VO, DTO, modelMapper

Web Development assistant·2023년 11월 4일
0

# cobeweb

목록 보기
6/6
> 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만을 이용하는 경우가 대부분

0개의 댓글