250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 오버라이딩
- ocp
- objecterror
- equals()
- 티스토리챌린지
- 코딩테스트
- 프록시
- 김영한
- @configuration
- 추상클래스
- 스프링
- 스프링컨테이너
- 의존관계
- 싱글톤
- 인터페이스
- JSON
- 다형성
- 백준
- 코드트리조별과제
- fielderror
- http 메시지 컨버터
- HttpServletResponse
- 오블완
- java
- DI
- 코드트리
- 서블릿
- html form
- 테스트코드
- 참조변수
Archives
- Today
- Total
minOS
스프링 핵심 원리 이해2 - 스프링으로 전환 본문
728x90
스프링 사용하여 AppConfig 변경
package com.example.core;
import com.example.core.discount.DiscountPolicy;
import com.example.core.discount.RateDiscountPolicy;
import com.example.core.member.MemberRepository;
import com.example.core.member.MemberService;
import com.example.core.member.MemberServiceImpl;
import com.example.core.member.MemoryMemberRepository;
import com.example.core.order.OrderService;
import com.example.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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();
}
}
MemberApp 스프링 사용 버전으로 변경
package com.example.core;
import com.example.core.member.Grade;
import com.example.core.member.Member;
import com.example.core.member.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
// 위 코드는 AppConfig 클래스에 정의된 설정 정보를 사용하여 스프링 ApplicationContext(스프링 컨테이너)를 생성한다.
// 이는 ApplicationContext가 AppConfig에 정의된 객체(빈)들을 생성하고 관리하도록 하는 것을 의미한다.
// AppConfig 클래스에는 빈 정의 같은 설정이 포함되어 있다.
MemberService memberService = applicationContext.getBean("memberService",MemberService.class); // 인자로 메서드 이름과 빈환 타입을 받음
Member memberA = new Member(1L, "memberA", Grade.VIP);
memberService.join(memberA);
Member findMember = memberService.findMember(1L);
System.out.println("new member = "+memberA.getName());
System.out.println("findMember = " + findMember.getName());
}
}
출력 결과
OrderApp 스프링 사용 버전으로 변경
package com.example.core;
import com.example.core.member.Grade;
import com.example.core.member.Member;
import com.example.core.member.MemberService;
import com.example.core.member.MemberServiceImpl;
import com.example.core.order.Order;
import com.example.core.order.OrderService;
import com.example.core.order.OrderServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
//
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
Long memberId =1L;
Member member = new Member(memberId,"memberA", Grade.VIP);
memberService.join(member); // 멤버 추가
Order order = orderService.createOrder(memberId,"itemA",20000);
System.out.println(order);
System.out.println(order.calculate());
}
}
출력 결과
스프링 컨테이너 정리
'ApplicationContext'를 스프링 컨테이너라 한다.
기존에는 개발자가 'AppConfig'를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터 스프링 컨테이너를 통해서 사용한다.
스프링 컨테이너는 '@Configuration'이 붙은 'AppConfig'를 설정(구성) 정보로 사용한다.
여기서 '@Bean'이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
스프링 빈은 '@Bean'이 붙은 메서드 명을 스프링 빈의 이름으로 사용한다. (코드 참고)
이전에는 개발자가 AppConfig를 사용하여 직접 조회하였지만, 이제부터 스프링 컨테이너를 통해서 필요한 스프링빈(객체)를 찾아야한다.
이전에는 개발자가 직접 자바 코드로 모든 것을 했다면, 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
728x90
'TIL > 김영한의 스프링 핵심 원리' 카테고리의 다른 글
스프링 컨테이너와 스프링 빈(2) (0) | 2024.02.11 |
---|---|
스프링 컨테이너와 스프링 빈(1) (0) | 2024.01.31 |
스프링 핵심 원리 이해2 - 객체 지향 원리 적용(3) (0) | 2024.01.30 |
스프링 핵심 원리 이해2 - 객체 지향 원리 적용(2) (2) | 2024.01.24 |
스프링 핵심 원리 이해2 - 객체 지향 원리 적용(1) (0) | 2024.01.18 |