spring_2기[본캠프]/과제

[과제] Spring 플러스 프로젝트 Day 6

minwoo95 2026. 3. 17. 22:01

https://github.com/TheOne-team-1/TheOne-Bottle-Shop

 

GitHub - TheOne-team-1/TheOne-Bottle-Shop: 주류 커머스 플랫폼 백엔드 구현하기

주류 커머스 플랫폼 백엔드 구현하기. Contribute to TheOne-team-1/TheOne-Bottle-Shop development by creating an account on GitHub.

github.com

 

1. [Troubleshooting] DB 정밀도 및 컬럼 길이 제한으로 인한 런타임 예외 해결
문제 상황

주문 생성 API 호출 시 Data truncation: Data too long for column 'order_num' 에러와 함께 400 Bad Request 발생.

초기 설계 시 order_num 컬럼의 길이를 20자로 제한했으나, 시스템 내부에서 생성하는 주문 번호 형식이 이를 초과하여 DB 무결성 제약 조건을 위반함.

원인 분석

기존 주문 번호 생성 로직인 "order_" + UUID.randomUUID()가 약 42자의 문자열을 생성함.

엔티티(Order.java) 내 @Column(length = 20) 설정으로 인해 최대 길이를 초과하는 데이터 삽입 시 DataIntegrityViolationException 발생.

해결 및 조치

DB 스키마 확장: 향후 주문 번호 체계의 확장성을 고려하여 order_num의 길이를 그대로 두고

로직 최적화: UUID 방식은 가독성이 떨어지고 인덱스 성능에 불리할 수 있어, 비즈니스 요구사항에 맞는 날짜 기반 순차 번호 체계로 개편.

2. [System Design] Redis를 활용한 분산 환경에서의 순차적 주문 번호 생성기
설계 목표

YYYYMMDD-00000001 형태의 가독성 높은 주문 번호 생성.

다중 서버 인스턴스 환경에서도 번호 중복이 발생하지 않는 원자성(Atomicity) 보장.

기술 선택 근거

Redis INCR 명령 활용: Redis는 싱글 스레드로 동작하며 원자적 연산을 지원하므로, 동시 요청이 몰려도 중복 없는 순차 번호 발행이 가능함.

자동 만료(TTL) 설정: 매일 새로운 날짜로 키(order:count:20260317)가 생성되도록 설계하고, 24시간 후 자동 삭제되게 하여 메모리 효율성 관리.

결과: 자릿수 문제 해결(총 17자) 및 초당 수만 건의 주문 요청에도 안정적으로 대응할 수 있는 고성능 번호 생성 체계 구축.

3. [Refactoring] API 데이터 무결성 강화를 위한 입력값 검증(Validation) 고도화
배경

부적절한 입력값이 서비스 레이어까지 전파되는 것을 방지하고, 프론트엔드와의 협업 효율을 위해 명확한 에러 응답이 필요함.

적용 내용

계층별 검증 분리: Controller 계층에 @Valid를 적용하여 잘못된 요청을 진입 단계에서 차단.

사용자 정의 에러 메시지: DTO 내 각 필드에 @NotBlank, @Min, @Max와 함께 비즈니스 언어로 된 메시지를 명시하여 API 사용성 개선.

데이터 무결성 확보: 특히 리뷰 시스템에서 평점 범위를 1~5점으로 엄격히 제한하여 잘못된 통계 데이터 누적 방지.

Elide 처리 (UI/UX 최적화): 리뷰 목록 조회 시 대량의 텍스트 데이터를 효율적으로 전송하기 위해 DTO 레벨에서 문자열을 요약 처리하는 'Elide' 로직 설계.