Redis 분산 락을 적용한 예약 기능의 동시성을 검증하기 위해 RedisLockReservationConcurrencyTest를 실행하던 중 Testcontainers가 Docker 환경을 찾지 못하는 오류가 발생했다. Docker Desktop과 Docker CLI는 정상적으로 동작하고 있었기 때문에 단순한 Docker 실행 문제는 아니라고 판단했다. 원인을 추적한 결과, Spring Boot의 dependency management에 의해 Testcontainers의 실제 사용 버전이 예상과 다르게 결정되고 있음을 확인했다. 이번 글에서는 해당 오류가 발생한 상황부터 dependency를 분석하고 버전을 맞춰 해결한 과정을 정리하려고 한다. 문제 상황 기존 예약 기능의 동시성 문제를 해결하기 ..
문제 설명링크https://school.programmers.co.kr/learn/courses/30/lessons/42897 문제도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다.각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 두 집을 털면 경보가 울립니다.각 집에 있는 돈이 담긴 배열 money가 주어질 때, 도둑이 훔칠 수 있는 돈의 최댓값을 return 하도록 solution 함수를 작성하세요.제한사항이 마을에 있는 집은 3개 이상 1,000,000개 이하입니다.money 배열의 각 원소는 0 이상 1,000 이하인 정수입니다. 입출력moneyreturn[1, 2, 3, 1]4 문제 정보📍 문제 난이도 : L..
장소 예약 서비스 spotlog에 Spring Security와 JWT 기반 로그인을 적용하면서, Refresh Token을 저장할 공간이 필요했다. Refresh Token은 일정 시간이 지나면 만료되어야 하는 데이터이기 때문에 DB에 저장하는 것보다 TTL(Time To Live)을 설정해 자동으로 만료시킬 수 있는 Redis가 더 적합하다고 판단했다. Redis를 도입하기로 결정한 뒤에는, Windows 개발 환경에서 Redis를 어떻게 구성할지 고민하게 되었다. 비교 Windows 환경에서 Redis를 사용하는 방법은 크게 로컬 설치, Memurai, Docker로 나눠볼 수 있다.방식특징로컬 설치Redis의 공식 Windows 지원이 없어 최신 버전과 업데이트를 지속적으로 사용하기 어렵다. Me..
문제 설명링크https://school.programmers.co.kr/learn/courses/30/lessons/84021 문제테이블 위에 놓인 퍼즐 조각을 게임 보드의 빈 공간에 적절히 올려놓으려 합니다. 게임 보드와 테이블은 모두 각 칸이 1x1 크기인 정사각 격자 모양입니다. 이때, 다음 규칙에 따라 테이블 위에 놓인 퍼즐 조각을 게임 보드의 빈칸에 채우면 됩니다.조각은 한 번에 하나씩 채워 넣습니다.조각을 회전시킬 수 있습니다.조각을 뒤집을 수는 없습니다.게임 보드에 새로 채워 넣은 퍼즐 조각과 인접한 칸이 비어있으면 안 됩니다.다음은 퍼즐 조각을 채우는 예시입니다.위 그림에서 왼쪽은 현재 게임 보드의 상태를, 오른쪽은 테이블 위에 놓인 퍼즐 조각들을 나타냅니다. 테이블 위에 놓인 퍼즐 조각들..
📍 이 글은 프로젝트를 진행하며 겪었던 문제에 대한 해결 방법을 복기하며 정리한 글입니다. 혹시 잘못된 부분이나 더 나은 방법이 있다면 댓글로 알려주세요. 감사합니다. 🙇♀️ 프로젝트를 진행하며 브랜치를 잘못 확인한 채로 커밋을 해버렸다. 이를 수습하려다가 오히려 구현 중이던 소스 파일들을 통째로 잃는 경험을 했다.이번 글에서는 그 과정과 원인, 그리고 git stash와 reset --hard를 사용할 때 주의해야 할 점을 정리해 보려고 한다. 문제 상황작업 중인 브랜치를 잘못 확인한 채로 커밋을 해버렸다. 커밋 후에야 의도한 브랜치가 아닌 다른 브랜치에 커밋이 쌓였다는 걸 알게 되었다.이를 수습하기 위해 다음과 같은 흐름으로 진행했다.현재 브랜치에서 git stash로 변경사항 임시 저장올바른 ..
📍 이 글은 프로젝트를 진행하며 겪었던 문제에 대한 해결 방법을 복기하며 정리한 글입니다. 혹시 잘못된 부분이나 더 나은 방법이 있다면 댓글로 알려주세요. 감사합니다. 🙇♀️ 이전 글에서는 로그인 실패 상황을 표현하기 위해 LoginFailException이라는 도메인 전용 예외를 만들었다. 이 방식은 "예외 이름만 봐도 어떤 상황인지 알 수 있다"는 장점이 있었지만, 프로젝트 규모가 커지면서 새로운 문제가 드러났다. 이번 글에서는 그 문제와, CustomException+ErrorCode enum 구조로 다시 정리한 과정을 정리해보려고 한다. 문제 상황 LoginFailException처럼 상황별로 예외 클래스를 만드는 방식을 계속 적용하다 보니, 도메인이 늘어날 때마다 예외 클래스도 함께 늘어..