Open kyupid opened 3 years ago
스프링 기본편 섹션 4. 스프링 컨테이너와 스프링 빈
수강완료
//
<이번 주 수강계획> 화 : 섹션5, 6 수 : 섹션7 목 : 섹션8, 9 금 : 섹션10
강의명: 스프링 핵심원리 기본편 수강회차: 웹 스코프 ~ 스코프와 프록시
웹 스코프
웹 스코프 종류
먼저 클라이언트 A가 요청을 한다. 컨트롤러에서 뭔가 request와 관련된 스코프를 조회한다. 로깅을 가져온다고 가정하면 공통 로그를 가져오면 A 클라이언트 전용으로 객체가 생성된다. 서비스 객체에서 로그를 또 조회한다. 그러면 http request가 같으면 같은 인스턴스를 바라보게 된다.
클라이언트 B가 동시에 들어온다고 가정한다. 클라이언트 B니까 스프링이 다른 요청이라고 생각해서 완전 별도의 http request 관련된 로거를 가지는 빈 객체를 생성해준다. B의 요청이 서비스까지 넘어가면 서비스 로직에서 스코프를 조회하면 이미 만들어 놓은 걸 반환해준다.
결론은 http request에 맞춰서 각각 할당된다. 정리하면 클라이언트A가 요청을 하면 A전용 스프링 빈이 만들어지고 운영되다가 A가 요청이 나가면 destroy가 된다. B가 요청을 하면 B전용이 생성이 되서 운영이 되다가 http request가 들어오면 동시에 request스코프를 파괴한다.
request 스코프 예제 만들기 spring-boot-starter-web 라이브러리를 추가하면 스프링 부트는 내장 톰켓 서버를 활용해서 웹 서버와 스프링을 함께 실행시킨다. 스프링 부트는 웹 라이브러리가 없으면 우리가 지금까지 학습한 AnnotationConfigApplicationContext 을 기반으로 애플리케이션을 구동한다. 웹 라이브러리가 추가되면 웹과 관련된 추가 설정과 환경들이 필요하므로 AnnotationConfigServletWebServerApplicationContext 를 기반으로 애플리케이션을 구동한다.
request 스코프
동시에 여러 HTTP 요청이 오면 정확히 어떤 요청이 남긴 로그인지 구분하기 어렵다.
이럴 때 사용하기 딱 좋은것이 바로 request 스코프이다.
기대하는 공통 포멧: [UUID][requestURL] {message}
UUID를 사용해서 HTTP 요청을 구분
requestURL 정보도 추가로 넣어서 어떤 URL을 요청해서 남은 로그인지 확인가능.
@Scope(value = "request") 를 사용해서 request 스코프로 지정했다. 이제 이 빈은 HTTP 요청 당 하나씩 생성되고, HTTP 요청이 끝나는 시점에 소멸된다.
빈이 생성되는 시점에 자동으로 @PostConstruct 초기화 메서드를 사용해서 uuid를 생성해서 저장해둔다. 이 빈은 HTTP 요청 당 하나씩 생성되므로, uuid를 저장해두면 다른 HTTP 요청과 구분할 수 있다.
이 빈이 소멸되는 시점에 @PreDestroy 를 사용해서 종료 메시지를 남긴다.
requestURL 은 이 빈이 생성되는 시점에는 알 수 없으므로, 외부에서 setter로 입력 받는다.
requestURL 값을 myLogger에 저장해둔다. myLogger는 HTTP 요청 당 각각 구분되므로 다른 HTTP 요청 때문에 값이 섞이는 걱정은 하지 않아도 된다.
컨트롤러에서 controller test라는 로그를 남긴다.
requestURL을 MyLogger에 저장하는 부분은 컨트롤러 보다는 공통 처리가 가능한 스프링 인터셉터나 서블릿 필터 같은 곳을 활용하는 것이 좋다. 여기서는 예제를 단순화하고, 아직 스프링 인터셉터를 학습하지 않으므로 컨트롤러를 사한다. 스프링 웹에 익숙하다면 인터셉터를 사용해서 구현해볼 것.
여기서 중요한 점!
스코프와 Provider 위 코드의 에러를 해결하기 위한 첫 번째 해결 방법은 Provider를 사용하는 것이다. ObjectProvider 덕분에 ObjectProvider.getObject() 를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다. ObjectProvider.getObject() 를 호출하시는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리된다. ObjectProvider.getObject() 자체를 LogDemoController , LogDemoService 에서 각각 한번씩 따로 호출해도(=ObjectProvider DL를 하는데) 같은 HTTP 요청이면 같은 스프링 빈이 반환된다!
스코프와 프록시 proxyMode = ScopedProxyMode.TARGET_CLASS 를 추가해준다.
CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다.
특징 정리
주의점 하기 전, 중급편에서 다룰 AOP가 다 이렇게 돌아간다. 가짜를 만들고 돌아간다. 여기서 중요한 점은 클라이언트의 코드를 고치지는 않는다. 스프링 컨테이너가 가진 큰 장점이다. 전체 고객 요청 당 어떤 URL이 들어와 몇초씩 걸리는 지 다 찍고싶으면 AOP와 프록시 기술을 사용하면 정말 쉬워진다고 한다.
주의점
회원 도메인 설계의 문제점
다른 저장소로 변경할 때 OCP 원칙? DIP를 잘 지키고 있을까? 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음 라는 말이 무슨 말일까.. 잘 와닿지 않는다. 김영한 - 스프링 기본 https://github.com/kyupid/core
강의명 : 스프링 핵심 원리 강의 회차 <빈 스코프>
요약
2021.07.27 섹션2
등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한 다. 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다.
컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다.
FilterType은 5가지 옵션이 있다.
강의명 : 스프링 MVC 1편 수강회차 : 스프링 MVC 섹션 1 마무리
내용
멀티쓰레드
이슈
장점
단점
: 쓰레드 풀에 미리 쓰레드를 담아두고 요청이 올 때마다 제공해주고 다 쓴 쓰레드는 다시 풀에 반환하게 하는 것 쓰레드 풀보다 많은 요청이 왔을 때, 거절 또는 대기를 할 수 있다. 즉 서버가 죽는 것을 막을 수 있음
특징
사용
장점
실무 팁
쓰레드 풀의 적정 수
WAS의 멀티 쓰레드 지원