[웹 스터디] 모델, 엔티티, DTO

박준수·2022년 11월 22일
0

[웹 스터디]

목록 보기
8/19

보통 자바로 된 비지니스 애플리케이션의 클래스는 두가지 종류로 나눌 수 있다.

  1. 일을 하는 클래스(기능을 수행하는 클래스)

    • 컨트롤러, 서비스, 퍼시스턴스처럼 로직을 수행하는 클래스
  2. 데이터를 담는 클래스

    • 아무 기능 없이 데이터베이스에서 반환된 비지니스 데이터를 담기 위한 클래스들
    • 모델, 엔티티, DTO

모델과 엔티티

이 프로젝트에서는 모델과 엔티티를 한 클래스에 구현한다. 따라서 모델은 비지니스 데이터를 담는 역할과 데이터베이스의 테이블과 스키마를 표현하는 두 역할을 한다.

Model : 비지니스 데이터를 담는 역할
Entity : 데이터베이스의 테이블과 스키마를 표현하는 역할. DB컬럼과 연결되기 때문에 필드명이 노출되서는 안된다.

  • @Builder
    • Builder는 오브젝트 생성을 위한 디자인 패턴 중 하나이다. Builder 클래스를 따로 개발하지 않고도 @Builder 패턴을 사용해 오브젝트를 생성할 수 있다.
TodoEntity todo = TodoEntity.builder()
							.id("t-12341234")
                            .userId("developer")
                            .title("Implement Model")
                            .build();

Builder패턴을 사용하는 것은 생성자를 사용해 오브젝트를 생성하는 것과 비슷하다. 생성자 매개변수의 순서를 기억할 필요가 없다는 점!

  • @NoArgsConstructor
    • 매개 변수가 없는 생성자를 구현.
  • @AllArgsConstructor
    • 모든 멤버변수를 매개변수로 받는 생성자를 구현.
  • @Data
    • 클래스 멤버변수의 Getter/Setter 메서드를 구현.

DTO

서비스가 요청을 처리하고 클라이언트로 반환할 때, 모델 자체를 그대로 리턴하는 경우는 별로 없다. 보통은 데이터를 전달하기 위해 사용하는 오브젝트인 Data Transfer Object롤 변환해 리턴한다. 그 이유는 뭘까?

  1. 비지니스 로직을 캡슐화하기 위함이다.
    모델은 데이터베이스 테이블 구조와 매우 유사하다. 모델이 가지고 있는 필드들은 테이블의 스키마와 비슷할 확률이 높다. 이때 DTO 처럼 다른 오브젝트로 바꿔 반환하면 외부 사용자에게 서비스 내부의 로직, 데이터베이스 구조 등을 숨길 수 있다.

  2. 클라이언트가 필요한 정보를 모델이 전부 포함하지 않는 경우가 많기 떄문이다.
    예를 들어) 에러 메시지가 있다. 만약 서비스 실행 도중 유저에러가 나면 모델은 서비스 로직과는 관련이 없기 때문에 모델에 담기는 애매하다. 이런 경우 DTO에 에러 메시지 필드를 선언하고 DTO에 포함하면 된다.

userId는 애플리케이션과 데이터베이스에서 사용자를 구별하기 위한 고유 식별자로 사용하기 때문에 숨길 수 있다면 숨기는 것이 보안상 알맞다. 따라서 DTO에는 userID를 포함하지 않는다.

DAO / DTO / VO

DAO(Data Access Object)

  • 데이터베이스의 data에 접근하기 위한 객체
  • DataBase에 접근하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용

DTO(Data Transfer Object)

  • 계층간 데이터 교환을 하기 위해 사용하는 객체
  • DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter만 가진 클래스)

예시)

  • 유저가 자신의 브라우제에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣엉서 전송한다.
  • 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣는다.

VO(Value Object)

  • 값 오브젝트로써 값을 위해 쓰인다. read-Only특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가진다.
  • DTO와 유사하지만 DTO는 Setter를 가지고 있어 값이 변할 수 있다.
  • 로직을 포함할 수 있으며, 객체의 불변성(객체의 정보가 변경하지 않음)을 보장한다. 클라이언트의 요청객체(RequestDTO)는 VO이다. 요청을 변경하진 않으니깐 ㅋㅋ

DTO와 VO의 비교


DTO는 Setter가 있기 때문에 값이 변할 수 있지만, 의도적으로 setter를 없애고 생성자로 값을 넣어서 불변하게 사용하는 것이 각 계층간 이동시 동일한 값을 보장하기 때문에 더욱 안전하게 사용 가능하다. VO는 Setter 메소드를 가지면 안되고, 생성자를 통해서만 값을 초기화 해야한다.

참고 : DTO, DAO, VO// DTO vs VO

profile
방구석개발자

0개의 댓글