
DAO(Data Access Object)는 데이터베이스나 다른 영속성 저장소에 대한 데이터 액세스를 관리하는 객체이다.
DAO는 데이터베이스와의 상호 작용을 캡슐화하여 데이터 액세스 코드를 비즈니스 로직에서 분리하고, 데이터베이스에 접근하는 로직을 단일한 위치에 모아둠으로써 유지보수성을 향상시킨다.
아래의 코드를 통해 더 자세히 알아보자.
public interface UserRepository extends JpaRepository<User, Long> {
// 추가적인 메서드가 필요한 경우 여기에 선언 가능
}
데이터베이스 접근을 위한 Repository 인터페이스이다.
이는 DAO의 가장 대표적인 예시이다. 다시 위에서 말한 내용을 토대로 DAO가 무엇인지 적어보면 다음과 같다.
특정 데이터베이스 테이블에 접근하는 코드를 Repository 인터페이스내에 모아둠으로써, 유지보수성을 확장 시킬 수 있다는 것이다.
이는 추후에 @Autowired 옵션을 붙여서 주입 시켜서 사용할 수 있다.
DTO(Data Transfer Object)는 서로 다른 계층 간에 데이터를 전송하기 위해서 사용된다.
DTO를 쉽게 생각하면 카드 지갑이라고 생각하면 될 것 같다.

왜 하필 카드 지갑이냐고 생각할 수도 있을텐데, 나는 DTO를 이해하면서 카드지갑이 계속해서 생각났다.
카드 지갑은 카드를 간단하게 들고 다니기 위한 목적으로 만들어졌으며, 서로 다른 종류의 카드들이 여기에 포함된다. 그리고 필요할 때, 해당 카드를 꺼내서 사용하고 다시 넣을 수도 있고, 다른 카드로 교체할 수도 있다.
이러한 특성은 데이터 전송을 목적으로하고, 서로 다른 종류의 데이터들을 포함 시킬 수 있는 DTO와 비슷하다고 생각했다.
VO(Value Object)를 보통 DTO로 헷갈려하는 경우가 정말 많다.
일단 설명 전에 알아야할 포인트는 VO는 그 자체로 값이다. 굉장히 모호하게 들릴 수도 있지만, VO가 불변성을 지켜야된다는 포인트를 이해하게 되면 훨씬 쉬울것이다.
VO 또한 공부를 하면서 도서관에 있는 책과 비슷한거 같다고 생각했다.

그렇게 생각한 이유는 책같은 경우 처음 만들어질 때, 안에 글이 쓰여지고, 이 후 책안에 글자를 바꿀 수 없기 때문이다.
그리고 가장 중요한 특성은 그 책 자체가 하나의 값이 되기 때문에, 책이 VO와 비슷하다고 생각했다.
이해를 돕기위해, 예시를 들겠다.
해리포터 책과 이산수학 책이 있다. 이는 똑같은 책이다.
하지만 각 책이 가지고 있는 정보는 전혀 다르다. 책은 발행된 그 순간부터 고유성을 띄게된다. 그렇기에 우리는 특정 책을 원할 때, 책보다는 그 책의 고유한 명칭으로 말하게 된다.
이처럼 VO를 이해하기 힘들 때는 책에 빗대어서 생각하면 이해하는데 조금은 도움이 될 것같다.
VO는 일반적으로 불변성을 띄어야하기 때문에, setter는 사용되지 않는다.. 하지만 DTO는 데이터의 효율적이고 안정성있는 전송을 주 목적으로 하기 때문에, 필요에 따라 setter를 가용할 수 도 있다.
import java.math.BigDecimal;
@Getter
public class Money {
private final BigDecimal amount;
private final Currency currency;
public Money(BigDecimal amount, Currency currency) {
this.amount = amount;
this.currency = currency;
}
public Money add(Money other) {
if (!this.currency.equals(other.currency)) {
throw new IllegalArgumentException("Cannot add Money objects with different currencies");
}
BigDecimal sum = this.amount.add(other.amount);
return new Money(sum, this.currency);
}
public Money multiply(BigDecimal multiplier) {
BigDecimal result = this.amount.multiply(multiplier);
return new Money(result, this.currency);
}
// 불변성을 유지하기 위해 setter는 포함하지 않음
}
위의 VO코드를 보게되면 add와 multiply와 같은 그 값 자체에 비즈니스 연산작업을 허용한다.
그러나, DTO는 데이터 전송만을 위한 목적으로 사용되기 때문에 이러한 비즈니스 연산작업은 불필요하다.
공부를 하며 해당 내용을 적게 되었지만, 전문성이 필요한 부분은 조금 더 공부하고 다듬을 예정이다.