danc
danc*dev
danc
  • 분류 전체보기
    • codestates_BE_bootcamp39
      • 주단위 일기
      • 회고
    • programming
      • JAVA
      • SPRING
      • GENERAL
      • LINUX
      • ALGORITHM
      • ERROR_HANDLING
    • web
      • NETWORK
      • DB
      • HTML
      • CSS
    • kr
    • nz

최근 글

인기 글

태그

  • 일기
  • 윈도우 11 우분투
  • TIL
  • React에서 Authorization헤더
  • HTTP
  • 회고
  • AOP
  • css
  • TIL 일기
  • 코드스테이츠 백엔드
  • TIL일기
  • 코드스테이츠

최근 댓글

티스토리

hELLO · Designed By 정상우.
danc
programming/SPRING

Entity개념 복습

Entity개념 복습
programming/SPRING

Entity개념 복습

2022. 6. 28. 00:01

*해당 포스팅은 개인적인 공부를 정리한 것이므로 틀린 정보가 있을 수 있습니다*
*틀린 부분에 대한 피드백은 감사하게 받겠습니다*

 

스터디 책을 진행하다가 Entity라는 것이 자꾸 튀어나왔는데, 분명 초반 부분에서 한번 스쳐 지나갔다.

하지만 개념이 이해가 되지 않은 상태에서 일단 코드를 따라 쳐 보다 보니 이미 나온 내용이지만 
어떤 기능을 하는지 잘 와닿지 않았고 계속 찝찝한 기분이 들었다. 

따라서 스터디 발표도 할 겸 한번 간단하게나마 정리해보려 한다. 

추가할 것: 

JPA Repository에서 진행되가는 과정 

- @entity로 객체 만들고 persist() 메서드로 실제로 DB와 연동을 시킨다. 

빈 과 엔티티 차이?? 

entity의 위치 


큰 그림으로 봤을때 알아두면 좋을 사전 정보는 아래와 같다   

 

  • @Entity는 'Class'단에서 사용되고 JPA의 애너테이션 이다.  

  • 서비스 계층에서 사용된다. 

  • JPA는 관계형 DB와 OOP사이에서 패러다임의 밸런스를 맞춰준다.

  • 즉, Entity는 실제 DB의 테이블과 매칭 될 '클래스'이다

  • Entity클래스의 수정을 통해 DB의 데이터를 변경한다.

  • dto객체가 View Layer와 데이터를 주고받는다면, entity객체는 db layer와 
    데이터를 주고받을 때 사용한다.

 

https://stackabuse.com/guide-to-spring-data-jpa/

 


@Entity 애너테이션

 

@Entity 애너테이션은 해당 클래스를 DB의 실제 테이블과 매칭 하겠다라고 선언하는 것이다.
해당 클래스를 Entity클래스라고 부를 수 있다. 

이때 해당 DB의 테이블 이름은 @Entity가 붙은 클래스의 이름으로 설정된다.  

@Getter
@NoArgsConstructor
@Entity
public class User extends BaseTimeEntity {
//DB의 실제 테이블과 매칭 될 클래스 (Entity 클래스 라고도 한다)
//Entity 클래스에서는 Setter를 절때 쓰지 않는다.

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //SQL AUTO_INCREMENT
    private Long id;

    @Column(nullable = false) //SQL NOT NULL
    private String name;

    @Column(nullable = false)
    private String email;

    @Column
    private String picture;

    @Enumerated(EnumType.STRING) //p 178 // enum을 String으로 저장하겠다 선언
    @Column(nullable = false)
    private Role role;

    @Builder
    public User(String name, String email, String picture, Role role) // 클래스 생성자
    {
        this.name=name;
        this.email=email;
        this.picture=picture;
        this.role=role;

User라는 클래스 이름이 DB에서의 테이블 이름과 매칭 되었고 

그 아래 @Id, @Column, 그리고 lombok의 @Builder 같은 추가적인 애너테이션들이 있다.
Entity 클래스가 DB와 관련이 있으니 해당 애너테이션들도 DB와 뭔가 관련이 있지 않을까?

해당 annotation들도 간략하게 찾아봤다.


 

@Id / @GeneratedValue 
해당 테이블의 Primary Key(PK) 값을 설정한다.
그리고 @GeneratedValue(strategy = GenerationType.IDENTITY)는 PK값이 1씩 증가하도록 한다.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // SQL AUTO_INCREMENT
private Long id;

 


 

@Column
해당 변수명을 테이블의'열'로 설정한다. 

위 사진은 상단의 책 예제 코드 부분을 h2-console로 확인한 모습이고,
코드의 @Column이 붙은 변수명이 USER테이블의 column으로 들어간 것을 확인할 수 있다.
(EMAIL, NAME, PICTURE, ROLE) 

 


 

@Builder
lombok의 라이브러리로써, 해당 클래스의 빌더 패턴 클래스를 생성해준다. 

생성자 상단에 선언 시 (아래 코드처럼) 생성자에 포함된 필드만 빌더에 포함한다. 

보통 Setter대신에 Builder pattern을 이용하거나, 생성자를 통해 필드의 초기화를 한다.

@Builder
public User(String name, String email, String picture, Role role) // 클래스 생성자
{
	this.name=name;
	this.email=email;
    this.picture=picture;
    this.role=role;
}
빌더 패턴? 

빌더 패턴은 디자인 패턴 중 하나로,
[객체의 생성 방법]과 [객체의 표현 방법]을 분리하는 것을 말한다. 

생성자 만을 통해서 객체를 생성하는 데는 어려움이 있어 이를 해소하기 위해 고안되었다.

특히 생성자 인자가 많은 경우에는 가독성이 떨어지는데 이때 빌더 패턴으로 코드를 구성하면
훨씬 간결하고 직관적인 코드 작성이 가능해진다. 

인자가 선택적인 경우에도 빌더 패턴이 유리하다. 


참고: https://devlog-wjdrbs96.tistory.com/207

 


Entity 클래스 특이사항 

 

1. Setter 사용의 지양

Entity클래스에서는 Setter사용을 극히 지양하고 있다.

롬복 라이브러리의 Getter 같은 경우에는 엔티티의 정보 조회를 많이 하는 경우가 많기도 하고
데이터의 변경을 하지 않으니 문제도 딱히 없어 보인다.

그러나 Setter는 실질적으로 1. 데이터를 변경시키고, 사이즈가 작은 코드면 몰라도
규모가 있는 코드에서는 Setter가 2. 어떤 기능을 하는지 명확하게 구분하기 힘들다. 

특히나 Entity클래스는 DB와 밀접한 관련이 있기 때문에 각별히 주의를 해야 한다.

만약 데이터의 값 변경이 필요한 경우에는
해당 변경의 목적과 의도를 나타낼 수 있는 메서드를 생성해서 사용해야 한다.   

 

[Spring] 실무에서 가급적 Entity 클래스에 Setter 사용을 자제해야 하는 이유

이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 별도의 메서드를 제공하는게 가장 이상적이다. 하지만 실무에서 엔티티의 데이터는 조회할 일이 너무 많으므로, Getter의 경우 모두 열어두

toongri.tistory.com

 


 

2. 영속성(persistent) 

영속성(변하지 않음)은 데이터를 생성한 애플리케이션이 종료돼도 생성된 데이터가
사라지지 않는 특성을 의미한다. 

Entity 클래스는 이런 영속성을 목적으로 사용하기 때문에 Request/Response 같이
값을 전달하는 클래스로써의 사용은 부적절하다. 따라서 Entity클래스와 비슷한 구조를 갖는
Request dto, Response dto 같은 view를 위한 클래스를 따로 만들어 사용한다. (잦은 변경) 

DB와 직접적으로 연관이 되기 때문에 더욱 영속성이 중요한 것 같다. 

 


 

3. 기본 생성자 

Entity는 반드시 파라미터가 없는 생성자가 있어야 하고,
접근제어자가 public / protected 이어야 한다.

이는 JPA구현체인 hibernate의 기능을 사용하기 위해서이다. 

 

[JPA] 왜 JPA의 Entity는 기본 생성자를 가져야 하는가?

왜 JPA의 Entity는 기본 생성자를 가져야 하는가? 정확히 이야기하면 Entity는 반드시 파라미터가 없는 생성자가 있어야 하고, 이것은 public 또는 protected 이어야 한다. 이러한 궁금증을 가지게 된 이

hyeonic.tistory.com

 

 

Entity 에 쓰이는 어노테이션

ORM 기술을 적용하다보면 엔티티를 쉽게 마주치게 된다.영속성 관리를 위한 객체이기 때문!스프링을 MyBatis가 아니라, JPA로 처음 접한 나는 당연히 여태까지 @Entity 어노테이션을 활용해서 잘 쓰고

velog.io

 


 

영속성 컨텍스트

영속성 컨텍스트 (Persistence Context)는 [Entity를 영구 저장하는 환경]이다. 

일종의 논리적 임시 저장소라고 보면 되고,
Entity가 영속성 콘텍스트에 포함되는지 아닌지가 JPA의 핵심이다. 

엔티티를 DB에 저장하는 게 아니라 영속성 콘텍스트라는 곳에 저장하고,
이를 관리하는 Entity Manager를 통해 해당 엔티티에 접근할 수 있다. 

 

 

영속성 컨텍스트에 엔티티를 저장하면 여러 이점들이 있다. 자세한 내용은 아래의 링크를 참조

  • 1차 캐시
  • 더티 체킹
  • 지연 로딩
  • 트랜젝션을 지원하는 쓰기 지연
  • 동일성 보장 

 


 

Entity 생명 주기

Entity Manager는 관리하는 entity 객체들을 영속성 컨텍스트에 넣고 엔티티를 관리한다.

여기서 관리라는 말은 entity객체의 Life-cycle을 관리하는 의미라 보면 된다.

entity의 생명주기는 4가지 종류가 있다.

이름 설명
New (비 영속)  Java영역에만 존재한다. DB와 연동되지 않은 순수한 상태

Entity Manager가 관리 X
Managed (영속) DB에 저장되고 메모리상에도 존재한다.

PK값을 통해 해당 entity객체를 사용 가능하다.
Removed (비 영속 / 삭제) DB에서 삭제된 상태이며, 삭제된 entity는 영속 컨텍스트에 존재하지 않음
Detatched (준 영속) 영속 컨텍스트에서 Entity객체를 꺼내서 사용함 / 해당 entity는 분리되어진다.

아직 DB와 동기화 X 

 

 

해당 부분은 이해가 아직 잘 되지 않아 참고하고 있던 링크를 걸어두었다. 

 

JPA 영속성 컨텍스트가 뭘까?

JPA 영속성 컨텍스트에 관하여 클라이언트 요청부터 DB까지 동작하는 로직 웹 애플리케이션에 클라이언트 요청이 들어오면 EntityMangagerFactory 는 EntityManager 객체를 생성하게 됩니다. 각각 생성된 En

dev-monkey-dugi.tistory.com

 

 

 

엔티티(Entity)

엔티티? JPA에서는 엔티티는 테이블에 대응하는 하나의 클래스라고 생각하시면 편합니다.엄청나게 간단한 코드와 함께 같이 보겠습니다. 엔티티 클래스 데이터베이스의 테이블 |username|passoword| |

velog.io

 

저작자표시 (새창열림)

'programming > SPRING' 카테고리의 다른 글

JDBC 간단 요약  (0) 2022.06.30
예외 처리  (0) 2022.06.29
구글 로그인 구현 이후 사용자 이름이 뜨지 않는 문제  (0) 2022.06.23
핸들러 메서드의 응답 데이터 순서 변경  (0) 2022.06.23
gradle reload는 중요해  (0) 2022.06.22
  • @Entity 애너테이션
  • Entity 클래스 특이사항 
  • 1. Setter 사용의 지양
  • 2. 영속성(persistent) 
  • 3. 기본 생성자 
  • 영속성 컨텍스트
  • Entity 생명 주기
'programming/SPRING' 카테고리의 다른 글
  • JDBC 간단 요약
  • 예외 처리
  • 구글 로그인 구현 이후 사용자 이름이 뜨지 않는 문제
  • 핸들러 메서드의 응답 데이터 순서 변경
danc
danc
Backend 개발자를 목표로 공부 중 입니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.