Mapstruct 에서는 ResponseDto에 포함될 필드들에 할당할 값의 출처를
@Mapping (target = "A", source = "B") 애너테이션을 사용하여 정할 수 있다.
형식 : @Mapping (target = "필드명", source = "필드 값으로 가져올 DB속 위치"
Ex 1.
@Mapper(componentModel = "spring")
public interface LibraryBookMapper {
//MemberBookMapper와는 다르게 source 에 . 을 사용한 이유는
//해당 필드들은 LibraryBook 엔티티에서 직접적인 field 로 가지고 있지 않고
//library 객체, book 객체를 통해 가져오는 것이기 때문.
@Mapping(target = "libraryId", source = "library.libraryId")
@Mapping(target = "bookId", source = "book.bookId")
@Mapping(target = "libraryBookId", source = "libraryBookId")
@Mapping(target = "bookTitle", source = "book.bookTitle")
@Mapping(target = "bookAuthor", source = "book.bookAuthor")
@Mapping(target = "bookPublisher", source = "book.bookPublisher")
@Mapping(target = "bookStatus", source = "bookStatus")
LibraryBookDto.Response libraryBookToLibraryBookDtoResponse(LibraryBook libraryBook);
List<LibraryBookDto.Response> libraryBooksToLibraryBooksDtoResponse(List<LibraryBook> libraryBooks);
}
LibraryBookDto의 Response 클래스에 있는 필드들이 target ="A" 자리에 위치.
source ="B" 는 A의 값을 어디서 가져올 것인지를 나타냄.
Ex 2.
@Mapper(componentModel = "spring")
public interface MemberBookMapper {
// LibraryBookMapper와는 다르게 source에서
// libraryId, bookId, memberBookId 를 . 없이 바로 사용한 이유는
// MemberBook 엔티티에서 해당 필드들을 바로 가지고 있기 때문이고
// bookId에서 . 을 사용한 이유는 bookId를 바로가진게 아니라 book 객체를 통해 가져오기 떄문.
@Mapping(target = "memberBookId", source = "memberBookId")
@Mapping(target = "libraryId", source = "libraryId")
@Mapping(target = "bookId", source = "book.bookId")
@Mapping(target = "createdAt", source = "createdAt")
@Mapping(target = "returnedAt", source = "returnedAt")
MemberBookDto.Response memberBookToMemberBookDtoResponse(MemberBook memberBook);
List<MemberBookDto.Response> memberBooksToMemberBooksDtoResponse (List<MemberBook> memberBooks);
}
하지만 위의 두 가지 예시를 보면 source = 부분에 어떤것은 . 을 사용하고 어떤건 바로 사용한게 있다.
source 부분에서 . 을 사용하는 기준은 MapStruct가 사용되는 엔티티 클래스에서 target에 해당하는 필드를
직접적으로 가지고 있느냐 or 아니면 연관관계에 있는 객체를 통해 가져오느냐의 기준이다.
또다른 예시를 들어보자면,
public Class User {
private String name
}
User 클래스에 String name 이라는 필드가 있다.
public Class UserDto {
public static Class Response {
String userName;
}
}
UserDto 클래스에는 String userName 이라는 필드가 있다.
public interface UserMapper {
@Mapping (target ="userName", source = "name")
UserDto.Response UserToUserDtoResponse (User user)
}
위와 같이 MapStruct를 사용하면
Response의 userName의 값을 UserDto 클래스의 필드가 아닌 User 클래스의 필드에서 가져올 수 있다.
'Tips' 카테고리의 다른 글
JUnit Test 코드 TIP (0) | 2023.05.16 |
---|---|
Spring Data JPA VS JPQL and QueryDsl (0) | 2023.05.15 |
Spring Data JPA - 자동 완성 메서드 규칙 (0) | 2023.05.12 |
JPQL 예시 (0) | 2023.05.12 |
Spring Data JPA N:N 매핑 참고사항 (0) | 2023.05.07 |