'필드 주입'에 해당되는 글 1건

들어가며

 

  스프링 프레임워크란 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로 간단히 스프링(Spring)이라고도 합니다. 한국에서는 전자정부 프레임워크의 영향을 받아서인지 압도적인 점유을 보이고 있습니다. 스프링을 사용하면 여러 장점들이 있고 그래서인지 개발자들의 많은 선택을 받아 왔습니다. 이번 포스팅에선, 우리가 선택하고 있는 스프링 프레임워크에 뼈대가 되는 3대 요소 (IOC/DI, AOP, 서비스추상화) 에 대하여 글을 작성하도록 하겠습니다.

 

 

 

제어의 역전 (Inversion of Control, IoC)

 

 Spring을 처음 접하게 되면 Servlet 컨테이너, EJB 컨테이너, IoC 컨테이너 등 Container라는 단어를 많이 듣게 됩니다.  컨테이너의 사전적 의미를 찾아보면 '화물을 능률적이고 경제적으로 수송하기 위해 사용하는 상자형 용기'를 의미합니다. 그렇다면 Spring에서 말하는 컨테이너란 무엇일까요? 마찬가지로 객체들을 담는 용기로 사용되어 지는데, Spring Container는 Spring Bean들의 생명주기를 관리합니다. 빈의 생성과 관계, 사용, 생명 주기를 관리하고 컨테이너를 통해 등록된 빈들은 시스템에 전반적으로 사용 가능합니다. 

 

 

 

 

 Spring Container는 어플리케이션을 구성하는 Bean들을 관리하기 위해 IoC(Inversion of Control, 제어의 역전)라는 개념을 이용하였습니다. 아래에 왼쪽 그림은 기존의 객체 생성방식입니다. 클래스 내부에 new 연산자를 이용하여 객체를 생성하였고 생명주기를 관리하였습니다. Spring에서는 오른쪽 그림의 방식으로 객체를 생성합니다. 외부에서 객체를 생성하고 생성자/수정자 방식을 이용하여 객체를 주입하는 방식을 채택하였습니다. 아 방식을 제어하는 주체가 역전되었다 하여 '제어의 역전(IoC)'라 부르며 스프링의 3대 핵심 요소입니다. 

 

 

 

 

 

 즉 IoC란 인스턴스의 생성부터 소멸까지의 인스턴스의 생명주기 관리를 컨테이너가 대신 해주는다는 것입니다.

 

 

의존성 주입 (Dependency Injection, DI)

 

 Spring DI란, IoC 컨테이너에서 빈객체를 생성하는 방식을 말합니다. 위 그림에서와 같이 기존 new로 생성하는 것을 외부에서 주입하는 방식으로 Spring에서는 Bean 생명주기를 관리하여 줍니다. 즉, IoC와 DI는 밀접한 관련이 있고 컨테이너에서 생명주기를 관리하여 준다는 것입니다. 이러한 DI는 3가지 의존성 주입 방식이 있습니다.

 

* 필드 주입

 

@RestController
public class BookController {
    
    @Autowired
    private BookService bookService;    
}

- 가장 일반적이고 쉬운 DI 방법

- final로 지정할 수 없기에 mutable 하여 NullPointerException이 발생할 수 있습니다.

- Runtime에서 예기치 않은 순환참조 문제가 발생할 수 있습니다.

 

* 수정자 주입

 

@RestController
public class BookController {

    private BookService bookService;

    public void setBookService(BookService bookService) {
        this.bookService = bookService;
    }
}

- 생성당시 주입을 꼭 하지 않아도 됩니다. 즉, 원하는 호출 타이밍에 함수를 호출하여 주입시킬 수 있습니다.

- 마찬가지로 mutable하여 NullPointerException이 발생할 수 있습니다.

 

 

* 생성자 주입

@RestController
public class BookController {

    private final BookService bookService;
    
    public BookController(BookService bookService) {
        this.bookService = bookService;
    }
}

- Pivotal에서 가장 권장하는 DI 방식입니다.

- final 지정이 가능하기에 Immutable 합니다.

- 서버 실행시 순환참조로 인해 오류가 발생합니다. 즉 Runtime에서 순환참조가 발생하지 않습니다.

- 테스트 코드 작성이 유리합니다.

 

 

정리

 

 

 Spring의 3대 핵심 요소인 IoC/DI에 대하여 학습하였습니다. 서로 밀접한 상관 관계가 있고 Bean의 사이클을 관리하기에 Spring이 취하고 있는 Bean 생성/소멸 방식을 이해하는 것이 좋습니다. Bean 주입 방법으로는 3가지가 존재하는데, 가능하면 Spring 입문시 배우는 필드 주입 방식보식 보다 생성자 주입 방식으로 코드를 작성하는 것이 안전한 코드를 작성하는 방법입니다.

 

 

 

블로그 이미지

사용자 yhmane

댓글을 달아 주세요