> TodoVO
@Getter
@Builder
@ToString
public class TodoVO {
private Long tno;
private String title
private LocalDate dueDate;
private boolean finished;
}
> TodoDTO
//완전히 같은 구조이지만 어노테이션에 차이가 있다.
//VO는 getter만을 이용해서 읽기 전용으로 구성한다.
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodoDTO {
private Long tno;
private String title
private LocalDate dueDate;
private boolean finished;
}
//구별하는 이유는 JPA에서 필수적?
//스프링에서 DTO는 검증이나 변환에서 전혀 다른 어노테이션들이 필요.
> modleMapper : DTO -> VO, VO -> DTO 변환을 도와줌 //ModelMapper 라이브러리를 사용
//책에서 Enum으로 만들면 싱글톤 보장이라 좋다고 하는데.. 굳이... 싶기고 하고.
//modelMapper를 사용하기 위한 MapperUtil를 enum으로 생성한다.
public enum MapperUtil {
INSTANCE; //enum의 상수명은 항상 대문자
private ModelMapper modelMapper; // 1.MapperUtil 클래스에 모델매퍼 필드 추가
//프로젝트 시작시 MapperUtil 인스턴스 생성, modelMapper초기화
MapperUtil(){
this.modelMapper = new ModelMapper();
this.modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
.setMatchingStrategy(MatchingStrategies.STRICT);
}
//get 메서드를 통해서 modelMapper 싱글톤으로 생성된 modelMapper 클래스 리턴
public ModelMapper get(){
return modelMapper;
}
}
//모델 메퍼를 이용해서 데이터를 insert하는 예시
public enum TodoService {
private TodoDAO dao;
private MdoelMapper modelMapper;
TodoService(){
dao = new TodoDAO();
modelMapper = MapperUtil.INSTANCE.get();
}
public void register(TodoDTO todoDTO) throws Exception{
TodoVO todoVO = modelMapper.map(todoDTO, TodoVO.class); //매개변수 TodoDTO를 VO로 바꿈
dao.insert(todoVO); // return int;
}
}
> 테스트
@Test
public void testRegister() throws Exception{
TodoDTO todoDTO = TodoDTO.builder() //TodoDTO의 builder 로 객체 생성
.title("JDBC TEST title")
.dueDate(LocalDate.now())
.build();
todoService.register(todoDTO); //modelMapper를 이용하여 DTO를 넣어도 내부에서 VO로 변환후 insert
DTO는 계층간 데이터 이동이고,
VO는 데이터 그 자체.
따라서 화면에서 데이터를 읽고 가져오거나 DB에 직접적인 작업을 할땐 VO
}
DTO
계층간 데이터 전송용
VO 또는 Entity
데이터베이스의 엔티티를 자바 객체로, 데이터 자체를 의미하기 때문에
getter만을 이용하는 경우가 대부분