Spring

[Spring Boot] Spring Data JPA에서 BaseEntity 사용하기

2023. 7. 26. 17:18
목차
  1. BaseEntity란?
  2. BaseEntity 적용해 보기
  3. @MappedSuperClass란?
  4. @MappedSuperclass에 대하여 알아두어야 할 점
728x90
728x90

BaseEntity란?

Spring Boot 내에서 코드를 작성하다 보면 정보가 중복되는 경우가 종종 발생합니다.

이러한 경우를 손쉽게 해결해 주는 방법이 바로 BaseEntity입니다.

 

아래 코드를 보면 Student와 Professor 클래스 내 정보를 살펴보면,

createdBy와 createdDate에서 공통 정보가 발생합니다. 

 

물론 하나하나씩 별도로 작성해 주어도 문제는 없지만, 중복된 것처럼 보일 수 있기에 이를 한 곳에 공통으로 매핑해 주는 것이 좋습니다.

 

@Entity
public class Student {

  @Id
  @GeneratedValue
  private Long id;
  private String name;

  // 공통 컬럼
  private String createdBy;
  private LocalDateTime createdDate;

}

 

@Entity
public class Professor {

  @Id
  @GeneratedValue
  private Long id;
  private String name;

  // 공통 컬럼
  private String createdBy;
  private LocalDateTime createdDate;

}

Spring Boot를 실행해 주고 H2 데이터베이스를 접속해 보면 아래와 같이 테이블이 생성되어 있습니다.

BaseEntity 생성 전 H2 DB

저희는 좀 더 효율적으로 BaseEntity를 통해서 코드를 개선해 보겠습니다.

 

BaseEntity 적용해 보기

먼저 같은 패키지 내에 아래와 같이 BaseEntity 클래스를 생성해 주었습니다.

클래스를 생성해 준 후, 아까 중복되었던 정보인 createdBy와 createdDate를 BaseEntity 클래스 내에 작성해 줍니다.

@MappedSuperclass
public abstract class BaseEntity {
  
  private String createdBy;
  private LocalDateTime createdDate;

}

 

여기서 잠깐,

@MappedSuperClass란?

BaseEntity는 사실 클래스명만 BaseEntity이고, 실제 Entity가 아닙니다.

Entity 클래스는 Entity 클래스끼리만 상속받을 수 있으므로 따라서 엔티티나 @MappedSuperclass 어노테이션을 작성해주어야 합니다.

 

다시 본론으로 넘어가서 Student와 Professor 클래스에서 중복되었던 데이터를 제거해 준 후,

extends 키워드를 통해서 BaseEntity로 확장을 해줍니다.

@Entity
public class Student extends BaseEntity {

  @Id
  @GeneratedValue
  private Long id;
  private String name;

}
@Entity
public class Professor extends BaseEntity {

  @Id
  @GeneratedValue
  private Long id;
  private String name;

}

 

코드를 깔끔하게 수정 후 다시 H2 데이터베이스를 실행하여 쿼리문을 입력한 결과,

테이블의 속성은 동일하게 나타납니다.

BaseEntity 생성 후 H2 DB

 

@MappedSuperclass에 대하여 알아두어야 할 점

@MappedSuperclass 어노테이션은 테이블과 관계가 없고, 공통 매핑 정보를 모으는 역할을 합니다. 

단순히 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하는 것이죠.

 

그러므로, 이 어노테이션을 사용한 클래스는 조회와 검색이 불가능 합니다. 

ex) em.find(BaseEntity) 사용 불가

 

또한, 직접 생성해서 사용할 경우가 없므로 추상 클래스를 권장합니다.


출처 : 인프런 김영한 - 자바 ORM 표준 JPA 프로그래밍(기본편)

728x90
728x90
저작자표시 (새창열림)

'Spring' 카테고리의 다른 글

[Spring Boot] Querydsl 동적 쿼리(Dynamic SQL) 조회 (BooleanBuilder, BooleanExpression)  (6) 2023.08.01
[Spring Boot] Querydsl 초기 세팅 (Gradle, Querydsl 5.0.0)  (6) 2023.07.31
Junit5에서 assertThat()과 equalTo()가 선언이 안되는 경우  (0) 2023.05.08
@RequestParam과 @Pathvariable의 차이점  (0) 2023.05.08
[IntelliJ] 테스트 코드 단축키 설정  (0) 2023.05.08
  1. BaseEntity란?
  2. BaseEntity 적용해 보기
  3. @MappedSuperClass란?
  4. @MappedSuperclass에 대하여 알아두어야 할 점
'Spring' 카테고리의 다른 글
  • [Spring Boot] Querydsl 동적 쿼리(Dynamic SQL) 조회 (BooleanBuilder, BooleanExpression)
  • [Spring Boot] Querydsl 초기 세팅 (Gradle, Querydsl 5.0.0)
  • Junit5에서 assertThat()과 equalTo()가 선언이 안되는 경우
  • @RequestParam과 @Pathvariable의 차이점
주인장 지니
주인장 지니
지니의 코딩로그주인장 지니 님의 블로그입니다.
300x250
주인장 지니
지니의 코딩로그
주인장 지니
전체
오늘
어제

블로그 메뉴

HOME
GITHUB
MAIL
    • 분류 전체보기 (123)
      • Baekjoon (0)
        • SQL (0)
      • Programmers (62)
        • SQL (61)
        • Coding Test (1)
      • LeetCode (2)
      • Spring (14)
      • GitHub (2)
      • DB (5)
      • Server (1)
      • Study (29)
        • 이것이 취업을 위한 코딩 테스트다 (11)
        • Java (0)
        • Python (1)
        • AWS (16)
        • React (1)
      • Record (7)
      • IT 잡학사전 (1)

    공지사항

    인기 글

    태그

    • spring boot
    • spring
    • 스프링
    • CLF-C01
    • 이것이 취업을 위한 코딩 테스트다
    • IntelliJ
    • Python
    • 알고리즘
    • AWS
    • mysql
    • 에러
    • 후기
    • Examtopics
    • SQL
    • 이코테
    • 자격증
    • QueryDSL
    • JPA
    • 프로그래머스
    • 코딩테스트

    최근 댓글

    최근 글

    hELLO · Designed By 정상우.
    주인장 지니
    [Spring Boot] Spring Data JPA에서 BaseEntity 사용하기
    상단으로
    loading

    티스토리툴바

    단축키

    내 블로그

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

    블로그 게시글

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

    모든 영역

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

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