일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- vue-cli
- HTTP 메서드
- 싱글톤
- JPA
- HTTP
- 캐시
- DB
- VUE
- Setter
- 로그인
- BEAN
- Excel
- cache
- js
- 의존성 주입
- thymeleaf
- Spring
- vuex
- di
- Vue.js
- 프로토타입
- Repository
- 라이프 사이클
- dependency injection
- javascript
- Java
- Security
- Singleton
- Kotlin
- Stateless
- Today
- Total
jhhan의 블로그
자바와 스프링 그 사이(마지막) 본문
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에도 동일하게 적용하면 됩니다.
크게 어려울 것 같지는 않아서 코드를 따로 적지는 않겠습니다.
이걸로 이번편의 내용은 끝난 것 같습니다.
조금 정리를 해본다면
- ApplicationContext: 스프링 컨테이너
- 기존 코드: AppConfig를 직접 불러와서 사용
- 변경 코드: 스프링 컨테이너를 통해 사용
- @Configuration을 가진 클래스를 설정 정보로 사용함.
-> 그리고 @Bean이 붙은 메서드는 모두 스프링 컨테이너에 등록이 됨
-> 추가로 메서드의 이름이 스프링 빈의 이름이 됨 - 이제는 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 |