웹 스코프

스프링 핵심 원리/프로토 타입 스코프 2021. 1. 2. 20:19

싱글 톤은 스프링 컨테이너의 시작과 끝까지 함께하는 매우 긴 스코프 이고 , 프로토타입은 생성과 함께 의존관계 주입 , 그리고 초기화까지만 진행하는 특별한 스코프이다. 웹 스코프 웹 환경에서만 동작한다. 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료메서드가 호출된다. 웹 스코프 종류 "request" : (각각의) HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프 , 각각의 HTTP 요청 마다 별도의 빈 인스턴스가 생성되고 관리된다. "session" : HTTP Session과 동일한 생명 주기를 가지는 스코프 "application" : 서블릿 컨텍스트(ServletContext)와 동일한 생명 주기를 가지는 스코프 "websocket" : 웹 소켓과 동일한..

Article Thumbnail
싱글톤 빈과 함께 사용시 문제점 과 문제 해결 방법

스프링 핵심 원리/프로토 타입 스코프 2021. 1. 2. 15:51

스프링 컨테이너에 프로토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 하지만 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의해야 한다. 프로토타입 빈 직접 요청 클라이언트A는 스프링 컨테이너에 프로토타입 빈을 요청한다. 스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환('x01')한다. 해당 빈의 count 필드 값은 0이다. 클라이언트는 조회한 프로토타입 빈에 addCount를 호출하면서 count필드를 +1 한다. 결과적으로 프로토타입 빈 ('x01')의 count는 1이 된다. 클라이언트B는 스프링 컨테이너에 프로토타입 빈을 요청한다. 스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환('x02')한다. 해당 빈의 count 필드 값은 0이다..

Article Thumbnail
빈 스코프란?

스프링 핵심 원리/프로토 타입 스코프 2021. 1. 2. 15:01

스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글 톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다 싱글톤 : 기본 스코프 , 스프링 컨테이너의 시작과 종료까지 유지 되는 가장 넓은 범위의 스코프이다. 프로토 타입 : 스프링 컨테이너는 프로토 타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프 이다. 빈 스코프는 다음과 같이 지정할 수 있다. 컴포넌트 스캔 자동 등록 @Scope("prototype") @Component public class FixDiscountPolicy implem..

Article Thumbnail
애노테이션 @PostConstruct , @PreDestory

스프링 핵심 원리/빈 생명주기 콜백 2021. 1. 2. 02:47

Class package hello.core.lifeCycle; // javax는 자바에서 공식적으로 지원하는 것들 import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class NetworkClient{ private String url; public NetworkClient() { System.out.println("생성자 호출 , url = " + url); } public void setUrl(String url) { this.url = url; } // 서비스 시작시 호출 public void connect(){ System.out.println("Connect : " + url); } public v..

빈 등록 초기화 , 소멸 메소드

스프링 핵심 원리/빈 생명주기 콜백 2021. 1. 2. 02:40

설정 정보에 @Bean(InitMethod="init" , destroyMethod="close")처럼 초기화 , 소멸 메소드를 지정할 수 있다. Class public class NetworkClient{ private String url; public NetworkClient() { System.out.println("생성자 호출 , url = " + url); } public void setUrl(String url) { this.url = url; } // 서비스 시작시 호출 public void connect(){ System.out.println("Connect : " + url); } public void call(String message){ System.out.println("Call :..

인터페이스 InitializingBean , DisposableBean

스프링 핵심 원리/빈 생명주기 콜백 2021. 1. 2. 02:23

Class public class NetworkClient implements InitializingBean , DisposableBean { private String url; public NetworkClient() { System.out.println("생성자 호출 , url = " + url); } public void setUrl(String url) { this.url = url; } // 서비스 시작시 호출 public void connect(){ System.out.println("Connect : " + url); } public void call(String message){ System.out.println("Call : " + url + " message : "+ message); ..

빈 생명주기 콜백 시작

스프링 핵심 원리/빈 생명주기 콜백 2021. 1. 2. 02:16

데이터베이스 커넥션 풀이나 , 네트워크 소켓 처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 , 애플리케이션 종료시점에 연결을 모두 종료하는 작업을 진행 하려면 , 객체의 초기화와 종료 작업이 필요하다. 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 예제로 알아보자 스프링은 간단하게 다음과 같은 라이프 사이클을 거친다. "객체 생성" → "의존관계 주입" (생성자 주입은 예외) 스프링 빈은 객체를 생성하고 , 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 해준다. 스프링 빈의 ..

자동 , 수동 스프링 빈 등록의 올바른 실무 운영 기준

스프링 핵심 원리/의존관계 자동 주입 2021. 1. 2. 01:40

편리한 자동 기능을 기본으로 사용하자 그러면 어떤 경우에 컴포넌트 스캔과 자동 주입을 사용하고 , 어떤 경우에 설정 정보를 통해서 수동으로 빈을 등록하고 , 의존관계도 수동으로 주입해야 할까? 결론부터 이야기하면 , 스프링이 나오고 시간이 갈 수록 점점 자동을 선호하는 추세다. 스프링은 @Component뿐만 아니라 @Controller , @Service , @Repository처럼 계층에 맞추어 일반적인 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원한다. 거기에 더해서 최근 스프링 부트는 컴포넌트 스캔을 기본으로 사용하고 , 스프링 부트의 다양한 스프링 빈들도 조건이 맞으면 자동으로 등록하도록 설계 했다. 그리고 결정적으로 자동 빈 등록을 사용해도 OCP , DIP를 지킬 수 있다. 그러면 수동..

생성자 주입을 선택해야하는 이유!

스프링 핵심 원리/의존관계 자동 주입 2020. 12. 30. 22:28

과거에는 수정자 주입과 필드 주입을 많이 사용했지만 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 다음과 같다. "불변" 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료 시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 애플리케이션 종료 전 까지 변하면 안된다. (불변 해야한다.) 수정자 주입을 사용하면 setXxx 메서드를 public으로 열어두어야한다. 누군가 실수로 변경할 수 도 있고 , 변경하면 안되는 메서드를 열어두는 것은 좋은 설계 방법이 아니다. 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계할 수 있다. "누락" 프레임 워크 없이 순수한 자바코드를 단위 테스트 하는 경우..

Article Thumbnail
자동 주입 대상을 옵션으로 처리 하는 방법

스프링 핵심 원리/의존관계 자동 주입 2020. 12. 29. 00:02

주입할 스프링 빈이 없어도 동작해야 할 때가 있다. 그런데 @Autowired만 사용하면 required 옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다. 자동 주입 대상을 옵션으로 처리하는 방법 @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨 org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다. 스프링 전반적으로 지원된다 Optinal : 자동 주입할 대상이 없으면 Optinal.empty가 입력된다. AutowiredTest public class AutowiredTest { @Test void AutowiredOption(){ Annotation..

Article Thumbnail