(https://ttl-blog.tistory.com/807)ํด๋น ๊ธ์์ ์๋ก์ด ์ํฐํฐ๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ๊ณผ, save()์ ์๋ ์๋ฆฌ์ ๋ํ์ฌ ์์๋ณด์์ต๋๋ค.
๊ทธ๋ฌ๋ @GenerateValue๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ณ์๋ฅผ ์ง์ ํ ๋นํ๋ ๊ฒฝ์ฐ์๋, ์ด๋ฏธ ์๋ณ์ ๊ฐ์ด ์๋ ์ํ๋ก save()๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
์ฆ ์ด ๊ฒฝ์ฐ์๋ merge()๊ฐ ํธ์ถ๋๋ ๊ฒ์ ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ Persistable์ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ํฐํฐ์ธ์ง ํ๋ณํ๋ ๋ฐฉ๋ฒ์ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
Persistable์ ์๋ฆฌ
Persistable์ ์์ ๊ฐ์ ์ธํฐํ์ด์ค์ ๋๋ค.
save ํธ์ถ ์์๋ SimpleJpaRepository์ save ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
์ด๋ entityInformation์ JpaEntityInfoermation ํ์ ์ ๋๋ค.
์ค์ ๋๋ฒ๊น ์ ํด๋ณด๋ฉด JpaMetamodelEntityInformation ํ์ ์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Persistable์ ๊ตฌํํ ์ํฐํฐ๋ JpaPersistableEntityInformation์ด ๋ฉ๋๋ค.
์ด๋ JpaEntityInformationSupport์ getEntityInformation์ด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
JpaPersistableEntityInformation์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
๊ณ์ธต ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ํฐํฐ๊ฐ Persistable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ isNew๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์๋ก์ด ์ํฐํฐ ํ๋ณ ์ฌ๋ถ๋ฅผ ์ง์ ์ค์ ํ ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
@Entity
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item implements Persistable<String> {
@Id
private String id;
@CreatedDate
private LocalDateTime createdDate;
public Item(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public boolean isNew() {
return createdDate == null;
}
}
์ฐธ๊ณ ๋ก ๋ฑ๋ก์๊ฐ(@CreatedDate - Auditing ์ฌ์ฉ)์ ์กฐํฉํด์ ์ฌ์ฉํ๋ฉด ์ด ํ๋๋ก ์๋ก์ด ์ํฐํฐ ์ฌ๋ถ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
@GeneratedValue๋ฅผ ์ฌ์ฉํ์ง ์๊ณ @Id๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์๋ณ์๊ฐ ์ด๋ฏธ ์๋ ์ํ๋ก save()๋ฅผ ํธ์ถํ๋ฏ๋ก merge๊ฐ ํธ์ถ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Persistable์ ๊ตฌํํ์
Reference