월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 질문입니다.
안녕하세요 김영한님! 다름이 아니라 김영한님 JPA책을 읽으면서 궁금한게 생겨서요.db read commtied + JPA 1차 캐시를 사용하면 repeatable read가 가능한데 JPA 락은 더 높은 격리 수준이 필요하면 건다고 하셨는데 serializable 격리 수준이 필요하면 해결 할 수 있는 락이 없는데 JPA 락을 왜 쓰는지 모르겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find()와 영속성 컨텍스트 관련 질문
안녕하세요!em.find()와 영속성 컨텍스트 관련해서 학습테스트를 작성하던 도중 의문이 생겨 질문을 남깁니다.em.find() 작업은 1차 캐시에 데이터가 존재한다면 영속성컨텍스트의 데이터를 반환하고, 1차 캐시에 데이터가 존재하지 않을 경우 DB에 select 쿼리문을 보내는 것으로 알고 있습니다. 위 선행지식을 바탕으로, 아래의 학습테스트 경우처럼 1차 캐시가 비어있고 DB에 데이터가 있는 경우에서 delete 메서드를 호출하고 EntityManager를 flush()하지 않은 상태로 테스트하여 delete 쿼리문을 DB에 보내지 않고 쓰기지연 저장소에 남겨둔 상태를 테스트해보도록 했습니다.(여기서 delete는 Spring Data JPA의 delete문입니다! 이 delete 메서드에선 해당 JpaRepository의 구현체를 타겟 프록시로 하는 SimpleJpaRepository에서 em.find() 작업 후 em.remove() 작업을 해주는 것으로 알고 있습니다.)학습 테스트 @Test @DisplayName("1차 캐시가 비어있고 쓰기지연 저장소에 delete 쿼리가 있는 상태에서 em.find()를 할 경우 결과를 확인한다") void test7() { // 영속성 컨텍스트, DB에 모두 member 저장 (IDENTITY 전략) final Member member = new Member("kth990303", "kth990303@naepyeon.com", Platform.KAKAO, "1"); final Long memberId = memberRepository.save(member) .getId(); // 영속성 컨텍스트는 비워줌 em.flush(); em.clear(); System.out.println("==========================="); // delete 쿼리는 쓰기지연저장소에 존재하고 아직 sql로 찌르지는 않음 memberRepository.delete(member); System.out.println("============================================="); // 1차캐시에 Member는 존재하지 않으므로 select 쿼리가 이 때 나갈 줄 알았으나 안나감. em.find(Member.class, memberId); em.flush(); em.clear(); }저는 위 테스트에 대한 결과 예측을 아래와 같이 했습니다.insert문을 DB에 날린다이후 em.clear()로 영속성 컨텍스트를 비워주어 1차 캐시에는 데이터 존재 X======delete 메서드 호출한다. 1차 캐시에 데이터가 존재하지 않아 select 쿼리문 후 delete 쿼리문을 날려야 함. (SimpleJpaRepository) 이 쿼리문들은 쓰기지연 저장소에 저장돼서 아직 날라가지 않음.=======em.find()를 호출하고, 1차 캐시에 데이터가 존재하지 않아 select 쿼리문이 쓰기지연저장소에 쌓임.em.flush()를 해주어 쓰기지연저장소에 있던 select, delete, select가 나갈 것이라 예측.결과적으로 insert -> ==== -> ===== -> select, delete, select 가 나갈 것이라 생각했습니다.하지만 실제 쿼리는 아래와 같았습니다.실제로는 위와 같이 insert -> ==== -> select -> ===== -> delete 만 나가게 됐습니다.이에 대한 이유가 궁금합니다!감사합니다. 참고1. SimpleJpaRepository의 delete 메서드@Override @Transactional @SuppressWarnings("unchecked") public void delete(T entity) { Assert.notNull(entity, "Entity must not be null!"); if (entityInformation.isNew(entity)) { return; } Class<?> type = ProxyUtils.getUserClass(entity); T existing = (T) em.find(type, entityInformation.getId(entity)); // if the entity to be deleted doesn't exist, delete is a NOOP if (existing == null) { return; } em.remove(em.contains(entity) ? entity : em.merge(entity)); }참고2. 해당 질문에 대한 상황을 정리한 노션https://clean-nutria-44b.notion.site/JPA-em-find-1-34fa1ba3df914e24ba9dd9a143f28c8c
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL 문법 RollBack
JPQL 작성 시, 전체 조회하면 이상이 없는데 특정 칼럼을 지정하면 RollBack에러가 발생합니다. 어떤 문제인지 알고 싶습니다..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
fetch join 일관성에 관하여 질문입니다.
안녕하세요 영한님올려주시는 강의를 들으며 JPA를 공부하고 있습니다.JPA에서 fetchJoin에 관련해서 질문을 검색해보다가 아래 링크에 있는 글을 봤습니다.https://www.inflearn.com/questions/59632다행히 해당 링크에서 영한님이 말씀해주신, fetchJoin에서 조인 대상의 필터링을 지원하지 않는다는 내용과 일관성이 깨질 수 있다는 내용은 이해를 했습니다.그런데 써주신 내용 중 이해가 안가는 부분이있습니다.아래는 영한님이 답변한 글 입니다. 댓글 번호는 5번입니다왜냐하면 JPA의 엔티티 객체 그래프는 DB와 데이터 일관성을 유지해야 하기 때문입니다.예를 들어서 DB에 데이터가 다음과 같이 있습니다.team1 - memberAteam1 - memberBteam1 - memberC그런데 조인 대상의 필터링을 제공해서 조회결과가 memberA, memberB만 조회하게 되면 JPA 애플리케이션은 다음과 같은 결과로 조회됩니다.team1 - {memberA, memberB}team1에서 회원 데이터를 찾으면 memberA, memberB만 반환되는 것이지요.이렇게 되면 JPA 입장에서 DB와 데이터 일관성이 깨지고, 최악의 경우에 memberC가 DB에서 삭제될 수도 있습니다.왜냐하면 JPA의 엔티티 객체 그래프는 DB와 데이터 일관성을 유지해야 하기 때문입니다! 잘 생각해보면 우리가 엔티티의 값을 변경하면 DB에 반영이 되어버리지요.위에 내용중 "이렇게 되면 JPA 입장에서 DB와 데이터 일관성이 깨지고, 최악의 경우에 memberC가 DB에서 삭제될 수도 있습니다." 이게 기존에 DB에 존재하는 데이터가 삭제될 수 있다는 내용으로 이해했는데 어떤 상황에서 발생할 수 있을까요?? 코드로 재연해보려고 시도했는데 계속 막히고있습니다ㅜㅜ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입
35강 값타입 불변객체 강의중,처음 new Address로 인스턴스를 찍어내고두번째 new Address 는 그전 주소를(메모리)참조하여 생성하는데,member 객체를 생성할때 마다 새로운 Address 를 찍어내면 안되나요?그러면 두개의 member 가 있을때 하나의 값을 변경해도각자 다른 주소를 바라보고 있으니 통합변경이 일어나지 않는거 아닌가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team.getMembers().add(member) 관련 질문드립니다
안녕하세요.team.getMembers().add(member) 실행시, 메모리에 team 관련하여 저장이 되고,Team findTeam = em.find(Team.class, team.getId()));실행시, 1차 캐시 (메모리)에서 team을 가져오는데,이 두가지 모두 같은 메모리에서 같은 team을 가져오는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블에는 객체가 못들어가나요?
Member 클래스에는 team이라는 클래스가 있는데db를 확인해보니 team_id로 되어있어서요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Order entity에서 private Long memberId; 를 지우면 memberId를 통한 select 쿼리는 못 날리게 되는거죠?
Order entity에서 private Long memberId; 를 지우면 memberId를 통한 select 쿼리는 못 날리게 되는거죠?예를 들어 member1 (id = 1)이 주문한 모든 order를 조회하고 싶을 때 select * from orders where member_id = 1이런식으로 order 레코드들을 찾을텐데매핑을 하면 이런 쿼리는 안날리고 member1.getOrders() 이런식으로 list를 받는 메소드를 사용하는거죠?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
OneToOne 즉시 로딩에 대한 조언을 구합니다.
안녕하세요.선생님 강의를 듣고 실무에서 JPA를 활용하고 있는 학생입니다.현재 엔테티 구조가 OneToMany가 여러개가 있어서 동시에 fetch join을 2개 이상을 사용할 수 없는 상황입니다.[bag exception]그래서 지연 로딩과 batch_size를 활용하고 있습니다.여기서 문제가 발생했습니다. 지연 로딩으로 불러오는 부분에서 연관 관계의 주인이 아닌 NftProduct 엔티티에 OneToOne 관계가 있어 Membership 엔티티를 즉시 로딩[n+1 발생]합니다.이런 경우에는 어떤식으로 풀어가는게 좋은 방법일지 궁금하여 질문드립니다.구글링 했을 때는 MixFormula 엔티티의 List<MixMaterialFormula>의 결과 값을 조회하는 별도의 fetch join[MixMaterial, NftProduct, Membership] 쿼리를 호출하여 해결하는 방법도 있던데 어떤 방법이 좋은 방법일 지 궁금하여 문의드립니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 flush()와 commit()에 대해서 질문 드립니다.
제가 처음에 flush()와 commit()의 차이점을 잘 모르겠어서다른 글들을 읽어봤는데도 제가 궁금한 것이 풀리지 않아 질문드립니다.플러시를 하는 순간 쓰기 지연 SQL 저장소에서 DB에 반영이 된다고 하셨는데, 그런데 또 다른 글들을 보니 플러시를 한다고 해서 실제 DB에 반영되는 것이 아니라 커밋을 해야지 실제 DB에 반영이 된다고 읽었습니다.그래서 인위적으로 커밋을 없애고 플러시만 하게 만들었더니 실제 DB는 안 바뀌고 insert문만 나왔습니다.Q. 혹시 플러시를 했을 경우 실제 DB에 반영이 안되고이렇게 반영될 예정이다? 그런 상태로 되는 건가요???
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
컬렉션 탐색
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용](멤버와 팀이 다대일 관계)"select t.members From Team t"t.members가 Member 객체가 아니라 Member컬렉션 자체라서 탐색이 허용안된다고 하셨는데요. 영한님께서 size 메서드를 쓰시는걸 보고 의문이 생겼습니다. 앞서 경로 표현식에서는 객체 탐색이 상태 필드, 단일값 연관필드, 컬렉션 값 연관필드만 허용이 된다고 하셨는데 size()는 왜 허용이 되는건가요? size가 허용되면 t.members.get(...)이런 식으로 컬렉션 메서드도 사용가능한거 아닌가요? 감사합니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
maven 오류
/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=60512:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/jeong-yeongmin/Downloads/study/JPA/jpa-basic/target/classes:/Users/jeong-yeongmin/.m2/repository/org/hibernate/hibernate-entitymanager/5.3.10.Final/hibernate-entitymanager-5.3.10.Final.jar:/Users/jeong-yeongmin/.m2/repository/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/jeong-yeongmin/.m2/repository/org/hibernate/hibernate-core/5.3.10.Final/hibernate-core-5.3.10.Final.jar:/Users/jeong-yeongmin/.m2/repository/org/javassist/javassist/3.23.2-GA/javassist-3.23.2-GA.jar:/Users/jeong-yeongmin/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/jeong-yeongmin/.m2/repository/org/jboss/jandex/2.0.5.Final/jandex-2.0.5.Final.jar:/Users/jeong-yeongmin/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/Users/jeong-yeongmin/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/jeong-yeongmin/.m2/repository/org/dom4j/dom4j/2.1.1/dom4j-2.1.1.jar:/Users/jeong-yeongmin/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.0.4.Final/hibernate-commons-annotations-5.0.4.Final.jar:/Users/jeong-yeongmin/.m2/repository/javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar:/Users/jeong-yeongmin/.m2/repository/net/bytebuddy/byte-buddy/1.9.5/byte-buddy-1.9.5.jar:/Users/jeong-yeongmin/.m2/repository/org/jboss/spec/javax/transaction/jboss-transaction-api_1.2_spec/1.1.1.Final/jboss-transaction-api_1.2_spec-1.1.1.Final.jar:/Users/jeong-yeongmin/.m2/repository/com/h2database/h2/1.4.200/h2-1.4.200.jar hellojpa.JpaMain 10월 09, 2022 4:58:00 오전 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...] 10월 09, 2022 4:58:00 오전 org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {5.3.10.Final} 10월 09, 2022 4:58:00 오전 org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException at org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43) at org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:86) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:212) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:174) at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:76) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:171) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:119) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:61) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:50) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:10) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 12 more Process finished with exit code 1안녕하세요. 원래 gradle을 사용하다가 강의를 보면서 maven을 사용중인데 원래 설치했던 환경이 달라 그런지 계속 오류가 뜹니다. pom.xml도 아예 초기 세팅이 <properties>까지 포함하게끔 나와서 디폴트로 주는 거는 그냥 두고 강의 코드를 복사 붙여넣기 했는데 어떤식으로 바꿔야 되는지 모르겠습니다. 아래는 pom.xml코드입니다.<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>jpa-basic</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.3.10.Final</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.200</version> </dependency> </dependencies> </project>
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
OneToMany에서 LazyLoading 관련 질문이 있습니다.
Member : Team = N : 1 관계에서 Team 엔티티에서 @OneToMany(fetch = FetchType.LAZY)로 Member를 참조하고 있는 상황입니다. Team team = TeamRepository.findById(1L);team.getMembers().get(0)를 한 후 쿼리를 보니 다음과 같이 나가는 것을 볼 수 있었습니다 (member엔 id, name, team_id column만 존재합니다)제 생각으론 id, name, team_id만 조회해오면 될 것 같은데 추가적인 team_id, id 조회가 중복으로 나가고있는데 이유가 무엇일까요? ㅠㅠ 도저히 해결이 안돼서 질문올려요..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
H2 DB 접근 거부 에러
수업 들으며 h2 db 잘 사용하고 있었는데요...오늘 접속하려고 보니 해당 에러가 발생하며 H2 콘솔 접근이 안됩니다 ㅠㅠJDBC URL 을 jdbc:h2:~/test 로 지정하면 정상 접근 되는 상황입니다.db 파일도 제대로 있고,db 파일 삭제 후 다시 파일 만들어 시도해도 동일한 현상입니다. 어떻게 조치해야 할까요? ㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
혹시 영한선생님께 1:1 질문이나 비밀 질문 같은 것은 할 수 없나요 ??
공개된 커뮤니티 말고 질문할 수 있는 방법은 없나요 ? 영한 선생님께 1:1로 직접 질문하고 싶은 내용이 있어서요
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
외래키가 "다" 쪽에 있어야 하는 이유에 대한 이해가 부족합니다.
영한님께서 일대다[1:N]강의에서 1:40 ~ 1:50초 사이에 DB설계관점에서 보면 외래키가 다쪽에외래키가 들어가는것이 좋으며, team쪽에 memberId가 있으면 team을 계속 insert해야하며,team이 중복이 되어 1이 아닌 N이 된다고 하셨는데 이 부분들이 이해하기가 어려웠습니다.외래키가 "다"쪽에 있으면 좋은 이유들과 이 부분들의 이해가 부족할 때 어떤 것들을 공부하면 좋을것 같을지도 알려주시면 감사하겠습니다.영한님의 좋은 강의 덕분에 처음 듣는 내용들인데도, 이해가 잘돼서 너무 좋네요. 좋은 강의 감사합니다
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입과 상속
안녕하세요 강의 너무 잘 듣고 있습니다!값 타입을 배우고 나서 궁금증이 생겼습니다. 앞서 배운 @MappedSuperclass가 적용된BaseEntity를 사용하는 것과값 타입을 사용하는 것이 비슷하게 느껴졌는데,제 생각엔 값 타입을 사용하는 편이 더 낫다고 생각되는데..구분해서 사용할 수 있는 개념들인가요??BaseEntity 를 처음 배웠을 때부터 상속으로 하면 느낌상 어떤 제약이 생기는 듯한 기분을 지울 수가 없네요..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
application.properties 질문 드립니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.JPA 설정을 persistent.xml에서 설정 내용들을 적어주는데 혹시 spring boot에서 할때는 persistent.xml 말고 application.properties에서 persistent-unit name을 따로 설정 할 수 없을 까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
동일한 트랜잭션 의미
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장 이뜻에서 동일한 트랜잭션은 한명의 유저가 특정 컴퓨터로 보낸 모든 요청을 동일한 트랜잭션이라고 보나요? 아니면 한명의 유저가 보낸 한번의 요청내에서만을 동일한 트랜잭션이라고 보나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
왜 flush와 clear를 안하면 자식이 삭제가 안될까요??
orphanRemoval=true를 적용하고 em.flush / clear를 호출 안하면 왜 자식이 삭제가 안되는 걸까요??기본키 전략이 IDENTITY 이서 em.persist 하면 자동으로 INSERT SQL이 나가는데 계속 em.flush / clear 를 하고 자식을 삭제해야만 DELETE SQL이 나가더라고요.