[본 포스팅은 인프런 스프링 핵심 원리 - 기본 편을 기반으로 작성하였습니다.]
기존 코드
AppConfig.java
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
MemberApp.java
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("findMember = " + findMember.getName());
}
}
기존 코드에는 순수하게 자바 코드를 사용했지만 스프링으로 바꿀 경우
@~~~를 붙여준다! (어노테이션)
그래서 AppConfig는
AppConfig.java
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
@Configuration(설정 정보)을 AppConfig 위에 붙여준 후
@Bean은 메소드에 붙여주면 된다.
Configuration의 역할은 스프링 설정 클래스를 선언해준다.
Bean은 스프링 IoC 컨테이너가 관리하는 객체이다.
MemberApp.java
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("findMember = " + findMember.getName());
}
}
사용할 때는 위와 같이 사용하는데 주석처리된 부분은 기존에 사용했던 방식이고,
이제는 스프링을 사용하기 때문에 6~7번 줄을 보면 ApplicationContext를 선언 후 AnnotationConfigApplicationContext로 AppConfig.class를 참조하여 그 안에 있는 Bean을 사용할 것이다.
라고 이해하였다.
그리고 7번째 줄에 applicationContext.getBean 함수를 통해 메소드를 사용?하는데
파라미터에는 무엇을 넣느냐면!
문자열로 돼있는 첫번째 파라미터는 AppConfig.java에서 Bean으로 어노테이션을 준 부분이 있을 것이다.
그 메소드의 이름을 문자열로 주면 되고
두번째 파라미터는 MemberApp.java에서 사용할 타입이 MemberService이기 때문에 MemberService.class를 넣어주면 된다.
+ 두번째 파라미터(Service.class) 하나로만 getBean을 할 수 있지만 이럴 경우 같은 타입의 경우 중복이 될 수 있음
이대로 실행하게 되면
이러한 로그가 뜨게 되는데
1~6줄은 스프링 내부적 관련 로그이고
7번째줄부터 스프링 컨테이너에 등록이 되고 사용할 때 저 이름으로 꺼내 사용하면 된다.
강의에서의 정리
'JAVA > Spring' 카테고리의 다른 글
[Spring] 롬복(Lombok) 설치 및 간단하게 사용 (feat. 최신 트렌드) (0) | 2022.09.02 |
---|---|
[Spring] 스프링 컨테이너가 싱글톤을 보장해주는 이유 (0) | 2022.09.01 |
[Spring] 스프링 컨테이너를 사용해야 하는 이유 (싱글톤 패턴의 문제점 해결) 그리고 주의점 (0) | 2022.09.01 |
[Spring] AppConfig의 역할과 왜 사용되는지 정리 (0) | 2022.08.31 |
스프링 부트 프로젝트 쉽게 생성하기 start.spring.io / Spring initializr (0) | 2022.08.30 |