🌼서비스 계층
API 계층에서 전달 받은 클라이언트의 요청 데이터를 기반으로 실질적인 비즈니스 요구사항을 처리하는 계층
Spring 의 DI(의존성 주입)를 이용하여 API 계층과 비즈니스(서비스) 계층을 연동하고
API 계층에서 전달받은 DTO 객체를 비즈니스(서비스) 계층의 도메인 Entity 객체로 변환해서 전환
API 계층과 서비스 계층을 연동한다
API 계층에서 구현한 Controller 클래스가 서비스 계층의 service 클래스와 메서드 호출을 통해 상호작용한다
🌼DTO 클래스와 엔티티 클래스의 역할 분리가 필요한 이유
🎀계층별 관심사의 분리
기능별로 서로 사용되는 계층이 다르다 ( OOP의 단일 책임 원칙(SRP)에 따라 더 좋은 OOP를 위해)
DTO 클래스
API 계층에서 클라이언트의 Request Body를 전달받고
클라이언트에게 되돌려 줄 응답 데이터를 담는 역할
Entity 클래스
서비스 계층에서 데이터 액세스 계층과 연동하면서 비즈니스 로직을 처리하기 위해
필요한 데이터를 담는 역할을 하는 클래스
(DTO 클래스와 비즈니스 클래스 합친 역할)
🎀코드 구성의 단순화
DTO 클래스에서 사용하는 유효성 검사 애너테이션이 Entity 클래스에서 사용이 된다면
JPA에서 사용하는 애너테이션과 뒤섞인 상태가 되어 유지보수하기 상당히 어려운 코드가 될것
🎀 REST API 스펙의 독립성 확보
Entity 클래스를 응답으로 전달하게 되면 원치않는 데이터까지 전달될 수 있음 ex. password
-> DTO 클래스를 사용하여 응답으로 전달해 원하는 정보만 제공 가능
Mapper
DTO클래스처럼 Java Bean 규약을 지키는 객체들 간의 변환 기능을 제공
(역할 구분을 위해 DTO - Entity / Entity - DTO 의 변환을 이루어줌)
MapStruct
매퍼(Mapper) 구현 클래스를 자동으로 생성해주는 코드 자동 생성기
더보기
❗ MapStruct 사용을 위해서는 아래 의존 라이브러리를 build.gradle 파일의 dependencies 에 추가해야함
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
Mapper 인터페이스에는 @Mapper 애너테이션을 붙여 MapStruct의 매퍼 인터페이스로 정의되게 해야함
@Mapper 애너테이션의 애트리뷰트로 componentMode = "spring" 을 지정해주어 Spring Bean으로 등록될 수 있도록 해야함
이 MapStruct가 자동으로 생성해준 Mapper인터페이스의 구현 클래스는 자동으로 생성되어 build > classes 디렉토리내에 Mapper 인터페이스가 위치한 패키지 안에 MapperImpl이라는 이름으로 생성됨
'개발공부🌷 > Spring MVC' 카테고리의 다른 글
Spring MVC JPA (0) | 2023.11.28 |
---|---|
Spring MVC Data JPA (0) | 2023.11.27 |
Spring MVC 예외처리 (0) | 2023.11.23 |
Spring MVC API 계층 2 (0) | 2023.11.22 |
Spring MVC API 계층 1 (0) | 2023.11.22 |