[TIL] JPA 더티체킹

2025-04-10 TIL

📝 TIL (Today I Learned)
🔗 원본 이슈: #40
📅 작성일: 2025-04-10
🔄 최종 수정: 2025년 04월 17일


🍀 새롭게 배운 것

  • JPA 더티체킹 (dirty checking)

    강의와 팀 스터디 시간에 얘기가 나왔는데 잘 모르겠어서 찾아봤습니다.

    • JPA가 객체의 변경 사항을 자동으로 감지해서 DB에 반영해주는 기능
      • JPA는 트랜잭션 안에서 영속 상태(@Entity가 EntityManager에 의해 관리되고 있는 상태)의 엔티티가 변경되었는지 감시함
      • 변경사항이 감지되면, 트랜잭션을 커밋할 때 JPA가 자동으로 update SQL을 생성해서 DB에 반영 -> 이것이 더티 체킹
    • JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만들어 놓음
    • 트랜잭션이 끝나는 시점에 이 스냅샷과 비교해 다른 점이 있다면 Update Query를 데이터베이스로 전달
      • 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티
        • detach된 엔티티 (준영속)
        • DB에 반영되기 전 처음 생성된 엔티티 (비영속)
        • 등 준영속/비영속 상태의 엔티티는 Dirty Checking 대상에 포함되지 않음
    • 예시
      @Transactional
      public void updateUsername(Long id, String newUsername) {
          User user = em.find(User.class, id); // 1. 영속 상태로 가져옴
          user.setUsername(newUsername);      // 2. 필드 값을 변경함
          // 3. em.persist 안 해도 됨!
          // 4. 트랜잭션이 커밋되면 JPA가 변경을 감지하고 update SQL을 실행함
      }
      
      • 위 코드에서 setUsername을 호출했지만 persistmerge같은 명시적인 저장 메서드는 쓰지 않음
      • 하지만 트랜잭션이 끝나면 UPDATE user SET username = ? WHERE id = ?같은 쿼리가 자동으로 실행됨
      • 이것이 더티 체킹!
  • http://www.gstatic.com/generate_204

    사이드 프로젝트 개발 중, 프로젝트 빌드 하다가 이 사이트가 계속 나와서 어떤 의미인지 찾아보았다.

    • Google이 인터넷 연결 상태를 확인할 때 사용하는 테스트용 URL
    • 이 주소에 접속하면
      • 서버는 HTTP 204 No Content 응답을 보내고,
      • 브라우저는 아무것도 표시하지 않아야 정상.
    • 즉, 인터넷 연결은 되지만, 리디렉션이 발생하거나, 204 응답이 안오는 경우 문제가 생겼다고 판단.
    • 이 사이트가 보이는 이유
      1. 공공 와이파이 접속 중
        • 스타벅스, 지하철, 학교 와이파이 등에서 자주 발생
        • 아직 로그인 인증 페이지(캡티브 포털)에 접속하지 않은 상태인데, 브라우저가 인터넷에 접속되는지 확인하려고 generate_204에 요청을 보냄.
        • 그런데 와이파이 서버가 요청을 리디렉션해서 로그인 페이지로 보내버리면, 그 주소가 눈에 보임.
      2. 인터넷 연결 오류 혹은 차단
        • 방화벽이나 네트워크 정책이 Google 서버 요청을 막을 때 발생 가능
      3. 인터넷 연결이 느리거나 중단됨
        • 브라우저가 연결 확인을 위해 해당 URL을 호출하는데 응답을 못받으면 이 주소만 보일 수 있음