분류 전체보기
-
Spring 에러 핸들링spring/core 2021. 10. 2. 18:05
들어가며 웹애플리케이션 API서버를 만들 때 서버 퀄리티를 결정하는 건 인증과 에러처리라고 생각한다. 인증은 그 방식이 무수히 많고 깊이도 어마어마하지만 인증은(스프링 한정) 어느정도 정형화된 패턴이 있다. 스프링이 어떤 방식으로 에러를 핸들링하는지 그 방식을 커스텀하는 방법은 무엇인지 알아보자^^ @ExceptionHandler 이런식으로 컨트롤러에서 에러를 핸들링하는 메서드 위에 @ExceptionHandler 에노테이션을 붙여주면 잘 동작한다. 다만, 핸들링을 추가하려면 반드시 컨트롤러 수정이 필요하고 핸들링 범위가 딱 해당 컨트롤러만 적용된다는 점이 단점이다. HandlerExceptionResolver spring에서 기본적으로 제공하는 에러핸들러이고 커스텀해서 이용하는 방법도 있다. Handl..
-
Git 복잡한 상황 해결깃 & 깃헙 2021. 8. 4. 19:12
회사에 다니기 전 혼자 개발할 때는 깃과 깃헙을 단순하게 활용했다. 협엽을 위한 버전관리 도구보다는 그저 ssh를 이용한 클라우드 활용하기 정도였다. 생각없이 커밋, 푸시, PR한 과거를 복구하면서 정리해보자. 현재 상황 - 개발을 위한 로컬브랜치 생성 - 열심히 개발 및 무지성 커밋(대략 5번, 커밋메세지 무지성 "tmp") - 마스터와 싱크를 맞추기 위해 무지성 git merge master - github에 push 후 master에 Pull Request 문제점 - master와 싱크를 맞추는 과정 - 무지성 커밋과 무지성 메세지 본인만 이해할 법한 그림이지만 어쨌든 문제상황을 만들었다. test/second에서 커밋한 내용을 PR하고 main에 합쳤다. 그리고 main에서 그 내용을 가져왔기 때..
-
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를 수행하느라 반납이 지연되는 상황이라면 서버의 응답성은 현저하게 낮아질 것이다. 이번 작업에..
-
Future 클래스 정리java 2021. 6. 3. 10:49
배경 Java concurrent 패키지에 Future라는 클래스가 있다. 한 스레드에서 non-blocking방식으로 메서드롤 수행할 때 그 결과값을 받아올 수 있는 방식을 정의한다. 실습하며 자세히 이해해보자. Non-blocking으로 실행 main스레드에서 먼저 start를 찍고 새 스레드1을 이용해 new Thread를 찍도록 작업한다. 이후 다시 main스레드에서 end를 찍으며 작업을 마무리하는데 결과를 확인하면 end가 new Thread보다 먼저 찍혀 non-blocking으로 작업이 수행되었음을 확인할 수 있다. Future를 이용해 결과 받아오기 이번엔 submit()함수를 사용해 반환값을 지정할 수 있는 Callable을 람다로 넘겨 Future객체를 리턴받았다. (Callable은..
-
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가 될 수도, 인메모리..