본문 바로가기

Tips

Mapstruct @Mapping(target = , source = )

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