doamin 패키지
DB 테이블과 1:1로 매핑되는 객체
데이터베이스 테이블내에 존재하는 컬럼만을 속성으로 가진다
도메인 로직(속성 변경)만을 가지고 있어야 하고 서비스 로직은 가지고 있으면 안된다.
repository 패키지
DB의 데이터에 접근하기 위한 객체. 삽입, 삭제, 조회 등의 기능 수행
JPA에서의 Repository의 기능과 동일한 역할
dto 패키지
각 계층간(Controller, View, Business Layer(Model)) 데이터 교환을 위한 객체
로직을 가지지 않는 데이터 객체.
Getter와 Setter 메서드만 가진 클래스
유효성 체크 애노테이션 사용하면 편리
https://itcoin.tistory.com/499
implementation 'org.springframework.boot:spring-boot-starter-validation'
dto 패키지
불변, Read-Only 클래스
equals()와 hashcode()를 오버라이딩하는 것은 필수
Setter 성격을 가지고 있는 메서드는 가져서는 안되며 오로지 생성자로만 값을 초기화해야하고 Getter 성격의 메서드만 사용
DTO는 애플리케이션 자체의 계층 간 데이터를 주고 받기 위해서, 필요한 데이터들만 구성하기 위해서라면, VO는 현재 애플리케이션의 비즈니스에 사용되는 의미가 담긴 값을 의미하며, 비즈니스 로직을 가질 수 있다는 점에서 DTO와 다르다. 즉, 둘 다 필요한 데이터들을 포장한 것은 맞지만, 그 의도와 쓰임새에서 차이가 있는 것이다.
영구 저장소가 아닌, 객체의 상태를 관리하는 저장소
인터페이스로 구현체를 따로 작성하면 도메인 계층, 아니면 서비스 계층이라고 할 수 있겠다.
DAO와 Repository의 주요 차이점은 DAO는 데이터 영속성을 추상화한 반면, 리포지토리는 도메인 개체 모음을 추상화했다는 점이다. DAO는 데이터베이스에 더 가깝고 테이블 중심적인 반면, 리포지토리는 도메인 계층에 더 가깝다. 리포지토리는 일반적으로 더 좁은 인터페이스로서 Get(id), Find(Specification), Add(Entity)와 같은 메서드를 사용한다. 반면에 DAO는 데이터 매핑/액세스 계층으로, 보기에, 그리고 사용하기에 까다로운 쿼리들을 가지고 있으며, 더 저수준의 개념으로 간주될 수 있다.
DAO는 좀 더 유연하고 일반적인 반면, 리포지토리는 좀 더 구체적이고 특정 유형으로 제한될 수있다. 리포지토리라고 불리는 구현이 실제로는 DAO에 더 가깝기 때문에 둘의 차이에 대해 약간의 혼란이 있을 수도 있다.
요약하자면, DAO는 DB에 더 가까운 저수준 개념으로 간주되는 반면, 리포지토리는 도메인 개체에 더 가까운 상위 수준 개념이다. DAO는 데이터 매핑/액세스 계층인 반면, 리포지토리는 도메인과 데이터 액세스 계층 사이에 있다.
적시적소! 어디에 무얼 써야하나

DTO: 계층 간 데이터 전달용
VO: 값을 갖는 도메인
Entity: DB와 매핑되는 용
Repository: = DAO, DB 접근용(CRUD)
출처
https://stella-ul.tistory.com/entry/Repository-DAO-DTO-VO-%EB%AD%90%EA%B0%80-%EB%8B%A4%EB%A5%B8%EA%B1%B8%EA%B9%8C
https://80000coding.oopy.io/dcd0f224-053f-456c-af22-d7e0946fa868