Spring MVC Service 계층
비즈니스 로직을 처리하는 Service 클래스
MemberService 클래스의 기본 구조
package com.codestates.member;
import java.util.List;
public class MemberService {
public Member createMember(Member member) {
return null;
}
public Member updateMember(Member member) {
return null;
}
public Member findMember(long memberId) {
return null;
}
public List<Member> findMembers() {
return null;
}
public void deleteMember(long memberId) {
}
}
member 클래스
API 계층에서 전달 받은 요청 데이터를 기반으로 서비스 계층에서 비즈니스 로직을 처리하기 위해 필요한 데이터를 전달 받고, 비즈니스 로직을 처리한 후에는 결과 값을 다시 API 계층으로 리턴해주는 역할
@Getter //lombok라이브러리를 통해 getter/setter 메서드를 자동으로 생성
@Setter
@NoArgsConstructor //현재 Member 클래스에 추가된 모든 멤버 변수를 파라미터로 갖는 Member 생성자를 자동으로 생성
@AllArgsConstructor //파라미터가 없는 기본 생성자를 자동으로 생성
public class Member {
private long memberId;
private String email;
private String name;
private String phone;
}
비지니스 계층과 API계층 연동
@RestController
@RequestMapping("/v2/members")
@Validated
public class MemberController {
private final MemberService memberService;
public MemberController() {
this.memberService = new MemberService(); // (1) MemberService 클래스의 객체를 생성
}
@PostMapping
public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) {
// (2) MemberService의 createMember() 메서드의 파라미터로 전달하기 위해 MemberPostDto 클래스의 정보를 Member 클래스에 채워넣음
Member member = new Member();
member.setEmail(memberDto.getEmail());
member.setName(memberDto.getName());
member.setPhone(memberDto.getPhone());
// (3) MemberService 클래스의 createMember() 메서드를 호출
Member response = memberService.createMember(member);
return new ResponseEntity<>(response, HttpStatus.CREATED);
}
}
매퍼를 이용한 DTO 클래스 ↔ 엔티티 클래스 매핑
DTO 클래스와 엔티티(Entity) 클래스를 서로 변환해주는 누군가 즉, 매퍼(Mapper)가 필요
Mapper 클래스
@Component // (1) MemberMapper를 Spring의 Bean으로 등록
public class MemberMapper {
// (2) MemberPostDto를 Member로 변환
public Member memberPostDtoToMember(MemberPostDto memberPostDto) {
return new Member(0L,
memberPostDto.getEmail(),
memberPostDto.getName(),
memberPostDto.getPhone());
}
}
MemberResponseDto 클래스
응답 데이터의 역할을 해주는 DTO 클래스
@Getter
@AllArgsConstructor
public class MemberResponseDto {
private long memberId;
private String email;
private String name;
private String phone;
}
Controller에 매퍼 클래스 적용
public class MemberController {
private final MemberService memberService;
private final MemberMapper mapper;
// (1) MemberMapper DI: MemberMapper 객체를 MemberController에서 사용하기 위해 DI로 주입
public MemberController(MemberService memberService, MemberMapper mapper) {
this.memberService = memberService;
this.mapper = mapper;
}
@PostMapping
public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) {
// (2) 매퍼를 이용해서 MemberPostDto를 Member로 변환
Member member = mapper.memberPostDtoToMember(memberDto);
Member response = memberService.createMember(member);
// (3) 매퍼를 이용해서 Member를 MemberResponseDto로 변환
return new ResponseEntity<>(mapper.memberToMemberResponseDto(response),
HttpStatus.CREATED);
}
MapStruct
매퍼(Mapper) 구현 클래스를 자동으로 생성해주는 코드 자동 생성기
MapStruct 의존 라이브러리 설정
▶ build.gradle의 dependencies에 아래와 같이 추가
dependencies {
...
...
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
}
▶ MapStruct 기반의 매퍼(Mapper) 인터페이스 정의
@Mapper(componentModel = "spring") // (1) @Mapper 애너테이션을 추가함으로써 해당 인터페이스는 MapStruct의 매퍼 인터페이스로 정의
public interface MemberMapper {
Member memberPostDtoToMember(MemberPostDto memberPostDto);
Member memberPatchDtoToMember(MemberPatchDto memberPatchDto);
MemberResponseDto memberToMemberResponseDto(Member member);
}