Spring
[DB] -> entity -> (mapper) -> DTO -> (constructor) -> ResDTO
lluna
2022. 2. 7. 15:03
이 과정을 거쳐야 하는 이유가 뭘까?
로직이 명확하다.
초기 구현 시간은 더 들지만 추후에 수정이 필요한 경우 오히려 수정시간이 짧아진다.
프론트엔드가 요구하는 정보가 변경되었다면, ResDTO 만 수정하면 된다.
프론트엔드에서 들어오는 정보가 변경되었다면 ReqDTO 만 수정하면 된다.
엔티티 field 와 controller 에서 다룰 data 가 100% 동일한 경우는 거의 없을 것이다. 필드명도, 주어지는 정보도 주어야 할 정보도 다르다.
그래서 유지보수 측면에서 Transfer 객체를 만들어주는 것이다.
package com.ssafy.db.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "book_name")
private String bookName;
@Column(name = "book_author")
private String bookAuthor;
@Column(name = "book_contents")
private String bookContents;
@Column(name = "book_publisher")
private String bookPublisher;
@Column
private String isbn;
@Column(name = "book_pub_year")
private int bookPubYear;
@ManyToOne
@JoinColumn(name = "GENRE_ID")
private Genre genre;
@Column(name = "book_thumbnail_url")
private String bookThumbnailUrl;
@Column(name = "loan_count")
private int loanCount;
}
package com.ssafy.DTO;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class BookDTO {
private int id;
private String bookName;
private String bookAuthor;
private String bookContents;
private String bookPublisher;
private String isbn;
private int bookPubYear;
private int loanCount;
private int genreId;
private String bookThumbnailUrl;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class GetBookRes {
private int id;
private String name;
private String author;
private String contents;
private String publisher;
private String isbn;
private int pubYear;
private int loanCount;
private int genreId;
private String thumbnailUrl;
public GetBookRes(BookDTO data) {
setName(data.getBookName());
setAuthor(data.getBookAuthor());
setContents(data.getBookContents());
setPublisher(data.getBookPublisher());
setIsbn(data.getIsbn());
setPubYear(data.getBookPubYear());
setLoanCount(data.getLoanCount());
setGenreId(data.getGenreId());
setThumbnailUrl(data.getBookThumbnailUrl());
}
}