Backend/Spring Basic

[Spring Web] DTO

Dto?

Data Transfer Object

dto package에 따로 관리합니다. 계층간에 데이터 교환을 위한 객체입니다.

로직을 가지고 있지 않은 순수한 데이터 객체이며 DB에서 꺼낸 값을 임의로 변경할 필요가 없기 때문에 setter가 없고 getter만 있습니다. 생성자에서 값을 할당합니다.

 

responseDto

백엔드에서 정보를 저장, 가공하고 프론트엔드에게 넘길 때 JSON 형식으로 넘기는데, 그 넘기는 과정에서 누군가가 파싱할 수 있습니다. 이 때 비밀번호 같이 보안적으로 넘기기 위험한 정보들이 중간에 가로채버리면 개인정보가 날려진 것입니다.

그래서 이를 막기 위해 ResponseDto를 통해서 정보를 전달하는데 Entity 정보를 다 넘기는 것이 아닌, Dto를 만들어서 원하는 정보만 커스텀해서 JSON 형식으로 넘길 수 있게 하기 위함입니다.

상황에 따라서 여러 다른 종류의 정보를 보내고 싶을 때는 Dto를 계속 새로 생성해주어야 합니다.

 

적용 방법

responseDto 클래스를 만들고 service단에서 적용해야 하는데 일일히 생성자에 하나하나 다 쓰기엔 너무 복잡하니 이런식으로 toDto란 메서드를 만들고 객체 자체를 받아들여 이 메서드 안에서 생성자를 통해 객체를 만드는 방식이 있습니다.

// Constructor
public ReviewResponseDto(String buyerName, int rate, String sellerName, Date review, String productName, String comment) {
    this.buyerName = buyerName;
    this.rate = rate;
    this.sellerName = sellerName;
    this.review = review;
    this.productName = productName;
    this.comment = comment;
}

// toDto
public static ReviewResponseDto toDto(Review review) {
    return new ReviewResponseDto(
            review.getUserId().getUsername(),
            review.getRate(),
            review.getProductId().getUserId().getUsername(),
            review.getDate(),
            review.getProductId().getProductName(),
            review.getComment()
    );
}

 

requestDto

유효성 검사하기 위해 쓰이는 Dto입니다. 데이터베이스를 조회할 때마다 금액이 발생하는데 이를 최소화 시키는게 목적입니다. 여기서 null, blank 등 쓸대없는 값이 발생해버리면 우리의 목적과 멀어지게 됩니다. 그래서 설정해주는 것이 requestDto입니다.

주로 @NotBlank과 함께 활용합니다.

Advice

오류를 관리해주는 패키지입니다. 여기서는 requestDto에서 null 등의 오류 처리를 할 떄 여기서 볼 수 있습니다. @Valid로 인해 @NotBlank가 실행되었을 때 Advice로 가서 예외처리가 이루어집니다.

 

이외의 데이터를 지킬 수 있는 방법

@Column

서버상의 문제 혹은, 다른 방식으로 해커가 접근을 했을 때, 최종적인 방어선입니다. 데이터베이스에 제약조건을 걸어버리면 결국 서버를 해킹해도 데이터베이스에 접근할 수 없습니다. 즉, 데이터베이스 자체에 제약조건을 걸어버리는 겁니다.

데이터의 흐름

사용자의 데이터 1 보냄 -> controller(server) @Valid -> entity @Column -> DB -> 최종 저장

1차적으로 @Valid 매개변수에서 스프링서버에서 한번 유효성 검사가 이루어지게 만듭니다.

2차적으로 entity의 @Column에서 제약조건으로 데이터베이스에서 데이터의 유효성 검사가 이루어집니다.

 

참고

 

[DAO] DAO, DTO, Entity Class의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

[스프링부트] #2 쉽게 Rest API를 만들어보기(JPA로 게시판 구현하기 및 유저 정보 넣기, Dto로 데이터

[스프링부트] #2 쉽게 Rest API를 만들어보기 (JPA로 게시판 구현하기 및 유저 정보 넣기, Dto로 ...

blog.naver.com

 

 

처음 스프링 개발을 하면서 알아뒀으면 좋았던 것들

Intro…

changrea.io