본문 바로가기

전체 글

(177)
시간 유효성 검사에서 시간 값 생성 시점 생각하기API 요청은 상품의 만료 기간이 "12:00"라고 가정 했을 때 "11:59 59.959"에 들어온 요청은 상품을 사용할 수 있도록 해주어야 하는 것일까? 사용자 입장에서는 정상적으로 상품 사용이 가능해야 한다. 회사 서비스에서는 저와 같은 상황을 연출하고 테스트 했을 때 상품을 사용할 수 없었다. 이유는 비교해야 하는 현재 시간을 API 호출 시점이 아닌 유효성을 검사할 때 생성해서 사용을 하고 있었기 때문이다. 유효성으로 가는 과정에서 "12:00"가 지나버린 것이다.사용자를 중점으로 이루어져야 하는 것이 서비스이기에 위와 같은 경우 상품을 사용할 수 있도록 해주는 것이 맞는 것 같다. 그래서 문제가 되는 기능이라고 생각을 해 수정 요청을 했다. 생성 시점은 언제로?생성 시점은 언제로 해야할..
불변 객체와 깊은 복사를 사용 해야 하는 이유 문제 & 원인상품을 획득하는 과정에서 리워드가 지급해야 하는 것보다 더 많이 발급이 된다는 것을 확인이 되었다. 리워드를 지급하는 로직에서 Redis에 캐싱해 둔 데이터 객체 내부 값을 변경하여 사용하고 있었다.변경된 객체로 Redis 캐시를 업데이트 하지 않았기 때문에 초기에 작성했을 때는 버그를 발생시키는 않는 로직이었을 것이다. 하지만 추후에 또 다른 개발자 분이 Redis의 부하를 줄이고자 인메모리 캐싱을 추가하였다. 리워드 보상에서 사용이 되는 데이터가 계속해서 업데이트 되어 인메모리 캐시에 저장이 되었고 이 때부터 문제가 발생하게 된 것이다.불변 객체불변 객체 장점은 로직을 처리하는 과정에서 객체 내부의 값이 변경이 되었을 때 발생하는 사이드 이펙트를 방지할 수 있기에 코드의 안정성을 보장할 ..
Github PR을 했을 때 Slack 알림 보내기 사이드 프로젝트에서 PR 알림 필요사이드 프로젝트에서 PR를 통해 코드 리뷰를 진행을 하고있다. PR이 되었을 때, 메일을 통해서만 전달이 되기 때문에 확인하고 리뷰를 남기는 것에 불편함이 있었다. 메일보다 더 접근성이 있으며, 쉽게 적용해볼 수 있는 것을 찾아보니 Slack이 가장 적합하다고 판단했다.Slack 알림 추가1. Slack에서 GitHub 앱 추가하기MarketPlace에서 Github을 검색하여 설치할 수 있다.https://challenge-team-talk.slack.com/marketplace/A01BP7R4KNY-github 2. Slack과 Github 연동하기Github 게정에 인증코드를 요청하고 입력하면 연동을 완료할 수 있다. 3. 적용 채널에 명령어 날리기알림을 받고 싶..
Logback에서 Log Level를 처리하는 과정 Logback 사용회사뿐만 아니라 사이드 프로젝트에서도 로그를 관리하기 위해 Logback을 사용하고 있다. 의존성 추가하고 logback.xml를 작성함으로 간단히 설정하고 사용할 수 있었다. 사용하는 데에 불편함이 없었고 원하는 대로 동작하기 때문에 아키텍처 구성과 내부 로직에 대해서 별도로 찾아보지 않게 되었다. 이번에 구현한 동작이 외부 API와 연결에 문제가 발생해서 예외가 발생을 했다. 그런데 예외에 대한 간략한 정보만 로그에 남았고 필요한 로그들은 INFO 레벨로 설정이 되어있어 남지 않았다. Logback에 ERROR 레벨로 설정이 되어있었기 때문이다. API로 정확히 어떤 데이터를 보냈고 어떤 에러가 발생했는지를 파악하기 위해 로그 ERROR로 모두 출력이 되도록 변경을 했다. 단순하게 ..
재화(크레딧, 투표권 등) 로그 데이터 정리 작업 배경회사에서 재화를 소모할 때 로그 데이터를 사용을 하고 있다. 그러다 보니 사용자의 데이터가 많아질수록 처리 속도가 느려지는 문제가 발생했다. 심한 경우 SQL Timeout 문제로 인해 처리가 안 되는 경우도 있다. 시상식 투표 기간이 다가오다 보니 광고를 보는 유저는 많아졌고 CS가 자주 들어오는 문제가 있어 로그 데이터를 정리해 주는 작업을 해주기로 했다.진행전체 로그를 합산하는 작업을 진행해야 하니 유효기간이 남은 재화만 합쳐서 정리해주는 작업이 오래 걸렸다. 특히 조회해 오는 부분에서 그랬다. 그래서 데이터가 3만 건 이상인 유저를 별도로 분리했고, 3만 건 이하의 유저만 먼저 처리하도록 했다. 그리고 3만 건 이하의 유저도 일정 숫자로 분리를 하여 한 번에 여러 유저들을 가져오도록 했다. 이..
AWS SQS 메시지 소비할 때 Visibility Timeout 문제 배경회사에서 앱으로 단체 알림을 보내는 서비스를 만들 때 순차 실행을 위해 메시지 큐 서비스인 SQS를 사용했다. SQS에 발행된 메시지를 서버 리스너가 일정 주기마다 체크를 해서 받아왔다. 받은 메시지를 기반으로 정해진 로직을 수행을 하였다. 이 때, 모든 로직이 완료가 되었을 때 SQS 메시지가 삭제가 되어야 했는데 삭제가 되지 않고 SQS에 메시지가 계속 남아있는 현상이 발생하였다.원인SQS에서 가져온 메시지를 소비할 수 있는 시간이 정해져 있었다. 소비 시간이 지나면 메시지는 반환이 되고 다른 컨슈머가 사용할 수 있는 상태가 된다. 메시지 소비 시간은 별도로 설정하지 않아 30초로 설정이 되었다. 단체 알림 로직은 대상이 되는 유저에 따라 처리 시간이 30초가 넘는 경우가 생겨 처리 완료 이전에 ..
Header 데이터 처리에 발생하는 예외에 람다 사용하기 Header 데이터 추출에서 문제앱에서 서버로 전송하는 Header에서 추출해서 사용해야 하는 데이터가 있었다. 필수값이 아니었으며 값이 있더라도 구분자로 분리를 해야 하는 데이터였다. 그러다 보니 값이 없거나, 데이터 형식이 변경이 되어 구분자로 분리하여 인덱스로 불러오는 과정에서 NPE 또는 "Index Out Of Range"가 발생할 수 있는 상황이었다. ✔ 상황S3에 데이터를 Json 형식으로 저장을 하고 있었고, 비어있는 경우 해당 필드에 Null 값을 넣는 것으로 처리하기로 되어있었다. 각 데이터에 필요한 값들을 얻기 위해 Header를 읽기 및 파싱 처리를 여러 번 해야 했다. Try Catch 문으로 여러 번 쓰는 것은 불편하다는 생각이 들어서 함수로 처리하기로 했다. ✔ 처리각기 다른 ..
앱으로 보내는 멀티 스레드 단체 알림 진행도 처리하기 단체 알림 진행도 응답관리자 페이지에서 앱으로 단체 알림의 진행도를 볼 수 있으면 좋겠다는 요구사항이 생겼다. 실시간으로 정확하게 알려줄 필요는 없다고는 했다. 그래서 관리자 페이지에서 사용할 진행도 API를 만들어 명세서를 전달하기로 했다. ✔ 비동기 멀티 스레드 환경단체 알림은 한 번에 약 100만 건 이상을 보낼 수 있도록 설계가 되었다. 비동기 멀티 스레드 환경으로 구성했으며, 보내는 알림의 전체 수를 나누어 각 스레드에 할당을 했다.   ✔ 고려 사항비동기로 처리가 되다 보니, 각 스레드의 값을 하나로 합칠 수 있는 공유 자원이 필요했다. 그리고 하나의 단체 메시지만 있는 것이 아니었기 때문에 각 단체 메시지마다 구별을 해서 진행도를 처리해야 했다. 마지막으로 단체 알림 서버가 증원이 될 수 있..