✨ DTO
- Data Transfer Object
- 계층간에 데이터를 전송할 때 사용한다.
- Contoller와 View, Controller와 Service
- DTO를 사용하는 이유
- 내부 데이터 구조를 유출하지 않는다.
- 유지보수가 쉬워진다.
- DTO를 사용하는 흐름
- View에서 Contoller로부터 DTO를 받는다.
- Contoller에서 Service로 DTO를 보낸다.
- Service에서 Entity를 Controller에 보낸다.
- Controller에서 Entity를 DTO로 변환하고, model에 담아 View로 보낸다.
DTO ➡️ Entity 또는 Entity ➡️ DTO로 변환하기
- [첫 번째 방법] ModelMapper 사용
- ModelMapper를 사용하면 자동으로 해줘서 편하다.
- [두 번째 방법] DTO와 Entity에 toEntity, toDto와 같은 메소드를 만들어서 객체를 변환
// Employee를 EmployeeResponse로 변환하는 코드
@Getter
@Entity
@Builder
@Table(name = "employees")
public class Employee {
@Id
@Column(name = "employee_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@Column(name = "phone_number")
private String phoneNumber;
@Column(name = "hire_date")
private LocalDate hireDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "job_id")
private Job job;
@Column(name = "salary")
private BigDecimal salary;
@Column(name = "commission_pct")
private BigDecimal commissionPercentage;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "manager_id")
private Employee manager;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
public EmployeeResponse toResponse() {
return EmployeeResponse.builder()
.id(id)
.firstName(firstName)
.lastName(lastName)
.email(email)
.phoneNumber(phoneNumber)
.hireDate(hireDate)
.job(job)
.salary(salary)
.commissionPercentage(commissionPercentage)
.department(department)
.build();
}
}
@Getter
@Setter
@Builder
public class EmployeeResponse {
private Long id;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private LocalDate hireDate;
private Job job;
private BigDecimal salary;
private BigDecimal commissionPercentage;
private Department department;
}
참고 👇
https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/
https://kafcamus.tistory.com/12?category=912020
https://techblog.woowahan.com/2711/
https://www.youtube.com/watch?v=4Pvd0KrTfvE
반응형
'Framework > Spring Boot' 카테고리의 다른 글
댓글 최신순 정렬 (0) | 2022.06.08 |
---|---|
[Error] Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'post' available as request attribute (0) | 2022.05.24 |
[Error] Error creating bean with name 'emailConfig': Injection of autowired dependencies failed; (0) | 2022.03.04 |
JavaMailSender를 이용한 메일 전송 (0) | 2022.03.03 |
[Error] HTML 템플릿 메일 전송시 내용 깨짐 (0) | 2022.03.03 |