빈 생명주기 콜백
·
Spring
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 종료시점에 연결을 모두 종료해야하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정했을 때, NetworkClient는 애플리케이션 시작 시점에 connect()를 호출해서 연결을 맺어두어야 하고, 종료시점엔 disconnect()로 연결을 끊어주어야 한다. package hello.core.lifecycle;public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url);..
의존관계 자동 주입
·
Spring
다양한 의존관계 주입 방법의존관계 주입은 크게 4가지 방법이 있다.- 생성자 주입- setter 주입 (수정자 주입)- 필드 주입- 일반 메서드 주입 생성자 주입- 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다.- 여태 진행했던 방법이 생성자 주입이다.- 특징은 생성자 호출시점에 딱 1번만 호출되는것이 보장된다.- 불변, 필수 의존관계에 사용된다.*생성자가 1개만 있으면 @Autowired를 생략해도 자동 주입된다. @Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy disco..
컴포넌트 스캔
·
Spring
컴포넌트 스캔과 의존관계 자동 주입하기지금까지는 스프링 빈을 등록할때 자바 코드를 사용해 @Bean을 사용해 설정 정보에 직접 등록할 스프링 빈을 나열했다.(AppConfig)예제에선 몇개 다루지 않았지만, 스프링 빈이 많아지게 된다면 일일이 등록하기 힘들고, 설정 정보도 커지고 누락될 위험이 있다.그래서 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능이 있다.또 의존관계도 자동으로 주입하는 @Autowired 기능도 있다.@Configuration@ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))public ..
싱글톤 컨테이너
·
Spring
웹 애플리케이션과 싱글톤대부분의 스프링 애플리케이션은 웹 애플리케이션이다. (물론 아닌것도 개발할 수 있다)그리고 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 스프링이 없는 순수한 DI컨테이너에서 동시 요청이 발생했을 때 어떤 일이 발생할까?public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); //1. 조회 : 호출 할 때마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2..
스프링 컨테이너와 스프링 빈
·
Spring
스프링 컨테이너 생성스프링 컨테이너가 생성되는 과정// 스프링 컨테이너 생성ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext를 스프링 컨테이너라고 한다.ApplicationContext는 인터페이스이다.XML기반으로 만들 수 있고, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다. (요즘엔 XML로 생성하진 않는다.)바로 이전에 사용했던 방식이 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만드는 방법이다.new AnnotationConfigAPplicationContext(AppConfig.class); 는 ApplicationCont..
스프링 핵심 원리 (2)
·
Spring
새로운 할인 정책 개발- 고정 할인이 아닌 정률 할인으로 구매 금액의 10%를 할인으로 변경 정률 할인 클래스package hello.core.discount;import hello.core.member.Grade;import hello.core.member.Member;public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return price * discountPercen..