이 포스팅은 인프런 강의 중 김영한님의 '스프링 핵심 원리 - 기본편' 중
섹션 3까지의 내용을 정리한 것입니다.
코드 및 사진 이미지 모두 해당 강의를 참고하였습니다.
스프링 핵심 원리 - 기본편 링크
전 포스팅에서 Appconfig 클래스를 사용함으로서
이 이점에 대해 설명을 했다.
그러나 이는 순수한 java 코드로, spring을 사용하여
관리하기 위해 어노테이션을 붙여 스프링으로 전환하는 작업을 실행했다.
//순수 자바 코드로 작성한 Appconfig 코드 일부 public class AppConfig { public OrderService orderService() { return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy()); } }
//Spring으로 전환하기 위해 어노테이션을 붙인 Appconfig 코드 일부 @Configuration public class AppConfig { @Bean public OrderService orderService() { return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy()); } }
이런식으로 Configuration 어노테이션과 Bean 어노테이션을 붙인다.
그러면 @Bean을 붙인 메서드들은 다 스프링 컨테이너에 등록이 된다.
//기존 메서드 코드 일부 AppConfig appconfig = new AppConfig(); MemberService memberService = appconfig.memberService();
//스프링컨테이너를 사용하도록 변경한 코드 //AppConfig appconfig = new AppConfig(); //MemberService memberService = appconfig.memberService(); ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
그런 다음, new AnnotationConfigApplicationContext(AppConfig.class);로
AppConfig에 있는 환경설정 정보들을 가지고 스프링이
@Bean이 붙은 객체들을 스프링 컨테이너에 넣어서 관리를 해주게 되는 것이다.
기존 객체를 찾아올 때, AppConfig에서 직접 찾아왔다면
이제는 스프링 컨테이너를 통해서 찾아올 수 있게 되었다.
그리고 객체를 갖고올 때는,
applicationContext.getBean("memberService", MemberService.class);
이렇게 코드를 작성하게 되는데
처음엔 @Bean을 붙인 클래스 이름을 이름으로 주고
반환 타입을 뒤에 적어준다.
@Configuration 어노테이션을 붙인 AppConfig 메서드를 눌러
Spring Diagrams.../Bean Dependencies 를 클릭하면
이와 같이 스프링 컨테이너에 @Bean을 붙인 객체들이
잘 등록이 된 것을 확인할 수 있다.
ApplicationContext를 스프링 컨테이너라고 한다.
기존에는 Appconfig 클래스를 사용해 사용자가 직접 객체를 생성하고 DI했지만, 이제부터는 스프링 컨테이너를 사용한다.
스프링 컨테이너는 @Configuration이 붙은 Appconfig를 구성정보로 사용한다. 여기에서 @Bean이라 적인 메서드를 모두 호출해서 반환된 객체를 스픵 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. ("memberService", MemberService.class)
이전에는 개발자가 필요한 객체를 AppConfig 를 사용하여 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다.
스프링 빈은 applicationContext.getBean() 메서드를 사용해 찾을 수 있다.
기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.