request 스코프는 웹 스코프 중 하나로 HTTP 요청이 들어오고 나갈 때까지 유지되는 스코프다. 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고 관리된다. 예제로 Logger를 하나 생각해보자. HTTP 요청마다 id를 부여해 HTTP 요청을 구분하고 싶다. 이때 request 스코프를 이용하면 HTTP 요청을 쉽게 구분할 수 있다. @Component @Scope(value = "request") // 이 빈은 http 요청 당 하나씩 생성 & http 끝나는 시점에 소멸 public class MyLogger { private String uuid; private String requestURL; public void setRequestURL(String requestURL) { this..
앞서서 싱글톤 패턴에 대해 공부했다. https://flowingmooon.tistory.com/20?category=996069 싱글톤 컨테이너 (1) 등장배경, 정의, 주의사항 등장배경 스프링 없이 순수 java 코드로 짜면, DI 컨테이너(이전 게시물 참고)는 클라이언트가 요청을 보낼 때마다 새로운 객체를 만들어서 반환한다. 가령 고객의 트래픽이 초당 100만큼 발생하면 flowingmooon.tistory.com 싱글톤 패턴에 따르면, 스프링 빈은 스프링 컨테이너가 생성될 때 등록되고, 스프링 컨테이너가 종료될 때까지 유지된다. 이를 두고 스프링 빈이 싱글톤 스코프를 따른다고 한다. 그렇다면 스프링 빈에 다른 스코프를 부여할 수 있을까? @Scope 어노테이션을 활용하면 된다. 이번 포스팅에서는 ..
데이터베이스 커넥션 풀을 연결할 때. 혹은 소켓을 연결할 때. 객체 생성 이후 연결을 맺고, 객체가 사라지기 전에 연결을 끊는 작업이 필요하다. 스프링에서는 이런 초기화 작업, cleanup 작업을 쉽게 할 수 있도록 기능을 제공한다. 먼저 스프링 빈의 라이프사이클은 다음과 같다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> ... -> 소멸전 콜백 -> 스프링 종료 스프링에서는 초기화 콜백, 소멸전 콜백을 구현할 수 있는 세가지 방법을 제공한다. spring 인터페이스를 활용하는 방법, @Bean 기능을 이용하는 방법, 또 다른 annotation을 활용하는 방법이다. 차례대로 알아보자. 1. 인터페이스 InitializingBean, DisposableBean..
Map, List를 이용하면 스프링 빈에 등록되어 있는 구현체들을 조회할 수 있다. 이를 통해 다형성 있는 프로그램을 작성해보자. 먼저, Map과 List에 스프링 빈에 담긴 구현체를 모두 가져오는 방법은 다음과 같다. static class DiscountService { private final Map policyMap; private final List policies; @Autowired public DiscountService(Map policyMap, List policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println..
@Autowired를 통해 의존관계를 주입할 때, spring은 type을 통해 적절한 구현체를 찾아 주입해준다. 이때, type이 일치하는 spring bean이 여러 개라면 어떻게 될까? 다음과 같은 error 가 난다. NoUniqueBeanDefinitionException 하나의 matching을 기대했지만 2개가 matching 된댄다. (참 친절하다..) 해결 방법은 세 가지가 있다. 1. 의존관계 주입시 변수명을 주입할 객체와 동일하게 한다. 위와 같이 구현체의 변수명을 특정하면 스프링이 type과 match 되는 것이 여러 개일 경우 변수명을 통해 적절한 구현체를 주입해준다. 하지만 이 방법은 의존관계를 바꿀 때 클라이언트의 코드를 수정하는 것이므로 개방-폐쇄 원칙을 위반한다. 2. @Q..
의존관계를 주입하는 방법은 크게 세 가지가 있다. 1. 생성자 주입 2. 수정자 주입 3. 필드 주입 차례대로 알아보자. 1. 생성자 주입 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountP..
class를 수동으로 Spring Bean에 등록하는 방법은 다음과 같다. 번거롭고, Bean에 등록하는 코드를 따로 작성하다보니 빼먹을 가능성이 있다. 이를 해결하기 위해 spring bean 등록을 더 쉽게 할 수 있는 방법이 있다. Component Scan 우선 config 파일에 @ComponentScan을 붙인다. 그리고 등록하고 싶은 class에 @Component를 붙인다. 이렇게 하면 spring이 spring container에 알아서 bean 등록을 해준다. 그런데... bean을 등록하는 건 알겠는데, 그러면 의존관계는 어떻게 주입할까? 수동으로 bean을 등록할 때는 의존관계를 프로그래머가 선택해서 넣어줄 수 있었는데... @Autowired 를 이용하면 된다! 생성자 코드에 @A..
문제 상황 LOCAL에서 작업한 스프링을 EC2 서버에 배포하려고 했다. ./gradlew build 명령어로 jar file을 생성하고, java -jar xxx.jar 명령어로 spring application을 실행시켰다. 그런데... build를 하다가 db connection 하는 작업에서 멈춰버렸다. 설상가상으로 ctrl+c 도 안 먹어서 인스턴스를 여러 번 껐다 켰다... 지인에게 조언을 구하니 ec2에서 swap memory를 할당해주지 않아서 생기는 문제인 것 같다고. free -m 명령어로 확인해보니 정말 swap memory가 0이었다. 그런데 swap memory란 뭘까? swap memory 하드디스크의 일부를 확장된 RAM처럼 사용할 수 있게 만드는 것. OS는 메모리에 올라와 ..
그렇다면 스프링은 어떻게 싱글톤 패턴을 유지하는 걸까? 스프링빈 설정 정보를 담은 AppConfig를 AnnotationConfigApplicationContext로 넘기면, AppConfig 또한 스프링 빈으로 등록된다. AppConfig 파일을 스프링 빈에서 꺼내서 출력해보면... 예상대로라면 클래스명이 AppConfig로 나와야하는데... $$EnhancerBySpringCGLIB이라는 게 추가된 클래스명이 나온다. 어떻게 된 일일까? 내가 AppConfig를 넘겨주면 스프링은 그것을 있는 그대로 스프링 빈으로 등록하지 않는다. CGLIB이라는 바이트코드 조작 라이브러리를 사용해서 AppConfig를 상속한 다른 클래스(AppConfig@CGLIB)를 만든다. 그리고 이 클래스를 스프링 컨테이너에 ..
등장배경 스프링 없이 순수 java 코드로 짜면, DI 컨테이너(이전 게시물 참고)는 클라이언트가 요청을 보낼 때마다 새로운 객체를 만들어서 반환한다. 가령 고객의 트래픽이 초당 100만큼 발생하면 초당 100개의 객체가 생성되고 소멸된다. 따라서 메모리 낭비가 심하다. 이를 해결하려면 객체를 하나만 만들어 놓고 클라이언트들이 동일한 객체를 요청하면 이 객체를 반환해서, 모든 클라이언트가 하나의 객체를 공유하게끔 하면 된다. 이것이 바로 싱글톤 패턴이다. 위 코드는 싱글톤 패턴을 자바코드로 구현하는 방법 중 하나이다. static 영역에 객체를 하나 만들어 놓고, 이 객체를 사용하려면 getInstance() 메소드를 반드시 이용하게 만든다. 그리고 생성자를 private으로 선언해서 다른 곳에서 이 객..
- Total
- Today
- Yesterday
- OOP
- 코테
- 프로그래머스
- SOLID
- 김영한
- AOP
- 디자인패턴
- 자바스터디
- 템플릿콜백
- 토비의스프링
- 서비스추상화
- 자바
- ec2
- 데코레이터패턴
- 백기선
- provider
- 프록시
- c++
- 토비의봄TV
- 카카오
- java
- 객체지향
- 코딩테스트
- 예외처리
- 토비
- gracefulshutdown
- 메서드레퍼런스
- 프록시패턴
- 스프링
- BOJ
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |