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);
}
}
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;
}
Vo는 Value Object의 약자로, Read-Only 속성을 가진 값 오브젝트라고 볼 수 있다. 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스를 만들어 사용하는 것이며, 따라서 getter
기능만 존재한다.
DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다. 따라서 getter
와 setter
기능을 모두 가지고 있다.
그에 반해, VO는 값 그 자체의 의미를 가진 불변 클래스(Read-Only)를 의미한다. 따라서 getter
기능만 존재한다.
→ DTO는 인스턴스 개념
이라면, VO는 리터럴 개념
으로 이해하면 편하다.