๐ ์์์ฑ์ปจํ ์คํธ์์ ๊ฐ์ฅ ์ฃผ์ฒด๊ฐ ๋๋ ํด๋์ค๋ ์ํฐํฐ๋ฉ๋์ ธ๊ฐ์ฒด์ด๋ค. ์ํฐํฐ๋ ํ๋์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ํฐํฐ์ DB๋ ์ฝ๋ ์ฌ์ด์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํด์ฃผ๊ณ , ์ด๋ป๊ฒ ๋ฐ์ํด ์ฃผ๋์ง, ๋ชจ๋ ์ํฐํฐ๋ฉ๋์ ธ์ ์ญํ์ด๋ค. ์์์ฑ์ปจํ ์คํธ ๋ด์์ ์ํฐํฐ๋งค๋์ ธ๊ฐ ์ํฐํฐ์ ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ณํ์ํค๋์ง ์์๋ณด์.
Entity ์์ ์ฃผ๊ธฐ ์์๋ณด๊ธฐ(Entity LifeCycle)
- ์ํฐํฐ ๋ผ์ดํ์ฌ์ดํด ์ด๋ผ๊ณ ํ๋ฉด 4๊ฐ์ง์ ์ํ๊ฐ ์กด์ฌํ๋ค.
- ๋น์์์ํ : new OR Transient ์ํ
- ์์์ํ : managed ์ํ
- ์ค์์์ํ : deteched ์ํ
- ์ญ์ ์ํ : removed ์ํ
๐๋น์์ ์ํ (Transient ์ํ)
- ์์์ฑ ์ปจํ ์คํธ๊ฐ ํด๋น ์์์ฑ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ง ์๋ ์ํ์ด๋ค. ๊ทธ ํ๋๋ ์์ํ์๋ํด์ ์ ์ธํ๊ฒ ๋ค ๋ผ๋ ๋ง์ด๋ค.
- ๋๊ฐ์ด Transient ์ํ๋ผ๊ณ ๋ ํ๋ฉฐ, New ์ํ๋ผ๊ณ ๋ ํ๋ค.
- ์ฌ์ค ์ด ์ํ๋ ์ํฐํฐ๋ผ๊ธฐ ๋ณด๋ค ๋จ์ํ๋์ ์๋ฐ object๋ก ๋ถ๋ฅ๋๋ค.
@Service
public class UserService {
@Transactional
public void put(){
User user = new User();
user.setName("newUser");
user.setEmail("newUser@fast.com");
}
}
์ ์ฝ๋์์ User๊ฐ์ฒด๋ ๋น์์์ํ์ด๋ค.
@SpringBootTest class UserServiceTest { @Autowired private UserService userService; @Autowired private UserRepository userRepository; @Test void test() { userService.put(); System.out.println(">>>>>> " + userRepository.findByEmail("newUser@fast.com")); } }
Hibernate: select user0_.id as id1_7_, user0_.created_at as created_2_7_, user0_.updated_at as updated_3_7_, user0_.email as email4_7_, user0_.gender as gender5_7_, user0_.name as name6_7_ from user user0_ where user0_.email=? >>>>>> null
select์ฟผ๋ฆฌ๊ฐ ์๋์ ํ์ง๋ง ์ค์ DB์ user๋ ์์ง ์๋ค๋๊ฑธ ํ์ธํ ์ ์๋ค.
DB์ ์ฐ๊ฒฐ์ด ๋๊ฒ ์๋๋ผ ๋จ์ํ ์๋ฐ ๊ฐ์ฒด๋ก๋ง ์กด์ฌํ๋ค๊ฐ Transactio์ด ์ข ๋ฃ๋๊ณ ๋๋ฉด ์ธ๋ชจ๊ฐ ์์ด์ ธ์ ์์ํ ๋์ง ์๊ณ ๊ฐ๋น์ง ์ปฌ๋ํฐ๋ฅผ ํตํด์ ์ฌ๋ผ์ง๋ ๋ฐ์ดํฐ๊ฐ ๋๋ค.
๐ฎ์์ ์ํ (managed ์ํ)
ํด๋น ์ํฐํฐ๊ฐ ์์์ฑ์ปจํ ์คํธ์ ๊ด๋ฆฌํ์ ์๋ค๋ ๋ป์ด๋ค.
์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌํ๋ค๋ ๋ป์ ๊ฐ์ฒด์ ๋ณํ๋ฅผ ๋ณ๋๋ก ์ฒ๋ฆฌํ์ง ์์๋ DB์ ๋ฐ์์ํจ๋ค.
@Transactional public void put(){ User user = new User(); user.setName("newUser"); user.setEmail("newUser@fast.com"); userRepository.save(user); }
๐ค ์ฐธ๊ณ ๋ก save๋ฉ์๋๋ฅผ ์จ๋ ์์์ํ๋ก ๊ด๋ฆฌํ๊ฒ๋๋ค. ์ด์ ๋ SimpleJpaRepositoryํด๋์ค์์ ์ ์ํด๋์ save๋ฉ์๋๋ฅผ ๋ณด๋ฉด EntityManager์ Persist, ์ฆ ์ ๋ ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์์ํ์ ๋ํด ๋ํ ์ผํ๊ฒ ๋ณด๊ธฐ ์ํด EntityManager๋ฅผ ์ง์ ํธ์ถํด ์ฃผ์.
@Service
@RequiredArgsConstructor
public class UserService {
private final EntityManager entityManager;
private final UserRepository userRepository;
@Transactional
public void put() {
User user = new User();
user.setName("newUser");
user.setEmail("newUser@fast.com");
// userRepository.save(user);
entityManager.persist(user);
user.setName("newUserAfterPersist"); //persist ํ ๋ค์์ ์คํํ ์ฟผ๋ฆฌ๋ flush๋๋ค.
}
}
insert
into
user
(created_at, updated_at, email, gender, name)
values
(?, ?, ?, ?, ?)
...
...
...
>>>>>> User(super=BaseEntity(createdAt=null, updatedAt=null), id=6, name=newUser, email=newUser@fast.com, gender=null)
- insert ์ฟผ๋ฆฌ๊ฐ ์๋ํ๊ณ , select๊ฐ ์คํ๋๋ฉด์ DB์์ ๊ฐ์ ๋ถ๋ฌ์ฌ์ ์๋ค.
- ์์์ฑ ์ปจํ ์คํธ๊ฐ ํด๋น ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ํ๊ฐ ๋์๋ค.
- ์์ํ ํด์ managed ์ํ๋ก ๋ฐ๋๋ฉด ์ด๋ค ๋ณํ๊ฐ ์ผ์ด๋ ๊น?
- ์์์ฑ ์ปจํ ์คํธ ๋ด์์ ๊ด๋ฆฌ๋๋ ์ํฐํฐ๋ ์ ํฐ๋ฅผ ํตํด ์ํฐํฐ๊ฐ์ฒด ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ๋ณ๋๋ก save๋ฅผ ํ์ง ์์๋ DB ๋ฐ์ดํฐ์ ์ ํ์ฑ์ ๋ง์ถฐ์ค๋ค.
- ์์ํ ๋์ด์์ผ๋ฉด save๊ฐ ์คํ๋์ง ์์๋ ํธ๋์ ์ ์ด ๋๋๋ฉด flush๊ฐ ์ผ์ด๋๋ค๋ ๊ฒ.
- ์ฆ, ์ฟผ๋ฆฌ๊ฐ DB์ ๊ฐ์์ง๋ ์์ ์ ํจ์๋ฅผ ํธ์ถํ์๋๊ฐ ์๋๋ผ flush๋ ๋๋ผ๋ ์ ์ด ์ค์ํ๋ค.
- ์ฌ๊ธฐ์ setName์ด persist์ดํ์ ๋ค์ด๊ฐ์ง๋ง ์คํ๋๋ ๊ฒฝ์ฐ๊ฐ ์์์ฑ ์ปจํ ์ค๊ฐ ์ ๊ณตํ๋ ๋ํฐ ์ฒดํฌ๋ผ๊ณ ํ๋ค.
Dirty Check
- ์์์ฑ ์ปจํ ์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ์ํฐํฐ๊ฐ์ฒด๋ ์ฒ์ ์ปจํ ์ค๋ฅผ ๋ก๋๋ฅผ ํ ๋ ๊ฐ์ฒด๋ฅผ ์ผ์ข ์ ์ค๋ ์ท์ผ๋ก ๊ฐ์ง๊ณ ์๋ค. ๋ณ๊ฒฝ๋ด์ฉ์ DB์ ์ ์ฉํ๋ ์์ (flushํ๋ ์์ )์ ํด๋น ์ค๋ ์ท๊ณผ ํ์ฌ ์ํฐํฐ๊ฐ์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ ๊ฐ์ด ๋ฐ๊ฒฌ๋๋ฉด ๋ณ๊ฒฝ๊ฐ๋ ์ ์ฉ์ํค๋ ์ฟผ๋ฆฌ๋ฅผ ๋๋ฆฐ๋ค.
๐์ค์์ ์ํ (detached)
- ์๋ ์์ํ ๋์๋ ์ํ๋ฅผ ๋ถ๋ฆฌํด์ ์์์ฑ ์ปจํ
์คํธ ๋ฐ์ผ๋ก ๊บผ๋ด๋ ์ํ
... ... @Transactional public void put() { User user = new User(); user.setName("newUser"); user.setEmail("newUser@fast.com");
// userRepository.save(user);
entityManager.persist(user);
entityManager.detach(user); // ์ค ์์ํ
user.setName("newUserAfterPersist"); //persist ํ ๋ค์์ ์คํํ ์ฟผ๋ฆฌ๋ flush๋๋ค.
entityManager.merge(user); // ์ฌ ์์ํ
entityManager.flush(); // clearํ๊ธฐ ์ ์ flush()
entityManager.clear(); // ๋ณ๊ฒฝ ์์
์ ๋ํ ๊ฒ์ ๋ชจ๋ clearํ๋ค.
}
}
- entityManager๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ค๋ฅธ ์ํ์ ๋ํ ๋ฉ์๋๋ ๋ชจ๋ springDataJpa์์ ์ ๊ณตํด์ค๋ค. ํ์ง๋ง detach๋ ๋ฐ๋ก ์ ๊ณตํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์์๋ ๊ตณ์ด detach ํ์ง์๋๋ค๋ ๋ป ์ด๋ค.
- detachedํ๋ฉด ์์์ฑ ์ปจํ
์คํธ์์ ๋์ด์ ๊ด๋ฆฌํ์ง ์๋๋ค.
- ์ค ์์์ํ์ ์ํฐํฐ๋ผ๋ ๋ช
์์ ์ผ๋ก ๋ค์ entityManager์ merge๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์์์ฑ ์ปจํ
์คํธ์์ ๊ด๋ฆฌํ๋ค.
- clear๋ฅผ ์จ๋ detach์ ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ณด์ง๋ง ๋ณ๊ฒฝ ์์
์ ๋ํ ๋ชจ๋ ๊ฒ์ clearํ๊ธฐ ๋๋ฌธ์ clearํ๊ธฐ ์ ์ flush() ํด์ฃผ๋๊ฒ์ด ์ข๋ค.
### ์ญ์ ์ํ
(removed์ํ)
- ์ญ์ ์ํ๋ ๋ฑํ ํน๋ณํ ๊ฒ์ ์๊ณ ํด๋น ์ํฐํฐ๋ ๋ ์ด์ ์ฌ์ฉํ์ง ๋ชปํ๋ ์ํ๊ฐ ๋๋ค.
User user1 = userRepository.findById(1L).get();
entityManager.remove(user1);
@Test
void test() {
userService.put();
// System.out.println(">>>>>> " + userRepository.findByEmail("newUser@fast.com"));
userRepository.findAll().forEach(System.out::println);
}
'Dev > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA Cascade (0) | 2022.03.02 |
---|---|
JPA์์ Transaction์ ์ ํ (0) | 2022.03.02 |
์์์ฑ ์ปจํ ์คํธ(Entity Cache) (0) | 2022.03.02 |
JPA M:N ์ฐ๊ด๊ด๊ณ (0) | 2022.03.02 |
JPA ์ฐ๊ด๊ด๊ณ ์ดํด๋ณด๊ธฐ(1:1) (0) | 2022.03.02 |