โ๏ธ Entity์ ๊ธฐ๋ก ๋จ๊ธฐ๊ธฐ
ํ์ ์์๋ ์ด์์์ ๋ฐ์ํ ์ด์๋ค์ ์ถ์ ํ ๋ ์ฌ์ฉํ๊ธฐ ์ํด Entity๋ง๋ค `์์ฑ์๊ฐ`,`๋ณ๊ฒฝ์๊ฐ`๋ฑ์ ๋จ๊ธด๋ค๊ณ ํ๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ User Entity์ ์์ฑ์๊ฐ์ธ `createdAt`, ๋ณ๊ฒฝ์๊ฐ์ธ `modifiedAt`์ด ์กด์ฌํ๋ค.
Entity ๊ธฐ๋ก ๋จ๊ธฐ๊ธฐ
@Entity
@Getter
public class UserDetail{
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "modified_at")
private LocalDateTime modifiedAt;
...
}
๐ ์๊ฐ ์์ฑ ๋ฐ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ
1. ์ง์ ๊ฐ ๋ฃ์ด์ฃผ๊ธฐ ( ๋น์ถ์ฒ ๐ โ๏ธ )
// 1. ์์ฑ
UserDetail createUserDetail(){
return UserDetail.builder()
.nickname("๋๋ค์")
.createdAt(LocalDateTime.now()) // ์ง์ ๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
.modifiedAt(LocalDateTime.now()) // ์ง์ ๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
.build();
}
// 2. ์
๋ฐ์ดํธ
@Transactional
void updateUserExpiration(UserDetail userDetail, LocalDateTime expiration) {
userDetail.updateModifiedAt(LocalDateTime.now()); // ๋ณ๊ฒฝ๊ฐ์ง ์ด์ฉํ๊ธฐ
}
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ง์ ๊ฐ์ ๋ฃ์ด์ค์ผ๋ก์จ ์์ฑํ๊ฑฐ๋, ์๊ฐ์ ์ ๋ฐ์ดํธ ํ ์ ์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ ์์ด์ ์ด๋ฉฐ, ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ ๊ฐ๋ฅ์ฑ ๋ํ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ถ์ฒํ์ง ์๋๋ค.
2. ์์ JPA ์ด์ฉํ๊ธฐ
@Entity
@Getter
@MappedSuperClass
public class UserDetail{
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "modified_at")
private LocalDateTime modifiedAt;
@PrePersist
public void prePersist(){
createdAt = LocalDateTime.now();
modifiedAt = LocalDateTime.now();
}
@PreUpdate
public void preUpdate(){
modifiedAt = LocalDateTime.now();
}
}
- `PrePersist` : Entity๊ฐ ๋น์์ ์ํ์์ ์์ ์ํ๋ก ๋์ด๊ฐ๋ ์์ ์์ ์คํ๋๋ค.
- `PreUpdate` : ์์ ์ํ์ Entity๋ฅผ ์ ๋ฐ์ดํธ ํ๊ธฐ์ ์ ์คํ๋๋ค.
์ 2๊ฐ์ง ์ด๋
ธํ
์ด์
์ ์ด์ฉํด์ ์์ฑ ํน์ ์
๋ฐ์ดํธ๊ฐ ๋ฐ์ํ์๋ ์๊ฐ์ ์๋์ผ๋ก ์ ์ฅํ ์ ์๋ค. ( ์๋ํ๊ฐ ์ต๊ณ ๋ค ํ์ฑํ์ฑ )
๐ Auditing ์ฌ์ฉํ๊ธฐ
Auditing์ด๋ `๊ฐ์, ๊ฐ์ฌ`์ ๋ปํ๋ฉฐ, Spring Data JPA์์ Entity์ ์๊ฐ์ ๋ํด ์๋์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ๋งํ๋ค.
๋์์๋ฆฌ๋ Auditing์ ์ ์ฉํ Entity์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํด ์ด๋ฒคํธ ๋ฐ์ ์๊ฐ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ๊ณผ์ ์ ์ดํด๋ณด์.
1. @EnableJpaAuditing
@SpringBootApplication
@EnableJpaAuditing
public class AttractionApplication {
public static void main(String[] args) {
SpringApplication.run(AttractionApplication.class, args);
}
}
2. BaseAuditingEntity ๋ง๋ค๊ธฐ ( AuditableEntity )
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public class AuditableEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
Auditing์ ์ ์ฉํ ํ๋( createdAt๊ณผ modifiedAt )๋ฅผ ๊ฐ์ง๋ BaseAuditingEntity ์ ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ํ๋ ๋์์ ๋ง๋ ์ด๋ ธํ ์ด์ ์ ์ ํํด ํ๋์ ์ง์ ํด์ค๋ค.
@CreatedDate | ๋ฐ์ดํฐ ์์ฑ ๋ ์ง ์๋ ์ ์ฅ |
@LastModifiedDate | ๋ฐ์ดํฐ ์์ ๋ ์ง ์๋ ์ ์ฅ |
@CreatedBy | ๋ฐ์ดํฐ ์์ฑ์ ์๋ ์ ์ฅ |
@LastModifiedBy | ๋ฐ์ดํฐ ์์ ์ ์๋ ์ ์ฅ |
3. BaseAuditingEntity ์ ์ฉ์ํค๊ธฐ
@Entity
@Getter
public class UserDetail extends AuditableEntity{
...
}
๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ Entity๊ฐ BaseAuditingEntity๋ฅผ ์์ํ๊ฒ ๋ง๋ค๋ฉด,
Entity๋ createdAt์ modifiedAt๋ฅผ ๊ฐ์ง๊ฒ ๋๊ณ , ํด๋น ํ๋๋ ์๋์ผ๋ก ์์ฑ & ๊ฐฑ์ ๋๋ค.
๐โ๏ธ ์ ์ฉ ๊ฒฐ๊ณผ
์ ์ฉํด๋ณธ ๊ฒฐ๊ณผ, ๋ฐ๋ก LocalDateTime ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์์๋ Entity ์์ฑ ์๊ฐ์ด ์ ์ ์ฅ๋์๊ณ ,
์ ๋ฐ์ดํธ๊ฐ ๋์์๋ ์๊ฐ ๋ํ ์ ์ฅ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ด๊ฐ ๋๋ ์ฅ์
- ์ ํํ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๊ฒ์ด ์๋ํ ๋์ด์๋ค.
- ๋ค๋ฅธ Entity์๋ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ด, ํ์ฅ ๋ฐ ์ ์ง๋ณด์๊ฐ ์ข๋ค.
- ํต์ฌ Entity๋ก๋ถํฐ ์ถ์ ํ๊ธฐ ์ํ ํ๋(createAt,modifiedAt)๋ฅผ ๋ถ๋ฆฌํ ์ ์์ด Entity๊ฐ ๊น๋ํด์ง๋ค.
ํ์ง๋ง ๋จ์ ๋ ์กด์ฌํ๋ค๊ณ ํ๋ค.
- JPA์ ์์กดํ๊ณ ์์์ ์ฌ์ฉํ๋ค.
- Auditing ํ๋ ํ๋๊ฐ ๋ง์์ง๋ฉด ๊ฒ์ ๋ฐ ์ฟผ๋ฆฌ์ ์ด๋ ค์์ด ์์ด ๋ํ ํ๋ก์ ํธ์์๋ ์ ํฉํ์ง ์์ ์๋ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ง์ถฐ Auditing์ ๋์ ํ ์ง ๊ฒฐ์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๐คฉ
'๊ฐ๋ฐ > BACKEND' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ Impl๋ ์ฌ์ฉํ์ง ๋ง๋ผ๋ ๊ฑธ๊น? (1) | 2024.07.10 |
---|---|
PK๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ข์๊น? ๐ค (0) | 2024.07.10 |
[Query dsl]hibernate.query.SemanticException : Could not interpret path expression (0) | 2024.07.10 |
[์๋ฌ ํด๊ฒฐ] cannot resolve class or package 'cj' (2) | 2024.07.10 |
java์์ ์ด๋ฏธ์ง ์์ ๋ฐ ์ต์ ํํ๊ธฐ (0) | 2024.07.10 |