[스프링(spring)]DTO, DAO(=Repository), Domain(=Entity), VO

allnight5·2023년 1월 25일
0

스프링

목록 보기
37/62

가져온사이트

DAO(Data Access Object)

repository package
실제로 DB에 접근하여 Data를 CRUD하는 객체.

Service와 DB를 연결 해주는 역할을 한다.

인터페이스와 이에 대한 구현체를 만들어서
구현체에 CRUD 관련 기능을 구현하고, 이를 DI 해주는 방식으로 사용된다.

ex) 인터페이스

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

ex) 구현체

public class JpaMemberRepository implements MemberRepository{
    ...
    
    @Override
    public Member save(Member member) {
        ...
    }

    @Override
    public Optional<Member> findById(Long id) {
        ...
    }

    @Override
    public Optional<Member> findByName(String name) {
        ...
    }

    @Override
    public List<Member> findAll() {
        ...
    }
    ...
}

ex) DI

@Configuration
public class SpringConfig {
    ...

    @Bean
    public MemberRepository memberRepository(){
        return  new JpaMemberRepository(em);
    }
    ...
}

Domain(=Entity)

domain package
실제 DB의 테이블과 매칭시키는 클래스.

@Entity, @Column, @Id 등과 같은 annotation 사용.

Entity와 DTO를 분리하는 이유

Entity는 DB Layer를 위한, DTO는 View Layer를 위한 것.

Entity는 테이블 매핑 클래스로 변경사항이 생기면,
Entity 뿐만 아니라 다른 여러 클래스에 영향을 주기 때문에 설계 시에 신중히 만들고
이후 변경사항이 상대적으로 다소 적은 클래스다.

반면에 DTO는
request/response에 대한 부분 혹은 View 관련 Presentaion Logic을 가지는
상대적으로 자주 변경되는 클래스이기 때문에 이 둘을 분리할 필요가 있다.

DTO는 Entity(=Domain) Model을 복사 해 와서,
Presentaion Logic을 추가하거나 DTO 상에서만 필요/불필요 한 필드 멤버를 추가/삭제한
클래스 구조인 것이다.

ex) Entity

@Entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

DTO(Data Transfer Object)

dto package
계층 간 데이터 교환을 위한 Java Beans.

View와 통신하기 위한 클래스.

DB에서 데이터를 받고 이 데이터를 다시 Service나 Controller 등으로 넘겨주는 역할.

따로 세부적인 로직을 갖고 있지 않는, DB로 부터 받을 데이터들을
어떤 방식, 타입 등으로 받거나 보낼 것인지 정의 해 놓은
양식 혹은 순수한 데이터 객체 정도로 볼 수 있겠다.

그나마
getter/setter 나 View와의 통신을 위한 Presentaion Logic 정도의 메소드를 가짐.

VO(Value Object)라는 DTO와 동일한 개념이지만 'read only' 속성을 가지는
Object가 또 있지만 아직 공부하면서 다뤄본 적이 없기에,
다뤄보게 된다면 그 때 이 글을 수정 및 보완하겠다.

전송되는 데이터의 컨테이너이다.
VO와 동일하게 데이터를 저장하여 사용하도록 하는 부분에서 필요하다.
VO와 비교를 하여 보면 DTO는 같은 시스템에서 사용되는 것이 아닌 다른 시스템으로 전달하는 작업을 처리하는 객체이다.
Layer간의 통신 용도로 오가는 객체를 말하기도 한다.
현재의 개발 환경에서 보통 데이터는 다음과 같이 흐름으로 이동한다.
서버 측 : Database Column Data -> DTO -> API(JSON or XML) -> Client
클라이언트 측 : Server -> API(JSON or XML) -> DTO -> View or Local Database

ex) DTO

@Getter
public class UserDto {
    public String userid;
    public String password;

    public SignInReq(String userid, String password) {
        this.userid = userid;
        this.password = password;
    }
}

참조사이트 VO

VO(value Object)

데이터 그 자체로 의미 있는 것을 담고 있는 객체이다
SQL 테이블의 컬럼명과 VO 클래스의 필드명 (변수)를 동일하게 하거나 다르게 할 수 있다.
다르게 사용할 경우 mappers 파일에서 parameterType, returnType 속성에 VO 클래스를 사용할 수가 없다.
DTO와 동일한 개념이나 차이점은 내부 속성 값을 변경할 수 없는, Read–Only 속성 객체이다.

  • 변경없이 값(Value)로 취급할 객체(Object) setter를 쓰면 안된다. 쓸수없다.
    간단한 독립체( Entity )를 의미하는 작은 객체를 의미한다.
    관계데이터베이스의 레코드에 대응되는 자바클래스이다.
    형태는 Database레코드를 구성하는 필드들을 VO의 Attribute로 하고 해당 변수에 접근 할 수 있는 Getter와 Setter 메소드의 조합으로 클래스를 형성되어진 클래스이다.
    거의 불변성을 가지고 equals()로 비교할 때 객체의 모든 값을 비교해야 한다.
profile
공부기록하기

0개의 댓글