상똥이의 Back-End 공부방
[spring] IoC 컨테이너 본문
일반적인 객체지향 프로그램
- 객체를 사용하는 시점에 직접 객체를 생성하여 사용
- 객체간의 의존성을 줄이기 위해 인터페이스와 추상 클래스 사용
- 하지만 소스코드 상에서 하드-코딩한 객체 생성 구현은 객체 간의 의존성을 강요
- 결국 의도한 것은 아니지만 직접적인 객체 생성으로 인해 객체 간의 결합도가 높아지게 됨
IoC(Inversion of Container) 객체 제어 방식
- 통제 방향의 변경을 의미(제어역전)
- 프레임워크가 갖는 일반적인 속성으로 특정 일에 대한 주체를 변경하는 것
- Command Line 프로그램 : 사용자의 프로그램이 모든 것(진행 순서, 사용되는 이벤트, 이벤트 처리, 결과 등)을 통제
- GUI 프로그램 : 사용자는 이벤트 핸들러만 구현하며 나머지는 프레임워크가 통제
- 객체 생성 책임을 컨테이너에 위임하여 객체 간 결합도를 낮춤 (loose coupling)
- 기존 로직에서 객체를 생성하는 로직을 제거함
- 구현 방법에 따라 DL / DI로 나뉨
- A class는 B Class의 존재 자체도 모르지만, B Class가 구현하고 있는 인터페이스에 대한 참조만 가짐
- IoC 컨테이너는 B Class의 생성과 그의 인스턴스 정보를 A Class에 전달하는 역할 (의존관계 주입)
DL (Dependency Lookup)
- EJB나 JNDI 리소스를 얻는 방식
- 컨테이너가 제공하는 Lookup Context를 통해서 필요한 자원이나 객체를 얻을 수 있음
- 컨테이너 API에 대한 의존성을 높이게 됨
- 컨테이너와의 의존성을 줄이기 위해서는 DI방식을 사용함
DI (Dependency Injection)
- 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것
- 개발자들은 제어를 담당할 필요 없이 빈 설정 파일에 의존관계가 필요하다는 정보만 추가하면 됨
- 의존 관계 주입 : 외부에서 객체를 생성하는 시점에 참조하는 객체에게 의존관계 제공
- 사용하는 객체 생성을 IoC컨테이너에 위임하여 객체 생성 로직이 사라짐
- 객체 생성에 대한 주도권을 객체를 필요로 하는 곳으로 넘겨주어 필요할 때 필요한 곳에서 객체를 생성
- 객체가 인터페이스만 알고 있으므로 느슨한 결합(loose coupling)이 가능함
- 책임성의 역행
- Spring은 Setter Injection, 생성자 Injection, 메소드 Injection 등 세 가지 DI패턴을 모두 지원함
- Spring은 의존관계를 설정하는 방법으로 XML, 어노테이션, 자바소스를 사용하는 방법을 제공함
Spring IoC 용어와 기능
IoC 용어 | 설명 |
빈(bean) | - 스프링이 IoC방식으로 관리하는 오브젝트 - 관리되는 오브젝트 - 스프링이 직접 그 생성과 제어를 담당하는 오브젝트 |
빈 팩토리 (bean factory) |
- 스프링이 IoC를 담당하는 핵심 컨테이너 - 빈을 등록, 생성, 조회, 반환, 관리하는 기능을 담당 - 보통은 팩토리를 바로 이용하지는 않고 이를 확장한 애플리케이션 컨텍스트를 이용 |
애플리케이션 컨텍스트 (application context) |
- 빈 팩토리를 확장한 IoC 컨테이너로 빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일 - 스프링이 제공하는 각종 부가 서비스를 추가로 제공 |
설정정보/설정 메타정보 (cofiguration metadata) |
- 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보 |
스프링 프레임워크 | - IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능 |
Annotation Bean관리
스테레오타입 어노테이션 | 설명 |
@Repsitory | - 데이터 엑세스 계층의 DAO또는 Repository 클래스에 사용 - DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해 사용하기도 함 |
@Service | - 서비스 계층 크래스에 사용 |
@Controller | - 프레젠테이션 계층의 MVC 컨트롤러에 사용 - 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정 |
@Component | - 위의 계층 구분을 적용하기 어려운 일반적인 경우 |
'Spring > Spring 기초' 카테고리의 다른 글
HTTP API의 개념 (0) | 2023.12.20 |
---|---|
RequestMapping (0) | 2023.12.20 |
Controller (0) | 2023.12.20 |
Spring boot 서비스 구조 (0) | 2023.10.29 |
[Spring] DI (1) 기본 개념과 이해 (0) | 2023.10.12 |