[Spring] 스프링 기초 개념
Updated: Categories: CSSpring 기초 개념 다시 정리 (DI, IoC 등)
DI / IoC
DI
- Dependency Injection, 의존성 주입
- 특정 객체를 사용해야 할 때 클래스 내에서 객체를 생성하는 것이 아닌, 이미 생성된 객체를 외부에서 주입받는 것
// 클래스 내부에서 직접 생성하기 class A { private final B b = new b(); } // 외부에서 주입받기 class A { private final B b; A(B b){ this.b = b; } }
- 장점
- 인터페이스로 주입받으면 의존성이 줄어들고, 결합도를 낮출 수 있다.
- 코드 재사용성을 높힐 수 있다
- 테스트가 편리하고, 가독성이 좋아진다
IoC
- Inversion Of Control, 제어의 역전을 뜻한다
- 어떠한 의존성 객체의 제어권(생성, 생명주기)이 개발자가 아닌 외부(프레임워크)에서 가지고 있는 것
- Spring에서는 IoC 컨테이너에서 DI 등의 의존성 관리를 대신함
Srping
Spring Boot의 내용은 빼고 정리
Spring이란
- 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
- 장점
- POJO를 사용한 객체지향적 구성
- DI, IoC를 통한 객체 관계 구성으로 결합도 낮추고 재사용성 높임
- AOP 지원
IoC Container
- BeanFactory
- 가장 기본적인 IoC Container
- Bean 객체의 생성과 생명주기를 관리하는 컨테이너이다
- ApplicationContext
- BeanFactory를 상속받아 추가적인 기능을 제공하는 IoC Container
Bean
- IoC 컨테이너에 의해 생성되고 관리되는 POJO 객체
- Bean끼리 DI가 가능하다
- Scope를 가진다
- 총 6개의 Bean Scope가 존재한다
- default는 싱글톤으로 동작한다
- prototype으로 변경시 싱글톤으로 동작하지 않음
- 생성과 소멸시 생명주기를 가진다
Bean 등록
- Bean을 IoC 컨테이너에 등록하는 방법에는 두가지가 있음
- xml에 직접 등록
- java config ->
@Configuration
+@Bean
및@Component
으로 등록@Bean
은@Configuration
클래스의 메소드에 사용한다@Component
는 클래스에 사용한다
- 두 방법 모두 IoC Container 생성시 Component scan이 일어난다.
@Configuration
클래스의@Bean
들과,@Component
클래스를 모두 빈으로 등록
Bean DI
- Bean을 등록할때 DI가 이루어져야 한다.
- 단 순환참조(Circular Dependency)를 주의해야 한다
- 의존성 주입에 두가지 방법이 있음
@Bean
으로 의존관계를 맺어주는 메소드 직접 만들기 (@Configuration
클래스에서 사용)@Autowired
기능 사용하기 (@Component
클래스에서 사용)
@Autowired
사용시- Bean 타입을 기준으로 주입시켜주기 때문에, 타입이 중복되는 Bean이 여러개일 경우 하나를 선택해야한다.
- Autowired시 주입엔 세가지 방법이 있음
- 필드값
- 주입 객체를 final로 선언 불가
- 테스트 어려움
- 의존관계 파악 어려움
- SRP 위반함
- Setter
- 주입 객체를 final로 선언 불가
- 선택적 DI 구현시 사용
- 테스트 쉬움
- Setter를 열어놓는것이 불편함
- 생성자
- 테스트 쉬움
- 의존관계 파악 쉬움
- 순환참조 감지 가능
- final로 선언 가능
- Spring 4.3 이상에서 생성자가 유일하면 @Autowired 생략가능
- 필드값