현실세계에는 다양한 객체들이 존재하고 그 객체들은 자신의 역할이 정해져 있다. 역할이 정해져 있다는 의미로 객체를 설계할 때 모델을 만든다고 한다. 객체지향프로그래밍에서는 클래스로 객체를 설계하기 때문에 클래스를 모델을 설계하는 도구라고도 다.
- 모델(Model)이란 무엇인가
- DTO, VO 클래스가 왜 필요할까
- DAO 클래스가 왜 필요할까
- Utility 클래스가 왜 필요할까
✓ 객체_Object(현실적) = 클래스_class(프로그래밍적)= 모델_Model(소프트웨어공학적)
✓ 객체지향프로그래밍에서 클래스를 역할에 따라 부르는 이름을 모델(Model)이라고 부른다.
✓역할에따라다양한모델을만들어사용할수있다.
우리가 클래스로 만들어 사용하게 될 모델의 종류는 아래와 같다.
- 식작 클래스
- DTO, VO Model
- DAO Model
- Utillity Model
그렇다면 왜? DTO, VO, DAO, Utillity 클래스 들이 필요한 것일까?
DTO | VO | |
---|---|---|
목적 | 계층간 데이터 전달 | 값 자체 표현 |
동등성 | 필드값이 같아도 같은 객체 아니다. | 필드값이 같으면 같은 객체 |
가변성 | setter존재 시 가변, setter 비 존배시 불가변 | 불변 |
로직 | getter/setter외의 로직이 필요하지 않음 | getter/setter외의 로직이 있어도 무방 |
DTO는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체
VO는 DTO와 달리 Read-Only속성을 지닌 값 오브젝트입니다. DTO는 setter를 가지고 있어서 값이 변할 수 있지만 VO의 경우에는 getter만 가지고 있어서 수정이 불가능합니다.
DTO와 VO의 차이점은 DTO는 인터턴스 개념이고, VO는 리터럴 값 개념입니다. VO는 값들에 대해 Read-Only를 보장해줘야 존재의 신뢰성이 확보되지만 DTO의 경우에는 단지 데이터를 담는 그릇의 역할일 뿐 값은 그저 전달되어야 할 대상일 뿐입니다. 따라서 값 자체에 의미가 있는 VO와 전달될 데이터를 보존해야 하는 DTO의 특성상 개념이 다릅니다.
따라서 VO의 핵심은 두 객체의 모든 필드 값들이 동일하면 두 객체는 같다입니다. 따라서 완전히 값 자체 표현 용도로만 사용하는 게 목적이라면, 두 객체의 모든 필드 값들이 모두 같으면 같은 객체이도록 만드는 것(equals() 와 hashCode()의 오버라이딩)이 중요하지, 메소드는 어떤 메소드가 있든 말든 상관 없습니다.
출처 : https://dkswnkk.tistory.com/500
public class CarDTO {
public int carSn;
public int carPrice;
public String carName;
public int carYear;
public String carType;
}
DAO(Data Access Object)
데이터베이스에 VO, DTO를 저장,수정 하거나 검색,삭제를 하기 위해서 만들어지는 모델
CRUD | SQL |
---|---|
Create | insert |
Read | select |
Update | update |
Delete | delete |
DAO(Data Access Object)
수집된 데이터를 데이터베이스에 저장, 수정
데이터베이스에 저장된 데이터를 검색, 삭제
검색 : select
삭제 : delete
public class CarDAO {
C.R.U.D
C = Create
R = Read
U = Update
D = Delete
public void carInsert(CarDTO carDTO){
// DB 연결, Insert SQL
System.out.println("car 정보가 DB에 저장이 되었습니다.");
}
public void carSelect(CarDTO carDTO){
// DB 연결, Insert SQL
System.out.println("car 정보가 DB에 출력이 되었습니다.");
}
public void carUpdate(CarDTO carDTO){
// DB 연결, Insert SQL
System.out.println("car 정보가 DB에 Update 되었습니다.");
}
public void carDelete(CarDTO carDTO){
// DB 연결, Insert SQL
System.out.println("car 정보가 DB에 삭제 되었습니다.");
}
}
1 날짜, 통화, 시간 정보 획득 기능(동작)
2 인코딩(한글 깨짐) 기능(동작)
3 DAO이외의 별도 기능(동작) -> main 메서드에서 분리해서 코딩
public class CarUtility {
public void carPtrint(CarDTO carDTO) {
System.out.println(carDTO.carSn + "\t" + carDTO.carName + "\t" + carDTO.carPrice + "\t" + carDTO.carYear + "\t" + carDTO.carType);
}
}