상똥이의 Back-End 공부방

[spring] IoC 컨테이너 본문

Spring/Spring 기초

[spring] IoC 컨테이너

상똥백 2023. 11. 26. 09:45

일반적인 객체지향 프로그램

- 객체를 사용하는 시점에 직접 객체를 생성하여 사용

- 객체간의 의존성을 줄이기 위해 인터페이스와 추상 클래스 사용

- 하지만 소스코드 상에서 하드-코딩한 객체 생성 구현은 객체 간의 의존성을 강요

- 결국 의도한 것은 아니지만 직접적인 객체 생성으로 인해 객체 간의 결합도가 높아지게 됨

 

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