[꼼꼼한 개발자] 꼼코더
[JAVA] - DAO, DTO, VO, Entity 간단하고 쉽게 이해하기 본문
반응형
👨🏻🏫 간단정리
DAO : Database에 접근하는 역할을 하는 객체.
DTO : 데이터를 전달하기 위한 객체
VO : 값 자체를 표현하는 객체.
Entity : 실제 DB 테이블과 매핑이 되는 클래스.
👀 자세한 내용은 아래에.
🔌 DAO
- Data Access Object 의 약자로, Database에 접근하는 역할을 하는 객체.
- 프로젝트의 서비스 모델에 해당하는 부분과 데이터베이스를 연결하는 역할
- 데이터의 CRUD 작업을 시행하는 클래스. 즉, 데이터에 대한 CRUD 기능을 전담하는 오브젝트
👀사용이유
그렇다면, DAO를 사용하는 이유가 무엇일까?
- 효율적인 커넥션 관리와 보안성.
- DAO는 비즈니스 로직을 분리하여 도메인 로직으로부터 DB와 관련한 메커니즘을 숨기기 위해 사용.
👨🏻💻 예재코드(DAO)
public class TestDao {
public void add(TestDto dto) throws ClassNotFoundException, SQLException {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/dao_Db";
private static final String USER = "root";
private static final String PASSWORD = "1234";
String sql = "SELECT * FROM vouchers";
try {
con = DriverManager.getConnection(URL, USER, PASSWORD);
stmt = con.createStatement();
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString("id") + " ");
System.out.println(res.getString("value") + " ");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
preparedStatement.setString(1, dto.getName());
preparedStatement.setInt(2, dto.getValue());
preparedStatement.setString(3, dto.getData());
preparedStatement.executeUpdate();
preparedStatement.close();
connection.close();
}
}
🚚 DTO
- Data Transfer Object의 약자로, 데이터를 전달하기 위한 객체
- DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스).
- 여러 레이어(Layer)간 데이터를 주고 받을 때 사용할 수 있고 주로 View와 Controller 사이에서 활용.
- DTO는 getter / setter 메소드를 포함한다. 하지만, 이외의 다른 비즈니스 로직은 포함하지 않는다.
- DTO는 어떻게 구현하느냐에 따라 가변 객체로 활용할 수도 있고 불변 객체로 활용할 수도 있다.
- DTO는 데이터 전달 만을 위한 객체라는 게 핵심 정의이다. 그렇기 때문에 완전히 데이터 전달 용도로만 사용하는게 목적이라면, getter/setter만 필요하지, 이외의 비즈니스 로직은 굳이 있을 필요가 없다.
👨🏻💻 예재코드(DTO)
- [가변 객체로써의 DTO]
// 가변 객체 DTO
// 기본생성자로 생성 후 값을 유동적으로 변경
public class DtoEx {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
- [불변 객체로써의 DTO]
// 불변 객체 DTO
// 생성시 지정했던 값이 변하지 않고 getter() 메소드만 사용 가능
public class DtoEx {
private final String name;
private final int age;
public DtoEx(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
- 가변 객체로써 DTO를 만들 때는 setter() 메소드를 이용하여 구현할 수 있다.
- 불변 객체로써 DTO를 만들 때는 생성자를 이용해서 구현시 getter() 메소드만 구현할 수 있다.
- 이렇게 구현함으로써 데이터를 전달하는 과정에서 데이터의 불변성을 보장합니다.
🖥 VO
- VO는 Value Object의 약자로 값 자체를 표현하는 객체.
- DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다.
- VO는 getter() 메소드를 포함해서, 이외의 비즈니스 로직도 포함할 수 있다.
- 사용하는 도중에 변경 불가하여 setter() 메소드는 가지지 않아. **오로지, 읽기 기능만 가능하다.(**read-Only)
- VO는 두 객체의 모든 필드 값들이 동일하면 두 객체는 같다! 가 핵심 정의이다. 그렇기 때문에 완전히 값 자체 표현 용도로만 사용하는 게 목적이라면, 두 객체의 모든 필드 값들이 모두 같으면 같은 객체이도록 만드는 것(equals() 와 hashCode()의 오버라이딩)이 중요하지, 메소드는 어떤 메소드가 있든 말든 상관 없다.
👨🏻💻 예재코드(VO)
- [VO 예제]
// VO예제
// 값을 표현만 하기 때문에 setter()메소드는 사용하지 않는다.
public class VoEx {
static class Money{
private final int value;
Money(int value) {
this.value = value;
}
public int getValue() {
return value;
}
// 사용자 생성 메소드이지만 setter형태의 메소드가 아니므로 무관함
public String printMoney(){
return this.value + "원";
}
// 두 객체의 모든 필드 값들이 모두 같으면 같은 객체이도록 만들기 위한 오버라이딩
@Override
public int hashCode() {
return Objects.hash(value);
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null || getClass() != obj.getClass())
return false;
Money money = (Money) obj;
if(value == money.value)
return true;
else
return false;
}
}
}
🧾 Entity
- Entity는 실제 DB 테이블과 매핑이 되는 클래스.
- Entity를 데이터를 전달하는 클래스로 사용하면 안된다.
- Entity를 기준으로 테이블이 형성되고, 칼럼이 변경되곤 한다.
- Entity는 비즈니스 로직을 포함할 수도, setter() 메소드를 포함할 수도 있습니다.
👨🏻💻 예재코드(Entity)
- [Entity 예제]
public class EntityEx {
private final Long id;
private final String name;
private final int value;
public EntityEx(Long id, String name, int value) {
this.id = id;
this.name = name;
this.value = value;
}
}
'간단하고 쉽게 > JAVA' 카테고리의 다른 글
[JAVA] - 제네릭이란?(Generic) 간단하고 쉽게 이해하기 (제네릭의 장점) (0) | 2022.12.20 |
---|---|
[JAVA] - SDK, JDK 간단하고 쉽게 이해하기 (0) | 2022.12.20 |
[JAVA] - Java SE, Java EE 차이 간단하고 쉽게 이해하기(자바 플렛폼의 종류) (0) | 2022.12.20 |
[JAVA] - Java Beans(자바 빈즈) 간단하고 쉽게 이해하기 (0) | 2022.12.20 |
[JAVA] - 3대 컬렉션 List, Set, Map(인터페이스) 간단하고 쉽게 이해하기(컬렉션이란?) (0) | 2022.12.20 |
Comments