Spring
스프링 기본 - 스코프와 프록시
스프링 기본 - 스코프와 프록시
2022.06.13스코프와 프록시 이번에는 프록시 방식을 사용해보자. 여기가 핵심이다. proxyMode = ScopedProxyMode.TARGET_CLASS 를 추가해주자. 적용 대상이 인터페이스가 아닌 클래스면 TARGET_CLASS를 선택 적용 대상이 인터페이스면 INTERFACES를 선택 이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다. 이제 나머지 코드를 Provider 사용 이전으로 돌려두자. 실행해보면 잘 동작하는 것을 확인할 수 있다. 코드를 잘 보면 LogDemoController, LogDemoService 는 Provider 사용 전과 완전히 동일하다. 어떻게 된 것일까? 웹 스코프와 프록시 동..
스프링 기본 - 스코프와 Provider
스프링 기본 - 스코프와 Provider
2022.06.13스코프와 Provider 첫번째 해결방안은 앞서 배운 Provider를 사용하는 것이다. 간단히 ObjectProvider를 사용해보자. main() 메서드로 스프링을 실행하고, 웹브라우저에 http://localhost:8080/log-demo 를 입력하자. 드디어 잘 작동하는 것을 확인할 수 있다. ObjectProvider 덕분에 ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다.(정확히는 컨테이너에 요청하는 것을 지연) ObjectProvider.getObject()를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리된다. ObjectProvider.getObject()를 LogDe..
스프링 기본 - request 스코프 예제 만들기
스프링 기본 - request 스코프 예제 만들기
2022.06.13request 스코프 예제 만들기 웹 환경 추가 웹 스코프는 웹 환경에서만 동작하므로 web 환경이 동작하도록 라이브러리를 추가하자. build.gradle에 추가 이제 hello.core.CoreApplication의 main 메서드를 실행하면 웹 애플리케이션이 실행되는 것을 확인할 수 있다. 참고 : spring-boot-starter-web 라이브러리를 추가하면 스프링 부트는 내장 톰켓 서버를 활용해서 웹 서버와 스프링을 함께 실행시킨다. 참고 : 스프링 부트는 웹 라이브러리가 없으면 우리가 지금까지 학습한 AnnotationConfigApplicationContext 을 기반으로 애플리케이션을 구동한다. 웹 라이브러리가 추가되면 웹과 관련된 추가 설정과 환경들이 필요하므로 AnnotationCon..
스프링 기본 - 웹 스코프
스프링 기본 - 웹 스코프
2022.06.13웹 스코프 지금까지 싱글톤과 프로토타입 스코프를 학습했다. 싱글톤은 스프링 컨테이너의 시작과 끝까지 함께하는 매우 긴 스코프이고, 프로토타입은 생성과 의존관계 주입, 그리고 초기화까지만 진행하는 특별한 스코프이다. 이번에는 웹 스코프에 대해서 알아보자. 웹 스코프의 특징 웹 스코프는 웹 환경에서만 동작한다. 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프 종류 request : HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다. session : HTTP Session과 동일한 생명주기를 가지는 스코프 application: 서블릿 컨텍스트(Servlet..
스프링 기본 - 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
스프링 기본 - 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
2022.06.10프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결 싱글톤 빈과 프로토타입 빈을 함께 사용할 때, 어떻게 하면 사용할 때 마다 항상 새로운 프로토타입 빈을 생성할 수 있을까? 스프링 컨테이너에 요청 가장 간단한 방법은 싱글톤 빈이 프로토타입을 사용할 때 마다 스프링 컨테이너에 새로 요청하는 것이다. 핵심 코드 실행해보면 ac.getBean()을 통해서 항상 새로운 프로토타입 빈이 생성되는 것을 확인할 수 있다. 의존관계를 외부에서 주입(DI)받는게 아니라 이렇게 직접 필요한 의존관계를 찾는 것을 Dependency Lookup(DL) 의존관계 조회(탐색) 이라한다. 그런데 이렇게 스프링의 애플리케이션 컨텍스트 전체를 주입받게 되면, 스프링 컨테이너에 종속적인 코드가 되고, 단위 테..
스프링 기본 - 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
스프링 기본 - 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
2022.06.09프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점 스프링 컨테이너에 프로토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 하지만, 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의해야 한다. 그림과 코드로 설명하겠다. 먼저 스프링 컨테이너에 프로토타입 빈을 직접 요청하는 예제를 보자. 프로토타입 빈 직접 요청 스프링 컨테이너에 프로토타입 빈 직접 요청1 1. 클라이언트A는 스프링 컨테이너에 프로토타입 빈을 요청한다. 2. 스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환(x01)한다. 해당 빈의 count필드 값은 0이다. 3. 클라이언트는 조회한 프로토타입 빈에 addCount()를 호출하면서 count 필드를 +1 한다. 결과적으로 프로토타입 빈..