자바 웹 프로젝트 #3 dto

Dear·2025년 7월 14일

TIL

목록 보기
61/74

💙 ItemFormDto

상품 등록/수정 시 폼 데이터를 담는 DTO

@NotBlank

빈 문자열 허용 X
null이거나 공백이면 검증 실패

@NotNull

null 허용 X
0은 가능

ModellMapper

ModelMapper는 Java 객체 간 자동 매핑을 도와주는 매핑 자동화 라이브러리이다.

class Item {
    private String itemName;
    private int price;
    // ... 기타 필드
}

class ItemFormDto {
    private String itemName;
    private int price;
    // ... 기타 필드
}

ModelMapper modelMapper = new ModelMapper();
Item item = modelMapper.map(itemFormDto, Item.class);

public Item creatItem() {
    return modelMapper.map(this, Item.class);
}

// 예시
ItemFormDto dto = new ItemFormDto();
dto.setItemName("라면");
dto.setPrice(1000);
Item item = dto.creatItem(); // 변환됨

이름과 타입이 같고 getter/setter가 있어야 같은 이름의 필드끼리 자동으로 복사된다.
다르다면 ModelMapperTypeMap, PropertyMap 또는 커스텀 매퍼를 사용한다.

💙 MainItemDto

상품 목록을 리스트 형태로 화면에 보여줄 때 사용하는 조회 전용 DTO

@QueryProjection

Querydsl과 함께 사용할 때 DTO를 타입 안전하게 조회하기 위해 사용한다.
이 생성자가 있어야 Querydsl이 Q 클래스를 만들 수 있다.

💙 ItemDto와 MainItemDto가 나눠진 이유

1. 역할 분리 (관심사의 분리)

DTO 이름사용 목적
ItemDto, ItemFormDto상품 등록/수정에 사용 (폼 입력)
MainItemDto메인 페이지에서 상품 목록 조회에 사용

ItemDto는 입력값 검증용 (@Notnull, @NotBlank)도 많고 이미지 리스트, 상태값 등 입력과 관련된 모든 정보를 다 담는다.
MainItemDto는 조회만을 위한 최소한의 정보만 담고 있어 불필요한 데이터는 제외된다.

2. 성능 최적화

조회 시 ItemDto를 그대로 사용하면 DB에서 모든 필드를 불러오게 된다. Dto를 나눔으로써 필요한 데이터만 가져오게 되어 성능이 향상된다.

3. 보안

등록용 DTO에는 민감하거나 관리자 전용 정보가 들어갈 수 있다. (등록일, 수정일, 작성자 등)
조회 전용 DTO는 외부에 보여줘도 되는 안정한 정보만 포함한다.

4. 유지보수 편의정

등록/수정 DTO 구조가 복잡해지더라도, 조회 DTO는 단순하게 유지할 수 잇다.
메인 페이지나 리스트 화면에서 보여주는 정보가 바뀌더라도 조회 전용 DTO만 수정하면 된다. (등록/수정용 DTO에는 영향 X)

💙 MemberFormDto

회원가입 시 사용자로부터 입력받는 정보를 담는 DTO 클래스

@Email

이메일 형식 검증 (예: aaa@bbb.com 형태)

🤍 회고

작성한 Dto외에도 ItemDto, ItemImgDto, ItemSearchDto가 있는데 이해하는데 크게 어려움이 없어 작성하지 않았다. 처음 보는 개념들, 헷갈리는 것들만 추려서 정리해보았다.

profile
친애하는 개발자

0개의 댓글