티스토리 뷰

Web

JPA에서 데이터 접근

nooblette 2021. 9. 9. 11:16

이전에 스프링 부트 프로젝트에서 DB 접근 기술로 Mybatis를 사용할때는 정해진 규약없이 멋대로 데이터를 가져와서 사용하였다.

DAO와 VO의 개념적으로나마 조금 알고 있었지만 제대로 사용하지는 못하였다.

이번에, JPA를 공부하면서 자바 객체와 테이블을 ORM하여 사용하게되는데 실제로 어떻게 쓰이는지 짚고 넘어가려고 한다.


1. Entity

DB 테이블과 1:1 맵핑을 이루게될 클래스.

테이블 내에 존재하는 컬럼만을 필드(속성)로 가져와야한다.

Entity 클래스는 상속받거나 구현체이면 안되고, 테이블에 없는 칼럼을 사용해도 안된다.

- Setter 금지 및 생성자, 접근 제어

Entity는 테이블과 1:1 맵핑을 이루게 되므로 가장 core한 클래스이다.

-> 그러므로 Setter를 무분별하게 사용하면 객체의 일관성을 유지시킬 수없다.

-> 객체의 일관성을 유지해야 유지보수성을 높일 수 있다.

-> 객체의 생성자에 값을 넣어줌으로써 Setter 사용을 줄일 수 있다.

혹은, 접근 제한자를 protected로 설정하여 new () 사용을 제한해 Entity의 일관성을 유지할 수 있다.

 

- 예시

1
2
3
4
5
6
7
8
9
10
11
12
@Entity //이 Member 는 jpa 가 관리하는 entity
public class Member {
 
 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    // @Id : id는 PK임을 표시, @GenerateValue, Identity : id 값을 디비가 알아서 생성
    private Long id;
 
 
    @Column(name = "username"// 디비의 칼럼명 username 과 name 변수를 mapping
    private String name;
}
cs

 

- @Entity //이 Member class는 는 jpa 가 관리하는 entity

- @Id : id는 PK임을 표시

- @GenerateValue(strategy = GenerateionType.IDENTIFY) : PK생셩 규칙, id 값을 디비가 알아서 생성

- @Column(name = "username")// 디비의 칼럼명 username 과 name 변수를 mapping

 

 

2. DTO (Data Transfer Object)

개층간 데이터 교환을 위한 객체(Java Beans)이다.

DB의 데이터를 Service나 Controller로 보낼 때 사용하는 객체를 말한다.

로직을 갖지않는 순수한 객체, getter/setter 메소드만을 갖는다.

또한, Controller layer에서 Response DTO 형태로 client에게 전달된다.

 

DB에서 가져온 데이터를 Entity를 통해 전송할 수도 있지만, Entity에 존재하지 않는 속성도 송신해야하는 경우도 있다. 

이때 임의로 필드를 추가한다면 Entity의 일관성을 깨뜨리기 때문에, DTO를 사용하여 필요한 필드를 추가하여 전송하면 된다. 

 

 

- 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Getter @Setter
@Alias("article")
class ArticleVO {
    private Long id;
    private String title;
    private String contents;
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Article article = (Article) o;
        return Objects.equals(id, article.id);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
cs

 

DTO 객체를 사용하는경우 

"SELECT new com.victolee.example.dto.BookDTO(b.no, b.title) FROM Book b"

와 같이 jpql을 작성해서 사용해야하는데,

이때 사용되는 jpql의 new 키워드를 사용하기위해 BookDTO에서 생성자를 오버라이딩한다.

즉, BookDTO 객체 필드 값으로 쿼리의 결과 값을 할당한다.

(new 키워드 때문에 객체를 생성하는것 처럼 보이지만 실제로 그렇지는 않다.)

 

 

3. VO (value Object)

값 객체, equals()와 hashcode()를 오버라이딩하는것이 VO의 핵심이다.

VO에 선언된 필드의 모든값이 같아야 동일한 객체라고 볼 수 있다.

여러 테이블에 대한 공통 속성을 모아서 만는 BaseVO 클래스를 상속 받아서 사용할 수 있다.

 

 


출처

- https://victorydntmd.tistory.com/205

 

[Spring JPA] JPQL ( Java Persistence Query Language )

JPQL ( Java Persistence Query Language ) JPQL은 SQL과 비슷한 문법을 가진 객체 지향 쿼리입니다. JPQL의 탄생 배경은 JPA에서 제공하는 메서드 호출만으로 섬세한 쿼리 작성이 어렵다는 것에 있습니다. 이

victorydntmd.tistory.com

- https://velog.io/@gillog/Entity-DTO-VO-%EB%B0%94%EB%A1%9C-%EC%95%8C%EA%B8%B0

 

Entity, DTO, VO 바로 알기

본 게시글은 작성자 본인의 학습을 위함이라 부족한 점이 많습니다.선생님들의 따뜻한 조언과 피드백 부탁드립니다! 감사합니다! 🙇‍♂️스프링 부트 프로젝트를 진행하면서 JPA를 사용하게

velog.io

 

'Web' 카테고리의 다른 글

ControllerAdvice와 ExceptionHandler로 예외처리  (0) 2021.09.13
Jackson과 Gson (Java에서 json 사용하기)  (0) 2021.09.09
JPA, ORM, Hibernate, JPQL  (0) 2021.09.09
Apache Tomcat과 Apache  (0) 2021.08.14
웹 브라우저의 기본 원리  (0) 2021.07.26
Comments