티스토리 뷰

공부 순서

느슨한 결합력과 인터페이스 -> DI - > MVC

AOP -> 트랜잭션

Servelt Filter -> 인증과 권한

 

1. 느슨한 결합력과 인터페이스

 1-1 엔터프라이즈 어플리케이션 제작에서 기본적으로 사용하는 레이어

 1) Service : 사용자의 요구에 맞는 서비스를 담당

 2) Dao : 데이터 소스에 접근하는 방법 및 구현 기술을 숨기고 단순히 서비스 레이어에서 Java 코드만 이용하여 데이터를 제공받을 수 있게 해주는 Data Acess Object

 

 1-2 서비스를 변경하기 위해 Dao를 변경해야 할 경우 어떤방식을 적용할까? 

 1) 코드 수정

 2) 코드 추가(덮어쓰기), Dao를 참조하는 Service의 코드를 수정해야 함 

코드를 추가하면 새로 배포를 하지 않아도 되기 때문에 편리하나, 추가된 코드를 참조하기 위해 Service부분이 변경되야 할 수 있다.

Class b1 = new Class b1();
-> Class b2 = new Class b2();

 

수동으로 Service코드를 수정하지 않고 변경된 사항을 적용하려면, 자동으로 객체를 변경할 수 있도록 처리해야 한다. 그 때 인터페이스에서는 파일을 읽어와서 자바의 코드를 수정하지 않고 객체의 참조를 변경할 수 있는데, 

 

강하게 결합된 두 클래스가 -> 외부 파일을 통해 수정할 수 있는 상태로 바뀐것을 느슨한 결합이라고 한다.

 

2. DI (Dependency Injection)

 - 스프링이 가지고있는 가장 기본적인 능력 : 객체를 생성하고 조립해주는 능력, 거기서 사용하는 용어가 DI & IOC 컨테이너이다.

 

2-1 DI (Dependency Injection)

 - DI를 알아보기 이전에 부품의 조립 관계로 객체지향 프로그래밍을 이해해보자, 객체지향 프로그래밍에서는 프로그램이 객체들의 조립관계로 만들어진다.

 

1) 조립관계 1

 - A라는 클래스가 B라는 클래스를 이용하고 있음. 이용하는 과정에서 생성자를 통해 A가 생성될 때 B클래스를 객체화하여 사용함.

 - Composition has a : A클래스가 B클래스를 일체형으로 가졌다 해서 일체형 has a 관계라고 함. 즉, B가 A의 부품이 됨. 그리고 그런 부품을 Dependency(종속성)이라 함

Class A {
    private B b;
    
    public A() {
    	b = new B();
    }
}

 

2) 조립관계 2

 - A의 생성자에서 B를 직접 생성하지 않고, 클래스 외부에서 B를 생성하고 생성된 인스턴스를 A의 메서드인 setB에 세팅해서 세팅된 객체를 A가 사용한다.

 - 이러한 관계를 조립형, Association has a 관계라 한다.

Class A {
    private B b;
    
    public A(){
    }
    
    public void setB(B b) {
    	this.b = b;
    }
}

 

2-2 DI가 중요한 이유

1) DI란?

 - A클래스가 부품 B를 사용하기 위해서는 B라는 부품을 생성하고 직접 꽂아서(세팅하여) 사용해야 한다. 이렇게 B라는 부품(Dependency)를 A에 꽂는 것을 주입(Injection)한다라고 하고, 이것을 DI (Dependency Injection)이라 한다.

// 느슨한 결합의 원리
A a = new A();
B b = new B(); // 주입하기 원하는 객체 직접 생성

a.setB(b); // setter를 통해 주입 

 

 - 프로그램을 만들 때 일체형 보다는 조립형의 결합력이 더 낮다. 결합력이 낮은 객체끼리는 쉽게 부품을 갈아끼울 수 있다. 따라서 프로그램의 업데이트를 생각했을 때 느슨합 결합으로 개발하는 것이 효율적이다.

 

느슨한 개발도 단점이 있다. 부품을 끼우기 위해서 직접 부품을 구해야하고 조립(선언)해야 한다는 것이다.

 

조립하는 일이 불편하면 조립해주는 서비스를 받으면 된다. DI를 자동으로 해주는 서비스가 바로 Spring이다. 

Spring은 객체를 생성하고 주입하는 역할을 자동으로 수행한다. 즉, Spring의 기본적인 기능 Dependency를 Injection해주는 기능이다.

 

원하는 부품이 무엇이고, 어떤 부품결합을 원하는지 설정을 해주면 Spring이 DI를 수행해준다.

 

 

*키워드

강한 결합 = 클래스 생성시에 주입되기 원하는 클래스가 같이 생성되고 결합됨. (Construction Injection)

느슨한 결합 = 수정이 용이하나 주입을 원하는 객체를 클래스 외부에서 직접 선언하고, 메서드를 통해 주입하여 결합해야 함 (Setter Injection)

Spring의 DI기능 = 느슨한 결합의 장점을 유지하고 단점을 보완하기 위해 결합할 객체를 생성하고, 주입해주는 기능

부품을 쉽게 조립한다는게 정확히 어떤 말인지? = 느슨한 결합으로 개발할 경우 계속해서 인스턴스를 생성할 수 있기 때문에 부품을 쉽게 조립하여 연결할 수 있다.

댓글