반응형
Data Transfer Object (DTO)
- 계층 간 데이터 교환을 위해 사용하는 객체
- 여기서 말하는 계층이란, View - Controller - Service - DAO와 같은 각 계층을 말한다.
- VO와 혼용되어 쓰이나, 이는 보통 DTO를 지칭하는 말이다.
- 데이터를 전달하고 주고 받을때 기존의 클래스를 사용하지 않고, 새로운 클래스를 만들어서 하는것.
- 데이터를 담을 private 변수와 그 변수를 조작할 수 있는 Getter, Setter 메서드로 구성돼있다.
- form, ajax에서 name 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 , 값을 받아야 할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 name 속성의 이름이랑 매칭 되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 UserDTO를 자료형으로 값을 받을 수 있다.
- DB 값 → DAO → Service → DTO
기존의 코드
public Long update(Long id, Course course) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(course);
return course1.getId();
}
업데이트 서비스에서 업데이트 메소드를 만들었을 때,
1. 업데이트할 대상의 ID
2. 업데이트할 내용을 가진 데이터
가 Course class를 이용해서 전달을 받고 있다.
이는 DB에 연결된 Class를 직접적으로 바꾸는 방식이라, 오류가 날 가능성이 높아진다.
이러한 상황에서 DTO가 필요한 것이다.
DTO 파일 생성
package com.sparta.week02.domain;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@RequiredArgsConstructor
public class CourseRequestDto {
private final String title;
private final String tutor;
}
Application 수정
// 이 코드를
Course new_course = new Course("웹개발의 봄, Spring", "임민영");
courseService.update(1L, new_course);
// 아래와 같이 수정
CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
courseService.update(1L, requestDto);
CourseService 수정
// 이 코드를
@Transactional
public Long update(Long id, Course course) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(course);
return course1.getId();
}
// 아래와 같이 변경
@Transactional
public Long update(Long id, CourseRequestDto requestDto) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(requestDto);
return course1.getId();
}
Course 수정
public Course(CourseRequestDto requestDto) {
this.title= requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
public void update(CourseRequestDto requestDto) {
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
실행확인
Application 전체코드
public class Week02Application {
public static void main(String[] args) {
SpringApplication.run(Week02Application.class, args);
}
@Bean
public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
return (args) -> {
courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
System.out.println("데이터 인쇄");
List<Course> courseList = courseRepository.findAll();
for (int i=0; i<courseList.size(); i++) {
Course course = courseList.get(i);
System.out.println(course.getId());
System.out.println(course.getTitle());
System.out.println(course.getTutor());
}
CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
courseService.update(1L, requestDto);
courseList = courseRepository.findAll();
for (int i=0; i<courseList.size(); i++) {
Course course = courseList.get(i);
System.out.println(course.getId());
System.out.println(course.getTitle());
System.out.println(course.getTutor());
}
};
}
}
반응형
'스프링 (Spring) > DTO, Lombok, JPA, H2' 카테고리의 다른 글
JPA 사용 심화 (0) | 2021.07.20 |
---|---|
Lombok (0) | 2021.07.15 |
Spring의 Service / JPA Update, Delete (0) | 2021.07.14 |
JPA Repository - Save, findAll, findById (0) | 2021.07.14 |
CRUD (0) | 2021.07.13 |
댓글