지난 포스팅까지 우리는 데이터를 저장하는 Repository와 비즈니스 로직을 수행하는 Service를 구현했다. 하지만 이 코드들은 아직 내 컴퓨터 안에서만 동작할 뿐, 외부 세상(프론트엔드, 앱)과는 단절되어 있다.이번에는 클라이언트의 요청을 받아 서비스 계층으로 연결해 주는 컨트롤러(Controller) 를 구현하고, 들어오는 데이터를 안전하게 검사하는 유효성 검증(Validation) 과정을 다룬다.1. 컨트롤러의 책임: "선은 넘지 말자"초보 개발자가 흔히 하는 실수 중 하나는 컨트롤러에 비즈니스 로직을 넣는 것이다. 컨트롤러는 "교통 정리"만 해야 한다.해야 할 일 (O): HTTP 요청받기, 입력값 검증(@Valid), 서비스 호출, HTTP 상태 코드(200, 201, 400...) 결정...
지난 포스팅에서 Testcontainers를 이용해 데이터 접근 계층(Repository)의 신뢰성을 확보했다. 이제는 이 데이터를 가공하여 실제 비즈니스 로직을 수행하는 서비스(Service) 계층을 구현할 차례다.1. DTO 설계: Entity를 밖으로 노출하지 마라서비스 계층의 첫 단추는 데이터를 주고받을 그릇(DTO)을 만드는 것이다. Entity를 컨트롤러 파라미터로 직접 받으면, 원치 않는 필드가 변경되거나 스펙 변경 시 DB 구조까지 흔들리는 부작용이 있다.Java 17의 record를 사용하여 불변(Immutable) DTO를 만들었다.public record MemberSignupRequest( @NotBlank String email, @NotBlank Stri..
1. 들어가며이전 포스트에서 엔티티를 구현하는 과정을 거쳤다. 물론 22개의 ERD에 따라 모든 엔티티를 구현하지는 않았다. 우리가 기능단위로 개발을 진행하니 구현이 필요할 때 작업할 예정이다. 그보다 이번에는 DataJPA를 사용하는 Repository 계층을 구현하고 테스트를 작성하였던 과정과 그 과정에서 겪었던 문제들과 해결방법을 소개하려고 한다.2. 기술 선정: 왜 Spring Data JPA인가?프로젝트의 핵심은 유저와 디지털 카드 데이터를 효율적으로 관리하는 것이다. 이를 위해 Spring Data JPA를 선택했다.JPA (Java Persistence API)란?JPA는 자바 애플리케이션에서 관계형 데이터베이스(RDBMS)를 사용하는 방식을 정의한 인터페이스(표준 명세)다. 과거에는 SQL..
1. 들어가며지난 포스팅에서 마플샵과 차별화된 디지털 굿즈 플랫폼 Universe Pick의 DB 설계를 진행했다. 총 22개의 테이블이 나왔고, 이제 이 설계도를 실제 Spring Boot(JPA) 엔티티 코드로 옮기는 작업을 진행하겠다. 모든 테이블을 설명하면 내용이 너무 많아 일단 이번 편에서는 member와 관련된 테이블들을 구현하겠다. 단순히 테이블을 매핑하는 것이 아니라, "안전한 객체 사용"과 "데이터 무결성"을 위해 적용한 몇 가지 JPA Best Practice와 설계 의도를 기록한다.2. 개발 환경 세팅 (Docker + Spring Boot)로컬 DB 설치의 번거로움을 줄이기 위해 Docker Compose를 사용했다. PostgreSQL 15 버전을 컨테이너로 띄우고, Spring ..