본문 바로가기

전체 글

(172)
코틀린 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. 적용 채널에 명령어 날리기알림을 받고 싶..
Logback에서 Log Level를 처리하는 과정 Logback 사용회사뿐만 아니라 사이드 프로젝트에서도 로그를 관리하기 위해 Logback을 사용하고 있다. 의존성 추가하고 logback.xml를 작성함으로 간단히 설정하고 사용할 수 있었다. 사용하는 데에 불편함이 없었고 원하는 대로 동작하기 때문에 아키텍처 구성과 내부 로직에 대해서 별도로 찾아보지 않게 되었다. 이번에 구현한 동작이 외부 API와 연결에 문제가 발생해서 예외가 발생을 했다. 그런데 예외에 대한 간략한 정보만 로그에 남았고 필요한 로그들은 INFO 레벨로 설정이 되어있어 남지 않았다. Logback에 ERROR 레벨로 설정이 되어있었기 때문이다. API로 정확히 어떤 데이터를 보냈고 어떤 에러가 발생했는지를 파악하기 위해 로그 ERROR로 모두 출력이 되도록 변경을 했다. 단순하게 ..
재화(크레딧, 투표권 등) 로그 데이터 정리 작업 배경회사에서 재화를 소모할 때 로그 데이터를 사용을 하고 있다. 그러다 보니 사용자의 데이터가 많아질수록 처리 속도가 느려지는 문제가 발생했다. 심한 경우 SQL Timeout 문제로 인해 처리가 안 되는 경우도 있다. 시상식 투표 기간이 다가오다 보니 광고를 보는 유저는 많아졌고 CS가 자주 들어오는 문제가 있어 로그 데이터를 정리해 주는 작업을 해주기로 했다.진행전체 로그를 합산하는 작업을 진행해야 하니 유효기간이 남은 재화만 합쳐서 정리해주는 작업이 오래 걸렸다. 특히 조회해 오는 부분에서 그랬다. 그래서 데이터가 3만 건 이상인 유저를 별도로 분리했고, 3만 건 이하의 유저만 먼저 처리하도록 했다. 그리고 3만 건 이하의 유저도 일정 숫자로 분리를 하여 한 번에 여러 유저들을 가져오도록 했다. 이..