spring
-
Spring @RequestScope 빈 스코프spring/core 2022. 8. 7. 16:48
스프링에서 관리하는 빈의 스코프는 기본값이 싱글톤이다. 웹애플리케이션을 운영하는 경우 사용자마다 다른 데이터를 갖고 서버에 진입할 수 있고 다른 데이터를 갖는다면 싱글턴빈으로는 그 값을 표현할 수 없다. 사용자마다 다른 데이터를 갖는 빈을 마치 스프링이 관리하는 싱글턴 빈처럼 사용할 수는 없을까? @RequestScope 사용 @Component @RequestScope @Setter @Getter public class HttpRequest{ private String headerMessage; private int count; } @Slf4j @RequiredArgsConstructor @RequestMapping @RestController public class TestController { pr..
-
Spring 에러 핸들링spring/core 2021. 10. 2. 18:05
들어가며 웹애플리케이션 API서버를 만들 때 서버 퀄리티를 결정하는 건 인증과 에러처리라고 생각한다. 인증은 그 방식이 무수히 많고 깊이도 어마어마하지만 인증은(스프링 한정) 어느정도 정형화된 패턴이 있다. 스프링이 어떤 방식으로 에러를 핸들링하는지 그 방식을 커스텀하는 방법은 무엇인지 알아보자^^ @ExceptionHandler 이런식으로 컨트롤러에서 에러를 핸들링하는 메서드 위에 @ExceptionHandler 에노테이션을 붙여주면 잘 동작한다. 다만, 핸들링을 추가하려면 반드시 컨트롤러 수정이 필요하고 핸들링 범위가 딱 해당 컨트롤러만 적용된다는 점이 단점이다. HandlerExceptionResolver spring에서 기본적으로 제공하는 에러핸들러이고 커스텀해서 이용하는 방법도 있다. Handl..
-
Spring 비동기 처리 - 3(WebClient와 Reactor)spring/reactive 2021. 6. 7. 10:43
배경 비동기 처리를 이용해 성능을 개선했다. 이제 Reactive Streams를 구현한 스프링의 Reactor API와 비동기 통신을 위한 WebClient를 활용해보자. AsyncRestTemplate -> Webclient DeferredResult, Future -> Reactor API(Mono, Flux) https://www.youtube.com/watch?v=bc4wTgA_2Xk&list=PLv-xDnFD-nnmof-yoZQN8Fs2kVljIuFyC&index=1 마찬가지로 토비님의 실습을 열심히 따라하며 공부한 내용이다. 의존성 분석 spring boot webflux 의존성을 추가하면 위와 같이 의존성이 추가된다. spring-webflux에 앞으로 사용할 Webclient, React..
-
Spring 비동기 처리 - 2(성능테스트)spring/reactive 2021. 6. 5. 11:32
배경 비동기 처리를 이용해 한 스레드가 불필요하게 오래 블락된 경우를 개선해보았다. 이제 동기방식으로 스레드를 관리할 때 어떤 문제가 발생할 수 있는지 또 그걸 비동기적으로 어떻게 풀어나갈지 실제로 테스트해보자. https://www.youtube.com/watch?v=ExUfZkh7Puk&list=PLv-xDnFD-nnmof-yoZQN8Fs2kVljIuFyC&index=6 토비님의 실습을 참고하며 공부한 내용이다. 문제 상황 클라이언트가 서버1에게 요청을 날리면 서버1은 서버2에게 요청을 날리고 응답이 올 때까지 블락된다. 서버2의 응답이 서버1에 도착하고 서버1이 최종적으로 클라이언트에게 응답을 주는 방식이다. 이때 100개의 요청이 동시에 서버1로 몰리는 경우를 테스트해보자. 요청하는 클라이언트 코..
-
Spring 비동기 처리 - 1(스레드 작업 분리)spring/reactive 2021. 6. 3. 18:08
배경 웹서버로 요청이 들어오고 응답이 나가기까지 과정을 간단하게 도식화했다. 요청이 들어온 경우 스레드풀에서 스레드를 할당 받고 비즈니스로직을 수행한 후 적절한 데이터와 함께 응답을 보낸다. 탐켓의 기본 설정만 따르는 경우 스레드풀로부터 할당받은 스레드는 요청이 들어온 뒤부터 응답이 나갈 때까지 반납되지 않는다. 비즈니스로직이 단순히 WAS내에서만 동작하는 로직이라면 큰 문제가 없겠지만 외부 DB와 통신하거나 다른 노드와 작업하는 로직을 포함하게 된다면 스레드는 비교적 많은 시간을 반납되지 못한 상태로 남게 된다. 서버로의 요청이 갑자기 몰려 스레드풀의 모든 스레드를 할당한 상태에서 대부분의 작업스레드가 외부IO를 수행하느라 반납이 지연되는 상황이라면 서버의 응답성은 현저하게 낮아질 것이다. 이번 작업에..
-
Reactive Streams 구현spring/reactive 2021. 6. 1. 19:10
배경 Observer패턴은 subject-observer 기반 이벤트 프로그래밍을 비동기로 처리하기 쉬운 환경을 제공한다. 공부하려는 Reactive Streams 또한 Observer패턴 기반으로 만들어졌으며 여기에 완료라는 개념과 에러를 핸들링하는 방식을 추가해서 완성되었다. Reactive Streams 공식문서 내용을 보면 Publisher는 subject와, Subscriber는 observer와 대응되는 걸 알 수 있다. 또한 Subscriber의 표준을 확인해보면 onSubscribe는 반드시, onNext()는 자유롭게, OnError나 onComplete는 구현여부를 프로그래머에게 맡겼다. 즉, 기본 Observer패턴에 약간의 기능을 선택적으로 추가하게 만든 것이다. 아키텍처 Subsc..
-
Observer 패턴spring/reactive 2021. 6. 1. 16:34
배경 reactive카테고리에 갑자기 Observer패턴이 있으니 당황할수도 있지만 reactive프로그래밍의 핵심인 Reactive Streams는 Observer패턴의 발전된 형태이니 Observer패턴을 복습할 필요가 있다고 생각했다. 핵심적인 부분만 간단하게 짚고 넘어가자. Subject Observer Status - subject : 크리에이터 - observer : 구독자 - status : 영상 Subject 이벤트가 발생한 시점에 구독자에게 영상을 전달하는 크리에이터라고 생각하면 쉽다. add()는 구독자를 추가하고, remove()는 구독취소를 처리하고, notifyStatus()는 영상이 업로드됨을 알리는 기능을 수행한다. 내부적으로 구독자를 관리하는 방법은 DB가 될 수도, 인메모리..
-
Spring Hibernate + Redis + MailSender 트랜잭션 동기화spring/JPA 2021. 5. 24. 11:31
배경 현재 프로젝트에서 사용자가 회원가입을 한 경우 흐름을 보면 DB에 사용자 저장(Hibernate) -> 인증코드 생성 후 이메일로 전송(MailSender) -> Redis에 이메일(key)+인증코드(value) 저장하는 로직이다. 이후 사용자 인증을 시도한 경우 Redis에서 데이터를 찾아 인증을 확인 후 사용자의 권한을 업그레이드한다. 흐름은 크게 3가지로 나뉘고 이 3가지 흐름은 원자적으로 묶여야 한다. 즉, 하나라도 실패한 경우 전부 실패해야하고 성공한다면 전부 성공해야 한다. 트랜잭션과 예외처리를 통해 간단하게 세 프로세스를 원자적으로 묶어보자. 상황 분석 1) redis에 우선 Hello를 key로, World를 value로 저장한다. 2) Hibernate로 member를 저장한다. 3..