스프링(Spring)/스프링부트(SpringBoot)
[SpringBoot] 영속성 컨텍스트(Persistence Context)란? (맛보기)
2021. 2. 18. 01:11반응형
아래의 코드를 보자. (더 아래의 repository 코드도 참조하면서 보면 좋다)
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
.
.
@Transactional
public void update(Long id, String name) {
Member member = memberRepository.findOne(id);
member.setName(name);
}
}
id를 인자로 받아서 해당하는 member를 찾고, 그 member에 대해서 name을 설정한다.
그리고 저 메서드가 종료되면 DB에 반영된다.
신기하지 않은가?
저 메서드가 끝나면 자동으로 DB에 반영이 되버린다.
그게 가능한 이유는 @Transactional 때문이다.
저 함수를 글로 해석하면 아래와 같다.
memberReppository.findOne(id)를 통해 영속성 컨텍스트를 가진 member를 반환한다.
영속상태를 가진 member를 setName으로 바꿔주면 나중에 함수가 끝날때 스프링이 AOP가 동작하면서
@Transactional에 의해 @Trasactional의 AOP가 끝나는 시점에 @Transaction 커밋이 된다.
그때 JPA가 영속성 컨텍스트를 flush하고 그 상태에서 데이터베이스에게 Transaction commit을 하는 것이다.
영속성 컨텍스트는 Entity를 영구적으로 저장하는 환경 그러한 문맥을 의미한다. 즉 Entity를 일단 어디에다가 저장하겠다는 말이다.
(정확히 말하면 persist() 시점에는 Entity를 영속성 컨텍스트에 저장하는 것이다)
Repository 코드
@Repository
@RequiredArgsConstructor
public class MemberRepository {
.
.
.
public Member findOne(Long id) {
return em.find(Member.class, id);
}
}
참고
반응형
'스프링(Spring) > 스프링부트(SpringBoot)' 카테고리의 다른 글
[SpringBoot] 스프링부트에서 재시작 없이 정적소스 변경 적용하기 (0) | 2021.12.03 |
---|---|
[SpringBoot] Spring 프로젝트에서 Thymeleaf 설정하는 방법 + CSS도 설정하는 방법 (0) | 2021.12.02 |
Spring Property 목록 (0) | 2021.03.09 |
[SpringBoot] 5분 안에 SpringBoot로 Hello world 띄우기 (0) | 2021.02.17 |
[Spring] 스프링 프레임워크(Spring Framework) 란? (0) | 2020.03.14 |