본문 바로가기
Develop/Spring+JPA

IoC, DI, Container 개념

by 연로그 2020. 12. 29.
반응형

제어의 역전

= 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 / 김영한 / 스프링 핵심 원리 기본편

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온

www.inflearn.com

 

반응형