제어의 역전
= IoC; Inversion of Control
: 프로그램의 제어 흐름을 직접 제어x, 외부에서 관리.
- 기존: 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체 생성/연결/실행
( = 구현 객체가 프로그램의 제어 흐름을 스스로 조종 )
- 개선: 필요한 인터페이스들을 호출하지만, 어떤 구현 객체들을 호출할지는 모름
ex: AppConfig.java (아래)
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
// memberRepository 생성
private MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
// discountPolicy 생성 - 어떤 구현체를 사용할지
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
위 코드가 있기 때문에 아래 MemberServiceImpl.java 에서는 어떤 객체가 주입될지 고민하지 않아도 된다.
의존 관계에 대한 고민은 외부에 맡긴다.
// MemberService라는 인터페이스를 implements한 상태
public class MemberServiceImpl implements MemberService {
// 기존 코드
// private final MemberRepository memberRepository = new MemoryMemberRepository();
// 개선 코드
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 인터페이스의 메소드들
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
- 프레임워크: 내가 작성한 코드를 제어/실행해 줌
- 라이브러리: 내가 작성한 코드가 직접 제어의 흐름을 담당
의존관계 주입
= DI; Dependency Injection
: 구체적인 의존 오브젝트와 이것을 사용하는 오브젝트( 클라이언트 )를 런타임 시에 연결해주는 작업
- 정적인 클래스 의존 관계와 실행 시점에 결정되는 동적인 객체 의존 관계를 분리해 생각해야 함
ㄴ 정적인 클래스 의존관계 : 애플리케이션 실행하기 전에 분석 가능.
ㄴ 동적인 객체 인스턴스 의존 관계 : 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 결정
컨테이너
= IoC 컨테이너 = DI 컨테이너
: AppConfig 처럼 객체 생성/관리하며 의존 관계 연결해주는 것
본 글은 김영한님의 유료 강의를 들으며 요약, 정리를 목적으로 작성한 것으로 홍보나 금전적 목적이 없습니다.
제 방식으로 정리한 것으로 강의 내용을 추가/삭제/변경된 부분이 많으며 자세한 설명은 강의 구매를 추천 드립니다.
참고: inflearn / 김영한 / 스프링 핵심 원리 기본편
'Develop > Spring+JPA' 카테고리의 다른 글
[Spring] Interceptor (0) | 2021.01.29 |
---|---|
[Spring Boot] Request method 'DELETE' not supported (2) | 2021.01.20 |
[Spring] <context:component-scan>에 대해 (0) | 2021.01.07 |
@Qualitifier 편리하게 이용하기 (0) | 2020.12.29 |
Java Spring 기초 개념 (0) | 2020.12.29 |