[JAVA] DAO/DTO/VO

Soo·2023년 9월 13일
0

1. DAO (Data Access Object)

DAO는 Data Access Object의 약자로, DB의 데이터에 접근하기 위한 객체라고 볼 수 있다. 또한, DB에 접근하기 위한 로직을 분리하기 위해 사용한다. 직접 DB에 접근해서 데이터를 삽입, 삭제 및 조회 등을 조작할 수 있는 기능을 수행한다.

MVC 패턴의 Model에서 아래와 같이 수행한다.

[example]

@Repository
public class UserDao {

    private JdbcTemplate jdbcTemplate;
    
    @Autowired
    public void setDataSource(DataSource dataSource){
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    
    public long createUser(PostUserReq  postUserReq){
        String      createUserQuery = "INSERT INTO Users(email, profilePicUrl, name, password)\n" +
                "VALUES\n" +
                "    (?, ?, ?, ?);";

        Object[]    createUserQueryParams = new Object[]{postUserReq.getEmail(), postUserReq.getProfilePicUrl(),
        postUserReq.getName(), postUserReq.getPassword()};

        // 데이터 삽입 쿼리
        this.jdbcTemplate.update(createUserQuery, createUserQueryParams);

        String      getNewUserIdQuery = "SELECT LAST_INSERT_ID();";
        return  this.jdbcTemplate.queryForObject(getNewUserIdQuery, long.class);
    }
}

2. DTO (Data Transfer Object)

DTO는 Data transfer Object의 약자로, 계층 간 (Controller, View, Service)의 데이터 교환을 위한 Java Bean을 의미한다. DTO는 로직을 가지지 않는 데이터 객체이고, getter/setter 메소드만 가진 클래스를 의미한다.

[유저가 입력한 데이터를 DB에 넣는 과정]
유저가 본인의 브라우저에서 데이터를 입력해 form에 있는 데이터를 DTO에 넣어서 전송 -> 해당 DTO를 받은 서버가 DAO를 이용해 데이터베이스로 데이터를 집어 넣음

[example]

@Getter
@Setter
public class GetUserRes {
    private long    userId;
    private String  userName;
    private String  email;
    private String  password;
}

3. VO (Value Object)

Vo는 Value Object의 약자로, Read-Only 속성을 가진 값 오브젝트라고 볼 수 있다. 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스를 만들어 사용하는 것이며, 따라서 getter기능만 존재한다.

❓ DTO vs VO

DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다. 따라서 gettersetter 기능을 모두 가지고 있다.
그에 반해, VO는 값 그 자체의 의미를 가진 불변 클래스(Read-Only)를 의미한다. 따라서 getter 기능만 존재한다.
→ DTO는 인스턴스 개념이라면, VO는 리터럴 개념으로 이해하면 편하다.

profile
Soogineer's Devlog

0개의 댓글