본문 바로가기

Dev

(3)
[동시성 처리] MySQL named lock 으로 API 중복 호출 방지하기 최근 특정 API에 대해서 중복 호출, 전문 용어로 따닥이라고 하는 현상이 발생했습니다. 해당 API의 로직은 자동 결제 정보를 DB에 저장하는 역할을 하는데요, 동시에 두 번 요청이 들어오면서 동일한 데이터가 중복으로 쌓이는 문제가 있었습니다. 이로 인해 결제 프로세스에서 오류가 발생했고, 이를 해결하기 위한 적절한 방법을 고민하게 되었습니다. 이번 글에서는 이 문제를 해결하기 위해 MySQL Named Lock을 활용한 방법과 관련한 고민, 구현 과정 및 결과 등을 간단히 얘기해보겠습니다. 해결 방법 검토1. 중복 방지 토큰(멱등성 키) 활용클라이언트에서 멱등성 키를 생성해 서버로 전송하고, 서버는 이를 기준으로 중복 요청을 필터링하는 방법입니다.하지만 이 방법은 클라이언트측(제휴사)에서 추가 개발 ..
Lombok @Builder.Default JPA 강의를 듣던 중 작은 난관에 봉착했습니다. 하라는 대로 다 했는데 NPE가 뜬것입니다. 이리 보고 저리 봐도 잘못된 것이 없는데 왜 이럴까... IDE의 문제가 아닐까.. 컴파일러의 문제가 아닐까... 했지만 문제는 @Builder 요 녀석에게 있었습니다. @Builder 어노테이션을 사용해서 객체를 만들었는데요, 아니글쎄 디폴트 값을 넣어준 필드 변수가 계속 null 이라는 겁니다. 찾아보니 .builder().build(); 로 생성되는 객체의 필드 변수는 모두 기본값 (0 / null / false) 이 세팅이 됩니다. 디폴트 값으로 뭘 줬든지 간에요. 고맙게도 Lombok v1.16.16 버전부터 @Builder.Default 란 어노테이션이 생겼습니다. 디폴트 값 설정이 필요한 필드 변수..
[Test][JUnit 4, 5] @Before, @BeforeClass, @BeforeEach, @BeforeAll 신입 기술 교육 때 JUnit을 사용해서 테스트 코드를 짜다가 @Before 라는 어노테이션을 알게 되었습니다. 이 어노테이션이 붙으면 @Test 어노테이션이 붙은 메소드가 실행되기 전에 먼저 실행됩니다. 그래서 보통 @Before public void setUp() { //setup before testing } 이런 식으로 많이 쓰더군여. 근데 또 @BeforeClass 란 어노테이션도 있댑니다. 근데 또 @BeforeEach 도 있고 @BeforeAll 도 있다네요. 그래서 이번 글에서는 얘들을 한 번 간단히 비교해볼까 합니다. 1. @Before 공식 문서 @Before 어노테이션은 JUnit 4에 있는 어노테이션입니다. 역할은 위에서 말했듯이 간단합니다. @Test 메소드보다 먼저 실행됩니다. ..