본문 바로가기

Coding/Java Spring23

Spring AWS SNS + SQS로 이벤트 처리하는 방법 개요 요즘 MSA, CQRS 등 아키텍처에 관한 흥미로운 주제들이 많다. 이러한 아키텍처적인 관점에서 항상 등장하는 부분이 바로 Event driven을 통한 loose coupling이다. CQRS를 예를 들어서 설명해보자. 데이터를 저장하는 명령 요청이 들어오면 쓰기DB에 데이터를 적재하고 읽기DB와의 데이터 동기화를 위해 메시지를 발행한다. 그리고 읽기DB에서는 메시지를 수신하여 데이터를 동기화시킨다. 만약 쓰기DB쪽 서버에서 직접 읽기DB 서버에 데이터 저장을 요청하는 형태라고 생각해보자. 이러한 경우 읽기DB 서버에 문제가 생긴다면 해당 문제는 쓰기DB 서버까지 전파된다. 따라서 쓰기DB는 단순히 이벤트를 발행하고 필요한 곳에서 해당 이벤트를 가져와서 사용하는 형태로 구성하여 각 서버간 의존성을.. 2022. 1. 18.
Spring Interceptor를 활용하여 JWT인증 구현하기 개요 모든 서버가 마찬가지이겠지만 개발을 하다보면 인증 관련된 로직을 단일화해서 사용해야할때가 오기 마련이다. 파이썬에서도 각 프레임워크에 맞게 작업을 해줬었는데 스프링에서는 크게 보면 Spring security와 Interceptor를 활용하여 작업할 수 있는 것으로 보인다. 이전 글(https://hides.tistory.com/1079)에서는 스프링 시큐리티 필터를 활용하여 인증 처리를 구현했는데 이번에는 인터셉터를 활용하여 인증 처리를 구현해봤다. 인터넷에서 그림을 찾아보다가 가장 이해하기 쉬운 그림인 것 같아서 가져왔다. 그림에서 나와있듯이 인터셉터의 경우 스프링 프레임워크단에서 제공해주는 기술이고 필터는 그렇지 않다. 따라서 인터셉터는 Servlet Container를 거친 이후에 실행되며 .. 2022. 1. 3.
Spring Data Redis로 레디스 연동하는 방법 개요 스프링에는 Redis와 연동하는 여러가지 방법이 존재하는데 Data JPA와 비슷하게 Data Redis라는 라이브러리를 제공한다. Lettuce와 Jedis 2가지 구현체를 통해 통신할 수 있는 방법이 있는데, Lettuce는 별다른 추가 설정없이 사용할 수 있지만 Jedis는 추가적인 의존성이 필요하다. 요즘에는 아래의 이유로 인해 Jedis보다 Lettuce를 쓰는 추세라고 한다. - Lecttue는 비동기로 요청을 처리하기 때문에 성능적인 이점이 있음 - Lecttue는 Jedis와는 다르게 별도의 풀을 생성하지 않아도 되기 때문에 개발이 단순함 - Jedis는 Thread-safe하지 않고 Spring boot 2.0부터 deprecated됨 본 포스팅에서는 Data Redis를 통해 스프.. 2021. 10. 19.
Spring ApplicationEventPublisher로 이벤트 처리하는 방법 개요 일반적으로 데이터베이스와 연결된 상황에서 코드를 작업할 때 일관성을 위해 트랜잭션을 걸어서 사용한다. (@Transactional) 만약 아래와 같은 코드가 있다고 가정해보자. @Service public class RoomService { @Transactional public void createRoom() { // 1. 룸 생성 // 2. 메일 전송 코드(외부 시스템) // 3. 유저 정보를 가져와서 소유한 룸의 개수 + 1 } } 주석을 보면 알겠지만, DB영속화를 하는 작업은 룸 생성/유저 소유 룸 개수+1 총 2개의 작업이 있다. 나머지 하나는 외부 시스템을 통해 메일을 전송한다. 1, 3번의 경우 @Transactional을 통해 하나의 트랜잭션으로 묶여있기에 둘 중 하나라도 오류가 발.. 2021. 10. 13.
Java Spring Boot 전역 예외처리하는 방법 개요 기본적으로 웹 어플리케이션 개발을 시작하는 시점에 미리 해두어야 할 선행 작업으로 생각하는 포인트가 몇가지 존재하는데, 그 중 하나가 바로 전역 예외처리이다. 예외이지만 예외가 아닌 것으로 간주해야할 것들, 예를 들어서 유저가 존재하는지 확인하는 코드에서 존재하지 않는다면 UserNotFoundException 예외를 던지는 행위와 같은 것들이다. 코드상에서는 예외로 처리하지만 서버에서 예외로 간주하기보다 정해진 Response 규격에 맞게 클라이언트로 돌려주는 형태로 처리한다. 또한 해당 예외는 Sentry(파이썬의 경우)등과 같은 에러 트래킹 툴에 보고되지말아야 하므로 관련된 처리 또한 해주는게 일반적이다. 물론 우리가 정의한 커스텀 예외를 제외하고는 당연히 에러 트래킹에 잡혀야한다. 최상위 C.. 2021. 9. 29.