(Spring) Spring IOC , Spring DI
Spring IOC
: (Inversion Of Control) 제어의 역전
Ex) DAO 클래스의 DB커넥션 얻어오는 메소드.
-> 커넥션 얻어오는 기능을 하는 Conn 클래스로 분리
-> DAO 클래스는 Conn 클래스를 받아 DB와 연결 후 기능 수행 (생성자나 메소드로 받음)
-> 받는 부분을 Conn 인터페이스로 한다면 Conn 구현체를 바꿔가며 사용할 수 있어서 DAO는 연결설정과 관련없이 동작가능
원래는 Conn 클래스를 new하는 형식으로 구현되어있겠으나(직접 생성 및 사용) 이것을 위처럼 바꾸면
제 3자가 Conn 클래스를 넘겨주는 것이므로 제어가 역전되었다고 하는 것이다! (오브젝트에 대한 제어권이 넘어감)
Spring DI
: (Dependency Injection) 의존 관계 주입
위의 예시에서 DAO 클래스는 Conn 클래스를 넣어야 동작이 가능한데 이 Conn을 넣는 부분을 의존관계 주입이라고 한다.
위의 DAO , Conn 을 스프링을 통해 처리한다면 해당 오브젝트들은 '빈 (Bean)'으로 관리될 것이다.
Spring에서 IOC를 위한 일련의 작업을 하는 해주는 IOC컨테이너를 '빈 팩토리 (Bean Factory)' 라고 함.
그리고 이것을 좀 더 확장한 '어플리케이션 컨텍스트 (ApplicationContext)' 가 있다.
(이들은 Spring이 제공하는 인터페이스이다)
어플리케이션 컨텍스트에서는 '빈' 오브젝트들을 관리한다.
모든 빈은 '싱글톤 (Singleton)' 으로 관리된다. 완전 싱글톤이아니라 '싱글톤 레지스트리'로 관리된다 싱글톤보다 발전한 방식.
- 때문에 매 요청마다 인스턴스를 생성하지 않아 메모리를 효율적으로 사용할 수 있다.
- 하지만 객체가 '상태' 정보 등을 가진다면 위험하다. 한 인스턴스를 공유하기 때문에 이곳저곳에서 값이 바뀌게 될것.
Spring 에서 DI를 설정 하는 방식에는 2가지가있다.
1. Xml을 통한 설정 ( 예전방식. Ex. <servlet-mapping> </servlet-mapping> )
2. Annotation을 통한 설정 ( 요즘 방식. Ex. @Controller 등)
IOC , DI 에 대해 쉽게 설명되어 있는 글 : https://joont.tistory.com/135