JPA Entity Definition and Lifecycle Hook - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
๋ ํผ๋ฐ์ค ์ฐธ๊ณ : http://arahansa.github.io/docs_spring/jpa.html
์ด๋ฒ์ฅ์ Gearing up the MSA ์์ ์์ฑํ์๋ ์ฝ๋์ JPA ๋ถ๋ถ์ ์ข๋ ์์ธํ ์ค๋ช ํ๊ณ ์ ํ๋ค.
์ฐ์ Course ๋ผ๋ Entity ํด๋ ์ค๋ฅผ ์์ฑํ์ฌ ๋ณด์
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Course {
@Id
@GeneratedValue
Long id;
String title;
int duration;
String description;
int maxEnrollment;
int minEnrollment;
}
์ด ํด๋ ์ค๋ @Entity
๋ผ๊ณ ๋ช
์๋ฅผ ํ์๋ค.
import ๋ฅผ ํ ์ ์ javax ๋ก ์์ํ๋ ๊ฒ์ java์ ํ์ค์ผ๋ก ์ ์ ๋์ด์๋ค๋ ๋ป์ด๋ค.
JPA๋ฅผ ์ ๊ณตํ๋ provider ๋ hibernate ๋ ์๊ณ , eclipse link ๊ฐ์ ๊ฒ๋ ์๋ค.
์ด๋ ํ์ค์ผ๋ก ์ ๊ณต๋์๋ libary๋ฅผ ์ฌ์ฉํ๋ฉด provider๋ฅผ ๋ณ๊ฒฝํ์ฌ๋ ์ ์ฐํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ด์ getter, setter ๋ฅผ ์์ฑํ์ฌ ์ฃผ๋๋ฐ, ๋ณ๊ฒฝํ๋ฉด ์๋๋ ๊ฐ์ธ id๋ ์ ์ธํ๊ณ ๋ง๋ค์ด ์ค๋ค.
java ์์ getter, setter ๋ ๊ฒฝ๊ณ๊ฐ์ ์ค์ ํ์ฌ ์ฃผ๋ ์ญํ ์ด๋ค.
member ๋ณ์๋ค์ private ๊ฐ ์ผ๋ก ์ฃผ๊ณ getter, setter ๋ก public ์ ์ฃผ์ด์ ์ด๋๊ณณ์์ ๋ณ๊ฒฝ๋์๋์ง๋ฅผ ํ์
ํ ์ ์๋ค.
์ด๋ ๊ฒ ์ค์ ์ ํด์ผ ๋ฐฉ์ด์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋ค.
@GeneratedValue
๋ ์์ด๋์ ์์คํ
์์ ์์ฑ๋๋ ์ผ๋ จ๋ฒํธ๋ฅผ ๋ถ์ฌํ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ค.
@PrePersist
@PreUpdate
public void validation(){
if( minEnrollment < 10 ){
throw new IllegalArgumentException("์๊ฐ์์ 10๋ช
์ด์์ด์ด ํฉ๋๋ค.");
}
}
@PrePersist
์ด๋
ธํ
์ด์
์ insert ๋๊ธฐ ์ ์ ํด๋น ๋ก์ง์ ์คํ ํ๋ผ๋ ์๋ฏธ์ด๋ค.
JPA framework ์ REST ๋ BCI(Byte Code Instrumentation) ๋ผ๋ ๊ฐ๋ ฅํ libary๋ฅผ ์ฌ์ฉํ์ฌ getter, setter ๋ฅผ ๊ฒฝ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ํ๋ง๋๋ก getter์ ๋น์ง๋์ค ๋ก์ง์ ๋ฃ์ด๋ดค์ ์ธ์์ด ์๋๋ค๋ ๋ป์ด๋ค.
@PreUpdate
๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฒดํฌ๋ฅผ ํ์ฌ ํด๋น ๋ก์ง์ ์คํ ํ๋ผ๋ ์๋ฏธ์ด๋ค.
@PreRemove
๋ ๊ฐ์ด ์ง์์ง๋ ์ฒดํฌ๋ฅผ ํ๋ค.
์ด๋ฐ์์ผ๋ก Lifecycle์ ๋ชจ๋ ์ฒดํฌํ ์ ์๋ค.
@PostPersist
public void greeting(){
// ๊ด๊ณ ์ด๋ฉ์ผ ๋ฐ์ก --> 1๋ฒ ๋ฐฉ๋ฒ
// ๊ณผ์ ๋ฑ๋ก์ ๋ํ ์ด๋ฒคํธ publish --> 2๋ฒ ๋ฐฉ๋ฒ
System.out.println("๊ณผ์ ์ด ๋ฑ๋ก๋จ " + this.getTitle());
}
@PostPersist
์ด๋
ธํ
์ด์
์ ์ฑ๊ณต์ ์ผ๋ก ๋ฑ๋ก์ด ๋๋ฉด ๊ทธ ํ ์ผ์ ํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
1๋ฒ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ฐ๋ก ๋น์ง๋์ค ๋ก์ง์ ์์ฑ ํ ์ ์์ง๋ง, ์ง์ ์ฌ๊ธฐ์์ ํด๋น microservice๋ฅผ ์ฐพ์์ ํธ์ถํ๋ ๊ฒ ๋ณด๋ค,
2๋ฒ ๋ฐฉ๋ฒ์ฒ๋ผ kafka๊ฐ์ message๋ฅผ ์๋ ค์ฃผ๊ณ , ๊ฑฐ๊ธฐ์ ์์์ ๋ฐ์ํด ๋ผ๊ณ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ํจ์ฌ ์ข๋ค.
์๋ํ๋ฉด microservice์ ๊ฐฏ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ Anotation์ ํตํ์ฌ Event์ ๋ฐ์ ํ ์ ์๋ JPA๊ฐ ์๊ธฐ์ ์ ์ฒด ์ํคํ์ณ๊ฐ ๊ฐ๋จํด์ง๊ณ ,
์ด๊ฒ์ 'microservice๋ค์ด ๋ฐฑ๊ทธ๋ผ์ด์์ ๋๊ณ ์์ง๋ง, ๋ชจ๋ ์ฐ๊ฒฐ ๋ ์ ์๋ค' ๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฌ๊ธฐ๊น์ง ํ๊ณ , ํด๋น console๋ก ๋ค์ด๊ฐ์ httpie๋ก http localhost:8080
์ ํธ์ถํด ๋ณด์.
๋ฐฉ๊ธ ๋ง๋ค์๋ Course๊ฐ ๋์ค์ง ์๋๊ฒ์ ํ์ธ ํ ์ ์๋๋ฐ,
์ด๋ Entity๋ง ๋ง๋ค์๊ณ , Repository๋ฅผ ๋ง๋ค์ง ์์์ Rest๋ฅผ ์์ง ์ฌ์ฉ ํ ์ ์๋ ๊ฒ์ด๋ค.
์ด์ Reopsitory๋ผ๋ Interface๋ฅผ ๋ง๋ค ์ฐจ๋ก์ด๋ค. Interface๋ ๊ตฌํ์ฒด๋ฅผ ์ฑ์ ๋ฌ๋ผ๊ณ ํ๋ ์์ฒญ์ด๋ค.
๋ค์ด๋ฐ ๊ท์น์ ๊ผญ ์งํฌ ํ์๊ฐ ์์ง๋ง, ์ฝ๋ฉ์ Entity์ ๊ฐ์ package์ ํ์ผ์ ์์ฑํ๊ณ ,
Entity๋ค์ Repository๋ผ๋ ๋ช
๋ช
์ ํ์ฌ ์์ฑํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
public interface CourseRepository extends PagingAndSortingRepository<Course, Long> {
}
PagingAndSortingRepository ๋ ํ์ด์ง ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ Repository์ด๋ค
๋ ํ์งํ ๋ฆฌ์ ์๋ก์ด ์ ํ์ ๋ง๋ค๊ณ ์ถ์๋๋ ํด๋น Repository๋ฅผ extendsํด์ ์๋กญ๊ฒ ๋ง๋ค ์ ์๋ค.
interface ์ ๊ตฌํ์ฒด๋ ์์ง๋ง Repository ์์ฑ์ ์คํ๋ง ๋ถํธ๊ฐ runtime์ ์ค์ ์ํนํ๋ sql๋ฌธ์ ์์ฑํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ฒ์ generate ํด์ค๋ค
์ด์ ํ
์คํธ๋ฅผ ํตํ์ฌ Lifecycle์ด ์ ์ ์๋ํ๋์ง ํ์ธํด ๋ด
๋๋ค.
์ฝ์์ฐฝ์ ์ฐ ํ์ mvn spring-boot:run
์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์
์ run ํฉ๋๋ค.
## Course๊ฐ Rest๋ก ๋ฑ๋ก๋์๋์ง ํ์ธ
$ http localhost:8080
{
"_links": {
"courses": {
"href": "http://localhost:8080/courses{?page,size,sort}",
"templated": true
},
"profile": {
"href": "http://localhost:8080/profile"
}
}
}
## ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ
$ http localhost:8080/courses title="software modeling lecture" duration=5 maxEnrollment=5 minEnrollment=10
## @PrePersist ์ ์ํ์ฌ throw new IllegalArgumentException("์๊ฐ์์ 10๋ช
์ด์์ด์ด ํฉ๋๋ค."); ๋ฐ์
$ http localhost:8080/courses title="software modeling lecture" duration=5 maxEnrollment=5 minEnrollment=1
## @PostPersist ์ ์ํ์ฌ greeting() ๋ฉ์๋ ์คํ๋จ
$ http PATCH localhost:8080/courses/1 description="์ค๋ช
"