본문 바로가기
Spring

[Spring] 서비스 계층 (Service Layer) @Service, @Mapper

by jungha_k 2022. 10. 24.

 

서비스 계층 ? :

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를 돌리면 이 인터페이스를 구현한 매퍼 구현 클래스가 자동 생성된다

댓글