묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpql 페치조인
안녕하세요 영한님 감사합니다 첫번째 : new 명령어를 사용해서 JPQL의 결과를 DTO로 즉시 반환하면 SELECT 절에서 원하는 데이터를 직접 선택하므로 네트워크 용량을 최적화 할수 있다고 해주셨는데 뒤로 돌아가서 JPQL 페치조인도 마찬가지로 원하는 데이터를 직접 선택해 보고싶어서 이런식으로는 못하나요 ? 테스틀 해봤는데 에러가 나서 질문드립니다. ======================================== 두번쨰 : 18:40 설명은 xToOne 관계에선 페치조인이 필요 없다고 이해 하면 되는거죠 ???
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
설정 정보가 다른 CircuitBreaker 사용하는 방법
안녕하세요. 강의 잘 듣고 있습니다. 예제에서 Resilience4jConfig를 통해 CircuitBreaker에 대한 설정을 하여 사용하는 것으로 확인을 했습니다. MSA를 연동하는 서비스에 따라 CircuitBreaker에 대한 설정 값을 다르게하여 복수개를 사용하는 경우도 있을 것 같은데, 이럴 경우 Resilience4JConfig에 대한 Bean 등록과 Config 를 어떻게 잡으면 될까요? 감사합니다.
-
미해결실전! Querydsl
concat() stringValue 나이를 완전히 가져오지 못합니다.ㅠㅠ
안녕하세요 질문이 있습니다 concat을 사용해서 stringValue를 활용할 때 나이를 다 가져오지 못하고 맨 앞에 있는 숫자만 가져오는데 왜 그럴까요ㅠㅠㅠㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
상속 매핑에 대한 질문
안녕하세요 영한님 서포터즈님들 상속 매핑에 대해 예제를 작성하는 중에 궁금한 점이 생겨 질문드립니다. 제가 게시판을 생성해서 게임 게시판. 일정 게시판 등 종류 별로 만들 때, 어떤 전략을 사용하는게 효율적인가 생각해보았습니다. 현재 자식 게시판들은 모두 같은 필드를 가지고 있습니다. 즉, 부모 게시판에 있는 필드만을 사용합니다. 1. SINGLE TABLE 전략 해당 전략을 사용하게 된다면 부모 테이블에 자식 테이블의 필드들이 한 테이블에 있게 됩니다. 특정 게시판을 조회하기 위해서는 모든 게시판 객체를 가져올텐데, 시스템의 규모가 크지 않고, join할 필요가 없기 때문에 현재는 해당 방법이 효율적이라 생각합니다. 2. JOIN TABLE 전략 추후에 게시판들이 늘어나게 되고, 다른 게시판 종류의 추가로 필드를 추가할 필요가 있다고 가정해봤습니다.(확장성 고려) 그렇다면 1번 전략을 사용할 때, 특정 게시판을 조회하기 위해서는 모든 게시판을 다 탐색해야하는데,조인 전략을 사용하게 되면 특정 게시판을 조회할 때 그 특정 게시판 테이블만 조회하면 된다고 생각합니다. 따라서 게시판들이 늘어나게 되면 해당 방법이 효율적이라 생각합니다.결론 그래서 제가 예제를 만들 때 사용한 전략에 대해 저 자신을 위와 같은 이유로 납득시켰는데 이게 맞는지 궁금합니다 그렇다면 결국 대부분의 실무에서는 JOIN 전략을 사용할 수 밖에 없나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderItems까지 같이 조회되는 이유가 궁금합니다!
안녕하세요 항상 좋은 답변 남겨주셔서 감사합니다 OrderItems까지 같이 조회되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping("/api/v1/simple-orders")public List<Order> ordersV1() { List<Order> orders = orderService.findOrders(new OrderSearch()); orders.forEach(order -> { order.getMember().getName(); order.getDelivery().getStatus(); }); return orders;} V1 컨트롤러는 다음과 같습니다. @Entity@Getter@Setter@NoArgsConstructor@AllArgsConstructor@Table(name = "orders")public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.ALL) // order가 만들어지면 orderItem이 만들어지기 때문에 영속성 전이한다. private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; ORDER는 다음과 같습니다. @Entity@Getter@Setterpublic class OrderItem { @Id @GeneratedValue @Column(name = "orderitem_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; private int orderPrice; private int count; ORDER_ITEM은 다음과 같습니다. 여기서 V1 컨트롤러를 통해서 쿼리를 날리면, 뒤늦게 Lazy Loading을 통해서 Order_Item들이 프록시 초기화가 되는 것처럼 나갑니다. 그런데 실제로는 프록시가 초기화도 되어있지 않습니다. 정리하면 이렇습니다 1. Order_Items는 Lazy Loading 설정이 되어있고, 프록시 객체를 강제 초기화 하는 과정도 없습니다. 그런데 왜 select 쿼리가 나가게 되는 것인지 알려주실 수 있으실까요? 2. orderItem에 대한 select 쿼리가 나갔음에도 불구하고 실제 응답에 있는 값은 null입니다. 이 경우는 어떻게 이해를 해야할까요? 항상 좋은 답변 주셔서 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional이 생략되는 이유가 궁금합니다
안녕하세요. 항상 좋은 답변 해주셔서 감사합니다. 이번에는 @Transactional이 생략되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping("/api/v4/simple-orders")public List<SimplerOrderQueryDto> ordersV4() { return orderSimpleQueryRepository.findOrderDtos(); } @Repository@RequiredArgsConstructorpublic class OrderSimpleQueryRepository { private final EntityManager em; public List<SimplerOrderQueryDto> findOrderDtos() { return em.createQuery( "select new jpabook.jpashop.repository.order.simplequery.SimplerOrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) from Order o" + " join o.member m" + " join o.delivery d", SimplerOrderQueryDto.class ).getResultList(); }} V4 컨트롤러를 개발할 때 궁금한 내용입니다. em.createQuery를 만들어서 dto를 바로 조회해오는 내용입니다. 제가 궁금한 부분은 @Transactional이 없어도 정상동작하는 부분입니다. 위 코드 상에는 어디에도 tx.begin() / tx.commit()이 되어있는 부분이 없는 것으로 보입니다. 따라서 트랜잭션 상태가 아니기 때문에 JPA가 DB 커넥션을 얻지 못한 상황으로 보이는데, DB에서 값을 읽어오고 있습니다. 혹시 어떤 조화로 이렇게... 트랜잭션 없이 값을 불러오는것인지.. 그리고 영속화가 되고 있는것인지를.. 알려주실 수 있으실까요? 감사합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실무에서 사용되는 Setter
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Setter를 열어 둘 경우 엔티티에 변경으로 인한 유지보수가 힘들다고 말씀해주셨는데 혹시 Setter를 다 닫고 필요한 것만 연다거나, 비즈니스 메서드를 만드는 예제를 참고할 만한게 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
javax.persistence.Enetity import 안 됩니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]1. 상황 -스프링입문 강의에서JPA 강의 영상 중 - 강사님 안내에 따라 build.gradle, application.properties에 반영했습니다. 2. 문제: javax.persistence.Entity가 라이브러리로 동작하지 않음. 빨간색으로 되어 있고 라이브러리를 import할 수 도없습니다. 답변에 미리 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
batchSize 원리에 대해서 알고 싶습니다
안녕하세요 영한님 @BatchSize를 이용하여 최적화를 하다가 문득 깊은 내용을 알고싶어서 질문을 드립니다. 폴더 안의 폴더를 만드는 구조인데요 다음의 상하 관계를 가진 폴더가 총 13개 있습니다. 이 13개의 폴더 정보를 받아 위의 그림의 구조로 저장을 하고 싶었습니다 . @Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Entitypublic class Folder { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "FOLDER_ID") private Long id; private String name; // 부모 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PARENT_ID") private Folder parent; // 자식 @BatchSize(size = 900) @OneToMany(mappedBy = "parent") private List<Folder> children; @Builder private Folder(String name, Folder parent) { this.name = name; this.parent = parent; } } 그래서 Folder라는 엔티티를 self reference하도록 구성을 했구요 @BeforeEachpublic void setUp() throws Exception { Folder aFolder = Folder.builder() .name("A") .build(); Folder bFolder = Folder.builder() .name("B") .parent(aFolder) .build(); Folder bChild1 = Folder.builder() .name("BChild1") .parent(bFolder) .build(); Folder bChild2 = Folder.builder() .name("BChild2") .parent(bFolder) .build(); Folder bChild3 = Folder.builder() .name("BChild3") .parent(bFolder) .build(); Folder cFolder = Folder.builder() .name("C") .parent(aFolder) .build(); Folder cChild1 = Folder.builder() .name("CChild1") .parent(cFolder) .build(); Folder cChild2 = Folder.builder() .name("CChild2") .parent(cFolder) .build(); Folder cChild3 = Folder.builder() .name("CChild3") .parent(cFolder) .build(); Folder dFolder = Folder.builder() .name("D") .parent(aFolder) .build(); Folder dChild1 = Folder.builder() .name("DChild1") .parent(dFolder) .build(); Folder dChild2 = Folder.builder() .name("DChild2") .parent(dFolder) .build(); Folder dChild3 = Folder.builder() .name("DChild3") .parent(dFolder) .build(); folderRepository.saveAll(Arrays.asList(aFolder, bFolder, cFolder, dFolder, bChild1, bChild2, bChild3, cChild1, cChild2, cChild3, dChild1, dChild2, dChild3)); em.flush(); em.clear();} 이렇게 저장을 한 후 @Test@DisplayName("bfs 알고리즘 적용 테스트")@Transactional@Commitpublic void bfsTest() throws Exception { // given Queue<Folder> queue = new LinkedList<>(); Folder deleteFolder = folderRepository.findById(1L).get(); queue.offer(deleteFolder); List<Folder> tempFolders = new ArrayList<>(); tempFolders.add(deleteFolder); int i = 0; // when while(!queue.isEmpty()) { System.out.println("i = " + i); Folder pollFolder = queue.poll(); List<Folder> folders = pollFolder.getChildren(); for (Folder folder : folders) { queue.offer(folder); } tempFolders.addAll(folders); i++; } // then Collections.reverse(tempFolders); folderRepository.deleteAll(tempFolders); em.flush();} 위의 코드처럼 테스트 코드를 짯습니다 그러니 select 쿼리가 많이 줄어든것을 확인할 수 있었습니다. 2022-01-13 23:25:04.471 DEBUG 21588 --- [ main] org.hibernate.SQL : select folder0_.folder_id as folder_i1_1_0_, folder0_.name as name2_1_0_, folder0_.parent_id as parent_i3_1_0_ from folder folder0_ where folder0_.folder_id=? 2022-01-13 23:25:04.492 DEBUG 21588 --- [ main] org.hibernate.SQL : select children0_.parent_id as parent_i3_1_1_, children0_.folder_id as folder_i1_1_1_, children0_.folder_id as folder_i1_1_0_, children0_.name as name2_1_0_, children0_.parent_id as parent_i3_1_0_ from folder children0_ where children0_.parent_id=? 2022-01-13 23:25:04.498 DEBUG 21588 --- [ main] org.hibernate.SQL : select children0_.parent_id as parent_i3_1_1_, children0_.folder_id as folder_i1_1_1_, children0_.folder_id as folder_i1_1_0_, children0_.name as name2_1_0_, children0_.parent_id as parent_i3_1_0_ from folder children0_ where children0_.parent_id in ( ?, ?, ? ) 2022-01-13 23:25:04.501 DEBUG 21588 --- [ main] org.hibernate.SQL : select children0_.parent_id as parent_i3_1_1_, children0_.folder_id as folder_i1_1_1_, children0_.folder_id as folder_i1_1_0_, children0_.name as name2_1_0_, children0_.parent_id as parent_i3_1_0_ from folder children0_ where children0_.parent_id in ( ?, ?, ?, ?, ?, ?, ?, ?, ? ) 총 이렇게 4개의 쿼리가 나갔는데요 서론이 길었습니다 선생님 제가 질문할 것은 이겁니다 @BatchSize를 설정하면 하이버네이트는 어떤 알고리즘으로 저 in절의 아이디 값들을 넣는 것일까요> 자료를 찾아봐도 나오는데가 없었고 저스스로 고민을 했을 때는 <1번> 첫번째 select 쿼리가 나갔을 때 A폴더(id = 1)가 영속화 된다. <2번> 2번째 select 쿼리가 나갔을 때 B,C,D 폴더 즉 id가 2,3,4인 폴더들이 영속화가 된다. -> 따라서 3번째 select 쿼리에서 in절의 id들은 이 2,3,4가 되는 것이다. (여기서의 의문점 그럼 앞서 영속화된 A폴더의 id = 1은 안 집어 넣는 알고리즘은 또 뭘까) 이렇게 생각했는데 과연 맞는지 궁금합니다
-
미해결실전! Querydsl
영속성 컨텍스트에 대해 질문드립니다.
jpaQueryFactory .selectFrom(member) .fetch();jpaQueryFactory .selectFrom(member) .fetch();이런식으로 테스트 코드를 짠 후 실행시켰는데select문이 2번 나갔습니다.제가 이해한 바로는 select문이 한번 나가고 2번째 쿼리에 대해서는 영속성 컨텍스트 1차 캐시에서 가져와서select문이 안나가야 하는데2번 나간게 이해가 되질 않습니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
port in use 8080 에러
안녕하세요! 강의를 듣다가 문제가 생겨서 연락드렸습니다.. 아래 사진과 같이 8080 포트를 이미 사용중이라는 에러를 보고 해결해보려고 cmd의 netstat -ano 명령어를 사용했습니다. 사진처럼, 8080포트를 사용중인 프로세스가 없는데 ide를 실행하면 8080이 이미 사용중이라고 뜨네요... stackoverflow에서 프로세스에 javaw가 동작하고 있을수도 있다고 해서 해당 프로세스를 찾아봤지만 없었습니다. 재부팅, ide 껏다 키기 등등으로도 해결이 안되는데 그냥 포트를 임의로 8090으로 변경해서 사용하는게 답일까요....?
-
미해결실전! 스프링 데이터 JPA
Dto를 다 다르게 만들어야 할까요..?
안녕하세요. 강의 너무 잘 보고 있습니다. JPA와 관련된 질문은 아닌거 같은데 강의를 보다가 항상 궁금했던 점이 언급되어서 이렇게 질문드립니다. 엔티티를 그대로 클라이언트로 넘기면 엔티티가 변경되었을때 API 스팩이 변경되기 때문에 DTO로 변환해서 넘겨줘야 한다고 하셨는데 예를들어 만약에 10개의 API가 Member 정보를 필요로 할 경우(Member 엔티티의 필드가 약 20개 정도 된다고 가정) 각 API 마다 MemberDto 클래스를 모두 생성하고 각 MemberDto에 Member엔티티를 dto로 매핑하는 로직을 모두 작성해야 하나요..? 10개 모두 생성해서 사용하려 하니 클래스 네이밍도 어렵고 코드 중복이 너무 많아지는것 같고,10개 API 에서 필요로하는 Member 정보를 모두 담은 하나의 MemberDto를 만들어 사용하려 하니 엔티티를 사용할 때의 문제와 같이 MemberDto를 변경하면 10개 API 스팩이 변경되는 문제가 발생합니다.. 제가 생각했을때 제일 최선의 방법은 API마다 리스폰VO 클래스를 만들고 해당 클래스에 static inner 클래스로 MemberDto를 선언하는것인데.. 혹시 실무에서 사용하는 best practice가 어떤거일까요..?
-
미해결실전! 스프링 데이터 JPA
mapper 문의
이번 강의로 자신감을 얻고 spring-data-jpa로 시스템 구축 해보려고 합니다. 하나하나 신중히 접근중입니다. ㅎㅎ DTO <--> Entity 변환시에 modelmapper, mapstruct 중에 어느걸 많이 사용하시나요? 혹시 강사님은 현업에서 어떤걸 사용하시는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Entity폴더 위치
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]JPA 공부중 질문이 생겨 문의드립니다. 예를들어 제가 기능이 여러개가 있어서 폴더 아키텍처를 아래와 같이 기능별로 나누고 그 안에 각각 엔티티나 그외 파일을 저장하려고 하는데요. 여기서 궁금한 점이 예를들어 1번 기능에서 사용하는 엔티티를 2번기능에서도 사용하거든요. 그래서 뭔가 이렇게 2곳이상에서 사용하는 엔티티는 commonEntity라는 식으로 따로 빼서 처리해야 하는지.. 보통 어떤식으로 구성하는걸 추천하시는지 궁금해서 질문드립니다. 기능 entity controller repository...등등 기능 entity controller repository...등등
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
QueryDsl compile이 EC2 인스턴스에서 되지 않습니다..
안녕하세요 QueryDsl 실습 중 에러를 해결하지 못해서 질문 드립니다. QueryDsl 을 사용하던 SpringBoot 프로젝트를 배포하고자 AWS EC2 인스턴스에서 해당 프로젝트 git clone하고 실행을 하려고 하는데 다음과 같은 오류가 납니다. 인텔리제이에서 프로젝트를 실행할 때에는 generated\querydsl 위치에 Qclass 파일들이 잘 컴파일 되었었는데 외부 인스턴스에서 실행시 해당 폴더를 찾을 수 없다고 뜨는데 이유를 모르겠네요 ㅠㅠ 아래는 제가 build.grade에서 작성한 queryDsl 관련 설정입니다. plugins { id 'org.springframework.boot' version '2.5.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'com.querydsl:querydsl-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' compile "com.mysema.querydsl:querydsl-jpa:3.6.3" compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa" implementation 'junit:junit:4.13.1' implementation 'org.projectlombok:lombok:1.18.18' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2:1.4.199' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation('org.slf4j:jcl-over-slf4j') implementation('ch.qos.logback:logback-classic') } test { useJUnitPlatform() } //def querydslDir = 'src/main/generated' def querydslDir = "$buildDir/generated/querydsl" // (3) querydsl { // (4) library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { // (5) main.java.srcDirs querydslDir } configurations { // (6) querydsl.extendsFrom compileClasspath } compileQuerydsl { // (7) options.annotationProcessorPath = configurations.querydsl } compileQuerydsl.doFirst { if(file(querydslDir).exists() ) delete(file(querydslDir)) }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일반 조인과 fetch join 차이에 대해 질문이 있습니다.
섹션 11. 객체지향 쿼리 언어2- 중급 문법 내의 "페치 조인1 - 기본" 강의를 듣고 작성하는 질문입니다. 안녕하세요 :) https://www.inflearn.com/questions/164472 https://www.inflearn.com/questions/170331 Q1) 제가 헷갈리는 부분과 관련해서 질문들이 있길래 다 살펴봤지만, 제가 명확하게 이해한 것인지 확신을 할 수 없어서 이렇게 질문 남깁니다. 일반 조인 -> 두 객체를 돌려받음, 객체 그래프 채워짐 (객체 그래프가 채워질 꺼라 생각한 이유는, https://www.inflearn.com/questions/170331 의 강사님 답변 "Object[]은 각각 따로 조회하기 때문에 이런 부분을 처리할 때 작업 공수가 많이 들어갑니다." 이 내포하는 뜻이 두 조인의 내부적인 동작에서는 차이가 있지만 결과는 똑같다고 생각해서입니다.) 페치 조인 -> 한 객체를 돌려받음, 객체 그래프 채워짐 제가 이해한 내용이 맞을까요? Q2) 일반 조인시에도 객체 그래프가 채워지는 지 확인하기 위해서, 코드를 직접 짜서 테스트를 돌려봤는데 이해하기 힘든 쿼리가 나가서 추가적으로 질문 남깁니다. (위의 질문에 대한 답변과 유사성이 있을까싶어, 한 질문란에 두개의 질문을 남깁니다. 아니라면 죄송합니다 ㅠㅠ) 해당 테스트 관련 코드와 결과화면을 첨부해두겠습니다. 일반 조인을 통해 작성한 쿼리를 em.createQuery()... 를 통해 결과리스트를 반환받고 하나씩 반복문을 통해 돌려보는데, select query가 추가로 나가는 것을 발견했습니다. member 에서 team 을 조회할 때는 쿼리가 추가로 발생하지 않는데, team에서 member를 조회할 때에 쿼리가 추가로 발생합니다. 처음 작성한 query를 통해 member를 다 받아왔을텐데, 왜 team에서 member를 조회할 때 쿼리가 추가로 발생할까요..? 고민해봐도 모르겠어서 질문 남깁니다. 감사합니다.
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Api Gateway와 Service Discovery의 차이가 무엇인가요?
ServiceDiscovery layer 없이 Api gateway가 Instance A, B, C로 직접 호출할 수도 있을 것 같은 생각이 드는데요, Api gateway와 각 인스턴스들 사이에 ServiceDiscovery가 있어야하는 이유가 무엇인가요?
-
미해결실전! Querydsl
안녕하세요 프로젝션 결과반환을 dto로 하는데 있어 질문을 드립니다
안녕하세요 현재 jpa 모든 강의를 듣고 토이프로젝트를 진행하고 있습니다 질문의 요지는 querydsl을 통해 dto로 조회할때 XXXtoMany 관계의 컬렉션을 함께 조회하고 싶어요 현재 제 상황은 이렇습니다 일기장에 일기를 쓰는데 질문을 통해 일기를 쓰는방식이라 일기장에 사용된 질문이 필요해요 Diary라는 엔티티가 있고 Question이라는 엔티티가 있는데 이 두 엔티티의 관계가 다대다 관계여서 가운데 DiaryItem이라는 엔티티를 두고 다이어리 페이지에 필요한 모든 정보를 한번에 조회하는것이 목적입니다 이런 방식으로 Diary엔티티를 조회할때와 마찬가지로 엔티티에 의존적이지 않게 dto로 받으면서 무한루프에 빠지지 않도록 필요한 정보만 받을 수 있도록 조회를 하는 방법이 궁금해 질문드립니다 같은 방식으로 DiaryDto가 아니라 Diary에 담은뒤 Controller에서 DiaryDto의 생성자를 통해 변환을 하면 정상적으로 값이 담겨 오는데 queryFactory의 fetch를 통해 직접 DiaryDto에 담으면 에러가 발생합니다ㅠㅠ 현재 이방식으로 쿼리를 실행해보면 query specified join fetching, but the owner of the fetched association was not present in the select list 라는 에러가 나옵니다... 어떤에러인지도 궁금하구요ㅠㅠ 도움부탁드립니다ㅎㅎ
-
해결됨
jpa persist not working
안녕하세요! jpa를 이용하여 db를 2개 접속합니다. 각각 config 패키지에 bean을 등록하여 사용했습니다. 발생한 문제는 다음과 같습니다. @Primary로 등록한 1번 db의 datasource부분에서는 문제없이 Transaction이 잘 일어나지만 등록하지 않은 2번 db datasource에서는 select같은 쿼리는 동작하지만 pesist는 동작하지 않습니다. 2번 db에서는 Transaction이 일어나지 않는것 같은데... https://jonghyeok-dev.tistory.com/44 위 블로그를 참고하여 코드를 작성 했습니다. 해결 방법이 있을까요? 감사합니다...!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA강의 중 테스트 코드(회원가입) 실행 시 오류가 발생합니다
23:12:28.918 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 23:12:28.934 [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)] 23:12:28.994 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [hello.hellospring.service.MemberServiceIntegrationTest] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper] 23:12:29.014 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [hello.hellospring.service.MemberServiceIntegrationTest], using SpringBootContextLoader 23:12:29.020 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [hello.hellospring.service.MemberServiceIntegrationTest]: class path resource [hello/hellospring/service/MemberServiceIntegrationTest-context.xml] does not exist 23:12:29.021 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [hello.hellospring.service.MemberServiceIntegrationTest]: class path resource [hello/hellospring/service/MemberServiceIntegrationTestContext.groovy] does not exist 23:12:29.021 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [hello.hellospring.service.MemberServiceIntegrationTest]: no resource found for suffixes {-context.xml, Context.groovy}. 23:12:29.022 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [hello.hellospring.service.MemberServiceIntegrationTest]: MemberServiceIntegrationTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 23:12:29.099 [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 [hello.hellospring.service.MemberServiceIntegrationTest] 23:12:29.233 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [C:\introSpring\hello-spring\out\production\classes\hello\hellospring\HelloSpringApplication.class] 23:12:29.240 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration hello.hellospring.HelloSpringApplication for test class hello.hellospring.service.MemberServiceIntegrationTest 23:12:29.444 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [hello.hellospring.service.MemberServiceIntegrationTest]: using defaults. 23:12:29.445 [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] 23:12:29.476 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@119020fb, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@3d9f6567, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@c055c54, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@25e2ab5a, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@35e5d0e5, org.springframework.test.context.support.DirtiesContextTestExecutionListener@73173f63, org.springframework.test.context.transaction.TransactionalTestExecutionListener@55562aa9, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@655ef322, org.springframework.test.context.event.EventPublishingTestExecutionListener@7e276594, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@3401a114, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@5066d65f, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@4233e892, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@77d2e85, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@3ecd267f, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@58ffcbd7] 23:12:29.484 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@704f1591 testClass = MemberServiceIntegrationTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@58fb7731 testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class hello.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@376a0d86, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@13df2a8c, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@163370c2, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@35a3d49f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@57a3e26a, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@23bb8443], 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]. 23:12:29.594 [main] DEBUG org.springframework.boot.ApplicationServletEnvironment - Activating profiles [] 23:12:29.595 [main] DEBUG org.springframework.test.context.support.TestPropertySourceUtils - Adding inlined properties to environment: {spring.jmx.enabled=false, org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true} . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.6.2) 2022-01-06 23:12:30.099 INFO 16868 --- [ main] h.h.s.MemberServiceIntegrationTest : Starting MemberServiceIntegrationTest using Java 11.0.13 on DESKTOP-MUGIJNP with PID 16868 (started by tuv in C:\introSpring\hello-spring) 2022-01-06 23:12:30.100 INFO 16868 --- [ main] h.h.s.MemberServiceIntegrationTest : No active profile set, falling back to default profiles: default 2022-01-06 23:12:31.140 INFO 16868 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2022-01-06 23:12:31.165 INFO 16868 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 13 ms. Found 0 JPA repository interfaces. 2022-01-06 23:12:31.980 INFO 16868 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2022-01-06 23:12:32.062 INFO 16868 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.3.Final 2022-01-06 23:12:32.295 INFO 16868 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2022-01-06 23:12:32.909 INFO 16868 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2022-01-06 23:12:32.987 INFO 16868 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2022-01-06 23:12:33.031 INFO 16868 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2022-01-06 23:12:33.852 INFO 16868 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2022-01-06 23:12:33.868 INFO 16868 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2022-01-06 23:12:34.346 WARN 16868 --- [ 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-01-06 23:12:34.872 INFO 16868 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html] 2022-01-06 23:12:35.406 INFO 16868 --- [ main] h.h.s.MemberServiceIntegrationTest : Started MemberServiceIntegrationTest in 5.808 seconds (JVM running for 7.655) 2022-01-06 23:12:35.555 INFO 16868 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@704f1591 testClass = MemberServiceIntegrationTest, testInstance = hello.hellospring.service.MemberServiceIntegrationTest@d70dbeb, testMethod = join@MemberServiceIntegrationTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@58fb7731 testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class hello.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@376a0d86, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@13df2a8c, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@163370c2, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@35a3d49f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@57a3e26a, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@23bb8443], 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@2573b149]; rollback [true] Hibernate: select member0_.id as id1_0_, member0_.name as name2_0_ from member member0_ where member0_.name=? Hibernate: insert into member (id, name) values (null, ?) 2022-01-06 23:12:35.981 WARN 16868 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23502, SQLState: 23502 2022-01-06 23:12:35.981 ERROR 16868 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : NULL not allowed for column "ID"; SQL statement: insert into member (id, name) values (null, ?) [23502-200] 2022-01-06 23:12:36.001 INFO 16868 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@704f1591 testClass = MemberServiceIntegrationTest, testInstance = hello.hellospring.service.MemberServiceIntegrationTest@d70dbeb, testMethod = join@MemberServiceIntegrationTest, testException = javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement, mergedContextConfiguration = [WebMergedContextConfiguration@58fb7731 testClass = MemberServiceIntegrationTest, locations = '{}', classes = '{class hello.hellospring.HelloSpringApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@376a0d86, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@13df2a8c, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@163370c2, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@35a3d49f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@57a3e26a, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@23bb8443], 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]] javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:766) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:746) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) at com.sun.proxy.$Proxy90.persist(Unknown Source) at hello.hellospring.repository.JpaMemberRepository.save(JpaMemberRepository.java:19) at hello.hellospring.service.MemberService.join(MemberService.java:27) at hello.hellospring.service.MemberService$$FastClassBySpringCGLIB$$530c61b7.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at hello.hellospring.service.MemberService$$EnhancerBySpringCGLIB$$6be7ef37.join(<generated>) at hello.hellospring.service.MemberServiceIntegrationTest.join(MemberServiceIntegrationTest.java:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:58) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3279) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3885) at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:84) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:760) ... 89 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement: insert into member (id, name) values (null, ?) [23502-206] at org.h2.message.DbException.getJdbcSQLException(DbException.java:527) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.get(DbException.java:227) at org.h2.message.DbException.get(DbException.java:203) at org.h2.table.Column.validateConvertUpdateSequence(Column.java:365) at org.h2.table.Table.convertInsertRow(Table.java:917) at org.h2.command.dml.Insert.insertRows(Insert.java:167) at org.h2.command.dml.Insert.update(Insert.java:135) at org.h2.command.CommandContainer.executeUpdateWithGeneratedKeys(CommandContainer.java:246) at org.h2.command.CommandContainer.update(CommandContainer.java:167) at org.h2.command.Command.executeUpdate(Command.java:252) at org.h2.server.TcpServerThread.process(TcpServerThread.java:408) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:832) at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.engine.SessionRemote.done(SessionRemote.java:611) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:191) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:152) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 107 more 2022-01-06 23:12:36.028 INFO 16868 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2022-01-06 23:12:36.031 INFO 16868 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2022-01-06 23:12:36.045 INFO 16868 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code -1 제 생각엔 Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement: insert into member (id, name) values (null, ?) [23502-206] 부분이 문제인 것 같은데 강사님 영상의 로그에서는 저렇게 출력되어도 잘 작동되고 id는 잘 생성된다고 하셨습니다. 근데 안되네요 ㅠㅠ 어디가 문제일까요? 코드는 동일합니다. H2도 켜져있고 쿼리문 잘 작동합니다.