DTO VS VO VS DAO

Ozยท2025๋…„ 3์›” 12์ผ

๐Ÿฆ‰ย DTO

  • Data Transfer Object(๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด)

๊ณ„์ธต(Layer)๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด

๋กœ์ง์„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด, getter/setter ๋ฉ”์„œ๋“œ๋งŒ์„ ๊ฐ–๊ณ  ์žˆ์Œ.

๋กœ์ง ์—†์ด, ๋„คํŠธ์›Œํฌ ๋˜๋Š” ๊ณ„์ธต๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋ชฉ์ ์ž„.

public class StudentInfoDto {
  private final String name;
  private final int age;
  private final String address;

  public StudentInfoDto(String name, int age, String address) {
    this.name = name;
    this.age = age;
    this.address = address;
  }

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }

  public String getAddress() {
    return address;
  }
}

๐Ÿฆ‰ย VO

  • Value Object(๊ฐ’ ๊ฐ์ฒด)

  • ๊ฐ’ ๊ทธ ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง„ VO์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ชจ๋“  ์†์„ฑ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๊ฐ™์€ ๊ฐ์ฒด

    • ์ „์ œ ์กฐ๊ฑด: equals(), hashcode() ํ•จ์ˆ˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    • ๊ฐ์ฒด์˜ ๋™์ผ์„ฑ์ด ์•„๋‹Œ, ๊ฐ’์˜ ๋™์ผ์„ฑ์„ ๋ณด์žฅ
  • ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅ

  • ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ.

public final class UserVO {
    private final String name;
    private final int age;

    public UserVO(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserVO userVO = (UserVO) o;
        return age == userVO.age && Objects.equals(name, userVO.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

๐Ÿฆ‰ย DAO (Data Access Object) - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ์ฒด

  • DB์™€์˜ CRUD ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด

JPA์˜ ORM์ด๋‚˜ JDBC ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•จ.

JPA ๊ธฐ๋ฐ˜ DAO ์˜ˆ์ œ.

@Repository
public interface UserDAO extends JpaRepository<UserEntity, Long> {
    Optional<UserEntity> findByName(String name);
}
---------------------------------------------------------------------------

public interface JpaUserRepository extends JpaRepository<UserEntity, Long> {

}

๐Ÿฆ‰ย DTO vs VO vs DAO

  • DTO๋Š” Layer๊ฐ„์˜ ํ†ต์‹  ์šฉ๋„๋กœ ์˜ค๊ณ ๊ฐ€๋Š” ๊ฐ์ฒด
  • VO๋Š” ํŠน์ •ํ•œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
  • DAO๋Š” DB์™€์˜ CRUD ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด

DTO๋ฅผ VO์ฒ˜๋Ÿผ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ?

DTO๊ฐ€ ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ๊ณผ์ • ์ค‘ ๋ณ€์กฐ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Œ.

๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์ค‘ ๋ฐ์ดํ„ฐ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์–ด์„œ ์•ˆ์ •์„ฑ์ด ์ข‹์•„์ง.

๐Ÿฆ‰ย Entity

  • ์‹ค์ œ DB์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ํด๋ž˜์Šค.
  • Id๋กœ ๊ตฌ๋ถ„๋จ.
  • ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ.

Entity๋ฅผ DTO ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

ํ•  ์ˆœ ์žˆ๋Š”๋ฐ.. ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์œ ๋ฆฌํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋จ.

View์—์„œ ํ‘œํ˜„ํ•˜๋Š” ์†์„ฑ ๊ฐ’๋“ค์ด ์š”์ฒญ์— ๋”ฐ๋ผ ๊ณ„์† ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ,

๊ทธ ๋•Œ๋งˆ๋‹ค Entity์˜ ์†์„ฑ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜์†์„ฑ ๋ชจ๋ธ์„ ํ‘œํ˜„ํ•œ Entity์˜ ์ˆœ์ˆ˜์„ฑ์ด ๋ชจํ˜ธํ•ด์ง.

๋”ฐ๋ผ์„œ Controller์—์„œ ์“ธ DTO์™€ Entityํด๋ž˜์Šค๋Š” ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์ข‹์Œ.


[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐Ÿ“์ธ๋น„์˜ DTO vs VO

[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐ŸŽผ๋ผํ์˜ DTO vs VO

profile
Oreo ๋ง›์žˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€