컨트롤러 계층에서는 엔티티 객체의 필드값을 setter() 메서드로 변경해도 실제 DB 상의 데이터가 변경되지 않는데, 서비스 계층에서는 엔티티 객체의 필드값을 setter() 메서드로 수정하면 실제 DB의 값이 변경되는 부분 때문에 해당 개념을 찾아보게 되었다.
JPA 영속성 컨텍스트 (JPA persist context)란, 1차 캐시와 쓰기지연 SQL 저장소로 이루어진 환경이다. EntityManagerFactory에 요청이 들어오면 EntityManager가 생성되고, 해당 객체는 엔티티 객체를 관리한다.
영속화란, em.persist(엔티티 객체) 메서드로 진행되고, 주의할 점은 영속화가 되었다고 해서 DB에 반영되는 것이 아니라는 것이다.
결론부터 말하자면, 최종적으로 DB에 반영되기 위해서는 반드시 "트랜잭션"이 필요하다. DB하면 반드시 트랜잭션 개념이 연결되는데, 마찬가지로 JPA 영속성 컨텍스트에서도 DB에 반영되기 위해서는 반드시 트랜잭션이 필요하다.
트랜잭션이 종료되는 시점에 .commit() 메서드가 실행되는데 이 시점에 .flush() 메서드가 실행되고, 이 때 쓰기지연 SQL 저장소에 누적되어 있던 쿼리문들이 한 번에 실행되어 DB상에 결과가 반영되게 된다. 따라서 반드시 트랜잭션이 있어야 DB에 결과가 반영 될 수 있다.
컨트롤러 계층에서는 트랜잭션 관리를 하지 않아서 엔티티 객체의 필드를 setter()로 변경해도 실제 DB에 반영되지 않지만, 서비스 계층에서는 @Transactional 로 관리하기 때문에 엔티티 객체의 필드를 setter()로 변경하면 실제 DB의 값이 변경되는 위험성이 존재함을 인지하고 개발을 진행해야 한다.