묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
동일성 보장에서 질문있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]동일성 보장에서 들어주신 예시에서 질문이 있습니다.findMember1과 findMember2의 pk값 즉 영속성 컨텍스트에서 객체의 id값이 동일한데, 이때 캐시에 어떻게 저장이되는지 궁금합니다. [ id / 객체 ]형식으로 캐시에 저장된다고 하셨는데,그럼 [101L/findMember1], [101L/findMember2] 이렇게 캐시에 저장이 되는건가요?캐시에 저장되는 Id값이 캐시 조회시 사용되는 주소값인가요?캐시에 저장되는 id 값은 중복을 허용하는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 구현체에서 '쓰기 지연 SQL 저장소', '1차 캐시'와 관련된 필드를 확인할 수 있을까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)<질문>하이버네이트 영속성 컨텍스트 구현체에서 '쓰기 지연 SQL 저장소', '1차 캐시'와 관련된 필드를 확인할 수 있을까요?영속성 컨텍스트에서 '쓰기 지연 SQL 저장소'와 '1차 캐시'가 어떻게 작동하는지 이해하는게 중요한것 같아서 영속성 컨텍스트 구현 클래스에서 SQL 저장소나 1차 캐시와 관련된 필드가 어떻게 생겼는지 확인하고, 엔티티매니저의 여러 메서드가 실행될 때 해당 필드들이 강의에서 배운 것처럼 변화하는지 확인하고자 했습니다.<궁금한 정보>하이버네이트 영속성 컨텍스트 구현 클래스의 필드 중 'SQL 저장소'나 '1차 캐시'의 역할을 하는 필드가 무엇인지Entity Manager의 CRUD 메서드나 flush() 등 실행시 SQL 저장소, 1차 캐시 필드의 변화 확인em.persist()em.find()em.remove()em.flush()Ex)em.persist(member)>>> 1차 캐시 필드에 member 엔티티 스냅샷이 저장 됐는지 확인>>> 쓰기 지연 SQL 저장소 필드에 member insert 쿼리가 생성됐는지 확인em.find(member2)>>> 1차 캐시 필드에 저장되지 않은 엔티티 조회시 DB에서 해당 엔티티 조회해서 1차 캐시에 저장하는지 확인em.flush()>>> 1차 캐시의 스냅샷과 현재 member엔티티와 비교하는 과정 확인>>> 변경 있다면 SQL 저장소 필드에 Update 쿼리 추가됨>>> 쓰기 지연 SQL 저장소 필드에 저장된 쿼리들 DB로 내보내는 과정 확인<조사 결과>아래처럼 영속성 컨텍스트 구현 클래스의 필드들 중 'SQL 저장소'나 '1차 캐시'의 역할을 하는 필드가 있을것이라고 가정하고 우선 해당 필드를 찾으려고 했습니다.1차 캐시entitiesByKey 필드에 엔티티가 저장돼서 해당 필드가 1차 캐시에 해당할수도 있겠다고 생각했는데엔티티 정보가 snapshot 처럼 저장된 것이 아니라 인스턴스 자체가 저장된 것이라서 1차 캐시가 아니라고 생각했습니다. 쓰기 지연 SQL 저장소SQL 쿼리가 String으로 저장된 필드 찾지 못함SingleTableEntityPersister 인스턴스에 엔티티 CRUD 쿼리 저장되는것 확인했지만,스프링부트 실행할 때 만들어지는 인스턴스기 때문에 쓰기 지연 SQL 저장소는 아니라고 생각했습니다.쓰기지연 SQL 저장소라면 em.persist() 실행시에 insert 쿼리가 만들어져야하기 때문에 (스프링부트 실행시점에 만들어지는 것이 아니라)결론적으로 영속성 컨텍스트 인스턴스에서 1차 캐시나 쓰기 지연 SQL 저장소에 해당되는 필드를 확인하지 못했습니다.디버거에서 entityManager.flush() persist() 등의 메서드 흐름을 쭉 따라가면서 전달되는 데이터를 보면서 1차 캐시나 SQL 저장소를 찾아보려고 했는데, 메서드 실행 과정이 너무 복잡해서 흐름을 따라가기가 어려웠습니다.<질문>영속성 컨텍스트 구현체에서 '쓰기 지연 SQL 저장소', '1차 캐시'와 관련된 필드를 확인할 수 있을까요?아니면 '1차 캐시'나 '쓰기 지연 SQL 저장소' 같은 개념들은 영속성 컨텍스트의 복잡한 작동을 추상화한 개념이라 실제 인스턴스에서 그 작동과정을 정확하게 확인하기는 어려울까요?스프링 강의에서부터 복잡한 개념은 위와 같은 방법처럼 인텔리제이 디버거에서 메서드 흐름에 따라서 주요 인스턴스 필드의 데이터가 어떻게 변하는지 확인하면서 이해가 잘 됐었습니다. JPA에서 중요한 부분도 이렇게 확인해보고자 했는데 위처럼 확인이 어려웠습니다. 그래서 이부분은 그냥 설명해주신 내용을 개념적으로 이해하고 넘어가야할지 고민입니다. ** 좋은 강의와 책 항상 감사드립니다.
-
미해결실전! 스프링 데이터 JPA
영속성 컨텍스트에 대해 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 제가 아직 실무로 JPA를 사용해본적은 없어서 공부만하고 있는데요. 생각해보니까 실무에선 서버가 여러대일 수 있어서 영속성 컨텍스트간의 동기화가 이슈가 될 수 있을것 같은데 이런 부분은 어떻게 해결하나요?동기화나 동시성 등 검색해봤는데 잘 모르겠어서요ㅜ
-
해결됨실전! 스프링 데이터 JPA
save하고 update할때 혼란이 있습니다
안녕하세요. 초보 개발자 명아주입니다. 궁금한게 있어서 문의드립니다. 제가 공부하다가 놓친걸 수도 있는데 아직 잘 이해가 안되는 부분이 하나 있습니다. 예를들어서 Member member = new Member(); member.setName("hello"); em.persist(member); member.setName("jpa"); 이런 코드가 있을때 예상 : member가 영속성 컨텍스트에 들어감 트랜잭션 종료 때, flush할때 변경감지까지 포함해서 한 번의 쿼리만 나감 insert into member values (1, 'jpa'); 실제 : insert into member values (1, 'hello'); update member set name = 'jpa'; 영속성 컨텍스트에 들어가있다가 아직 플러시 되지 않은 상태에서 변경되면 마지막에 변경된 사항으로 insert 한번만 나갈 줄 알았는데 실제 동작은 insert, 그리고 변경감지에 의한 update가 발생하더라구요. 저번에 말씀하셨던 것중 얼핏 기억나는 스냅샷? 같은 걸로 영속성에 들어간 상태를 스냅샷 찍어놓고 그거에 대한 insert 쿼리가 나가고 그 후에 변경감지를 처리하는건가요?? 궁금합니다! 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.flush() & em.clear() 제가 이해하고 있는게 맞나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] em.flush와 em.clear를 하지 않았을 경우에 db에는 persist한 데이터가 저장되긴 하지만 iterator로 리스트를 출력했을때 내용이 나오지 않아서 그 이유를 제가 올바르게 이해한건지 궁금합니다! em.fluch(); 로 영속성 컨텍스트에 있는 쿼리를 db로 날린 후 em.clear(); 하여 영속성 컨텍스트를 비우면 em.find()로 조회했을 때 1차캐시가 아닌 db에서 값을 찾아오기 때문에 findMember에 해당하는 팀의 회원리스트를 받아 올 수 있다. Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member1 = new Member(); member1.setName("member1"); member1.setTeam(team); em.persist(member1); Member member2 = new Member(); member2.setName("member2"); member2.setTeam(team); em.persist(member2); em.flush(); // 영속성 컨텍스트에 있는 쿼리를 db로 날림 em.clear(); // 영속성 컨텍스트를 비움 Member findMember = em.find(Member.class, member1.getId()); // db에서 값을 가져온다. System.out.println("Team = " + findMember.getTeam().getName()); List<Member> members = findMember.getTeam().getMembers(); //양방향 연관관계 for (Member m : members) { System.out.println("m = : " + m.getName()); }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트와 트랜잭션 관련 질문 있습니다.
안녕하세요 JPA 를 공부를 하다가 영속성 컨텍스트의 기본 전략은 트렌잭션 범위라고 알고 있어 테스트 코드를 작성해 실행해 본 결과 아래와 같은 코드에서 select 문이 안 나가는 걸 볼 수 있었습니다.select 문이 안 나가는 것은 영속성 컨텍스트 안에서 가져온 객체라고 볼 수 있는데 save와 select 가 각각 다른 트랜젝션 단위에서 작동을 하는데 왜 이런 결과가 나오는 건가요..? 테스트 코드 git 주소 첨부드립니다. ( test3 메소드 )깃 주소 @Test @DisplayName("영속성 컨텍스트 1차 캐시 - 트랜잭션이 다른 경우 - 1차 캐시 사용 불가") void test3() throws Exception{ User user = User.builder().nickname("유저 1").build(); save(user); // 트랜잭션 1 //select 문이 나가야 함 // 트랜잭션 2 User findUser = find(user.getId()); //다른 객체라고 나와야하는데 select 문이 안나가고 같은 객체가 나오는 걸 보니 영속성 컨텍스트 안에서 동작 중임 log.info("{} - {}",user.hashCode(), findUser.hashCode()); assertThat(user, is(not(equalTo(findUser)))); } @Transactional(propagation = Propagation.REQUIRES_NEW) void save(User user){ userRepository.save(user); } @Transactional(propagation = Propagation.REQUIRES_NEW) User find(Long id) throws NotFoundException { return userRepository.findById(id).orElseThrow(() -> new NotFoundException("not found Exception")); }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 1차 캐시가 비워지는 시점은 언제인가요?
안녕하세요, 영속성 컨텍스트 1차 캐시에 대한 질문이 있습니다. 새로운 트랜잭션이 시작되는 시점에서도 1차 캐시가 유지되는 건가요? 만약 맞다면 1차 캐시가 비워지는 시점이 언제인가요? 강의를 보면 영속성 컨텍스트 1차 캐시는 flush 시점(커밋 시점) 이후에도 내용을 유지한다고 합니다. 그렇다면 새로운 트랜잭션이 시작되는 시점에서도 1차 캐시가 유지되는 건지가 궁금하구요. 궁금한 이유는,새로운 트랜잭션이 시작되었는데도 이전 트랜잭션 시점의 데이터가 담긴 1차 캐시를 계속 바라보면 문제가 될 수 있을 것 같아서요. 답변해주시면 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성 컨텍스트가 무슨뜻인가요?
19분 11초에서 같은 영속성 컨텍스트 내에서 id값이 같으면 같은 엔티티라고 하셨는데 영속성 컨텍스트가 무슨뜻인지 알려주시면 감사요
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트는 JPA의 스펙인가요? 하이버네이트의 스펙인가요?
안녕하세요! 영한님 신입개발자 준비하고있는 취준생입니다. 항상 영한님 강의보면서 열심히 공부하고 있고 너무 잘가르쳐주셔서 감사합니다 :) 질문은 제목내용 그대로 입니다. 영속성 컨텍스트는 JPA스펙에서 명시하고 있는 건지 아니면 하이버네이트가 JPA를 구현하기위해 영속성 컨텍스트를 구현한건지 궁금해서 이렇게 질문드립니다! ㅎㅎ