레이어드 아키텍처로 User를 저장하는 API를 만들겠습니다.
* 레이어드 아키텍처
[ Controller ] : http 요청을 받습니다. 클라이언트 및 Service와 데이터를 주고받기 위해 주로 [DTO] 객체를 사용합니다.
[ Service ] : 비즈니스 로직을 처리합니다. Repository와 데이터를 주고받기 위해 주로 [Entity] 객체를 사용합니다.
[ Repository ] : CRUD 작업을 수행합니다. DB와 데이터를 주고받기 위해 주로 [Entity] 또는 [DAO] 객체를 사용합니다.
1. 패키지 분리
레이어드 아키텍처를 구현하기 위한 구조로 패키지를 분리합니다.
controller : 클라이언트로부터 GET, POST 등의 API 요청을 받기 위한 진입점입니다.
service : 비즈니스 로직을 처리합니다.
repository : entity를 DB에 CRUD 합니다.
dto : request, response 응답용 데이터를 담는 객체입니다.
entity : DB <> java 간 데이터 맵핑 객체입니다.
2. Entity 생성
entity 패키지에 User 엔티티를 생성합니다.
지난 포스트에서 만든 클래스에 name을 추가했습니다.
@NoArgsConstructor : JPA에서 기본생성자가 필수
@Builder : 엔티티를 빌더패턴으로 편리하게 생성할 수 있도록 하기 위함
@AllArgsConstructor : @Builder는 모든 필드를 초기화 할 수 있는 생성자가 필요함
@Getter : 필드를 편리하게 조회하기 위함
3. Repository 생성
repository 패키지에 UserRepository interface를 생성합니다.
JpaRepository를 확장하며, Long 타입의 키값을 갖는 User 엔티티임을 명시합니다.
* JpaRepository란, Spring Data JPA에서 제공하는 인터페이스입니다. CRUD, 페이징, 정렬 등을 기본으로 제공합니다.
* JPA란, entity와 DB의 테이블 매핑해줍니다. SQL 없이 자바 코드로 DB에 쉽게 접근할 수 있습니다.
4. Service 생성
service 패키지에 비즈니스 로직 처리를 담당할 UserService를 추가합니다.
비즈니스 로직 처리 이후 변경된 내용을 반영하기 위해, 또는 필요한 데이터를 조회하기 위해 Repository와 통신하기 때문에 UserRepository를 주입받습니다.
@RequiredArgsConstructor : final이나 @NonNull이 붙은 필드를 초기화하는 생성자를 자동으로 만들어줍니다.
@Service : Spring이 자동으로 Bean으로 등록하고 자동으로 생성자를 주입합니다.
> UserService는 UserRepository를 final로 선언했기 때문에, Spring이 UserRepository를 자동으로 생성자에 주입합니다.
5. Controller 생성
controller 패키지에 UserController를 추가합니다.
UserController는 클라이언트의 요청을 받아 UserService에서 요청에 해당하는 기능을 호출합니다.
@RequiredArgsConstructor를 통해 final로 선언된 UserService를 자동으로 주입받습니다.
@RestController를 사용하여 HTTP 요청을 처리하고 JSON 형태로 응답합니다.
6. UserDto 생성
dto 패키지에 UserDto를 추가합니다.
추후 수정, 조회 등에 필요한 클래스를 구현하기 위해 inner class로 구현하였습니다.
7. 기능 구현
- UserController.java
[POST] /users 로 들어오는 요청을 처리합니다.
{ name: "" } 형태의 데이터를 파라미터로 받습니다.
- UserService.java
DTO를 통해 받은 데이터를 기반으로 새로운 User 엔티티를 생성합니다.
UserRepository에 엔티티를 전달하여 저장합니다.
8. 테스트
Postman으로 요청하고, MySQLWorkbench로 user가 정상적으로 저장된걸 확인합니다.
'Server > SpringBoot' 카테고리의 다른 글
[SpringBoot] 조회 API 만들기 (1) | 2025.04.26 |
---|---|
[SpringBoot] JPA, MySQL 설정 (0) | 2025.04.26 |
[SpringBoot] 프로젝트 만들기 (1) | 2025.04.26 |