본문 바로가기
개발/JPA

Entity 제작시 유의사항 (개인 공부입니다.)

by 설이주인 2022. 7. 9.
@Entity // 더이상 자세한 설명은 생략한다.
/*
 * 테이블 속성을 정의하기 위한 Annotation
 * 상속 전략을 사용하는 테이블의 경우 어떤 상속 전략을 
 * 사용할지에 따라서 작성을 하면 안되는 경우가 있습니다.
 * 상속 전략을 사용하실 것이라면 어떤 상속 전략을 쓸지 판단해야 합니다.
 */
@Table(
    /*
     * Table 이름을 정의.
     * 이 부분을 제거하면 Class 이름으로 테이블이 생성된다.
     * 테이블 이름 규칙은 [TB] + _ + [GROUP NAME] + _ + [TABLE NAME] 입니다.
     * 하지만 여기서 GROUP NAME 까지 작성하시는건 어려울 것이라 판단됩니다.
     * 그래서 [TB] + _ + [TABLE NAME] 와 같은 규칙으로 작성하시길 바랍니다.
     */
    name = "TB_BLOG_POST",
    /*
     * 테이블 INDEXING 정의입니다.
     * 지금 혼자 공부할 때 필수가 아니니 제거하셔도 됩니다.
     * (지금 공부하지 말란 말입니다. 그냥 이런게 있구나라는 인식만 있으면 됩니다.)
     */
    indexes = {@Index(name = "IDX_BLOG_POST_FLAG", columnList = "useFlag, delFlag")}
)
@Getter // 더이상 자세한 설명은 생략한다.
@DynamicInsert // 이건 한 번 검색해서 공부를 해주세요.
@DynamicUpdate // 이건 한 번 검색해서 공부를 해주세요.
/*
 * 기본 생성자에 대한 접근 권한을 설정.
 * 이건 한 번 검색해서 공부를 해주세요.
 */
@NoArgsConstructor(access = PROTECTED)
public class Board {

    @Id // 더이상 자세한 설명은 생략한다.
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
				// 이건 한 번 검색해서 공부를 해주세요.
    private Long id;

    /*
     * Column 에 대한 상세 설정이 가능한 Annotation
     * 상당히 다양한 설정을 할 수 있습니다.
     * 이건 한 번 검색해서 공부를 해주세요.
     */
    @Column(
            nullable = false, // null 입력이 가능한지 설정 (DB Column null 제약 조건을 공부하면 됩니다.)
            length = 100 // 최대 길이 설정 (DB Column length 를 공부하면 됩니다.)
    )
    private String title;

    @Lob // TEXT 와 같이 큰 문자열 유형을 정의 (DB Column 데이터 유형을 공부하면 됩니다.)
    @Column(nullable = false)
    private String contents;

    /*
     * 작성일을 적고 싶으셨던 것 같습니다.
     * 작성일은 DB 에 값이 Insert 될 때 설정되겠죠?
     * 이 설정 방법도 다양합니다.
     * 어떤 설정 방법이 있는지 공부해서 알려주세요.
     */
    private LocalDateTime createDate;

}

@Entity - 상속 전략?

객체는 상속을 지원하지만 DB는 상속을 지원하지 않는다, 그래서 논리 모델을 물리 모델로 구현할 방법이 필요하다

JPA가 이 세가지 방식과 매핑하기 위해서는

  • @inheritance(strategy = inheritance)종류 :
    • JOINED
    • SINGEL_TABLE
    • TABLE_PER_CLASS
  • deault 전략은 single table 전략
  • @DiscriminatorColumn(name= “ ”)
  • 부모 클래스에 선언. 하위 클래스를 구분하는 용도의 컬럼. 관례: default=DTYPE
  • @Discriminator(”XXX”)어노테이션을 선언하지 않을 경우 기본 값으로 클래스 이름이 들어간다.
  • 하위 클래스에 선언. 엔티티 저장시 슈퍼타입의 구분 컬럼에 저장할 값을 지정한다.

주로 JOINED, SINGLE_TABLE 전략 사용

https://ict-nroo.tistory.com/128

 

[JPA] 상속관계 매핑 전략(@Inheritance, @DiscriminatorColumn)

상속관계 매핑 객체는 상속관계가 존재하지만, 관계형 데이터베이스는 상속 관계가 없다.(대부분) 그나마 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑이라

ict-nroo.tistory.com

entity extends, entity inheritance 차이

Entity 칼럼 상속

테이블과 매핑하지 않고 부모 클래스를 상속 받는 자식 클래스에게 매핑 정보(엔티티 칼럼)만 제공하고 싶으면 @MapperSuperClass를 사용하면 된다.

mappersuperclass를 비유하면 추상 클래스와 비슷한데 entity는 실제 테이블과 매핑되지만 mappedsupperclass는 실제 테이블과 매핑 되지 않는다.

주의:

  • 상속 관계는 매핑이 아니다.
  • MappedSuperclass가 선언 되어있는 클래스는 엔티티가 아니다. 테이블과 매핑 안된다.
  • 단순히 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
  • 조회 검색 불가능 (부모 불가능)
  • 직접 생성해서 작업하지 않음 추상 클래스로 제작 권장 abstract
  • 주로 등록일 수정일 등록자 수정자 같은 공통 엔티티를 공통으로 적용하는 정보를 모을때 사용한다.
  • 참고 : JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스만 상속 할 수 있다.

mappedsuperclass - 내가 상위라고 하는 이름표(inheritance가 없어도 사용 가능하다)

inheritance는 상속이라고 드러내는 이름표


  1. extends
    • 부모에서 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있음
  2. implements (interface 구현)
    • 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩 (재정의) 해서 사용해야함
  3. abstract
    • extends와 interface 혼합. extends하되 몇 개는 추상 메소드로 구현되어 있음

@DynamicInsert - insert 값이 null 일때 무시하게 해줌

@DynamicUpdate - 위와 같음

 

@NoargsConstructor(access= protected)

왜 사용 하는가?

무분별한 객체 생성에 대해 한번 더 체크 할 수 있는 수단이 된다.

EX) User 이라는 Class가 name, age, email 정보를 모두 가지고 있어야만 하는 경우에 기본 생성자를 막는 것은 이를 도와주는 좋은 수단이 된다.

 

만약에 기본 생성자의 권한이 public 일시 이러한 상황이 발생할 수 있다.

https://cobbybb.tistory.com/14

 

@NoargsConstructor(AccessLevel.PROTECTED) 와 @Builder

@NoargsConstructor(AccessLevel.PROTECTED) 와 @Builder를 함께 사용할때 주의할 점에 대해서 서술합니다. "왜" 안되는지와 "왜" 이렇게 해결 할 수 있는지에 대해 집중하여 서술합니다. 1. 왜 NoargsConstructor..

cobbybb.tistory.com


@GeneratedValue(strategy = “?”)

identity - 기본키 생성 DB에 위임 (+ 특별한 경우 IDENTITY 전략에서응 entityManager.persist()하는 시점에서 insertSQL을 실행하여 데이터베이스에서 식별자를 조회하여 영속성 컨텍스트 1ck 캐시에 값을 넣어주기 때문에 관리가 가능해진다.)

 

sequence - DB의 sequence object를 사용하여 데이터베이스가 자동으로 기본키를 생성 해줌, sequenceGenerator 어노테이션이 필요하다. (+ sequence 값을 계속 DB에서 가져와서 사용해야 하기 때문에 성능 저하를 일으킬 수 있다. but allocationSize의 크기를 적당히 설정하여 성능 저하 개선 가능) - 사용 가능한 디비 제한

 

table - 키를 생성하는 테이블을 사용함 sequence와 유사 @TableGenerator 어노테이션 필요, 모든 디비 사용 가능

 

auto - 기본 설정 값으로 각 데이터베이스에 따라 기본키를 자동으로 생성한다. - 우선순위 존재


@Column 어노테이션

속성 설명 기본값
name Mapping 할 Column의 이름을 지정 객체 Field 이름
insertable Entity 저장 시 해당 Feild도 저장, false오 릭기 전용 설정 가능하다. true
updateable Entity 수정 시 해당 Feild도 수정, false로 읽기 전용 설정 가능 true
table 하나의 Entity 설정에서 두개 이상의 Table에 매핑할 때 사용 현재 Class가 매핑된 Table
nullable(DDL) true/false로 null 허용 여부 설정  true
unique(DDL) true/false로 unique 허용 여부 설정  
length(DDL) Column 속성 길이 설정 255
columnDefinition DB Column 정보를 직접 설정 Java Type과 설정 DB방언으로 , 적절한 
Column Type 생성
percision, scale(DDL) BigDecimal, BigInteger Type에서 사용,  precision은 소수점 포함 전체 자릿수,scale은 소수 자릿수,double, float Type에는 적용되지 않음.아주 큰 숫자나 정밀한 소수를 다룰때 사용. precision=19, scale=2

https://velog.io/@gillog/JPA-Column-Annotation

 

[JPA] @Column Annotation

자바 ORM 표준 JPA 프로그래밍JPA에서 DB Table의 Column을 Mapping 할 때 @Column Annotation을 사용한다.여기서 @Column을 사용하지 않으면 userId와 같이 속성명 그대로 DB Column과 Mapping을 시도한다.@Col

velog.io

@Lob : Large Object 줄임말

어노테이션으로 large object를 데이터베이스에 적절하게 저장한다.


Java.util.Date

Java.util.Calender

둘의 문제점

localDate 탄생

https://d2.naver.com/helloworld/645609

 


@NoArgsConstructor(access = PROTECTED)

protected는 무분별한 생성자 제작에 제한을 두게 해준다.


Entity에서 기본적으로 Setter을 설정하지 않는다. 

JPA에서는 특히나 어디서나 변경 되는 환경을 막는게 맞다.

그럼 우리는 Setter원래 쓰지 않는다 -> 그럼 @Buillder을 사용하자