
목표단순 기능 구현을 넘어서, 왜 이런 구조를 선택했는지, 어떤 문제를 겪었고 어떻게 해결했는지를 기록하기 위한 글이다.이 프로젝트는 공연 예매 서비스로,동시성 이슈가 명확한 좌석 선택 도메인JWT 기반 인증/인가Redis를 활용한 캐싱과 분산 락을 핵심 기술 포인트로
문제 상황좌석 예매, 쿠폰 발급, 포인트 차감처럼여러 요청이 동시에 같은 자원을 수정하는 상황 발생단순 조회 후 수정 방식에서는 두 요청이 동시에 isSelected == false 확인동시에 true로 변경 → 중복 선택 발생단 하나의 요청만 자원을 수정나머지는 즉시
JDBC를 이용해 유저 데이터 500만 건 Bulk Insert닉네임으로 유저를 검색하는 API 구현검색 성능 병목을 분석하고 인덱스를 통해 개선성능 개선을 정량적 근거(EXPLAIN) 로 비교구현 방식JPA가 아닌 순수 JDBC + Batch InsertPrepare
사용자는 날짜만 신경 쓰지, 시:분:초까지 직접 입력할 필요가 없음UI/UX 관점에서 날짜 입력이 훨씬 직관적임DB에는 생성 시점이 LocalDateTime으로 저장됨응답 DTO는 정확한 생성 시각을 보여주는 게 맞음@DateTimeFormat(iso = DateTim
Spring Boot 애플리케이션을 AWS EC2에 배포한다RDS(MySQL) 와 연동한다서버가 살아있는지 확인할 수 있는 Health Check API를 만든다Health API는 누구나 접근 가능해야 한다배포 과정에서 발생한 문제를 직접 해결하며 AWS 네트워크 /
페이징 응답에는 보통 이 정보들이 필요합니다현재 페이지의 데이터 목록 (content)전체 데이터 개수 (totalElements)전체 페이지 수 (totalPages)현재 페이지 번호limit, offset이 들어간 조회 쿼리로는 전체 개수를 알 수 없다.목록 조회
사용자는 날짜만 신경 쓰지, 시:분:초까지 직접 입력할 필요가 없음UI/UX 관점에서 날짜 입력이 훨씬 직관적임DB에는 생성 시점이 LocalDateTime으로 저장됨응답 DTO는 정확한 생성 시각을 보여주는 게 맞음@DateTimeFormat(iso = DateTim
인덱스는 데이터 조회 속도를 높이기 위한 ‘검색용 지도’이다.원하는 데이터를 빠르게 조회하기 위한 자료구조테이블과는 별도로 저장됨일반적으로 B-Tree 구조 사용PRIMARY KEY, UNIQUE 제약 조건 컬럼에는 자동 생성사용자 테이블에 대량 데이터(천만 건) 생성
응답 속도 향상DB 부하 감소트래픽 및 외부 API 비용 절감캐시 히트(Hit) 시에는 메모리에서 바로 응답하므로 매우 빠름.캐시 미스(Miss) 시에만 DB를 조회한다.DB는 신뢰성 중심,캐시는 성능 최적화를 위한 보조 수단DB = 책상 서랍→ 안전하지만 꺼내는 데
Docker는 애플리케이션과 실행 환경을 하나로 묶어어디서 실행하든 동일하게 동작하도록 만들어주는 컨테이너 기술이다.Docker = 실행 환경을 통째로 포장하는 기술환경이 다르면 결과도 달라지기 때문이다.개발자 PC: Windows / Mac서버 환경: Linux라이브
JPQL(Java Persistence Query Language) 은 엔티티 객체를 대상으로 쿼리를 작성하는 문자열 기반 쿼리 언어이다.JPQL은 간단한 쿼리에는 유용하지만, 실무에서 복잡한 조건이나 동적 쿼리를 작성할 때 여러 한계가 드러난다.문자열 기반 : IDE
테스트 코드는 시간 낭비가 아니라, 미래의 나를 지켜주는 보험테스트 코드가 없으면 기능 수정 시 기존 코드가 깨질까 항상 불안배포 후 버그 발견 → 긴급 수정“어제 되던 기능이 오늘 안 됨” 같은 미스터리 발생기능 수정 후 테스트 한 번으로 안정성 확인리팩토링을 자신
문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를

JPQL (Java Persistence Query Language)은 Entity 객체를 대상으로 쿼리를 작성하는 객체 지향 SQL이다.사용하는 이유객체 중심 개발에 자연스럽게 녹아들 수 있음JPQL은 SQL이 아닌, 객체(Entity) 를 대상으로 작성함테이블/컬럼
봄버맨은 크기가 R×C인 직사각형 격자판 위에서 살고 있다. 격자의 각 칸은 비어있거나 폭탄이 들어있다.폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈 칸이 되며, 인접한 네 칸도 함께 파괴된다. 즉, 폭탄이 있던 칸
문제 14016번 춘향이는 편의점 카운터에서 일한다. 손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개
ArgumentResolver등록이 안되는 문제 발생코드오류 코드를 봤을 때 resolver.add(A) A에 들어가는 값이 null 값처리가 된다는 문구를 확인하였고 resolver는 아무 문제가 없었다.한참을 씨름을 하다가 Webconfig 클래스에 @Configu
Admin API의 응답값이 void라서 로깅 시 Request/Response Body가 모두 null로 찍히는 문제PATCH /admin/users/{id}DELETE /admin/comments/{id}void 자체가 잘못된 것은 아니지만 운영 환경 로깅을 생각하

모든 요청에 대해 로그를 남기고 싶다로그인된 사용자만 특정 요청을 허용하고 싶다요청이 들어올 때마다 요청 시간을 측정하고 싶다특정 서비스 로직 실행 전후로 공통적인 검증이나 처리를 하고 싶다다만 이 로직들을 모든 코드에 작성하게 된다면 가독성도 떨어지고 보수하기 굉장히