
DAO(Data Access Object)
- 데이터베이스의 data에 접근하기 위한 객체이다.
- 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.
- DataBase에 접근하기 위한 로직과 비지니스 로직을 분리하기 위해 사용한다.
- PA, Hibernate, Mybatis 등의 Persistence Framework를 통해 접근
- DAO를 사용하는 이유
- 효율적인 커넥션 관리와 보안성
- 비지니스 로직을 분리하며 도메인 로직으로부터 DB와 관련된 메커니즘을 숨기기 위해 사용한다.
public class TestDao {
public void add(TestDto dto) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
PreparedStatement preparedStatement = connection.prepareStatement("insert into users(id,name,password) value(?,?,?)");
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)
- 계층간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)를 의미한다.
- DB의 데이터를 Service나 Controller 등으로 보낼 때 사용하는 객체를 말한다.
- DB의 데이터가 Presentation Logic Tier로 넘어올때는 DTO로 변환되어 오고가는 것이다.
- DTO는 데이터 전송 (이동) 객체라는 의미를 가진다.
- 로직을 가지지 않는 순수한 데이터 객체이고 getter/setter메소드만 가진 클래스를 의미한다.
- 주로 비동기 처리를 할 때 사용한다.
+) Java Beans
Java로 작성된 소프트웨어 컴포넌트를 지칭하는 단어
비즈니스 로직 부분을 담당하는 Java 프로그램 단위
(장점) JSP페이지가 복잡한 자바 코드로 구성되는 것을 피할 수 있음
(장점) 재사용 가능한 컴포넌트를 만들 수 있음
public class MemberDTO {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
VO(Value Object)
- DTO와 달리 VO는 Read-Only속성을 지닌 값 오브젝트이다.
- 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스(Read-Only)를 만들어 사용한다.
- 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.
- 내부에 선언된 속성(필드)의 모든 값들이 VO 객체마다 값이 같아야, 똑같은 객체라고 판별한다.
- getter 메소드만 가진 클래스
- 여러 테이블에 대한 공통 속성을 모아서 만든 BaseVO 클래스를 상속받아서 사용할 수 있다.
// Money.java
public class MoneyVO {
private final String currency;
private final int value;
public MoneyVO(String currency, int value) {
this.currency = currency;
this.value = value;
}
public String getCurrency() {
return currency;
}
public int getValue() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MoneyVO money = (MoneyVO) o;
return value == money.value && Objects.equals(currency, money.currency);
}
@Override
public int hashCode() {
return Objects.hash(currency, value);
}
}
// MoneyTest.java
public class MoneyTest {
@DisplayName("VO 동등비교를 한다.")
@Test
void isSameObjects() {
MoneyVO money1 = new MoneyVO("원", 10000);
MoneyVO money2 = new MoneyVO("원", 10000);
assertThat(money1).isEqualTo(money2); // true
}
}
Entity
- 실제 DataBase의 테이블과 1 : 1로 매핑 되는 클래스
- DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.
- 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가져서도 안된다.
- 최대한 외부에서 Entity 클래스의 getter/setter를 사용하지 않도록 클래스 내부에서 필요한 로직을 구현해야 한다.
- 구현 메소드는 주로 Service Layer에서 사용한다.
- Presentation Logic을 가지면 안된다.
public class MemberEntity {
private final Long id;
private final String email;
private final String password;
private final Integer age;
public MemberEntity() {
}
public MemberEntity(Long id, String email, String password, Integer age) {
this.id = id;
this.email = email;
this.password = password;
this.age = age;
}
}
'공부 > Spring' 카테고리의 다른 글
| 스프링 패키지 구조 (0) | 2023.06.22 |
|---|---|
| 스프링 객체 주입 (0) | 2023.02.03 |
| Session (0) | 2023.01.16 |
| Spring의 대표적인 Annotation의 역할 (0) | 2023.01.10 |
| Spring Bean (0) | 2023.01.06 |
댓글