Spring Boot 공부하는 도중,
DTO, DAO, 그리고 Domain(=Entity)에 대해서 각각의 역할 및 차이를
제대로 이해하지 못하고 있음을 느꼈다.
오늘은 이 부분에 대하여 정리 해볼까 한다.
실제로 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();
}
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() {
...
}
...
}
@Configuration
public class SpringConfig {
...
@Bean
public MemberRepository memberRepository(){
return new JpaMemberRepository(em);
}
...
}
계층 간 데이터 교환을 위한 Java Beans.
View와 통신하기 위한 클래스.
DB에서 데이터를 받고 이 데이터를 다시 Service나 Controller 등으로 넘겨주는 역할.
따로 세부적인 로직을 갖고 있지 않는, DB로 부터 받을 데이터들을
어떤 방식, 타입 등으로 받거나 보낼 것인지 정의 해 놓은
양식 혹은 순수한 데이터 객체 정도로 볼 수 있겠다.
그나마
getter/setter 나 View와의 통신을 위한 Presentaion Logic 정도의 메소드를 가짐.
VO(Value Object)라는 DTO와 동일한 개념이지만 'read only' 속성을 가지는
Object가 또 있지만 아직 공부하면서 다뤄본 적이 없기에,
다뤄보게 된다면 그 때 이 글을 수정 및 보완하겠다.
ex) DTO
@Getter
public class UserDto {
public String userid;
public String password;
public SignInReq(String userid, String password) {
this.userid = userid;
this.password = password;
}
}
실제 DB의 테이블과 매칭시키는 클래스.
@Entity, @Column, @Id 등과 같은 annotation 사용.
Entity와 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;
}
}