본문 바로가기

Web/BackEnd12

[Backend] RabbitMQ 에러 핸들링 (feat. Retry) 무한 예외 발생MQ를 활용한 기본 발급 로직을 짠 뒤, 실패 테스트를 하던 중에 리스너에서 계속 예외를 던지는 상황을 마주하게 된다.Execution of Rabbit message listener failed. 기본적으로 RabbitMQ에서는 다른 조치가 없으면 리스너에서 예외가 발생하면 다시 큐에 집어넣게 된다.그리곤 무한히 반복하게 되기 때문에 이런 상황을 마주한 것이다.무한 Retry 해결하기이 상황을 해결하는 가장 쉬운 방법은 다음과 같다.1. Requeue 옵션 설정하기다음과 같이 yml 설정하면 가장 간단하게 Requeue 옵션을 제어할 수 있다.# application.ymlspring: rabbitmq: listener: simple: # exchange 옵션에 따라 다르.. 2024. 7. 14.
[Backend] flyway 사용하기 🙋 들어가며 우리는 코드를 관리하기 위해서 git이라는 형상 관리 툴을 사용합니다. 반면에 여러분들은 DB는 어떤 것으로 형상을 관리하시나요? 바로 Flyway가 DB에 대한 형상 관리를 제공합니다. 이번 글에서 간단하게 사용법을 알아보겠습니다. 😋 🪽 flyway란? 공식 문서에는 다음과 같이 소개합니다. 😮 Flyway is an open-source database migration tool. DB 형상 관리를 도와주는 도구입니다. 심지어 오픈 소스입니다! 😋 🤔 왜 사용할까? 저는 개발을 할 때 DDL을 직접 작성해서 관리하는 것을 선호합니다. 스키마에 변경사항이 생기면 하나하나 수정했습니다. (다행히도 꼼꼼한 성격 때문에 아직까진 실수한 적 없습니다 😜) 만약 관리해야 할 DB가 많다면 이 과정.. 2023. 10. 11.
[Backend] DB 인덱스 이해하기 🙋 들어가며 처음 자료구조를 공부할 때 우리는 배열을 가장 먼저 접합니다. 배열에서 데이터가 어디에 있는지 나타낼 때 인덱스라는 용어를 사용하는데, 데이터베이스에서도 이 인덱스라는 용어를 사용합니다. 이번 글을 통해서 인덱스가 무엇이고 어떻게 사용하는지 알아보겠습니다. 📚 인덱스란? 저번에 읽었던 책에서 찾고 싶은 내용이 있을 때 어떻게 찾을까요? 맨 앞에 있는 목차혹은 끝에 있는 찾아보기를 참고할 것 같습니다. 이렇게 빠르게 찾기 위해서 도움을 주는 페이지를 인덱스라고 합니다. 페이지라고 표현한 이유는 DB에서 인덱스는 하나의 자료구조이기 때문입니다. 기본적으로 인덱스는 키를 정렬해서 보관합니다. 🤔 왜 빨라질까? 인덱스를 둔다는 것은 원하는 데이터가 어디에 있는지 마킹해두는 것입니다. 마킹을 기반으로.. 2023. 8. 4.
[Backend] 트랜잭션, 격리 수준 🙋 들어가며 데이터를 다룰 때 트랜잭션이라는 용어가 자주 등장합니다. 이번 글에서 우리는 자주 언급되는 트랜잭션이 무엇이고 특징이 어떤 것들이 있는지 알아보고, 주의할 점은 어떤 것들이 있는지 알아보겠습니다. 🤔 트랜잭션이란? 트랜잭션은 특별한 작업의 단위를 의미합니다. 어떤 특징이 있어서 단순한 작업과 다르게 표현을 하는 것일까요? 👀 특징 트랜잭션을 이야기할 때는 ACID라고 부르는 특징을 이해해야 합니다. ACID를 지키고 있는 단위를 우리는 트랜잭션이라고 부르는 것입니다. 🎭 루미큐브 루미큐브는 가장 유명한 보드게임 중 하나입니다. 이 게임은 트랜잭션의 특징과 아주 비슷합니다. 다음은 규칙입니다. 🎯 루미큐브 규칙 4가지 색을 가진 1부터 13까지 숫자가 존재한다. 필드에 제출된 숫자들은 같은 색.. 2023. 7. 27.
[BackEnd] MapStruct 사용기 😋 MapStruct 사용기 객체 간의 간단한 매핑을 위해서 MapStruct를 도입한 이야기를 해보려고 합니다. 어떻게 사용하는지와 사용하고 어땠는지 적어보겠습니다. 🪄 MapStruct란? Java 기반의 객체 매핑 라이브러리입니다. 다음과 같은 특징을 가지고 있습니다. 컴파일 시점에 매핑 코드를 작성한다. 그래서 런타임 시 오버헤드가 없고 안전하다. 다른 매핑 라이브러리보다 빠르다. 어노테이션을 통해서 매핑을 개발자가 쉽게 제어할 수 있다. Lombok에 대한 의존성이 꼭 필요하다. 💡 MapStruct 사용법 예시에 사용될 DTO와 Entity는 다음과 같습니다. // DTO 1번 public class RequestDto { private String title; private String co.. 2023. 5. 13.
[BackEnd] Enum 유효성 검사 구현기 🤔 들어가기 앞서 사실 enum에 대한 유효성 검사를 위해서 Custom Annotation을 구현할 필요는 없을 수 있다. 하지만 나는 DTO에서 enum 타입 자체를 가지고 있고, 구현한 enum 타입이 많아서 만들었다. 이를 통해서, Parse 오류도 잡고 클라이언트에서 어떤 값을 잘못 보냈는지 확인할 수 있게 되었다! 😋😋 Custom Annotation을 구현하는 방법은 이전에 작성한 글을 참고하기 바란다! 🪄 Enum용 CustomAnnotation 만들기 작성한 코드는 우선 다음과 같다. 핵심으로 표시한 부분은 다음에 설명하겠다. @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = .. 2023. 4. 25.