21.04.03-04 TIL - Spring 핵심원리 - 2편

2542 단어 SpringSpring

📌 Spring 핵심원리 - 2편

<출처 : 인프런 Spring 핵심원리 : 김영한 강사님>

https://www.inflearn.com/roadmaps/373

⌘ IOC(Inversion Of Control) / ⌘ DI(Dependency Injection) / ⌘ 컨테이너

➡️1. IoC 제어의 역전

핵심원리의 1편을 보면 알겠지만, AppConfig를 만든 후에는 구현체들은 자신의 로직을 실행하는 역할만 한다.
프로그램 제어의 흐름을 개발자가 아닌 AppConfig가 가져가게 된 상황이다.
ex. MemberServiceImpl은 필요한 인터페이스들을 호출한다. 하지만 어떠한 구현체가 실행될지는 모른다.
MemberServiceImpl, OrderServiceImpl 또한 AppConfig가 생성한다.
➳ AppConfig는 OrderServiceImpl이 아닌 OrderService인터페이스의 다른 구현체
(ex. OrderServiceImplSecond) 를 생성하고, 실행할 수 있다. 그런 상황도 모르는 MemberServiceImpl은 묵묵히 자신의 로직만을 실행한다.

👉 정리 : 이와 같이 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 IoC제어의 역전이라고 한다.

➡️2. DI 의존성 주입

OrderServiceImpl은 MemberRepository와 DiscountPolicy에 의존하고 어떤 구현체가 사용될지는 모른다.
⌘ 정적 의존관계
클래스가 사용하는 import코드만 보고 의존관계를 파악할 수 있다.
ex> 흔히 우리가 가장 많이 사용하는 DAO객체 같은 것들을 생각해보면 쉽게 이해할 수 있다.

⌘ 동적 의존관계
애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결 되는 것.

👉 DI의 이점 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경이 가능하다.
ex. MemoryMemberRepository로 결정했는데, 고객사에서 DB로 바꿔달라고 하면 DbMemberRepository로 변경할 수 있다.
AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 DI컨테이너라고 한다.

➡️3. 스프링 컨테이너

ApplicationContext를 스프링 컨테이너라고 한다.
⟹ 기존에는 이 역할을 AppConfig를 사용해서 직접 객체를 생성하고 의존성을 주입했다.
스프링 컨테이너는 @Configuration이 붙은 클래스를 설정(구성) 정보로 사용한다.
@Bean이 붙은 메소드들을 스프링 컨테이너에 등록한다.
이러한 객체들을 스프링 빈이라고 한다.

설정 정보 클래스를 대충 만들어보자.

@Configuration
class TestContainer{
		@Bean
		public One onemore(){
        			return new One(another());
               	}

이러한 Bean을 사용하는 클래스도 만들어보자.

class UseBean{
	ApplicationContext ac = new AnnotationConfigApplicationConText(TestContainer.class);
    	ac.getBean();

⌘ AnnotationConfigApplicationContext : Annotation기반으로 Configuration(설정을) 하고 있다. 정도로 생각하면 될 것 같다. 처음에 왜 이렇게 쓰는지 잘 이해가 안 되서 간략히 정리해봤다.

➽ 정리 : IoC, DI에 대해서 정리했고, 스프링 컨테이너는 맛보기 느낌으로 정리했다. 3편에서는 조금 더 스프링 컨테이너에 대해서 깊이 알아보자.

좋은 웹페이지 즐겨찾기