2023-04-23
IoC
( Inversion of Control ) - 제어의 역전
- 메서드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것
장점
- 결합도가 줄어듦
- 유연선이 높아짐
- 가독성이 높아짐
- 코드 중복이 줄어듦
- 유지 보수에 편리함
DI
( Dependency Injection ) - 의존성 주입
- 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
( IoC 프로그래밍 모델을 구현하는 방식 중 하나 )
- 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입함
의존관계
의존 대상 B가 변하면, 그것이 A에 영향을 미칠 때 A는 B와 의존관계라고 함
■ DI 가 필요한 이유
- 클래스와 클래스 간의 결합이 강하면 하나의 클래스가 바뀌면 매번 생성자를 바꿔줘야 하는 등 유연성이 떨어지게 됨
- 객체 지향 프로그래밍을 위해선 클래스 간의 관계에 의존하면 안되고 객체들 간의 관계를 맺어야 함
주입 방법
생성자 주입
- 생성자를 만들어 의존 관계를 주입하는 것
- 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우 사용
수정자 주입
- @Setter 어노테이션을 사용해 의존 관계를 주입하는 것
- 주입받는 객체가 변경될 가능성이 있는 경우 사용
- 런타임에서 의존성을 주입함
필드 주입
- @Autowired 어노테이션을 사용해 의존 관계를 주입하는 것
- 런타임에서 의존성을 주입함
■ 생성자 주입 방법을 권장함
- NullPointerException 의 발생을 막음
객체가 생성되는 시점에 빈을 주입함. 생성시에 의존성 없이는 생성 불가능하기 때문에 일부러 null 을 주입하지 않는 이상 발생하지 않음
- 불변성을 활용할 수 있음
final 선언 가능
- SRP (단일 책임 원칙) 를 지킬 수 있도록 유도함
Bean
- Spring Ioc 컨테이너가 관리하는 자바 객체
등록 방법
- 어노테이션 ( Annotation ) 사용
@Component
어노테이션을 사용하거나,
스테레오 타입인 @Controller
, @Service
, @Repository
등을 사용함
- Bean 설정 파일에 직접 등록
@Configuration
, @Bean
어노테이션 사용함
@Configuration
: 해당 파일에 빈을 등록하겠다는 선언