프로젝트 (30) 썸네일형 리스트형 코틀린 Data Class와 Mybatis 같이 사용할 때 주의점 Mybatis 기본 생성자가 없는 경우Mybatis에서는 기본 생성자가 없는 경우 Mapper에 정의된 규칙을 사용하지 않는다. 주 생성자의 파라미터와 조회해 온 데이터를 순서대로 매핑을 한다. DefaultResultSetHandler 클래스에서 createResultObject를 통해서 확인을 할 수 있다.hasDefaultConstructor 메서드는 파라미터 개수가 0인 생성자 여부를 알려주며, 이것이 충족하지 않을 때 Mybatis에서 정한 규칙에 따라 자동으로 객체와 데이터를 매핑을 해준다. ✅ DefaultResultSetHandler.java private Object createResultObject(...){ if (hasTypeHandlerForResultObject(rsw, r.. Redis Scan으로 Key 삭제하기 무엇을 하고 싶은가?버그 수정 및 적용을 위해 실서버 환경에서 Redis 캐시(데이터) 갱신이 필요했다. 캐시 전략은 Cache-aside Pattern을 사용하고 있기 때문에 삭제를 통해 필요한 유저만 갱신하기로 했다. 패턴 조회를 통해 필요한 버그에 관련된 key값만 골라 삭제해 주기로 했다. 어떻게 할 수 있는가?패턴을 통한 삭제는 Redis 명령어 keys, scan을 통해서 처리를 할 수 있다. keys를 사용하면 전체 키를 조회해서 삭제를 할 수 있지만, Redis는 기본적으로 싱글 스레드로 동작을 하기 때문에 key가 많을 경우 다른 요청을 받아서 처리할 수 없는 특징이 있다. 실제 운영이 되고 있는 Redis에 keys를 날릴 경우 서비스에 장애를 가져다줄 수 있다. 운영 서비스에 영향을 .. 시간 유효성 검사에서 시간 값 생성 시점 생각하기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. 적용 채널에 명령어 날리기알림을 받고 싶.. 재화(크레딧, 투표권 등) 로그 데이터 정리 작업 배경회사에서 재화를 소모할 때 로그 데이터를 사용을 하고 있다. 그러다 보니 사용자의 데이터가 많아질수록 처리 속도가 느려지는 문제가 발생했다. 심한 경우 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 문으로 여러 번 쓰는 것은 불편하다는 생각이 들어서 함수로 처리하기로 했다. ✔ 처리각기 다른 .. 이전 1 2 3 4 다음