본문 바로가기
Spring&Spring Boot

(Spring) Spring IOC , Spring DI

by Developer RyanKim 2019. 4. 8.

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

댓글