월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! 스프링 데이터 JPA
Slice 타입 findAll()
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 만약 controller에서 Slice<T> 타입을 봔환하고 싶고 실행 메서드는 findAll(pageable)일 경우 사용자 정의 리포지토리에서 직접 구현을 해줘야하나요? findAll 은 page 는 반환하는데 slice 는 없더라구요 사용자 정의 리포지토리에서 직접 findsliceAll 로 이름 붙이고 구현하여 SliceImpl 을 반환하는 형태로 하면 컨트롤러에서 slice 반환으로 사용가능하다고 생각하는데 맞나요
- 미해결실전! 스프링 데이터 JPA
프록시 초기화
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강의 코드를 실행해보다가 궁금한점이 생겨서 질문드립니다. 예전에 MemberTest 클래스에서 아래 코드를 실행했을때는 member.getTeam() 에서 team에 대한 select 쿼리가 나가면서 프록시 초기화가 발생했습니다. @Test public void testEntity() throws Exception { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); //초기화 em.flush(); em.clear(); //확인 List<Member> members = em.createQuery("select m from Member m", Member.class) .getResultList(); for (Member member : members) { System.out.println("member = " + member); System.out.println("-> member.team = " + member.getTeam()); } } 하지만 MemberRepositoryTest 클래스에서 아래의 코드의 경우 member.getTeam() 으로 하면 team에 대한 select 쿼리가 나가지 않고 프록시 초기화가 발생하지 않습니다. 이 두가지 테스트의 차이가 무엇이길래 처음 테스트는 getTeam()으로 프록시 초기화가 되고 두번째 테스트는 getTeam()만으론 안되고 getTeam().getName() 까지 해야 프록시 초기화가 될까요? @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clear(); //when List<Member> members = memberRepository.findAll(); //then for (Member member : members) { member.getTeam(); System.out.println("Team = " + member.getTeam().getClass()); } }
- 미해결실전! 스프링 데이터 JPA
Service, Repository는 클래스가 하나라도 interface를 생성하는게 좋을까요 ?
안녕하세요요 자바 프로젝트 개발을 처음 시작하였는데 Service 와 Repository가 시작할 때는 하나라 그냥 class로 만들었는데, 일반적으로 하나의 클래스더라도 interface를 생성하고 interface 명 Impl 이렇게 클래스를 생성해야 할까요 ?
- 미해결실전! 스프링 데이터 JPA
[질문]
강의 잘보고 있습니다. 선생님 혹시 인터페이스를 이렇게 사용자정의로 구현하면 만약 page 반환 쿼리를 날릴때 count 쿼리는 어떻게 따로 설정이 가능한가요?
- 미해결실전! 스프링 데이터 JPA
실무(OLTP 환경)에서는 강의에서 알려주신 오프셋 페이징을 쓰면 안되는거 맞을까요?
실무에서 DB 를 사용한다고 하면 배치나 데이터 파이프라인 등이 아닌 OLTP 환경에서는 절대 오프셋 기반의 페이징을 쓰면 안되지 않나요? 우선 페이징 도중에 다른 클라이언트에 의해 실시간으로 데이터가 삽입/삭제가 일어나 중복된 데이터가 보여지거나 중간 데이터 누락이 발생할 수도 있기 때문에 문제가 될 것이고, 성능의 관점에서도 SQL 쿼리에서 OFFSET 문의 경우 index seek 과정에서 바로 페이지의 첫 데이터를 찾아가는것이 아니라 불필요하게 맨 처음 인덱스부터 offset 사이즈만큼 스캔한 뒤에 limit 만큼 가져오는 것이기 때문에 scalable 않지만, 커서 기반의 페이징의 경우 데이터의 양이 많아지더라도 where 절을 통해 index seek 과정에서 바로 커서에 해당하는 인덱스를 찾아가서 page size 만큼의 데이터만 스캔하면 되기 때문에 실무에서 굳이 오프셋 기반의 페이징을 쓸 이유가 없다. 라고 이해하면 맞을까요? 물론 페이징 대상이 되는 데이터의 수 자체가 매우 적거나 유저가 많은 페이지를 탐색하지 않는다면 큰 문제가 되지 않을 수도 있지만, 커서 기반의 페이징을 구현하는것이 특별이 어려운 것도 아니고 굳이 오프셋 기반의 페이징을 사용할 필요가 있나 궁금했습니다!
- 미해결실전! 스프링 데이터 JPA
Lazy 강제 초기화를 해도 프록시 객체가 유지 됩니다.
public List<Drawing> getDrawingList() { List<Drawing> drawings = drawingService.findDrawings(); for (Drawing drawing : drawings) { drawing.getDrawingCategory().getName(); } return drawings;} 위 코드 실행시에러 내용입니다. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->.drawing.entity.Drawing["drawingCategory"]->.drawingcategory.entity.DrawingCategory$HibernateProxy$dtz0HezH["hibernateLazyInitializer"])] with root cause findDrawings 에서 JpaRepository가 findAll을 return 해줍니다. @ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "category_id", nullable = false)private DrawingCategory drawingCategory; Drawing은 DrawingCategory를 ManyToOne으로 단방향 연관관계를 맺고 있습니다. 그래서, drawing.getDrawingCateogory.getName 으로 Lazy 강제 초기화를 해주었는데 위의 에러가 나오네요.. fetch join을 사용하면 해결이 되긴 합니다만 get으로 Lazy연관관계의 값을 직접 가져와도 HibernateProxy객체가 유지되는지 궁금합니다.
- 미해결실전! 스프링 데이터 JPA
벌크연산 실행시 영상과 같은 원하는 값이 나오지 않습니다...
12:19초 부분 영상에서 MemberRepositoryTest를 실행시 영상에서는member5 = Member(id=5, username=member5, age=41)이라고 build창에서 나오지만 저는 아예 나오지 않아서 질문드립니다.. build 내용은 에러없이 이렇게 나옵니다. "/Applications/IntelliJ IDEA CE.app/Contents/jbr/Contents/Home/bin/java" -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=62958:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/milaju/.m2/repository/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar:/Users/milaju/.m2/repository/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar:/Users/milaju/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/milaju/.m2/repository/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar:/Users/milaju/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/junit/lib/junit5-rt.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/junit/lib/junit-rt.jar:/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/test/classes:/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/production/classes:/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/production/resources:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-data-jpa/2.6.6/30942753cd29132913a5b642dc5b045c1cb18fd9/spring-boot-starter-data-jpa-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-web/2.6.6/7aa73898044e9fb7dc71dbf4d4e0f2fbcc7ce25f/spring-boot-starter-web-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.github.gavlyukovskiy/p6spy-spring-boot-starter/1.5.7/1c1cc817d2ee7cfe8a511bb1b429254d05f7ad03/p6spy-spring-boot-starter-1.5.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-test/2.6.6/b6b577cad64544e47dc9f523d7091c2cbb85bd52/spring-boot-starter-test-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-aop/2.6.6/d08c239992526803aa4f7fc4e74f243ccc337ebb/spring-boot-starter-aop-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-jdbc/2.6.6/c0ee383ed4482fddc74ad645c0d77c98ec767140/spring-boot-starter-jdbc-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.transaction/jakarta.transaction-api/1.3.3/c4179d48720a1e87202115fbed6089bdc4195405/jakarta.transaction-api-1.3.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.persistence/jakarta.persistence-api/2.2.3/8f6ea5daedc614f07a3654a455660145286f024e/jakarta.persistence-api-2.2.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core/5.6.7.Final/c62626c463b75530acb4f2fb2ae3ca85d80cfa06/hibernate-core-5.6.7.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.data/spring-data-jpa/2.6.3/7fbfafa3b27c8f2e315fe489c2f0699a24f32082/spring-data-jpa-2.6.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aspects/5.3.18/78e473c68f3f579f6dff4810530260bcfe97ca8f/spring-aspects-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-json/2.6.6/6f405fb0ebe73841e4494aa65cf2f91d7dc2ae7f/spring-boot-starter-json-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/2.6.6/b34b4f0c1e99edc181ea40a6b1b79fa72658ee04/spring-boot-starter-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-tomcat/2.6.6/2076a0fd75e63b57dd149a0ccf7a1545e3f1aec3/spring-boot-starter-tomcat-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-webmvc/5.3.18/806b4ac997761daa32cba3f766d8ac09c132fe81/spring-webmvc-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/5.3.18/8db103c4109e925ec6f5fbfe577d447d3e95ded5/spring-web-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.github.gavlyukovskiy/datasource-decorator-spring-boot-autoconfigure/1.5.7/83c5a0750a42d36ffbcb988f82af0debd43ebd8b/datasource-decorator-spring-boot-autoconfigure-1.5.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/p6spy/p6spy/3.8.2/52299d9a1ec2bc2fb8b1a21cc12dfc1a7c033caf/p6spy-3.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test-autoconfigure/2.6.6/c2571e2dd0a9543525b9bd6253942a89195d9b4d/spring-boot-test-autoconfigure-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/2.6.6/97626f535c1625e0ca3ede4351e4d55e4cd80ae1/spring-boot-test-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.jayway.jsonpath/json-path/2.6.0/67f565b424f7903a12d4f5b9361b11462ecacdac/json-path-2.6.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.xml.bind/jakarta.xml.bind-api/2.3.3/48e3b9cfc10752fba3521d6511f4165bea951801/jakarta.xml.bind-api-2.3.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/3.21.0/27a14d6d22c4e3d58f799fb2a5ca8eaf53e6942a/assertj-core-3.21.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/2.2/1820c0968dba3a11a1b30669bb1f01978a91dedc/hamcrest-2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter/5.8.2/5a817b1e63f1217e5c586090c45e681281f097ad/junit-jupiter-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-junit-jupiter/4.0.0/b76de25bd6e5d8f7924d0536729c0076e37e9396/mockito-junit-jupiter-4.0.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/4.0.0/f5195e0c4a45716bbd2d1d29173adbd148acce3a/mockito-core-4.0.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.skyscreamer/jsonassert/1.5.0/6c9d5fe2f59da598d9aefc1cfc6528ff3cf32df3/jsonassert-1.5.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-test/5.3.18/9d6a388deed7abd60e2bddde44d927f9d009d3be/spring-test-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.3.18/7ff3000f3342989cb011b6095a0e86f2e5176cef/spring-core-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.xmlunit/xmlunit-core/2.8.4/35be57989ca80eefa03161b211630e319a8f36c6/xmlunit-core-2.8.4.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/5.3.18/8e9cce60c60257ae1d5b3cd675ec3a8286ed1955/spring-aop-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjweaver/1.9.7/158f5c255cd3e4408e795b79f7c3fbae9b53b7ca/aspectjweaver-1.9.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jdbc/5.3.18/b168d4c024cb002377bca91f2b804297d8b74003/spring-jdbc-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.zaxxer/HikariCP/4.0.3/107cbdf0db6780a065f895ae9d8fbf3bb0e1c21f/HikariCP-4.0.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.6/1e6cd0e5d9f9919c8c8824fb4d310b09a978a60e/jaxb-runtime-2.3.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.hibernate.common/hibernate-commons-annotations/5.1.2.Final/e59ffdbc6ad09eeb33507b39ffcf287679a498c8/hibernate-commons-annotations-5.1.2.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.jboss.logging/jboss-logging/3.4.3.Final/c4bd7e12a745c0e7f6cf98c45cdcdf482fd827ea/jboss-logging-3.4.3.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.11.22/8b4c7fa5562a09da1c2a9ab0873cb51f5034d83f/byte-buddy-1.11.22.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/antlr/antlr/2.7.7/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.jboss/jandex/2.4.2.Final/1e1c385990b258ff1a24c801e84aebbacf70eb39/jandex-2.4.2.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml/classmate/1.5.1/3fe0bed568c62df5e89f4f174c101eab25345b6c/classmate-1.5.1.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.3.18/34f6683d9dbe6edb02ad9393df3d3211b5484622/spring-context-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/5.3.18/ec32d5f4c718cc63e7c44adf5c4e7c49cdffa147/spring-orm-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.data/spring-data-commons/2.6.3/767ebf330da425ac4ab4b14391a60d9ed3ba18b7/spring-data-commons-2.6.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/5.3.18/a93f91200e40b22ac0fda1308ecac081b820b099/spring-tx-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.3.18/3f0ea6598a5a1eae0a672f025a33a0b7e0d6dfd3/spring-beans-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.13.2/cddd9380efd4b81ea01e98be8fbdc9765a81793b/jackson-datatype-jsr310-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.module/jackson-module-parameter-names/2.13.2/c406ec37f89125d1003093d5b96d216dc967153c/jackson-module-parameter-names-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.13.2/95f59cf63c3aadc1549578254af839a9c42ae84f/jackson-datatype-jdk8-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.13.2.2/ffeb635597d093509f33e1e94274d14be610f933/jackson-databind-2.13.2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/2.6.6/e5b575d304ec5c6746fef3cc594bbe89721d64c2/spring-boot-autoconfigure-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.6.6/286137a0c57d159f845faa1c2e8d0b7548391085/spring-boot-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/2.6.6/e37b388e2407a1b03f920a7fd0722e41745c92c6/spring-boot-starter-logging-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/1.3.5/59eb84ee0d616332ff44aba065f3888cf002cd2d/jakarta.annotation-api-1.3.5.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.29/6d0cdafb2010f1297e574656551d7145240f6e25/snakeyaml-1.29.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-websocket/9.0.60/a88262a55ae2c4b5404149a48122523688be341a/tomcat-embed-websocket-9.0.60.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-core/9.0.60/e14045220243804544ddb168cb532f4640a220c/tomcat-embed-core-9.0.60.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-el/9.0.60/46dad1a278f348ca73466e0b73132bf4c4892c06/tomcat-embed-el-9.0.60.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/5.3.18/61c51831e49a85fc5bf925253ca63f46fec6f013/spring-expression-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.minidev/json-smart/2.4.8/7c62f5f72ab05eb54d40e2abf0360a2fe9ea477f/json-smart-2.4.8.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.activation/jakarta.activation-api/1.2.2/99f53adba383cb1bf7c3862844488574b559621f/jakarta.activation-api-1.2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.8.2/ddeafe92fc263f895bfb73ffeca7fd56e23c2cce/junit-jupiter-params-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.11.22/2fbcf3210dfc09b42242e3b66a5281cc5b9adb80/byte-buddy-agent-1.11.22.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.vaadin.external.google/android-json/0.0.20131108.vaadin1/fa26d351fe62a6a17f5cda1287c1c6110dec413f/android-json-0.0.20131108.vaadin1.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.3.18/7e5d8cd447981bc20d4c397a2ba0a1c65ff2267a/spring-jcl-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/txw2/2.3.6/45db7b69a8f1ec2c21eb7d4fc0ee729f53c1addc/txw2-2.3.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.sun.istack/istack-commons-runtime/3.0.12/cbbe1a62b0cc6c85972e99d52aaee350153dc530/istack-commons-runtime-3.0.12.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.13.2/ec18851f1976d5b810ae1a5fcc32520d2d38f77a/jackson-annotations-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.13.2/a6a0e0620d51833feffc67bccb51937b2345763/jackson-core-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.11/4741689214e9d1e8408b206506cbe76d1c6a7d60/logback-classic-1.2.11.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-to-slf4j/2.17.2/17dd0fae2747d9a28c67bc9534108823d2376b46/log4j-to-slf4j-2.17.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/1.7.36/ed46d81cef9c412a88caef405b58f93a678ff2ca/jul-to-slf4j-1.7.36.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.minidev/accessors-smart/2.4.8/6e1bee5a530caba91893604d6ab41d0edcecca9a/accessors-smart-2.4.8.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apiguardian/apiguardian-api/1.1.2/a231e0d844d2721b0fa1b238006d15c6ded6842a/apiguardian-api-1.1.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.2.11/a01230df5ca5c34540cdaa3ad5efb012f1f1f792/logback-core-1.2.11.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.2/f42d6afa111b4dec5d2aea0fe2197240749a4ea6/log4j-api-2.17.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.1/a99500cf6eea30535eeac6be73899d048f8d12a8/asm-9.1.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.h2database/h2/1.4.200/f7533fe7cb8e99c87a43d325a77b4b678ad9031a/h2-1.4.200.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.8.2/c598b4328d2f397194d11df3b1648d68d7d990e3/junit-jupiter-engine-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/3.2/7fadf57620c8b8abdf7519533e5527367cb51f09/objenesis-3.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.sun.activation/jakarta.activation/1.2.2/74548703f9851017ce2f556066659438019e7eb5/jakarta.activation-1.2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-engine/1.8.2/b737de09f19864bd136805c84df7999a142fec29/junit-platform-engine-1.8.2.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 study.datajpa.repository.MemberJpaRepositoryTest,bulkUpdate 20:56:06.803 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 20:56:06.814 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)] 20:56:06.880 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [study.datajpa.repository.MemberJpaRepositoryTest] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper] 20:56:06.897 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [study.datajpa.repository.MemberJpaRepositoryTest], using SpringBootContextLoader 20:56:06.902 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [study.datajpa.repository.MemberJpaRepositoryTest]: class path resource [study/datajpa/repository/MemberJpaRepositoryTest-context.xml] does not exist 20:56:06.902 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [study.datajpa.repository.MemberJpaRepositoryTest]: class path resource [study/datajpa/repository/MemberJpaRepositoryTestContext.groovy] does not exist 20:56:06.902 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [study.datajpa.repository.MemberJpaRepositoryTest]: no resource found for suffixes {-context.xml, Context.groovy}. 20:56:06.903 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [study.datajpa.repository.MemberJpaRepositoryTest]: MemberJpaRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 20:56:06.973 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [study.datajpa.repository.MemberJpaRepositoryTest] 20:56:07.075 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/production/classes/study/datajpa/DataJpaApplication.class] 20:56:07.076 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration study.datajpa.DataJpaApplication for test class study.datajpa.repository.MemberJpaRepositoryTest 20:56:07.258 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [study.datajpa.repository.MemberJpaRepositoryTest]: using defaults. 20:56:07.259 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener] 20:56:07.278 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@5066d65f, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@4233e892, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@77d2e85, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@3ecd267f, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@58ffcbd7, org.springframework.test.context.support.DirtiesContextTestExecutionListener@555cf22, org.springframework.test.context.transaction.TransactionalTestExecutionListener@6bb2d00b, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@3c9bfddc, org.springframework.test.context.event.EventPublishingTestExecutionListener@1a9c38eb, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@319bc845, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@4c5474f5, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@2f4205be, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@54e22bdd, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@3bd418e4, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@544820b7] 20:56:07.281 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@6955cb39 testClass = MemberJpaRepositoryTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@235a0c16 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class study.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7d61eb55, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@163370c2, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@13d9cbf5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@c667f46, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3b5fad2d, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4e41089d], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true]], class annotated with @DirtiesContext [false] with mode [null]. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.6.6) 2022-04-17 20:56:08.246 INFO 39496 --- [ main] s.d.repository.MemberJpaRepositoryTest : Starting MemberJpaRepositoryTest using Java 11.0.14.1 on MacBook-Pro.local with PID 39496 (started by milaju in /Users/milaju/Desktop/SpringDataJPA/data-jpa) 2022-04-17 20:56:08.248 INFO 39496 --- [ main] s.d.repository.MemberJpaRepositoryTest : No active profile set, falling back to 1 default profile: "default" 2022-04-17 20:56:09.521 INFO 39496 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2022-04-17 20:56:09.588 INFO 39496 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 58 ms. Found 2 JPA repository interfaces. 2022-04-17 20:56:11.058 INFO 39496 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2022-04-17 20:56:11.115 INFO 39496 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.7.Final 2022-04-17 20:56:11.280 INFO 39496 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2022-04-17 20:56:11.392 INFO 39496 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2022-04-17 20:56:11.480 INFO 39496 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2022-04-17 20:56:11.513 INFO 39496 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2022-04-17 20:56:12.208 DEBUG 39496 --- [ main] org.hibernate.SQL : drop table if exists member CASCADE 2022-04-17 20:56:12.216 INFO 39496 --- [ main] p6spy : #1650196572215 | took 1ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/datajpa drop table if exists member CASCADE drop table if exists member CASCADE ; 2022-04-17 20:56:12.216 DEBUG 39496 --- [ main] org.hibernate.SQL : drop table if exists team CASCADE 2022-04-17 20:56:12.216 INFO 39496 --- [ main] p6spy : #1650196572216 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/datajpa drop table if exists team CASCADE drop table if exists team CASCADE ; 2022-04-17 20:56:12.216 DEBUG 39496 --- [ main] org.hibernate.SQL : drop sequence if exists hibernate_sequence 2022-04-17 20:56:12.216 INFO 39496 --- [ main] p6spy : #1650196572216 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/datajpa drop sequence if exists hibernate_sequence drop sequence if exists hibernate_sequence; 2022-04-17 20:56:12.218 DEBUG 39496 --- [ main] org.hibernate.SQL : create sequence hibernate_sequence start with 1 increment by 1 2022-04-17 20:56:12.219 INFO 39496 --- [ main] p6spy : #1650196572219 | took 0ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa create sequence hibernate_sequence start with 1 increment by 1 create sequence hibernate_sequence start with 1 increment by 1; 2022-04-17 20:56:12.220 DEBUG 39496 --- [ main] org.hibernate.SQL : create table member ( member_id bigint not null, age integer not null, username varchar(255), tema_id bigint, primary key (member_id) ) 2022-04-17 20:56:12.222 INFO 39496 --- [ main] p6spy : #1650196572222 | took 1ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa create table member ( member_id bigint not null, age integer not null, username varchar(255), tema_id bigint, primary key (member_id) ) create table member ( member_id bigint not null, age integer not null, username varchar(255), tema_id bigint, primary key (member_id) ); 2022-04-17 20:56:12.224 DEBUG 39496 --- [ main] org.hibernate.SQL : create table team ( team_id bigint not null, name varchar(255), primary key (team_id) ) 2022-04-17 20:56:12.225 INFO 39496 --- [ main] p6spy : #1650196572225 | took 0ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa create table team ( team_id bigint not null, name varchar(255), primary key (team_id) ) create table team ( team_id bigint not null, name varchar(255), primary key (team_id) ); 2022-04-17 20:56:12.226 DEBUG 39496 --- [ main] org.hibernate.SQL : alter table member add constraint FK8g17q6hc0aeo27fqj0vlxsa38 foreign key (tema_id) references team 2022-04-17 20:56:12.229 INFO 39496 --- [ main] p6spy : #1650196572229 | took 3ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa alter table member add constraint FK8g17q6hc0aeo27fqj0vlxsa38 foreign key (tema_id) references team alter table member add constraint FK8g17q6hc0aeo27fqj0vlxsa38 foreign key (tema_id) references team; 2022-04-17 20:56:12.232 INFO 39496 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2022-04-17 20:56:12.340 INFO 39496 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2022-04-17 20:56:12.964 WARN 39496 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2022-04-17 20:56:14.549 INFO 39496 --- [ main] s.d.repository.MemberJpaRepositoryTest : Started MemberJpaRepositoryTest in 7.204 seconds (JVM running for 8.983) 2022-04-17 20:56:14.614 INFO 39496 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@6955cb39 testClass = MemberJpaRepositoryTest, testInstance = study.datajpa.repository.MemberJpaRepositoryTest@16f62062, testMethod = bulkUpdate@MemberJpaRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@235a0c16 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class study.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7d61eb55, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@163370c2, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@13d9cbf5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@c667f46, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3b5fad2d, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4e41089d], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@74cff17c]; rollback [false] 2022-04-17 20:56:14.823 DEBUG 39496 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 20:56:14.831 INFO 39496 --- [ main] p6spy : #1650196574831 | took 4ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 20:56:14.844 DEBUG 39496 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 20:56:14.845 INFO 39496 --- [ main] p6spy : #1650196574845 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 20:56:14.845 DEBUG 39496 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 20:56:14.846 INFO 39496 --- [ main] p6spy : #1650196574846 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 20:56:14.846 DEBUG 39496 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 20:56:14.847 INFO 39496 --- [ main] p6spy : #1650196574847 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 20:56:14.847 DEBUG 39496 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 20:56:14.847 INFO 39496 --- [ main] p6spy : #1650196574847 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 20:56:14.861 DEBUG 39496 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 20:56:14.865 INFO 39496 --- [ main] p6spy : #1650196574865 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (10, NULL, 'member1', 1); 2022-04-17 20:56:14.866 DEBUG 39496 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 20:56:14.867 INFO 39496 --- [ main] p6spy : #1650196574867 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (19, NULL, 'member1', 2); 2022-04-17 20:56:14.867 DEBUG 39496 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 20:56:14.868 INFO 39496 --- [ main] p6spy : #1650196574868 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (20, NULL, 'member1', 3); 2022-04-17 20:56:14.868 DEBUG 39496 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 20:56:14.868 INFO 39496 --- [ main] p6spy : #1650196574868 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (21, NULL, 'member1', 4); 2022-04-17 20:56:14.869 DEBUG 39496 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 20:56:14.869 INFO 39496 --- [ main] p6spy : #1650196574869 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (40, NULL, 'member1', 5); 2022-04-17 20:56:14.872 DEBUG 39496 --- [ main] org.hibernate.SQL : update member set age=age+1 where age>=? 2022-04-17 20:56:14.874 INFO 39496 --- [ main] p6spy : #1650196574874 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa update member set age=age+1 where age>=? update member set age=age+1 where age>=20; 2022-04-17 20:56:14.939 INFO 39496 --- [ main] p6spy : #1650196574939 | took 0ms | commit | connection 3| url jdbc:h2:tcp://localhost/~/datajpa ; 2022-04-17 20:56:14.941 INFO 39496 --- [ main] o.s.t.c.transaction.TransactionContext : Committed transaction for test: [DefaultTestContext@6955cb39 testClass = MemberJpaRepositoryTest, testInstance = study.datajpa.repository.MemberJpaRepositoryTest@16f62062, testMethod = bulkUpdate@MemberJpaRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@235a0c16 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class study.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7d61eb55, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@163370c2, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@13d9cbf5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@c667f46, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3b5fad2d, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4e41089d], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]] 2022-04-17 20:56:14.958 INFO 39496 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2022-04-17 20:56:14.963 INFO 39496 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2022-04-17 20:56:14.987 INFO 39496 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code 0 MemberRepository입니다. package study.datajpa.repository;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Slice;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Modifying;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import study.datajpa.dto.MemberDto;import study.datajpa.entity.Member;import java.util.Collection;import java.util.List;import java.util.Optional;public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByUsernameAndAgeGreaterThan(String username, int age); List<Member> findTop3HelloBy(); List<Member> findByUsername(@Param("username") String username); @Query("select m from Member m where m.username = :username and m.age = :age") List<Member> findUser(@Param("username") String username, @Param("age") int age); @Query("select m.username from Member m") List<String> findUsernameList(); @Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t") List<MemberDto> findMemberDto(); @Query("select m from Member m where m.username in :names") List<Member> findByNames(@Param("names") Collection<String> names); List<Member> findListByUsername(String username); // 컬렉션 Member findMemberByUsername(String username); // 단건 Optional<Member> findOptionalByUsername(String username); // 단건 Optional Page<Member> findByAge(int age, Pageable pageable); @Modifying @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age);} MemberRepositoryTest 입니다. package study.datajpa.repository;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Slice;import org.springframework.data.domain.Sort;import org.springframework.test.annotation.Rollback;import org.springframework.transaction.annotation.Transactional;import study.datajpa.dto.MemberDto;import study.datajpa.entity.Member;import study.datajpa.entity.Team;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import java.util.Arrays;import java.util.List;import java.util.Optional;import static org.assertj.core.api.Assertions.*;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest@Transactional@Rollback(false)class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Autowired TeamRepository teamRepository; @PersistenceContext EntityManager em; @Test public void testMember() { System.out.println("memberRepository = " + memberRepository.getClass()); Member member = new Member("memberA"); Member savedMember = memberRepository.save(member); Member findMember = memberRepository.findById(savedMember.getId()).get(); assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); assertThat(findMember).isEqualTo(member); } @Test public void basicCRUD() { Member member1 = new Member("member1"); Member member2 = new Member("member2"); memberRepository.save(member1); memberRepository.save(member2); // 단건 조회 검증 Member findMember1 = memberRepository.findById(member1.getId()).get(); Member findMember2 = memberRepository.findById(member2.getId()).get(); assertThat(findMember1).isEqualTo(member1); assertThat(findMember2).isEqualTo(member2); findMember1.setUsername("member!!!!!!!"); // 리스트 조회 검증 List<Member> all = memberRepository.findAll(); assertThat(all.size()).isEqualTo(2); // 카운트 검증 long count = memberRepository.count(); assertThat(count).isEqualTo(2); // 삭제 검증 memberRepository.delete(member1); memberRepository.delete(member2); long deleteCount = memberRepository.count(); assertThat(deleteCount).isEqualTo(0); } @Test public void findByUsernameAndAgeGreaterThen() { Member m1 = new Member("AAA", 10); Member m2 = new Member("AAA", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findByUsernameAndAgeGreaterThan("AAA", 15); assertThat(result.get(0).getUsername()).isEqualTo("AAA"); assertThat(result.get(0).getAge()).isEqualTo(20); assertThat(result.size()).isEqualTo(1); } @Test public void findHelloBy() { List<Member> helloBy = memberRepository.findTop3HelloBy(); } @Test public void testNamedQuery() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findByUsername("AAA"); Member findMember = result.get(0); assertThat(findMember).isEqualTo(m1); } @Test public void testQuery() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findUser("AAA", 10); Member findMember = result.get(0); assertThat(findMember).isEqualTo(m1); } @Test public void findUsernameList() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<String> usernameList = memberRepository.findUsernameList(); for (String s : usernameList) { System.out.println("s = " + s); } } @Test public void findMemberDto() { Team team = new Team("teamA"); teamRepository.save(team); Member m1 = new Member("AAA", 10); m1.setTeam(team); memberRepository.save(m1); List<MemberDto> memberDto = memberRepository.findMemberDto(); for (MemberDto dto : memberDto) { System.out.println("dto = " + dto); } } @Test public void findByNames() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findByNames(Arrays.asList("AAA", "BBB")); for (Member member : result) { System.out.println("member = " + member); } } @Test public void returnType() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); Optional<Member> findMember = memberRepository.findOptionalByUsername("asdasfasDFADSF"); System.out.println("findMember = " + findMember); } @Test public void paging() { memberRepository.save(new Member("member1", 10)); memberRepository.save(new Member("member2", 10)); memberRepository.save(new Member("member3", 10)); memberRepository.save(new Member("member4", 10)); memberRepository.save(new Member("member5", 10)); int age = 10; PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); // when Page<Member> page = memberRepository.findByAge(age, pageRequest); Page<MemberDto> toMap = page.map(m -> new MemberDto(m.getId(), m.getUsername(), null)); // then List<Member> content = page.getContent(); assertThat(content.size()).isEqualTo(3); assertThat(page.getTotalElements()).isEqualTo(5); assertThat(page.getNumber()).isEqualTo(0); assertThat(page.getTotalPages()).isEqualTo(2); assertThat(page.isFirst()).isTrue(); assertThat(page.hasNext()).isTrue(); } @Test public void bulkUpdate() { //given memberRepository.save(new Member("member1", 10)); memberRepository.save(new Member("member2", 19)); memberRepository.save(new Member("member3", 20)); memberRepository.save(new Member("member4", 21)); memberRepository.save(new Member("member5", 40)); // when int resultCount = memberRepository.bulkAgePlus(20); em.flush(); em.clear(); List<Member> result = memberRepository.findByUsername("member5"); Member member5 = result.get(0); System.out.println("member5 = " + member5); // then assertThat(resultCount).isEqualTo(3); }} 그리고 MemberRepository Interface에서 @Modifying을 주석처리하면 에러가 나야하지만 주석처리하고 돌려도 정상적으로 아래와 같이 실행이 됩니다. "/Applications/IntelliJ IDEA CE.app/Contents/jbr/Contents/Home/bin/java" -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=63008:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/milaju/.m2/repository/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar:/Users/milaju/.m2/repository/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar:/Users/milaju/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/milaju/.m2/repository/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar:/Users/milaju/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/junit/lib/junit5-rt.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/junit/lib/junit-rt.jar:/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/test/classes:/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/production/classes:/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/production/resources:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-data-jpa/2.6.6/30942753cd29132913a5b642dc5b045c1cb18fd9/spring-boot-starter-data-jpa-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-web/2.6.6/7aa73898044e9fb7dc71dbf4d4e0f2fbcc7ce25f/spring-boot-starter-web-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.github.gavlyukovskiy/p6spy-spring-boot-starter/1.5.7/1c1cc817d2ee7cfe8a511bb1b429254d05f7ad03/p6spy-spring-boot-starter-1.5.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-test/2.6.6/b6b577cad64544e47dc9f523d7091c2cbb85bd52/spring-boot-starter-test-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-aop/2.6.6/d08c239992526803aa4f7fc4e74f243ccc337ebb/spring-boot-starter-aop-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-jdbc/2.6.6/c0ee383ed4482fddc74ad645c0d77c98ec767140/spring-boot-starter-jdbc-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.transaction/jakarta.transaction-api/1.3.3/c4179d48720a1e87202115fbed6089bdc4195405/jakarta.transaction-api-1.3.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.persistence/jakarta.persistence-api/2.2.3/8f6ea5daedc614f07a3654a455660145286f024e/jakarta.persistence-api-2.2.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core/5.6.7.Final/c62626c463b75530acb4f2fb2ae3ca85d80cfa06/hibernate-core-5.6.7.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.data/spring-data-jpa/2.6.3/7fbfafa3b27c8f2e315fe489c2f0699a24f32082/spring-data-jpa-2.6.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aspects/5.3.18/78e473c68f3f579f6dff4810530260bcfe97ca8f/spring-aspects-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-json/2.6.6/6f405fb0ebe73841e4494aa65cf2f91d7dc2ae7f/spring-boot-starter-json-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/2.6.6/b34b4f0c1e99edc181ea40a6b1b79fa72658ee04/spring-boot-starter-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-tomcat/2.6.6/2076a0fd75e63b57dd149a0ccf7a1545e3f1aec3/spring-boot-starter-tomcat-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-webmvc/5.3.18/806b4ac997761daa32cba3f766d8ac09c132fe81/spring-webmvc-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/5.3.18/8db103c4109e925ec6f5fbfe577d447d3e95ded5/spring-web-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.github.gavlyukovskiy/datasource-decorator-spring-boot-autoconfigure/1.5.7/83c5a0750a42d36ffbcb988f82af0debd43ebd8b/datasource-decorator-spring-boot-autoconfigure-1.5.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/p6spy/p6spy/3.8.2/52299d9a1ec2bc2fb8b1a21cc12dfc1a7c033caf/p6spy-3.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test-autoconfigure/2.6.6/c2571e2dd0a9543525b9bd6253942a89195d9b4d/spring-boot-test-autoconfigure-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/2.6.6/97626f535c1625e0ca3ede4351e4d55e4cd80ae1/spring-boot-test-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.jayway.jsonpath/json-path/2.6.0/67f565b424f7903a12d4f5b9361b11462ecacdac/json-path-2.6.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.xml.bind/jakarta.xml.bind-api/2.3.3/48e3b9cfc10752fba3521d6511f4165bea951801/jakarta.xml.bind-api-2.3.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/3.21.0/27a14d6d22c4e3d58f799fb2a5ca8eaf53e6942a/assertj-core-3.21.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/2.2/1820c0968dba3a11a1b30669bb1f01978a91dedc/hamcrest-2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter/5.8.2/5a817b1e63f1217e5c586090c45e681281f097ad/junit-jupiter-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-junit-jupiter/4.0.0/b76de25bd6e5d8f7924d0536729c0076e37e9396/mockito-junit-jupiter-4.0.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/4.0.0/f5195e0c4a45716bbd2d1d29173adbd148acce3a/mockito-core-4.0.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.skyscreamer/jsonassert/1.5.0/6c9d5fe2f59da598d9aefc1cfc6528ff3cf32df3/jsonassert-1.5.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-test/5.3.18/9d6a388deed7abd60e2bddde44d927f9d009d3be/spring-test-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.3.18/7ff3000f3342989cb011b6095a0e86f2e5176cef/spring-core-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.xmlunit/xmlunit-core/2.8.4/35be57989ca80eefa03161b211630e319a8f36c6/xmlunit-core-2.8.4.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/5.3.18/8e9cce60c60257ae1d5b3cd675ec3a8286ed1955/spring-aop-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjweaver/1.9.7/158f5c255cd3e4408e795b79f7c3fbae9b53b7ca/aspectjweaver-1.9.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jdbc/5.3.18/b168d4c024cb002377bca91f2b804297d8b74003/spring-jdbc-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.zaxxer/HikariCP/4.0.3/107cbdf0db6780a065f895ae9d8fbf3bb0e1c21f/HikariCP-4.0.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.6/1e6cd0e5d9f9919c8c8824fb4d310b09a978a60e/jaxb-runtime-2.3.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.hibernate.common/hibernate-commons-annotations/5.1.2.Final/e59ffdbc6ad09eeb33507b39ffcf287679a498c8/hibernate-commons-annotations-5.1.2.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.jboss.logging/jboss-logging/3.4.3.Final/c4bd7e12a745c0e7f6cf98c45cdcdf482fd827ea/jboss-logging-3.4.3.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.11.22/8b4c7fa5562a09da1c2a9ab0873cb51f5034d83f/byte-buddy-1.11.22.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/antlr/antlr/2.7.7/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.jboss/jandex/2.4.2.Final/1e1c385990b258ff1a24c801e84aebbacf70eb39/jandex-2.4.2.Final.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml/classmate/1.5.1/3fe0bed568c62df5e89f4f174c101eab25345b6c/classmate-1.5.1.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.3.18/34f6683d9dbe6edb02ad9393df3d3211b5484622/spring-context-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/5.3.18/ec32d5f4c718cc63e7c44adf5c4e7c49cdffa147/spring-orm-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.data/spring-data-commons/2.6.3/767ebf330da425ac4ab4b14391a60d9ed3ba18b7/spring-data-commons-2.6.3.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/5.3.18/a93f91200e40b22ac0fda1308ecac081b820b099/spring-tx-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.3.18/3f0ea6598a5a1eae0a672f025a33a0b7e0d6dfd3/spring-beans-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.13.2/cddd9380efd4b81ea01e98be8fbdc9765a81793b/jackson-datatype-jsr310-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.module/jackson-module-parameter-names/2.13.2/c406ec37f89125d1003093d5b96d216dc967153c/jackson-module-parameter-names-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.13.2/95f59cf63c3aadc1549578254af839a9c42ae84f/jackson-datatype-jdk8-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.13.2.2/ffeb635597d093509f33e1e94274d14be610f933/jackson-databind-2.13.2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/2.6.6/e5b575d304ec5c6746fef3cc594bbe89721d64c2/spring-boot-autoconfigure-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.6.6/286137a0c57d159f845faa1c2e8d0b7548391085/spring-boot-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/2.6.6/e37b388e2407a1b03f920a7fd0722e41745c92c6/spring-boot-starter-logging-2.6.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/1.3.5/59eb84ee0d616332ff44aba065f3888cf002cd2d/jakarta.annotation-api-1.3.5.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.29/6d0cdafb2010f1297e574656551d7145240f6e25/snakeyaml-1.29.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-websocket/9.0.60/a88262a55ae2c4b5404149a48122523688be341a/tomcat-embed-websocket-9.0.60.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-core/9.0.60/e14045220243804544ddb168cb532f4640a220c/tomcat-embed-core-9.0.60.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-el/9.0.60/46dad1a278f348ca73466e0b73132bf4c4892c06/tomcat-embed-el-9.0.60.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/5.3.18/61c51831e49a85fc5bf925253ca63f46fec6f013/spring-expression-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.minidev/json-smart/2.4.8/7c62f5f72ab05eb54d40e2abf0360a2fe9ea477f/json-smart-2.4.8.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/jakarta.activation/jakarta.activation-api/1.2.2/99f53adba383cb1bf7c3862844488574b559621f/jakarta.activation-api-1.2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.8.2/ddeafe92fc263f895bfb73ffeca7fd56e23c2cce/junit-jupiter-params-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.11.22/2fbcf3210dfc09b42242e3b66a5281cc5b9adb80/byte-buddy-agent-1.11.22.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.vaadin.external.google/android-json/0.0.20131108.vaadin1/fa26d351fe62a6a17f5cda1287c1c6110dec413f/android-json-0.0.20131108.vaadin1.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.3.18/7e5d8cd447981bc20d4c397a2ba0a1c65ff2267a/spring-jcl-5.3.18.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/txw2/2.3.6/45db7b69a8f1ec2c21eb7d4fc0ee729f53c1addc/txw2-2.3.6.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.sun.istack/istack-commons-runtime/3.0.12/cbbe1a62b0cc6c85972e99d52aaee350153dc530/istack-commons-runtime-3.0.12.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.13.2/ec18851f1976d5b810ae1a5fcc32520d2d38f77a/jackson-annotations-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.13.2/a6a0e0620d51833feffc67bccb51937b2345763/jackson-core-2.13.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.11/4741689214e9d1e8408b206506cbe76d1c6a7d60/logback-classic-1.2.11.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-to-slf4j/2.17.2/17dd0fae2747d9a28c67bc9534108823d2376b46/log4j-to-slf4j-2.17.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/1.7.36/ed46d81cef9c412a88caef405b58f93a678ff2ca/jul-to-slf4j-1.7.36.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/net.minidev/accessors-smart/2.4.8/6e1bee5a530caba91893604d6ab41d0edcecca9a/accessors-smart-2.4.8.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apiguardian/apiguardian-api/1.1.2/a231e0d844d2721b0fa1b238006d15c6ded6842a/apiguardian-api-1.1.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.2.11/a01230df5ca5c34540cdaa3ad5efb012f1f1f792/logback-core-1.2.11.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.2/f42d6afa111b4dec5d2aea0fe2197240749a4ea6/log4j-api-2.17.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.1/a99500cf6eea30535eeac6be73899d048f8d12a8/asm-9.1.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.h2database/h2/1.4.200/f7533fe7cb8e99c87a43d325a77b4b678ad9031a/h2-1.4.200.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.8.2/c598b4328d2f397194d11df3b1648d68d7d990e3/junit-jupiter-engine-5.8.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/3.2/7fadf57620c8b8abdf7519533e5527367cb51f09/objenesis-3.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/com.sun.activation/jakarta.activation/1.2.2/74548703f9851017ce2f556066659438019e7eb5/jakarta.activation-1.2.2.jar:/Users/milaju/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-engine/1.8.2/b737de09f19864bd136805c84df7999a142fec29/junit-platform-engine-1.8.2.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 study.datajpa.repository.MemberJpaRepositoryTest,bulkUpdate 21:04:41.706 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 21:04:41.716 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)] 21:04:41.785 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [study.datajpa.repository.MemberJpaRepositoryTest] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper] 21:04:41.799 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [study.datajpa.repository.MemberJpaRepositoryTest], using SpringBootContextLoader 21:04:41.804 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [study.datajpa.repository.MemberJpaRepositoryTest]: class path resource [study/datajpa/repository/MemberJpaRepositoryTest-context.xml] does not exist 21:04:41.804 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [study.datajpa.repository.MemberJpaRepositoryTest]: class path resource [study/datajpa/repository/MemberJpaRepositoryTestContext.groovy] does not exist 21:04:41.804 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [study.datajpa.repository.MemberJpaRepositoryTest]: no resource found for suffixes {-context.xml, Context.groovy}. 21:04:41.805 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [study.datajpa.repository.MemberJpaRepositoryTest]: MemberJpaRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 21:04:41.875 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [study.datajpa.repository.MemberJpaRepositoryTest] 21:04:41.973 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [/Users/milaju/Desktop/SpringDataJPA/data-jpa/out/production/classes/study/datajpa/DataJpaApplication.class] 21:04:41.975 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration study.datajpa.DataJpaApplication for test class study.datajpa.repository.MemberJpaRepositoryTest 21:04:42.145 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [study.datajpa.repository.MemberJpaRepositoryTest]: using defaults. 21:04:42.145 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener] 21:04:42.161 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@655ef322, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@7e276594, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@3401a114, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@5066d65f, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@4233e892, org.springframework.test.context.support.DirtiesContextTestExecutionListener@77d2e85, org.springframework.test.context.transaction.TransactionalTestExecutionListener@3ecd267f, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@58ffcbd7, org.springframework.test.context.event.EventPublishingTestExecutionListener@555cf22, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@6bb2d00b, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@3c9bfddc, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@1a9c38eb, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@319bc845, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@4c5474f5, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@2f4205be] 21:04:42.164 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@4b9df8a testClass = MemberJpaRepositoryTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@5e8ac0e1 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class study.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7d61eb55, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@163370c2, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@13d9cbf5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@c667f46, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3b5fad2d, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4e41089d], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true]], class annotated with @DirtiesContext [false] with mode [null]. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.6.6) 2022-04-17 21:04:42.963 INFO 39593 --- [ main] s.d.repository.MemberJpaRepositoryTest : Starting MemberJpaRepositoryTest using Java 11.0.14.1 on MacBook-Pro.local with PID 39593 (started by milaju in /Users/milaju/Desktop/SpringDataJPA/data-jpa) 2022-04-17 21:04:42.965 INFO 39593 --- [ main] s.d.repository.MemberJpaRepositoryTest : No active profile set, falling back to 1 default profile: "default" 2022-04-17 21:04:44.194 INFO 39593 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2022-04-17 21:04:44.262 INFO 39593 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 58 ms. Found 2 JPA repository interfaces. 2022-04-17 21:04:45.656 INFO 39593 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2022-04-17 21:04:45.707 INFO 39593 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.7.Final 2022-04-17 21:04:45.864 INFO 39593 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2022-04-17 21:04:45.973 INFO 39593 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2022-04-17 21:04:46.059 INFO 39593 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2022-04-17 21:04:46.091 INFO 39593 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2022-04-17 21:04:46.746 DEBUG 39593 --- [ main] org.hibernate.SQL : drop table if exists member CASCADE 2022-04-17 21:04:46.751 INFO 39593 --- [ main] p6spy : #1650197086751 | took 1ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/datajpa drop table if exists member CASCADE drop table if exists member CASCADE ; 2022-04-17 21:04:46.751 DEBUG 39593 --- [ main] org.hibernate.SQL : drop table if exists team CASCADE 2022-04-17 21:04:46.751 INFO 39593 --- [ main] p6spy : #1650197086751 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/datajpa drop table if exists team CASCADE drop table if exists team CASCADE ; 2022-04-17 21:04:46.752 DEBUG 39593 --- [ main] org.hibernate.SQL : drop sequence if exists hibernate_sequence 2022-04-17 21:04:46.752 INFO 39593 --- [ main] p6spy : #1650197086752 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/datajpa drop sequence if exists hibernate_sequence drop sequence if exists hibernate_sequence; 2022-04-17 21:04:46.754 DEBUG 39593 --- [ main] org.hibernate.SQL : create sequence hibernate_sequence start with 1 increment by 1 2022-04-17 21:04:46.755 INFO 39593 --- [ main] p6spy : #1650197086755 | took 0ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa create sequence hibernate_sequence start with 1 increment by 1 create sequence hibernate_sequence start with 1 increment by 1; 2022-04-17 21:04:46.756 DEBUG 39593 --- [ main] org.hibernate.SQL : create table member ( member_id bigint not null, age integer not null, username varchar(255), tema_id bigint, primary key (member_id) ) 2022-04-17 21:04:46.757 INFO 39593 --- [ main] p6spy : #1650197086757 | took 1ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa create table member ( member_id bigint not null, age integer not null, username varchar(255), tema_id bigint, primary key (member_id) ) create table member ( member_id bigint not null, age integer not null, username varchar(255), tema_id bigint, primary key (member_id) ); 2022-04-17 21:04:46.760 DEBUG 39593 --- [ main] org.hibernate.SQL : create table team ( team_id bigint not null, name varchar(255), primary key (team_id) ) 2022-04-17 21:04:46.761 INFO 39593 --- [ main] p6spy : #1650197086761 | took 0ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa create table team ( team_id bigint not null, name varchar(255), primary key (team_id) ) create table team ( team_id bigint not null, name varchar(255), primary key (team_id) ); 2022-04-17 21:04:46.761 DEBUG 39593 --- [ main] org.hibernate.SQL : alter table member add constraint FK8g17q6hc0aeo27fqj0vlxsa38 foreign key (tema_id) references team 2022-04-17 21:04:46.764 INFO 39593 --- [ main] p6spy : #1650197086764 | took 2ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/datajpa alter table member add constraint FK8g17q6hc0aeo27fqj0vlxsa38 foreign key (tema_id) references team alter table member add constraint FK8g17q6hc0aeo27fqj0vlxsa38 foreign key (tema_id) references team; 2022-04-17 21:04:46.767 INFO 39593 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2022-04-17 21:04:46.910 INFO 39593 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2022-04-17 21:04:47.555 WARN 39593 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2022-04-17 21:04:48.952 INFO 39593 --- [ main] s.d.repository.MemberJpaRepositoryTest : Started MemberJpaRepositoryTest in 6.73 seconds (JVM running for 8.42) 2022-04-17 21:04:49.001 INFO 39593 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@4b9df8a testClass = MemberJpaRepositoryTest, testInstance = study.datajpa.repository.MemberJpaRepositoryTest@42db3ff, testMethod = bulkUpdate@MemberJpaRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@5e8ac0e1 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class study.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7d61eb55, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@163370c2, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@13d9cbf5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@c667f46, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3b5fad2d, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4e41089d], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@2f4fc18]; rollback [false] 2022-04-17 21:04:49.176 DEBUG 39593 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 21:04:49.185 INFO 39593 --- [ main] p6spy : #1650197089185 | took 4ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 21:04:49.222 DEBUG 39593 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 21:04:49.223 INFO 39593 --- [ main] p6spy : #1650197089223 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 21:04:49.223 DEBUG 39593 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 21:04:49.224 INFO 39593 --- [ main] p6spy : #1650197089224 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 21:04:49.224 DEBUG 39593 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 21:04:49.225 INFO 39593 --- [ main] p6spy : #1650197089225 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 21:04:49.225 DEBUG 39593 --- [ main] org.hibernate.SQL : call next value for hibernate_sequence 2022-04-17 21:04:49.226 INFO 39593 --- [ main] p6spy : #1650197089226 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa call next value for hibernate_sequence call next value for hibernate_sequence; 2022-04-17 21:04:49.239 DEBUG 39593 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 21:04:49.243 INFO 39593 --- [ main] p6spy : #1650197089243 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (10, NULL, 'member1', 1); 2022-04-17 21:04:49.244 DEBUG 39593 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 21:04:49.245 INFO 39593 --- [ main] p6spy : #1650197089245 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (19, NULL, 'member1', 2); 2022-04-17 21:04:49.245 DEBUG 39593 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 21:04:49.246 INFO 39593 --- [ main] p6spy : #1650197089246 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (20, NULL, 'member1', 3); 2022-04-17 21:04:49.246 DEBUG 39593 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 21:04:49.247 INFO 39593 --- [ main] p6spy : #1650197089247 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (21, NULL, 'member1', 4); 2022-04-17 21:04:49.247 DEBUG 39593 --- [ main] org.hibernate.SQL : insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) 2022-04-17 21:04:49.247 INFO 39593 --- [ main] p6spy : #1650197089247 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa insert into member (age, tema_id, username, member_id) values (?, ?, ?, ?) insert into member (age, tema_id, username, member_id) values (40, NULL, 'member1', 5); 2022-04-17 21:04:49.251 DEBUG 39593 --- [ main] org.hibernate.SQL : update member set age=age+1 where age>=? 2022-04-17 21:04:49.252 INFO 39593 --- [ main] p6spy : #1650197089252 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/datajpa update member set age=age+1 where age>=? update member set age=age+1 where age>=20; 2022-04-17 21:04:49.312 INFO 39593 --- [ main] p6spy : #1650197089312 | took 0ms | commit | connection 3| url jdbc:h2:tcp://localhost/~/datajpa ; 2022-04-17 21:04:49.313 INFO 39593 --- [ main] o.s.t.c.transaction.TransactionContext : Committed transaction for test: [DefaultTestContext@4b9df8a testClass = MemberJpaRepositoryTest, testInstance = study.datajpa.repository.MemberJpaRepositoryTest@42db3ff, testMethod = bulkUpdate@MemberJpaRepositoryTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@5e8ac0e1 testClass = MemberJpaRepositoryTest, locations = '{}', classes = '{class study.datajpa.DataJpaApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7d61eb55, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@163370c2, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@13d9cbf5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@c667f46, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@3b5fad2d, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4e41089d], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]] 2022-04-17 21:04:49.330 INFO 39593 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2022-04-17 21:04:49.335 INFO 39593 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2022-04-17 21:04:49.351 INFO 39593 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code 0
- 미해결실전! 스프링 데이터 JPA
MemberRepositoryTest를 돌리는 과정에서 아래와 같이 에러가 나타납니다.
6:40초 부분 빌드를 하는 과정에서 아래와 같은 에러를 만났습니다. Error creating bean with name 'memberRepository' defined in study.datajpa.repository.MemberRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! Reason: Failed to create query for method public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! No property 'userName' found for type 'Member'! Did you mean ''username''?; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! No property 'userName' found for type 'Member'! Did you mean ''username''? Error creating bean with name 'memberRepository' defined in study.datajpa.repository.MemberRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! Reason: Failed to create query for method public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! No property 'userName' found for type 'Member'! Did you mean ''username''?; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! No property 'userName' found for type 'Member'! Did you mean ''username''? 2022-04-16 00:51:55.562 ERROR 20525 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener@7e276594] to prepare test instance [study.datajpa.repository.MemberRepositoryTest@2148b47e] Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-04-16 00:51:55.558 ERROR 20525 --- [ main] o.s.boot.SpringApplication : Application run failed Error creating bean with name 'memberRepository' defined in study.datajpa.repository.MemberRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! Reason: Failed to create query for method public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! No property 'userName' found for type 'Member'! Did you mean ''username''?; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List study.datajpa.repository.MemberRepository.findByUserNameAndAgeGreaterThen(java.lang.String,int)! No property 'userName' found for type 'Member'! Did you mean ''username''? MemberRepositoryTest 입니다. package study.datajpa.repository;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.transaction.annotation.Transactional;import study.datajpa.entity.Member;import java.util.List;import static org.assertj.core.api.Assertions.*;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest@Transactional@Rollback(false)class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test public void testMember() { System.out.println("memberRepository = " + memberRepository.getClass()); Member member = new Member("memberA"); Member savedMember = memberRepository.save(member); Member findMember = memberRepository.findById(savedMember.getId()).get(); assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); assertThat(findMember).isEqualTo(member); } @Test public void basicCRUD() { Member member1 = new Member("member1"); Member member2 = new Member("member2"); memberRepository.save(member1); memberRepository.save(member2); // 단건 조회 검증 Member findMember1 = memberRepository.findById(member1.getId()).get(); Member findMember2 = memberRepository.findById(member2.getId()).get(); assertThat(findMember1).isEqualTo(member1); assertThat(findMember2).isEqualTo(member2); findMember1.setUsername("member!!!!!!!"); // 리스트 조회 검증 List<Member> all = memberRepository.findAll(); assertThat(all.size()).isEqualTo(2); // 카운트 검증 long count = memberRepository.count(); assertThat(count).isEqualTo(2); // 삭제 검증 memberRepository.delete(member1); memberRepository.delete(member2); long deleteCount = memberRepository.count(); assertThat(deleteCount).isEqualTo(0); } @Test public void findByUserNameAndAgeGreaterThen() { Member m1 = new Member("AAA", 10); Member m2 = new Member("AAA", 20); memberRepository.save(m1); memberRepository.save(m2); List<Member> result = memberRepository.findByUserNameAndAgeGreaterThen("AAA", 15); assertThat(result.get(0).getUsername()).isEqualTo("AAA"); assertThat(result.get(0).getAge()).isEqualTo(20); assertThat(result.size()).isEqualTo(1); } @Test public void findHelloBy() { List<Member> helloBy = memberRepository.findTop3HelloBy(); }} MemberRepository Interface입니다. package study.datajpa.repository;import org.springframework.data.jpa.repository.JpaRepository;import study.datajpa.entity.Member;import java.util.List;public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByUserNameAndAgeGreaterThen(String username, int age); List<Member> findTop3HelloBy();} 아래 글을 참고하여서 error 로그를 구글링했지만 해결을 하지 못하였습니다.. https://heestory217.tistory.com/131 https://solbel.tistory.com/1447 다른 부분에서 추가해야할 작업이 있나요??..
- 미해결실전! 스프링 데이터 JPA
Transaction commit 시 flush 자동호출, 그리고 DB commit 과 Transaction commit의 차이에 대해
안녕하세요 영한님. 질문하는 와중에도 용어자체에 혼동이 있어 매끄럽지 못한 점 미리 죄송합니다. Q1. DB commit과 Transaction commit 에는 어떤 차이가 있나요? Q2. A 사용자 a-1 쓰레드에서 정보 추가 em.flush() 를 하게되면 B사용자의 b-1 쓰레드에서 정보 조회가 가능해지는건가요? -> flush 가 수행되면 "쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다." 라고 알고 있는데 이 말이 DB 에 실제 commit 이 되어 쿼리가 반영이 되는건지 궁금합니다. Q3. 트랜잭션이 커밋되는 시점에 flush()를 호출하여 쓰기지연 SQL 저장소 -> DB 에 SQL 전송 이라고 이해했는데 맞나요? 감사합니다.
- 미해결실전! 스프링 데이터 JPA
PDF 변경해야 될 부분
PDF 25p부분에 공통 인터페이스 계층구조를 그려놓으신 부분에서 CrudRepository 변경할 부분 findOne(ID) -> findById(ID) 로 수정된 것을 보고 혹시 다른것도 바뀌었을 것같아서 살펴봤습니다. exists(ID) -> existsById(ID) 로 변경되었는 것을 볼 수 있습니다. 이 부분도 PDF에 추가해주시면 다른 분들도 헷갈리지 않으실 것 같습니다!!!
- 미해결실전! 스프링 데이터 JPA
LazyLoading 시 가져오는 객체에 대해 질문이있습니다!
[질문 내용]안녕하세요 영한님 JPA 를 공부하다가 LazyLoading 관련해서 의문점이 생겨 질문남깁니다. 연관관계에서의 LazyLoading 은 실제 entity를 가져오는것이 아닌 프록시객체의 target이 entity와 연결되어있는것으로 알고있습니다. 그래서 Team(1) <-> Member(n) 의 관계라고 가정했을때 Member 에서의 @ManyToOne 관계에서의 LazyLoading 으로 객체를 가져오게 되면 Team은 `Team$HibernateProxy$95RMKfgq@13875` 이런 형식으로 프록시 객체를 갖고있는것을 확인했습니다. 다만 Team에서 @OneToMany 관계의 Member를 LazyLoading 호출하게되면 List<Member> 의 형식이 PersistentBag 의 객체형식을 가지고있는것까지는 이해했는데 컬렉션 내의 객체는 제가 생각했던 `Member$HibernateProxy$95RMKfgq@13875` 와 같은 프록시 객체의 형태가 아닌 `Member@13867` 과 같은 실제 객체를 가지고 있는것으로 확인했습니다. 이와 관련해서 PersistenceCollection 이나 StatefulPersistenceContext 클래스의 관련된 문서를 찾아봤지만 답을 찾지못해 여쭤봅니다ㅠㅜ 추가로 entityManagerFactory getPersistenceUnitUtil().isLoaded 메소드를 이용해서 List 객체를 조회했을땐 false 로 확인했습니다. 다만 디버그모드로 봤을때는 ManyToOne 과 다르게 실제객체형태로 보이네요ㅠㅜ 디버그모드로 확인시 값을조회해야해서 의도치않게 추가쿼리가 발생되는것은 인지하고있지만 이 케이스는 이해가 되질 않네요 ㅎㅎ
- 미해결실전! 스프링 데이터 JPA
@Transcational을 서비스계층에 하는 이유는 무엇인가요?
레포지토리 계층에 @Transactional가 이미 되어 있는데 Service단에 @Transactional을 붙이는 이유가 무엇인가요?
- 미해결실전! 스프링 데이터 JPA
낙관적인 락
안녕하세요 영한님! 간단하게 비관적인 락과 낙관적인 락 예시에 대해 궁금한게 있습니다. 비관적인 락 같은 경우에는 동시에 많은 요청이 들어와서 모두 카운트해서 올려야하는 조회수 같은 곳에 사용한다고 구글링을 해보니 나오는데 낙관적인 락을 사용하는 예시는 찾을 수 없어서 혹시 실무에서 낙관적인 락을 사용하는 사례는 어떤게 있을 까요?
- 미해결실전! 스프링 데이터 JPA
MemberRepositoryTest 질문
MemberRepositoryTest에서 실행을 하면 create 쿼리는 뜨는데 insert 쿼리는 안뜹니다. h2데이터 베이스에 들어가서 확인해 봤는데 "memberA" 가 안들어가네요 설정 문제인가요??ㅜ
- 미해결실전! 스프링 데이터 JPA
업데이트 질문입니다.
안녕하세요 마지막부분에 basicCRUD 테스트 함수에서요 member1을 save하고 findById로 findMember1을 가져온 뒤 findMember1.setUsername("member!!!") 로 업데이트하고 있는데요 변경감지 기능을 사용할 때, 트랜잭션 안에서 엔티티를 조회하고, 변경할 값을 set 해주면 트랜잭션 커밋 시점에 변경 감지가 동작해서 update 쿼리가 나간다고 배웠습니다. 그래서 예상하기로 update member set username='member!!!!!' where member_id = 1; 이렇게 쿼리가 나갈거라고 생각했는데 update member set age=0, team_id = NULL, username='member!!!!!' where member_id = 1; 이렇게 쿼리가 나가는 걸로 보여서요. 해당하는 컬럼만 업데이트 되는게 아니라 전체 칼럼이 업데이트 되는건가요? 전체 칼럼 업데이트 merge, 해당 칼럼 업데이트는 변경감지. 이렇게 배운거 같아서요
- 미해결실전! 스프링 데이터 JPA
spring jpa 실습시 질문이 있습니다.
h2 를 사용해서 jpa 테스트코드를 돌려보고있는데... 테이블 생성 후 데이터 insert 하고, 로그까지 찍었을때는 정상적으로 테스트코드가 잘 동작햇습니다. 그런데 실제로 h2 db에 접속해서봤더니.. 해당 테이블이 다 사라지고 없는데... 어떤 설정을 해야하나요? spring: datasource: # url: jdbc:h2:tcp://localhost/~/imageTest username: image password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: truelogging.level: org.hibernate.SQL: debug
- 미해결실전! 스프링 데이터 JPA
안녕하세요 개인 프로젝트중 궁금한게 생겨서 질문드립니다.
안녕하세요 선생님 스프링부트를 이용한 프로젝트를 진행중에 궁금한 것이 생겨서 꼭 알고 싶은 마음에 질문하게 되었습니다. 프로젝트 구성은 이렇습니다. Entity는 User, Board, Comment를 만들었고, Spring Data Jpa를 활용하여 각각의 repository인 UserRepository, BoardRepository, CommentRepository도 만들었고, service부분인 CommentServiceImpl을 구성하는 중에 문제가 발생하였습니다. @Service public class CommentServiceImpl implements CommentService{ ... @Override public Long create(User user, Long board_id, String content) { Board board = boardRepository.findById(board_id).get(); //user.getClass() = class com.graduation.parrot.domain.User //proxy가 아님을 확인 System.out.println("user.getClass() = " + user.getClass()); //user.getBoards() = [Board(id=2, title=title1, content=at), ... //정상실행 System.out.println("user.getBoards() = " + user.getBoards()); //LazyInitializationException 발생 System.out.println("user.getComments() = " + user.getComments()); return commentRepository.save(new Comment(content, user, board)).getId(); } 에러메시지 : org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.graduation.parrot.domain.User.comments, could not initialize proxy - no Session 원래는 System.out.print...이 부분이 없었지만 이해를 돕기위하여 추가하였습니다. (return 부분의 new Comment를 생성할때 생성자에서 user.getComments()가 실행됩니다.) 테이블의 연관관계 매핑은 [user : board - 1대다], [user : comment - 1대다], [board : comment - 1대다] 이렇게 구성하였습니다. 제가 생각할때 user.getBoards()와 user.getComments()가 구조상 차이가 없어보이는데 스프링은 그렇게 생각하지 않는지 user.getComments()를 실행할 때만 에러를 발생시킵니다.. 문제상황 자체를 해결하는 방법은 찾았으나(user를 바로 사용하지 않고 userRepository.findById() 이용) 왜 user.getComments()만 문제가 발생하는지 꼭 알고 싶습니다. +@Transactional를 달아도 에러가 발생합니다 아래는 Entity들의 자바코드입니다. User @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "name", "login_id", "password"}) public class User extends BaseTimeEntity{ @Id @GeneratedValue @Column(name = "user_id") private Long id; @Column(nullable = false, length = 100, unique = true) private String login_id; @JsonIgnore @Column(nullable = false, length = 100) private String password; @Column(length = 15, unique = true) private String name; @Column(length = 100) private String email; @Enumerated(EnumType.STRING) private Role role = Role.ROLE_USER; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<Board> boards = new ArrayList<>(); @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<Comment> comments = new ArrayList<>(); @Builder public User(String login_id, String password, String name, String email) { this.login_id = login_id; this.password = password; this.name = name; this.email = email; } } Board @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @ToString(of = {"id", "title", "content"}) public class Board extends BaseTimeEntity{ @Id @GeneratedValue @Column(name = "board_id") private Long id; @Column(nullable = false, length = 30) private String title; @Column(length = 1000) private String content; private String author; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", updatable = false) private User user; @OneToMany(mappedBy = "board", cascade = CascadeType.ALL) private List<Comment> comments = new ArrayList<>(); @Builder public Board(String title, String content, User user) { this.title = title; this.content = content; this.author = user.getName(); setUser(user); } public void setUser(User user) { this.user = user; user.getBoards().add(this); } Comment @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @ToString(of = {"id", "content"}) public class Comment extends BaseTimeEntity{ @Id @GeneratedValue @Column(name = "comment_id") private Long id; @Column(nullable = false) private String content; private String author; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") private Board board; @Builder public Comment(String content, User user, Board board) { this.content = content; this.author = user.getName(); setUser(user); setBoard(board); this.board = board; } public void setUser(User user) { this.user = user; user.getComments().add(this); //System.out.print를 지우고 정상실행시 이 부분에서 지연로딩 에러가 발생합니다. } private void setBoard(Board board) { this.board = board; board.getComments().add(this); } }
- 해결됨실전! 스프링 데이터 JPA
Optional 적용 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 회원 이메일을 사용하여 MemberRepository에서 회원 정보를 조회하는 메서드를 구현해 보았습니다. 해당 이메일의 회원이 DB에 존재하지 않을경우를 고려하여 다음과 같이 Optional로 감싸주었습니다. Transactional(readOnly = true) public interface MemberRepository extends JpaRepository<Member, Long> { Optional<Member> findByEmail(String email); ... } 이 경우 Service 단에서 해당 메서드를 사용할 경우 변수 타입을 Optional<Member>로 선언해 줘야 했습니다. @Transactional public void followFriend(FollowFriendRequest request) { Member requester = getMember(request.getRequesterEmail()); Optional<Member> receiver = memberRepository.findByEmail(request.getReceiverEmail()); log.info("requester: '{}', receiver: '{}'", requester, receiver); if (receiver == null) { throw new MemberEmailNotFound(); } if (requester.hasFriend(receiver) || relationRepository.existsByOwnerEmailAndFriendEmail(request.getRequesterEmail(), request.getReceiverEmail())) { throw new EmailDuplicatedException(request.getReceiverEmail()); } relationRepository.save(new Relation(requester, receiver)); } 이러면 위 코드 마지막 줄의 Relation 생성자 또한 Optional을 포함한 생성자를 추가로 만들어 줘야 하고 이렇게 되면 Relation 엔티티의 receiver 필드값에도 Optional을 씌워줘야 하는 문제가 발생했습니다. 이 경우 Optional을 어떻게 사용하는게 옳은건지 궁금합니다.
- 미해결실전! 스프링 데이터 JPA
데이터베이스 연결
제가 Data Jpa를 테스트 해보려고 하는데 Table "ARTICLE" not found 에러가 발생합니다 분명히 ddl-auto에 의해서 Article 테이블이 자동 생성되는데 왜 SQL 문법 에러가 나는가 싶어서 workbench에서 select문을 던져봤는데 실제로 Article 테이블이 존재하지 않는다고 합니다. 좀 더 찾아본 결과 workbench에서 구체적인 database가 선택되지 않아 발생한 문제 인 것 같습니다 workbench에서 select * from article; 은 에러가 나지만 select * from mydb.article; 이나 use mydb 이후 select * from article;은 문제 없이 작동합니다 이 경우 data jpa에서 나가는 쿼리문이 문제인 것 같은데 insert into (테이블 이름) 에서 테이블 이름 앞에 prefix를 넣는 방법이 따로 있을까요?
- 해결됨실전! 스프링 데이터 JPA
질문있습니다.
Auditing에서 @PreUpdate를 사용하면 자동으로 수정된 시간이 저장되는데요. 복습하다 궁금한점이 생겼습니다. 만약 회원의 마지막 접속 날짜를 얻어올려면 제가 생각하기에는 엔티티에 lastLogin 같은 LocalDateTime 타입의 필드를 추가해야 할것같은데요. 즉, 로그인할때마다 lastLogin에 LocalDateTime.now()을 이용하여 해당 테이블에 업데이트시키면 될것같은데 생각해보니 lastLogin을 업데이트 시키면 @PreUpdate의 필드도 업데이트 쿼리가 수행되면 현재 시간이 저장됩니다. 그럼 뭔가 마지막 접속 날짜를 얻기위해 새로운 필드(lastLogin)을 추가하지않고 @PreUpdate를 이용하여 마지막 로그인 시간을 가져올 방법이 있지 않을까해서 질문드립니다. 만약 @PreUpdate를 이용하여 마지막 로그인 시간을 가져오는 방법이 없다면 제가 위에서 예시로 든것처럼 마지막 로그인 시간을 저장할 필드를 추가해야하나요?