스프링의 request 스코프란?
2022. 1. 14. 12:25
Spring
스프링에는 웹 스코프, 싱글톤 스코프, 프로토타입 스코프 크게 3가지가 있다. 그 중 웹 스코프의 request 스코프를 알아 보자. Request 스코프란 웹 스코프는 3가지로 나뉜다. request : 웹 요청이 들어오고 나갈 때 까지 session : 웹 세션이 생성되고 종료될 때 까지 applicaiont : 웹의 서블릿 컨텍스트와 같은 범위 ??????? reqest 스코프는 http의 요청이 오고 응답해서 나갈 때 까지 스프링 빈에 관리되는 스코프이다. 싱글톤과는 다르게 http 요청 마다 개별로 빈을 생성해준다. 언제 사용할 수 있을까? 여러가지가 있겠지만 사용자별 로그에 사용될 수 있다. 10명의 사용자가 요청을 했는데 로그가 어떤 사용자인지 구분없이 보인다면 로그를 보기가 힘들 것이다. ..
스프링의 프로토타입과 싱글톤 빈 같이 사용하기
2022. 1. 14. 08:35
Spring
싱글톤으로 클라이언트의 요청을 받으며, 프로토타입 빈을 주입받아 사용하고 싶을 때 어떻게 해야 할까? 일단 주입을 받아보면 어떻게 될까? 싱글톤 빈에 프로토타입빈을 주입을 받아 보자. 싱글톤 빈은 생성 시점에 생정자 주입을 받았으므로 프로토타입 빈을 새로 생성하지 않게 된다. 이렇게 되면 결국 싱글톤과 다를 바가 없게 된다. 테스트 결과를 살펴보면 count2는 값이 2인 것을 확인할 수 있다. @Test void singletonClientUsePrototype() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean cl..
스프링의 빈 스코프
2022. 1. 14. 08:34
Spring
빈 스코프란? 보통은 싱글톤 빈을 사용하게 된다. 싱글톤 빈은 스프링 컨테이너의 시작 → 종료까지 유지되는 스코프를 가졌다. 스코프라는 것은 빈이 살아있는 범위를 의미한다. 빈 스코프의 종류 싱글톤 → 기본 스코프, 스프링 컨테이너 시작 → 끝 프로토타입 → 의존 관계 주입까지 살아있음. 매번 새로운 객체를 생성한다. → 싱글톤 빈은 스프링 컨테이너 생성 시점에 초기화 메서드가 실행되지만 프로토타입은 빈 조회(ac.getBean)할 때 초기화 메서드가 실행이 된다. 즉, ac.getBean()을 할 때 의존관계 주입이 일어난다. → 스프링 컨테이너가 종료될 때 종료 메서드가 호출되지 않는다. 호출하려면, 조회한 빈에서 직접 호출해주어야 한다. 웹 스코프 request : 웹 요청이 들어오고 나갈 때 까지..
스프링 빈의 생명주기
2022. 1. 14. 08:33
Spring
데이터베이스의 커넥션 풀은 애플리케이션이 시작될 때 연결을 해서 풀을 생성해 놓는다. 이후 애플리케이션이 종료가 될 때 연결을 끊게 된다. 이를 스프링에서 사용한다고 하면 빈이 의존관계 주입까지 끝나면 연결을 하고, 빈이 소멸되면 연결을 끊는 행위가 필요하다. 그렇다면 스프링에서는 이를 어떻게 처리할 수 있을까? 스프링 빈의 생명 주기 스프링은 아래와 같은 생명 주기를 갖는다. 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용... → 소멸 전 콜백 → 스프링 종료 초기화 콜백 → 빈이 생성되고, 의존관계 주입이 완료된 후에 호출되는 것 소멸 전 콜백 → 빈이 소멸되기 전에 호출되는 것 당연한 것이지만 스프링은 의존관계 주입까지 끝나야 올바르게 빈을 사용할 준비가 된다...
스프링에서 모든 타입의 빈을 동적으로 관리하기
2022. 1. 14. 08:31
Spring
스프링에서 같은 타입의 빈이 2개 이상이면 의존 주입이 실패하게 된다. 하지만 동적으로 빈을 변경해야 사용하고 싶을 경우가 있을 것이다. 예를 들어 어떤 로직에는 정률 할인 정책을 어떤 로직에는 고정 할인 정책을 사용하고 싶을 경우가 있다. 그런데 같은 타입이면 충돌이 나서 주입이 안되는데 어떻게 동적으로 처리할 수 있을까? 그 방법이 바로 전략 패턴을 활용한 컬렉션 사용이다. Map으로 활용 해보자. 생성자 → 같은 타입의 모든 빈을 Map에 담는다. 같은 타입이 2개 이상이도 Map이기 때문에 주입이 가능하다. discount() → String discountCode 파라미터가 전략 패턴을 사용한 코드이다. 클라이언트 코드에서 Map에 담긴 빈 중 원하는 빈을 이름으로 찾는 방법이다. class D..
스프링 조회 대상 빈이 2개 이상일 경우
2022. 1. 14. 08:31
Spring
스프링 컨테이너는 조회 대상의 타입이 2개 이상일 경우 에러를 발생 시킨다. 이 경우 하위 타입으로 지정해도 되지만 DIP, OCP 위반이다. @Autowired 필드 명 or 파라미터 명으로 빈 이름 매칭 아래와 같은 코드가 있을 경우 같은 타입의 빈이 두개이므로 등록을 할 수 없는 에러가 발생한다. DiscountPolicy타입으로 fixDiscountPolicy,rateDiscountPolicy 2개의 하위 타입이 있기 때문에 나는 에러이다.(NoUniqueBeanDefinitionException) 의존 주입을 시도할 때 발생하는 것이다. @Component public class OrderServiceImpl implements OrderService { private final MemberRe..
스프링의 @ComponentScan
2022. 1. 14. 08:30
Spring
@ComponentScan이란 @Component가 붙은 클래스를 모두 빈으로 등록하도록 해주는 어노테이션이다. @Autowired가 붙은 Target에 자동으로 등록된 빈을 타입으로 조회하여 의존 관계 주입을 해주는 어노테이션이다. 먼저 수동으로 빈을 등록하는 방법을 간단히 알고 넘어가자. 아래와 같이 AppConfig라는 클래스에 @Configuration을 붙이고 @Bean을 사용해서 하나하나 모두 설정을 해주고 new AnnotationConfigApplicationContext(AppConfig.class)로 스프링 빈으로 등록을 하게 된다. @Configuration public class AppConfig { @Bean public MemberService memberService() { r..
스프링의 @Configuration과 싱글톤의 관계
2022. 1. 14. 08:29
Spring
스프링은 기본적으로 싱글톤 객체를 생성하고 관리 해준다. 물론 싱글톤이 아니도록 설정할 수도 있다. 하지만 거의 99%는 싱글톤으로 사용을 한다. 그렇다면 스프링은 어떻게 싱글톤을 보장해 주는 것일까? 지금부터 알아 보도록 하자. 자바 코드가 객체 생성을 한 번만 하는게 이상하다. 아래와 같은 빈을 등록한다고 하자. @Configuration public class AppConfig { @Bean public MemberService memberService() { System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository m..