[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 |