jhhan의 블로그

자바와 스프링 그 사이(마지막) 본문

JAVA

자바와 스프링 그 사이(마지막)

jhhan000 2021. 1. 1. 21:23

3편에 이어서 쓰려고 합니다.

 

이번 포스트는 자바만을 활용하는 마지막 편입니다.

여기서 이제 스프링을 활용하기 위한 기초 작업을 한 후 다음부터는 스프링 게시판으로 옮겨서 적겠습니다.

 

먼저 AppConfig 클래스부터 살펴보겠습니다.

AppConfig에 스프링 어노테이션을 붙이겠습니다.

@Configuration
public class AppConfig {

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

}
  • Configuration: 설정을 구성한다는 뜻의 어노테이션입니다. 설정정보라고 이해하시면 편할 것 같습니다.
                       이 어노테이션을 통해서 빈 생성이 가능해집니다.
  • Bean: 스프링 빈으로 등록시켜주는 어노테이션입니다.

 

이제 스프링을 활용하는 쪽으로 변경할 것이기 때문에 다른 코드들도 변경을 할 겁니다.

먼저 MemberApp 클래스를 변경합니다.

public class MemberApp {

    public static void main(String[] args) {
//        MemberService memberService = new MemberServiceImpl();
//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService(); // memberService 안에 MemberServiceImpl이 들어가있는 것임

        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

        Member member = new Member(1L, "MemberA", Grade.VIP);
        memberService.join(member);

		...
    }
}
  • 기존에는 AppConfig를 직접 사용해서 진행했습니다.
  • ApplicationContext: 애플리케이션에 설정정보를 제공하기 위해 사용됩니다.
                              이게 스프링 컨테이너라고 생각하면 편합니다.
  • ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    -> 이 코드를 통해 AppConfig에 등록된 4개의 Bean을 스프링 컨테이너에 넣어서 관리하게 됩니다.
  • MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
    -> AppConfig에서 등록된 빈 중 memberService란 이름으로 등록된 녀석을 가져옵니다.
        이 때, 이름은 AppConfig에서 메서드 이름이 default로 설정됩니다.
  • 만약 이름을 바꾸고 싶다면?
  • @Bean(name = "aaa") -> 빈 어노테이션에 name을 추가해서 그 이름으로 진행하시면 됩니다.

그럼 이제 한 번 실행을 해봅니다.

기존에 실행하던 화면과 뭔가가 달라졌습니다.

 

spring bean이 생성되었다고 로그에 뜨는 것을 볼 수 있습니다.

중간에 5줄을 보면 제가 썼던 코드의 메서드가 이름으로 들어간 것을 볼 수 있습니다.

appConfig, memberRepository, discountPolicy, memberService, orderService (참고로 이 순서는 다를 수 있습니다.)

아까 스프링 빈으로 등록된 것들을 직접 볼 수 있습니다.

그리고 만약 이름을 바꾸고 싶다면 아까 위에서 적은 방법으로 바꾸면 됩니다.
(근데 아마 안 바꿀 것 같네요 ㅎㅎ)

 

마찬가지로 OrderApp에도 동일하게 적용하면 됩니다.

크게 어려울 것 같지는 않아서 코드를 따로 적지는 않겠습니다.

 

 

이걸로 이번편의 내용은 끝난 것 같습니다.

조금 정리를 해본다면

  1. ApplicationContext: 스프링 컨테이너
  2. 기존 코드: AppConfig를 직접 불러와서 사용
  3. 변경 코드: 스프링 컨테이너를 통해 사용
  4. @Configuration을 가진 클래스를 설정 정보로 사용함.
    -> 그리고 @Bean이 붙은 메서드는 모두 스프링 컨테이너에 등록이 됨
    -> 추가로 메서드의 이름이 스프링 빈의 이름이 됨
  5. 이제는 AppConfig를 직접 불러오는 것이 아니라,
    @Configuration이 붙은 파일을 통해서(스프링 컨테이너를 통해서) 스프링 빈을 찾아서 사용

이라고 볼 수 있습니다.

 

이렇게 변경을 진행한다면... (저는 안 그랬는데...)

어떤 누군가는 이런 생각을 할 수 있습니다.

" 코드가 더 복잡해진 느낌이다. 그냥 기존에 AppConfig를 불러와서 사용하면 안 되는 것일까? "

라는 생각을 할 수 있습니다.

... 결과적으로는 스프링 컨테이너를 사용하는 것이 더 좋다고 합니다

그 이유에 대해서는 나중에 더 알아보도록 하죠 ㅎㅎ

(저도 아직 배우는 중이어서...)

 

 

앞으로는 자바 게시판이 아닌 스프링 게시판에 이어서 진행할 예정입니다.

그럼 이렇게 글을 마무리하겠습니다.

 

 

출처: 인프런 - 스프링 핵심원리(기본편) by 김영한

'JAVA' 카테고리의 다른 글

자바와 스프링 그 사이(3)  (0) 2020.12.29
자바와 스프링 그 사이(2)  (0) 2020.12.26
자바와 스프링 그 사이(1)  (0) 2020.12.16
BufferedReader & BufferedWriter  (0) 2020.06.18
Java의 정석을 시작하자(7)(2/11)  (0) 2020.02.14