-
[Spring Boot] 스프링 컨테이너 ApplicationContext 생성과 빈 등록, 의존 관계 설정Back-End/Spring Boot 2022. 9. 30. 13:22
앞에서 순수 자바 코드를 이용해 DIP, OCP 원칙을 지키며 MVC 패턴에 맞춰 프로젝트를 작성하는 방법에대해 알아봤다면, 이번엔 스프링으로 전환해서 DI를 적용해보려고 한다.
📑 스프링 적용하기
일단) 애플리케이션의 전체 동작 방식을 구성하기 위해, 구현 객체를 생성하고, 연결하는 역할을 했던, AppConfig 메서드에 @Configuration, @Bean 어노테이션을 붙여준다.
//구성 정보, 설정 정보에 Configuration 어노테이션을 붙여준다. @Configuration public class AppConfig { //key는 메서드 이름 memberService() //value는 return 값으로 스프링 컨테이너에 등록된다. @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } }
그 후 AppConfig 클래스를 의존하는 서비스 클래스에서 코드를 수정해준다.
/* 의존성 주입을 위한 작업 AppConfig appConfig = new AppConfig(); MemberService memberService = appConfig.memberService();*/ //OCP, DIP 원칙을 지키기 위한 작업 // MemberService memberService = new MemberServiceImpl(); //스프링 적용하기 위한 작업, AppConfig에 있는 환경 설정 정보를 가지고 스프링이 컨테이너에 객체 생성한 걸 관리한다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
📑 스프링 컨테이너란?
ApplicationContext를 스프링 컨테이너라 한다. 기존에는 AppConfig를 사용해 직접 객체를 생성하고 DI 했지만, 이제부턴 스프링 컨테이너를 통해 사용한다. 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성) 정보로 사용한다. 여기서 @Bean이라 적힌 메서드를 모두 호출해 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. ex) memberService, OrderService ,,
이전에는 개발자가 필요한 객체를 AppConfig를 사용해 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해 필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 applicationContext.getBean() 메서드를 사용해 찾을 수 있다.
📑 스프링 컨테이너 생성 과정
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContext 는 인터페이스이다.
스프링 컨테이너는 xml을 기반으로 만들 수 있고, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다. 즉) 앞서 AppConfig를 사용했던 방식이 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 이 자바 설정 클래스를 기반으로 스프링 컨테이너를 만들어 보자면, new AnnotationConfigApplicationContext(AppConfig.class); 다음과 같은데 이 클래스는 ApplicationContext 인터페이스의 구현체이다.
🔨 1. 스프링 컨테이너 생성
: 스프링 컨테이너를 생성할 때 구성 정보를 지정해줘야 하는데, 여기선 AppConfig.class를 구성 정보로 지정했다.
🔨 2. 스프링 빈 등록
: 스프링 컨테이너는 파라미터로 넘어온 설정 클래스(Appconfig.class)의 정보를 사용해 스프링 빈을 등록한다. 메서드 이름은 빈 이름이 되고 반환값은 빈 객체가 된다. 빈은 항상 다른 이름을 부여해야 한다.
🔨 3. 의존관계 설정
: 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다. 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다. 그런데 이와같이 자바 코드로 스프링 빙을 등록하면 생성자를 호출하면서 의존관계 주입도 한 번에 처리가 된다. 뒤에서 나올 의존관계 자동 주입에 대해서는 더 알아봐야겠다.
반응형'Back-End > Spring Boot' 카테고리의 다른 글
[Spring Boot] 컴포넌트 스캔과 의존관계 자동 주입 (1) 2022.10.03 [Spring Boot] 싱글톤 패턴 vs 싱글톤 컨테이너 ( @Configuration) (1) 2022.10.01 [JAVA 객체 지향 설계의 원칙] OCP, DIP 예제로 완전 정복 ( + 관심사 분리) (0) 2022.09.30 [Spring 개념] 객체 지향 설계와 스프링 (1) 2022.09.29 [Spring Boot] 스프링 웹 개발 흐름 살펴보기 - 정적, MVC, API (1) 2022.09.26