[JPA] MappedSuperclass / JpaAuditing

2024. 1. 31. 15:50
728x90

 

1. MappedSuperclass

@MappedSuperclass

: 다른 Entity가 상속 받아서 내가 가진 속성 정보를 포함시키고 싶을 때 상속 받는 Entity 클래스임을 나타내는 어노테이션

- 이렇게 만들어진 클래스는 다른 클래스가 상속받는 것이 목표이기 때문에! 실제로 테이블이 생성되지는 않는다.

 

ex) Article, Comment 엔티티에 공통으로 가진 속성 정보 id

BaseEntity 추상 클래스를 만들고 @MappedSuperclass 어노테이션을 붙여 Article, Comment에서 상속받는다.

- BaseEntity

// BaseEntity abstract class
@MappedSuperclass
@Getter
public abstract class BaseEntity {
	// id값
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    // 생성일자
    private LocalDateTime createdAt;

    // 업데이트 일자
    private LocalDateTime updatedAt;

}

- Article & Comment 

// Article Entity class
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Article extends BaseEntity {

    private String title;
    private String content;
    private String writer;

    @OneToMany(mappedBy = "article")
    private final List<Comment> commentList = new ArrayList<>();

}

// Comment Entity class
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Comment extends BaseEntity {
    private String content;
    private String writer;

    @ManyToOne
    private Article article;
}

 

 

2. JpaAuditing

@EnableJpaAuditing

: Entity Auditing 기능 설정. BaseEntity에 해당 컬럼을 적용하면 된다.

 

1) Config 클래스 만들기 (@Configuration + @EnableJpaAuditing)

// JpaConfig

//auditing
@Configuration
@EnableJpaAuditing
public class JpaConfig {

}

 

2) BaseEntity에 적용하기

- @EntityListeners(AuditingEntityListener.class) : 이 엔티티에 변경사항이 발생할 때 그 내용을 관찰할 클래스를 지정해준다.

- @CreatedDate : 해당 속성이 나타내는 컬럼은 데이터의 생성일자를 나타내는 컬럼

- @LastModifiedDate : 데이터의 마지막 수정일자를 나타내는 컬럼.

// BaseEntity abstract class
@MappedSuperclass
@Getter
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @CreatedDate
    private LocalDateTime createdAt;
    @LastModifiedDate
    private LocalDateTime updatedAt;
}

 

3) 간단하게 컨트롤러만 만들어서 확인해보았다.

//ArticleController class

@RestController
@RequiredArgsConstructor
@RequestMapping("articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    @GetMapping("/test")
    public String test() {
        articleRepository.save(Article.builder()
                .title("hi")
                .content("hello")
                .writer("me")
                .build()
        );
        return "done";
    }

    @GetMapping("/update")
    public String update() {
        Long id = 1L;
        Article article = articleRepository.findById(id).orElseThrow();
        article.setContent("update");
        articleRepository.save(article);
        return "updated";
    }
}

 

쟈잔~ 48분에 create하고, 49분에 update 했다~ 잘 반영되네요!

728x90

'Programming > Spring, SpringBoot' 카테고리의 다른 글

@Query  (1) 2024.02.01
Relations (M : N 관계)  (1) 2024.02.01
OAuth2 - Kakao Login 구현  (1) 2024.01.30
OAuth2 - 소셜 로그인  (0) 2024.01.30
Authorization  (0) 2024.01.30

BELATED ARTICLES

more