반응형

아래의 코드를 보자.  (더 아래의 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);
    }
}

 

 

 

참고

gmlwjd9405.github.io/2019/08/06/persistence-context.html

반응형