DTO(Data Transfer Object)의 약자로,
데이터
를 전달하기 위한 객체라고 생각하면 된다.
DTO는 로직을 가지지 않은 순수한 데이터 객체이므로 (Getter & Setter 만 가지는 클래스이다.)
DTO의 핵심은 데이터를 전달하는 것에 초점을 둔다.
따라서 여러 레이어(Layer)간 데이터를 주고 받을 때 사용할 수 있으며 주로 View와 Controller 사이에서 사용한다.
따라서 클라이언트에서 서버쪽으로 요청하는 데이터를 담긴 객체가 Request 객체라면,
RequestDto 라는 이름을 붙여서 DTO 클래스를 만들 수 있다.
또한, 서버쪽에서 클라이언트로 응답 데이터를 담긴 객체를 Response 객체라면,
ResponseDto 라는 이름을 붙여 DTO 클래스를 만들 수 있다.
@Getter
public class RequestDto {
private final String name;
private final int age;
public RequestDto(Request request) {
name = request.getName();
age = request.getAge();
}
}
이런 식으로 불변 객체로써의 DTO를 만들 수 있다.
실제
DB 테이블
과매핑
이 되는 클래스를 의미한다.
실제 DB의 데이틀봐 매칭될 클래스이다.
Entity 데이터를 전달하는 클래스로 사용하면 안된다.
테이블에 대응하는 하나의 클래스라고 생각하면 된다.
Entity는 Setter를 설정하지 않아야 한다. 외부에서 Setter를 이용한 값의 변경으로 DB 오류가 발생할 수 있다.
@Entity
@NoArgsConstructor
@Getter
@Table(name = "test")
public class EntityTest{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="test", nullable = false)
private String test;
public EntityTest(String test) {
this.test = test;
}
}
이런식으로 DB 테이블에 대응하는 클래스이다.
자세한 어노테이션에 대한 링크는 어노테이션 링크 에 찾아가서 보면 된다.
JPA가 관리할 수 있는 Entity 클래스로 지정한다.
매핑할 테이블을 지정해준다.
@Column(name = "test") : 필드와 매핑할 테이블의 컬럼을 지정할 수 있다.
@Column(nullable = false) : 데이터의 null 값 허용 여부를 지정할 수 있다.
@Column(unique = true) : 데이터의 중복 값 허용 여부를 지정할 수 있다. (defalut = false)
@Column(length = 500) : 데이터 값(문자)의 길이에 제약 조건을 걸 수 있다. (default = 255)
테이블의 기본 키
를 지정해준다.
영속성 컨텍스트
에서 Entity를 구분하고 관리할 때 사용되는 식별자 역할을 수행한다.
@GeneratedValue 옵션을 추가하면 기본 키 생성을 DB에 위임할 수 있다.
@GeneratedValue(strategy = GenerationType.IDENTITY) : 직접 id값을 넣어주지 않아도 자동으로 순서에 맞게 기본키가 증가된다.
주의!!
JPA가 Entity 클래스를 인스턴스화 할 때기본 생성자
를 사용하기 때문에 반드시 현재 Entity 클래스에는 기본 생성자가 생성되고 있는지 확인해야한다.