스프링을 사용하는 이유

rami·2023년 9월 14일
0

Today I Learned

목록 보기
27/34

1. DI(Dependency Injection) 의존성 주입

객체 의존관계를 '외부'에서 넣어주는 것을 의존성 주입이라 합니다.

주입될 의존성은 스프링 컨테이너에서 관리되는 빈(Bean)이어야 하며 이를 통해 객체 간의 결합도를 낮추고 유연성을 높일 수 있습니다.

@Autowired 어노테이션은 스프링 컨테이너에서 (연관된 객체) 해당 타입의 빈을 찾아서 주입합니다.

  • 의존성 주입의 방법
    • 필드 주입
      클래스의 필드로 직접 주입하는 방법입니다.
    • setter 주입
      해당 클래스의 setter 메서드를 통해 주입하는 방법입니다.
    • constructor 주입
      클래스의 생성자 파라미터로 의존성을 받아온 후, 스프링 컨테이너가 객체를 생성하고 주입하는 방법입니다.

의존성 주입 X : Composition has a
결합도가 강하고 매번 new 객체 생성해야 해서 유지보수성이 떨어집니다.

class A {
    B b;
    
    public A() {
        b = new B();
    }
}

의존성 주입 O : Association has a

class A {
	B b;		// DI
    
    public void setB(B b) {		// Setter Injection
    	this.b = b;				//외부에서 클래스 B의 인스턴스를 받아서 b 멤버 변수에 할당합니다.
    }
    
    public A(B b) {				// Construction Injection
    	this.b = b;
    }
    
    
    
}

class Main {
	public void something() {
    	B b = new B();	// 보통 이렇게 선언 후 -> 할당하는데, IOC는 할당 후 -> 선언해서 가져다 씁니다.
        
        // ----- Setter Injection ----- //
    	A a = new A();
    
    	a.setB(b);		// 클래스 A의 setB 메서드를 사용하여 클래스 B의 인스턴스를 클래스 A에 주입합니다. 
    					// 이제 클래스 A는 클래스 B의 인스턴스를 사용할 수 있습니다.
            	        // IOC에서 관리해줍니다.
                        
		// -------------------------- //
        
        // ----- Construction Injection ----- //
        A a = new A(b);
    }
}

2. IOC (Inversion of Control) 제어의 역전

객체 생성과 관리의 제어를 관리자가 아닌 프레임워크가 담당함을 의미합니다.

new DataSource() 하지 않고 ds가 null인데
어떻게 ds.getConnection()을 할 수 있냐면

DataSource가 Interface이고
@Autowired로 의존성을 주입 받았기 때문입니다.

DataSource의 몸통은 root-context.xml에 bean객체로 정의되어 있습니다.

객체를 선언한 후 할당하는 것이 일반적인 순서라면,
스프링에서 할당을 먼저한 후 선언하는 것을 제어의 역전(IOC)이라고 합니다.

따라서 DataSource ds; 선언문은 먼저 할당된 bean객체를 통해 ds.getConnection()을 가능하게 합니다.


3. AOP (Aspect-Oriented Programming) 관점 지향 프로그래밍

애플리케이션에 공통적으로 나타나는 부가적인 기능들을 독립적으로 모듈화 하는 프로그래밍 모델입니다.

//추가 예정
@Transactional
프록시

profile
앞으로 나아가는 사람

0개의 댓글