[Spring MVC] Service 계층

·2022년 10월 30일
0

Spring

목록 보기
13/24
post-thumbnail

Service 계층

서비스 계층은 API계층에서 구현한 Controller 클래스가 서비스 계층의 Service 클래스와 메서드 호출을 통해 API계층과 상호작용한다.

Service 클래스

Service 클래스는 비즈니스 로직을 처리하는 구간이다.
API계층의 Controller 클래스의 핸들러 메서드와 Service 클래스의 메서드는 1대1로 매칭된다.

도메인 엔티티 클래스

  • 서비스 계층에서 데이터 액세스 계층과 연동하면서 비즈니스 로직을 처리하기 위해 필요한 데이터를 담은 클래스
  • API계층에서 전달 받은 요청 데이터를 기반으로 서비스 계층에서 비즈니스 로직을 처리하기 위해 필요한 데이터를 전달받고, 비즈니스 로직을 처리한 후에는 결과값을 다시 API계층으로 리턴해주는 역할을 한다.
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Member { //도메인 엔티티 클래스
    private long memberId;
    private String email;
    private String name;
    private String phone;
}

💡lombok 라이브러리에서 제공되는 애너테이션
@Getter/@Setter
@AllArgsConstructor : 모든 멤버변수를 가진 생성자를 자동 생성
@NoArgsConstructor : 노! 아규먼트 생성자 자동 생성

DI를 통한 API계층과의 연동

: DI를 통해 서비스 계층과 API계층을 연동한다.

💡 생성자 기반 의존성 주입을 할 경우, 주입되는 클래스 객체는 가급적 final 키워드를 사용할 것.

  • DI를 하려면 주입 받는 대상, 주입될 대상 모두 Spring Bean으로 등록되어야 한다.
  • 서비스 클래스를 Spring Bean으로 등록하려면 클래스에 @Service 애너테이션을 추가하면 된다.

Mapper

Mapper의 역할

  • DTO 클래스와 Entity 클래스를 서로 변환해주는 역할을 하며, 서로 간의 관심사를 분리시켜주는 역할을 한다.

Mapper의 생성

  • Mapper는 클래스가 아닌 인터페이스로 정의하고 @Mapper 애너테이션을 통해 MapStruct 라이브러리가 자동으로 Mapper 인터페이스의 구현체를 생성해준다.
@Mapper(componentModel = "Spring")
public interface MemberMapper {
    Member memberPostDtoToMember(MemberPostDto memberPostDto);
    Member memberPatchDtoToMember(MemberPatchDto memberPatchDto);
    MemberResponseDto memberToMemberResponseDto(Member member); 
}

💡@Mapper(componentModel = "Spring")
componentModel = "Spring" 의 의미 : Spring의 Bean이라는 뜻

☝️ Controller 클래스에 Mapper 인터페이스 import하는 것 잊지 말기

Mapper 사용 우선순위

@Build -> @AllArgsConstructor -> @NoArgsconstructor -> @Setter

DTO클래스와 Entity 클래스의 역할 분리

: DTO클래스와 Entity 클래스가 Mapper를 통해 변환하는 이유

1. 계층별 관심사의 분리

  • DTO 클래스와 Entity 클래스는 서로 다른 목적을 가지고, 서로 다른 계층에서 사용된다.

    • DTO 클래스 : API계층에서 요청 데이터를 전달 받고 응답 데이터를 전송하는 것
    • Entity 클래스 : 서비스 계층에서 데이터 액세스 계층과 연동하여 비즈니스 로직의 결과로 생성된 데이터를 다루는 것
  • 하나의 클래스나 메서드 내에서 여러 개의 기능들을 구현하고 있는 것은 객체 지향 코드 관점에서 권장되지 않는다.

    • Mapper가 생성되기 전에는 Controller 클래스에서 DTO - Entity클래스 간의 변환을 담당하고 있었음

2. 코드 구성의 단순화

  • 각자의 역할, 목적에 맞게 클래스를 작성함으로서 복잡한 로직이 줄어드는 결과를 가져온다.

3. REST API 스펙의 독립성 확보

  • Entity 클래스의 객체를 클라이언트 응답으로 전달하면 원치 않는 데이터까지 전송될 수 있으나, DTO 클래스의 객체를 사용하면 원하는 정보만 전송할 수 있다.
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글