@Modifying
์ด๋
ธํ
์ด์
์ @Query
์ด๋
ธํ
์ด์
์ผ๋ก ์์ฑ๋ ์์ , ์ญ์ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ํ์ํฉ๋๋ค. ์ฆ, ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ INSERT, UPDATE, DELETE
์ฟผ๋ฆฌ์์ ์ฌ์ฉํฉ๋๋ค. ์ฃผ๋ก ๋ฒํฌ ์ฐ์ฐ ์ ์ฌ์ฉํฉ๋๋ค.
์ด ์์ฑ์ @Modifying
์ด๋
ธํ
์ด์
์ด ๋ถ์ ์ฟผ๋ฆฌ ๋ฉ์๋ ์คํ ์งํ, ์์์ฑ ์ปจํ
์คํธ๋ฅผ Clear ํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ ์์ฑ์
๋๋ค. ๋ํดํธ ๊ฐ์ false ์
๋๋ค. ๊ทธ๋ฌ๋ false ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ์์์ฑ ์ปจํ
์คํธ์ 1์ฐจ ์บ์์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
JPA ์์๋ ์์์ฑ ์ปจํ
์คํธ์ ์๋ 1์ฐจ ์บ์๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ์บ์ฑํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ํ์๋ฅผ ์ค์ฌ์ค์ผ๋ก์จ ์ฑ๋ฅ ๊ฐ์ ์ ์๋์ผ๋ก ํด์ค๋๋ค. 1์ฐจ ์บ์๋ @Id
๊ฐ์ ํค๊ฐ์ผ๋ก ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ทธ๋์ findById
๋ฑ์ ํตํด์ ์ํฐํฐ๋ฅผ ์กฐํํ์ ์ ID ๊ฐ์ด 1์ฐจ ์บ์์ ์กด์ฌํ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ง ์๊ณ ์บ์ฑ๋ ์ํฐํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฒํฌ ์ฐ์ฐ์ ํตํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ , ํด๋น ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ ๊น์? ํ ์คํธ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
save()
๋ฅผ ํตํด ์์ฑํ ์ํฐํฐ๋ฅผ ์ ์ฅํฉ๋๋ค - Persistent ์ํfindById()
๋ฅผ ํตํด ์
๋ฐ์ดํธํ ์ํฐํฐ๋ฅผ ์กฐํํฉ๋๋ค.์ํฐํฐ ์์ฑ
@Entity
public class Course {
@Id
@GeneratedValue
private Long id;
private String name;
...
private Course(String name) {
this.name = name;
}
public static Course of(String name) {
return new Course(name);
}
}
Repository ์์ฑ
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
...
@Modifying
@Query(value = "UPDATE Course C SET C.name = ?2 WHERE C.id = ?1"
int updateById(Long id, String name);
}
ํ ์คํธ ์ฝ๋ ์์ฑ
@Test
@Transactional
public void modifyingTest() {
Course course = Course.of("before");
courseRepository.save(course);
int result = courseRepository.updateById(1L, "after");
assertEquals(result, 1);
LOGGER.info(String.format("Updated Course Name -> {%s}", courseRepository.findById(1L).get().getName()));
}
์คํ ๊ฒฐ๊ณผ
๊ฒฐ๊ณผ๋ฅผ ๋ณด์๋ฉด INSERT
, ๊ทธ๋ฆฌ๊ณ UPDATE
๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์คํํ ๊ฒ์ ๋ณผ ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ํ
์คํธ๋ฅผ ์คํํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์
๋ฐ์ดํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์๋ฉ๋๋ค. ๋ง์ง๋ง์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ํ์ฌ 1์ฐจ ์บ์์ ์บ์ฑ์ด ๋์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ง ์๊ณ 1์ฐจ ์บ์์์์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ๋ง์ง๋ง ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ์
๋ฐ์ดํธ๋์ง ์์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณผ ์๊ฐ ์์ต๋๋ค.
๋ค์์ผ๋ก๋ clearAutomatically = true
์์ฑ์ ์ถ๊ฐํ๊ณ ํ
์คํธ๋ฅผ ์คํํฉ๋๋ค.
@Modifying
@Query(value = "UPDATE Course C SET C.name = ?2 WHERE C.id = ?1"
int updateById(Long id, String name);
๊ฒฐ๊ณผ๋ฅผ ๋ณด์๋ฉด ์ง๊ธ์ ์กฐํ๋ฅผ ํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฒ ๋๊ณ ์ ๋ฐ์ดํธ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณผ ์๊ฐ ์์ต๋๋ค.
JPA ์ 1์ฐจ ์บ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ํ์๋ฅผ ์ค์ฌ์ ์ฑ๋ฅ ๊ฐ์ ์ ํ ์ ์๋ ์ข์ ๊ธฐ๋ฅ์ด์ง๋ง, @Modifying
๊ณผ @Query
๋ฅผ ์ฌ์ฉํ ๋ฒํฌ ์ฐ์ฐ์์๋ ์ด ๊ธฐ๋ฅ ๋๋ฌธ์ ์์ธกํ์ง ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค. ๊ทธ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
JPA ์์ ์กฐํ๋ฅผ ์คํผํ ์์ 1์ฐจ ์บ์๋ฅผ ํ์ธํด์ ํด๋น ์ํฐํฐ๊ฐ 1์ฐจ ์บ์์ ์กด์ฌํ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ง ์๊ณ , 1์ฐจ ์บ์์ ์๋ ์ํฐํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ง๋ง ๋ฒํฌ ์ฐ์ฐ์ 1์ฐจ ์บ์๋ฅผ ํฌํจํ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์์์ ์ปจํ ์คํธ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ ์๊ฐ ์์ต๋๋ค. ์ฆ, ๋ฒํฌ ์ฐ์ฐ ์คํ ์ 1์ฐจ ์บ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑํฌ๊ฐ ์ผ์นํ์ง ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ @Modifying
์ clearAutomatically = true
๋ฅผ ์ค์ ํด์ฃผ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฒํฌ ์ฐ์ฐ ์งํ ์๋์ผ๋ก ์์์ฑ ์ปจํ
์คํธ๋ฅผ Clear ํด์ค๋๋ค. ๊ทธ๋์ ์กฐํ๋ฅผ ์คํํ๋ฉด 1์ฐจ ์บ์์ ํด๋น ์ํฐํฐ๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.