일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Greedy
- JDBC
- SpringBoot
- spring
- Android
- 알고리즘
- 스프링
- kotlin
- springdatajpa
- jpa
- Thymeleaf
- QueryDSL
- Servlet
- 인프런
- JPQL
- 스프링 핵심 기능
- 자바
- Spring Boot
- 백준
- 그리디
- Proxy
- pointcut
- java
- db
- Exception
- transaction
- http
- 김영한
- 스프링 핵심 원리
- AOP
- Today
- Total
개발자되기 프로젝트
Entity Listener : 4(실제 사용하는 방법) 본문
좀 더 현실적으로 코드를 수정해보자.
createdAt, updatedAt에 각각 @CreatedDate, @LastModifidedDate 붙여주고, @AuditingEntityListener를 활용하여 간단하게 적용할 수 있었다.
하지만 각 class의 createdAt, updatedAt에 일일히 annotation을 붙여주는 것도 일이다. 귀찮다.
createdAt, updatedAt만 담당하는 class를 만들고 다른 class에서 상속받도록 하자.
그러면 일일히 안해줘도 된다. ㄱㅇㄷ
1. BaseEntity class
BaseEntity 클래스를 만들자. 특징으로는 @MappedSuperclass를 사용한다.
해당 annotation의 의미는 해당 클래스를 상위 엔티티의 컬럼으로 쓰겠다는 의미.
예를들어 User class가 BaseEntity를 상속받으면 User의 table의 컬럼에 BaseEntity를 추가하겠다는 의미.
@Data
@MappedSuperclass //해당 클래스 필드를 상속받는 entity의 커럶으로 포함시켜줌. 상위 엔티티의 컬럼으로 쓰겠다.
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
2. 나머지 class가 BaseEntity를 상속받도록 하자.
User, Book, UserHistory 모두 적용.
@Builder
@Entity //Entity에는 primary key가 꼭 필요함., JPA가 관리하고 있는 객체
@Table
@Data
@EntityListeners(value = {UserEntityListener.class})
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity implements Auditable {
뭔가 신기한게 추가되었다. @ToString, @EqualsAndHashCode가 추가되었는데, 이 둘이 없으면 @Data에 에러가 난다.
상속받은 클래스에 대한 정보가 처리되지 않는다고 한다.
상속받는 class까지 ToString을 하고 EqualsAndHashCode를 비교하겠다는 의미.
@ToString : ToString()을 override
callSuper : 부모클래스의 ToString() 호출
@EqualsAndHashCose : equals, hashCode 자동생성
equals : 두 객체의 내용이 같은지 확인하는 연산자
hashCode : 두 객체가 같은 객체인지 확인하는 연산자
3. 결과
UserHistory(
super=BaseEntity(createdAt=2021-06-16T23:35:09.690498, updatedAt=2021-06-16T23:35:09.690498),
id=6, userId=null, name=hyun19, email=hyun19@navernaver.com)
UserHistory(
super=BaseEntity(createdAt=2021-06-16T23:35:09.801920, updatedAt=2021-06-16T23:35:09.801920),
id=8, userId=7, name=hyun20_new, email=hyun19@navernaver.com)
BaseEntity가 column으로 사용되었고, createdAt, updatedAt이 잘 입력되었다. ㅋㅋ
이렇게 반복적으로 createdAt, updatedAt을 반복적으로 입력하지않고, annotation 을 계에에에속 입력하지 않게되었다.
오히려좋아!
'JPA' 카테고리의 다른 글
mappedBy() (0) | 2021.06.20 |
---|---|
1:1 연관관계 - 1 (0) | 2021.06.17 |
Entity Listener : 3(@AuditingEntityListener) (0) | 2021.06.16 |
Entity Listener : 2 (0) | 2021.06.16 |
Entity Listener - 1 (0) | 2021.06.15 |