서비스 계층 ? :
API 계층(Web Layer)에서 전달 받은 클라이언트의 요청 데이터를 기반으로
실질적인 비즈니스 요구사항을 처리하는 핵심 계층
DI를 통한 서비스 계층 ↔ API 계층 연동
API 계층과 서비스 계층을 연동한다?
= API 계층에서 구현한 Controller 클래스가,
서비스 계층의 Service 클래스와 메서드 호출을 통해 상호 작용한다는 것!
➡ 컨트롤러에서 작성해주었던 핸들러 메서드로
전달받은 요청을 처리하는 메서드를 서비스 클래스에 작성한다.
Controller 클래스 / Service 클래스 / Entity 클래스의 각 목적과 역할 잘 생각해보기!
오늘 제작했던 코드 기반으로 살펴보자면,
(순서는 코드 작성했던 순)
1. MemberController
: 클라이언트의 요청의 엔드포인트인 컨트롤러 클래스
핸들러메서드로 post, patch, get(id별, 전체 멤버), delete 를 작성했다.
2. Member ~ dto
: 클라이언트의 Request Body를 전달 받고 클라이언트에게 되돌려 줄 응답 데이터를 담는 역할
RequestBody가 필요한(리소스의 추가, 변경이 필요한) post, patch 의 dto를 만들었다.
get은 리소스 조회 용도이기 때문에 딱히 Request Body가 필요하지 않았다.
3. Member (entity)
: API 계층에서 전달 받은 요청 데이터를 기반으로
서비스 계층에서 비즈니스 로직을 처리하기 위해 필요한 데이터를 전달 받고,
비즈니스 로직을 처리한 후에는 결과 값을 다시 API 계층으로 리턴해준다.
*도메인 entity 클래스?
: 서비스 계층에서 데이터 액세스 계층과 연동하면서
비즈니스 로직을 처리하기 위해 필요한 데이터를 담는 역할을 하는 클래스
* @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor
No ~ : 파라미터가 없는 기본 생성자를 자동으로 생성해준다
All ~ : 클래스에 추가된 모든 멤버 변수를 파라미터로 갖는 Member 생성자를 자동으로 생성해준다
4. Service
: 실질적인 비즈니스 로직을 행하는 핵심 클래스
* @Service?
DI를 이용하여 MemberController 생성자 파라미터로 MemberService의 객체를 주입받는다. (둘 연동)
객체 주입을 받기 위해서는 주입 받는, 대상 클래스 모두 Spring Bean 이여야 하는데
MemberController 클래스는 @RestController 어노테이션으로, (@Controller와 달리 json 형태를 받음)
MemberService 클래스는 @Service 어노테이션으로 Spring Bean으로 등록 가능하다.
(@Component도 가능, but @Service가 더 직관적!)
* 생성자가 하나일 경우 @Autowired 생략 가능, 하나 이상일 때는 필수!
5. Mapper
: DTO 클래스와 엔티티 클래스 간의 타입을 서로 변환해주는 변환자
DTO 클래스와 Entity 클래스 역할 분리 이유?
1) 계층별 관심사 분리
2) 코드 구성 단순화
3) REST API 독립성 확보
* MapStruct? : 객체들 간의 변환 기능을 제공하는 Mapper 구현 클래스를 자동 생성해주는
코드 자동 생성기
1) build.gradle 에 MapStruct 의존 라이브러리 추가해준다.
2) MapStruct 기반의 인터페이스를 정의해준다
3) @Mapper 어노테이션의 애트리뷰트로 componentModel = "spring" 도 지정해준다
4) build를 돌리면 이 인터페이스를 구현한 매퍼 구현 클래스가 자동 생성된다
'Spring' 카테고리의 다른 글
[Spring] 서비스 계층 예외 던지기(throw) 및 예외 처리 (+ Custom Exception 생성) (0) | 2022.10.26 |
---|---|
[Spring] 스프링 예외처리 (@ExceptionHandler, @RestControllerAdvice) (0) | 2022.10.25 |
[Spring] DTO 란? (Data Transfer Object) (0) | 2022.10.21 |
[Spring] Controller 구조 및 핸들러 메서드(Handler Method) (0) | 2022.10.21 |
[Spring] Spring MVC란? (0) | 2022.10.21 |
댓글