SEB_BE 43일차 - 서비스 계층

subimm_·2022년 10월 24일
0

코드스테이츠

목록 보기
43/83

💡 오늘의 학습목표

  • 서비스 계층에서의 DI
  • 매퍼

📔 DI를 통한 서비스 계층 <-> API 계층 연동

  • 서비스 계층은 API계층에서 전달 받은 클라이언트의 요청 데이터를 기반으로 실질적인 비즈니스 요구사항을 처리하는 계층
  • API계층에서 구현한 Controller 클래스가 서비스 계층의 Service 클래스와 메서드 호출을 통해 상호 작용
    • Service
      • 도메인 업무 영역을 구현하는 비즈니스 로직과 관련
      • 빈약한 도메인 모델 / 풍부한 도메인 모델
      • DDD(Domain Driven Design) 도메인 주도 설계

📖 비즈니스 로직을 처리하는 Service 클래스 작성

  • MemberController의 핸들러 메서드 역할
    • postMember() : 1명의 회원 등록을 위한 요청 전달 받음
    • patchMember() : 1명의 회원 수정을 위한 요청 전달 받음
    • getMember() : 1명의 회원 정보 조회를 위한 요청 전달 받음
    • getMembers() : N명의 회원 정보 조회를 위한 요청 전달 받음
    • deleteMember() : 1명의 회원 정보 삭제를 위한 요청 전달 받음

✔ MemberService 클래스 기본 구조 작성

  • Member 클래스의 역할
    API 계층에서 전달 받은 요청 데이터를 기반으로 서비스 계층에서 비즈니스 로직을 처리하기 위해 필요한 데이터를 전달 받고, 비즈니스 로직을 처리한 후에는 결과 값을 다시 API계층으로 리턴해주는 역할

    Member클래스 처럼 서비스 계층에서 데이터 액세스 계층과 연동하면서 비즈니스 로직을 처리하기 위해 필요한 데이터를 담는 역할을 하는 클래스를 도메인 엔티티 클래스 라고한다.

✔ Member 클래스 구현

  • @Getter @Setter : lombok 라이브러리 제공 애너테이션, DTO 클래스를 작성하면서 각 멤버 변수에 해당하는 게터세터 메서드를 일일이 작성하지 않아도 됨.
  • @AllArgsConstructor : 현재 Member 클래스에 추가된 모든 멤버 변수를 파라미터로 갖는 Member 생성자를 자동 생성
  • @NoArgsConstructor : 파라미터가 없는 기본 생성자를 자동으로 생성
    https://projectlombok.org/features/ (lombok)


    ✔ MemberService 클래스 구현

📖 DI 없이 비즈니스 계층과 API 계층 연동

  • 어떤 클래스가 다른 클래스의 기능 사용 : 객체 생성 후 해당 객체로 클래스의 메서드 호출
  • (1) MemberService 클래스를 사용하기 위해 객체 생성
  • (2) 클라이언트에서 전달 받은 DTO 클래스 정보를 MemberService의 createMember() 메서드의 파라미터로 전달하기 위해 MemberPostDto 클래스의 정보를 Member 클래스에 채워넣는다.
  • (3) 회원 정보 등록을 위해서 MemberService 클래스의 createMember() 메서드 호출 (연결 지점)
  • (4) 클라이언트에서 전달 받은 DTO클래스의 정보를 MemberService의 updateMember() 메서드의 파라미터로 전달하기 위해 MemberPatchDto 클래스의 정보를 Member클래스에 채워넣는다.
  • (5) 회원 정보 수정을 위해 MemberService 클래스의 updateMember() 메서드 호출 (연결 지점)
  • (6) 한 명의 회원 정보 조회를 위해 MemberService 클래스의 findMember() 메서드 호출 (연결 지점)
  • (7) 모든 회원의 정보를 조회하기 위해 MemberService 클래스의 findMembers() 메서드 호출
  • (8) 한 명의 회원 정보를 삭제하기 위해 MemberService 클래스의 deleteMember() 메서드 호출, 특정 회원의 정보를 삭제하는 기준인 memberId를 파라미터로 넘겨준다.

📖 DI를 적용한 비즈니스 계층과 API 계층 연동

  • MemberController 생성자 파라미터로 MemberService의 객체를 주입 받음.
  • @Service 애너테이션을 추가함으로써 Spring Bean 등록
  • 생성자가 하나 이상일 경우 반드시 @Autowired 붙여야함.

📔 매퍼를 이용한 DTO클래스 <-> 엔티티 클래스 매핑

  • DTO 클래스를 엔티티 클래스로 변환하는 작업을 핸들러 메서드 말고 다른 클래스가 변환
  • 클라이언트의 응답으로 엔티티클래스 전송 말고 엔티티클래스 객체를 DTO클래스의 객체로 다시 변환
    (매퍼 필요)

📖 Mapper 클래스 구현


✔ MemberResponseDto 클래스 생성

✔ 적용

📖 MapStruct를 이용한 Mapper 자동 생성

  • MapStruct는 DTO 클래스처럼 Java Bean 규약을 지키는 객체들 간의 변환 기능을 제공하는 매퍼 구현 클래스를 자동으로 생성해주는 코드 자동 생성기
    https://mapstruct.org/
    ✔ MapStruct 의존 라이브러리 설정
    build.gradle 파일에 추가

    ✔ MapStruct 기반의 매퍼 인터페이스 정의

  • gradle 실행하면 숨김 파일로 mapper 클래스 생성됨.

📜 DTO 클래스와 엔티티 클래스의 역할 분리가 필요한 이유

  • 계층별 관심사의 분리
  • 코드 구성의 단순화
  • REST API 스펙의 독립성 확보
profile
코린이의 공부 일지

0개의 댓글