일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바스크립트
- 버튼
- 셋업
- MySQL
- 설정
- 자바
- 알고리즘
- Oracle
- 깃허브 간단요약
- 마이바티스
- Eclipse
- EL태그
- 스프링
- 오라클
- 필터체인
- springboot
- 폼태그
- java
- 면접
- 설치
- jsp 내부객체
- jstl
- 제이쿼리
- html
- SESSION
- 깃허브
- Spring
- 이클립스
- jsp
- jquery
- Today
- Total
은은하게 코드 뿌시기
DTO/VO/Entity 차이 본문
Entity | DTO | VO | |
생성 목적 | DB Table과 직접적으로 매핑하여 DB에 접근할때 사용 |
단순 Data 전송, 수신 용도 ex) view와 Controller사이에 데이터 주고받을때사용 |
값 자체를 표현하는 객체 ReadOnly 목적이 강함, 데이터 자체 불변 하게 설계 ex) 테이블 관련 데이터 |
데이터 가변 불변 | 가변/불변 | 가변/불변 | 불변 |
getter 사용 | O | O | O |
setter 사용 | O,보안 강화시 X | O | X |
로직 포함 | O | X | O |
equals & hashCode 구현 | O | X | O |
DTO (Data Transre Object)
: 계층(layer)간 데이터 교환을 위해 사용하는 객체
, 데이터 교환 만을 위해 사용하므로 로직을 갖지 않고, getter/setter메소드만 을 갖는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package kr.co.dong;
public class UserVO {
private String userId;
private String userName;
public UserVO(String userId, String userName) {
super();
this.userId = userId;
this.userName = userName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
|
cs |
VO (Value Object)
: 값 그자체를 표현 하는 객체, getter와 setter를 가질 수있으며 vo테이블 내에 있는 속성외에 추가적인 속성을 가질 수있으며 여러테이블(a,b,c)에 대한 곹오 속성을 모아서 만든 Basevo클래스를 상속받아서 사용할 수도있다.
서로 다른 이름을 갖는 vo인스턴스라도 모슨 속성값이 같다면 두 인스턴스는 같은 객체라고 할 수있따.
이를 위해서 VO는 Object클래스의 equals()와 hashCode()를 오버라이딩 해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package kr.co.dong;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserVO {
private String userId;
private String userName;
public UserVO(String userId, String userName) {
super();
this.userId = userId;
this.userName = userName;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
result = prime * result + ((userName == null) ? 0 : userName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserVO other = (UserVO) obj;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
return true;
}
}
|
cs |
equals() 를 한줄 한줄 살펴보면, VO를 설명할때 언급한 모든 속성값이 같다면 이름이 다른 인스턴스라도 같은 객체로 본다는 특징을 마지막 return 문에서 증명하고 있다.
equals()를 오버라이딩해서 정의하기 전과 정의한 후의 객체비교 테스트 코드이다.
Entity
: Entity Class는 실제 Database의 테이블과 1대1 매핑되는 class로, DB의 테이블 내에 존재하는 컬럼만을 속성(필드)으로 가져야한다. Entity Class는 상속을 받거나 구현체여서는 안되며, 테이블 내에 존재하지 않는 컬럼을 가져서도 안된다.
Entity Class는 최대한 외부에서 Data Field에 함부로 접근하지 못하도록 제한하여, 해당 클래스 안에서 접근을 허용할 데이터들을 제한하고 logic method를 구현 해야하고, Domain Login만 가지며, Presentation Logic을 가지고 있어서는 안된다.
Spring 3 Tier인 Persistence, Business, Presentation Tier 중 Persistance Tier에서 사용한다. 구현 method는 주로 Service Layer에서 사용한다.Entity를 Persistance Tier에서 받아와 DTO로 변환하여 Presentation Tier에 전달하는 것이 Business Tier, Service 단에서의 역할이다.
Entity, DTO Class 분리 이유?
Entity와 DTO를 분리해서 관리해야 하는 이유는 DB Layer와 View Layer 사이의 역할을 분리 하기 위해서다.
DB Layer = Persistence Tier, View Layer = Presentation Tier
+ Entity Setter 금지 및 생성자, 접근 제어
Entity를 작성할 때 Setter를 무분별하게 사용하면 객체(Entity)의 값을 쉽게 변경할 수 있으므로, 객체의 일관성을 보장할 수 없다.
객체의 일관성을 유지할 수 있어야 유지 보수성이 올라가기 때문에 Setter 사용을 최대한 지양해야하며,객체의 생성자에 값들을 넣어줌으로써 Setter 사용을 줄일 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
@Getter
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = "id")
@Table(name = "user")
@Entity
public class User {
@Id
@GeneratedValue
private int id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "phone", nullable = false, unique = true)
private String phone;
@Column(nullable = true)
private LocalDateTime create_date;
private LocalDateTime modify_date;
@Builder(
builderClassName = "init"
, builderMethodName = "initUser"
)
private User(UserDTO dto) {
id = dto.getId();
name = dto.getName();
...
}
}
|
cs |
참고사이트
https://velog.io/@gillog/Entity-DTO-VO-%EB%B0%94%EB%A1%9C-%EC%95%8C%EA%B8%B0
Entity, DTO, VO 바로 알기
Spring Boot 프로젝트를 진행하면서 JPA를 사용하게 되었다. MyBatis를 쓸 때는 개념적으로 DTO, VO가 그냥 데이터 객체들을 옮겨다 주는 통 정도로만 이해하고 사용했는데, 이번에 JPA를 사용하면서 Entit
velog.io
'자바 > 자바 기본' 카테고리의 다른 글
[JAVA] 디폴트 메서드(default method) (0) | 2022.08.30 |
---|---|
의존성주입/DI/Dependency Injection (0) | 2022.08.11 |
lombok 어노테이션/ 롬복 설치/셋업 (0) | 2022.08.09 |
싱글톤(Singleton)/getInstance() (0) | 2022.07.25 |
형식화 클래스 : SimpleDateFormat (0) | 2022.07.25 |