[Spring] DAO, DTO, VO의 개념과 적용례

Oublie-le·2024년 10월 9일

스프링(게시판)

목록 보기
3/3

DAO(Data Access Object)

실제로 DB의 데이터에 접근하는 객체

DAO는 Service와 데이터베이스를 연결하는 역할을 하며, 실제로 DB에 접근하여 CRUD 기능을 수행
JPA에서는 DB에 데이터를 CRUD하는 JpaRepository<>를 상속받는 Repository객체들이 DAO

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {}

DTO(Data Transfer Object)

계층 간 데이터 교환을 위한 객체

로직을 가지지 않고 getter/setter 메소드만 가진 순수한 데이터 객체 클래스(java beans)로 DB에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용합니다

ex)Item entity

@Data
@Entity
public class Item {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;
 
    @Column(name = "item_name")
    private String itemName;
 
    @Column(name = "item_name")
    private Integer price;
    
    @Column(name = "item_name")
    private Integer quantity;
 
    public Item() {} // JPA는 public, protected의 기본 생성자가 필수 !
 
    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

ex)ItemUpdateDto

@Getter
@Setter
public class ItemUpdateDto {
    private String itemName;
    private Integer price;
    private Integer quantity;
 
    public ItemUpdateDto() {
    }
 
    public ItemUpdateDto(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

ex)ItemService

@Service
@RequiredArgsConstructor
@Transactional
public class ItemService {
    private final ItemRepository itemRepository;
 
    public Item save(Item item) {
        return itemRepository.save(item);
    }
 
    @Override
    public void update(Long itemId, ItemUpdateDto updateParam) {
        Item findItem = itemRepository.findById(itemId).orElseThrow();
        findItem.setItemName(updateParam.getItemName());
        findItem.setPrice(updateParam.getPrice());
        findItem.setQuantity(updateParam.getQuantity());
        // 변경 쿼리를 날리지 않아도됨.
        // 트랜잭션이 커밋되는 시점에 데이터가 변경되었으면 데이터들의 업데이트 쿼리를 만들어 DB에 알아서 날려줌.
    }
}

VO(value object)

변경 불가능하며 오직 읽기만 가능(Read-Only)

DTO는 setter를 가지고 있어 값을 변경할 수 있지만, VO는 getter만을 가지기 때문에 읽기만 가능하고 수정은 불가능합니다.

DTO는 인스턴스 개념이고 VO는 리터럴 값(변하지 않는 데이터) 개념입니다.
DTO는 단지 데이터를 담아 전달하는 역할만 하지만, VO는 값들에 대해 읽기만 가능한 Read-only 속성을 가져 객체로서 데이터 그 자체에 의미를 갖습니다.

profile
개발자 지망생

0개의 댓글