묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Practical Testing: 실용적인 테스트 가이드
Persistence 계층 단위테스트를 어디까지 하는게 맞을까요?
@DisplayName("상품 번호 리스트로 상품목록을 조회하기") @Test void findAllByProductNumberIn(){ //given Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 3000); Product product3 = createProduct("003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); //when List<Product> findProducts = productRepository.findAllByProductNumberIn(List.of("001", "003")); //then assertThat(findProducts).hasSize(2) .extracting("productNumber","price") .containsExactlyInAnyOrder( tuple("001",1000), tuple("003",5000) ); }1.데이터 계층은 유효한 상품 번호 리스트만 넘어왔다는 전제로만 테스트를 해도 충분한가요?유효하지 않은 상품번호는 검증 로직에서 걸러졌다고 생각하고 테스트를 한다고 생각하면 될까요? @DisplayName("미등록된 상품 번호 리스트로 상품목록을 조회하기") @Test void findAllByProductNumberIn(){ //given Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 3000); Product product3 = createProduct("003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); //when List<Product> findProducts = productRepository.findAllByProductNumberIn(List.of("004", "005")); //then assertThat(findProducts).hasSize(0); } 2.JpaRepository가 제공하는 기본 save,findAll 등도개발자가 원하는 데이터가 올바르게 저장 되었는지, 조회가 되었는지 테스트도실무에서는 작성하시나요 ?아니면 이미 만들어진 코드이기 때문에 불필요한 테스트 코드라 생각해서넘어가는지 궁금합니다. @DisplayName("주문 생성시 상품 리스트에서 주문의 총 금액을 계산한다.") @Test void calculrateTotalPrice(){ //given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, LocalDateTime.now()); //then assertThat(order.getTotalPrice()).isEqualTo(3000); } private Product createProduct(String productNumber, int price) { return Product.builder() .type(HANDMADE) .productNumber(productNumber) .price(price) .sellingStatus(SELLING) .name("메뉴 이름") .build(); } @DisplayName("주문 생성시 주문 상태는 INIT 이다.") @Test void init(){ //given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, LocalDateTime.now()); //then assertThat(order.getOrderStatus()).isEqualByComparingTo(OrderStatus.INIT); } @DisplayName("주문 생성시 등록시간을 기록한다.") @Test void registeredDataTime(){ //given LocalDateTime registeredDateTime = LocalDateTime.now(); List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, registeredDateTime); //then assertThat(order.getRegisteredDateTime()).isEqualTo(registeredDateTime); }Order.create 테스트 코드를 작성할때엔각각 필드 초기화를 단위테스트를 진행했는데, @DisplayName("주문번호 리스트를 받아 주문을 생성한다.") @Test void createOrder(){ LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct(HANDMADE, "001", 1000); Product product2 = createProduct(HANDMADE, "002", 3000); Product product3 = createProduct(HANDMADE, "003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); OrderCreateRequest request = OrderCreateRequest.builder() .productNumbers(List.of("001", "002")) .build(); OrderResponse orderResponse = orderService.createOrder(request, registeredDateTime); assertThat(orderResponse.getId()).isNotNull(); assertThat(orderResponse) .extracting("registeredDateTime","totalPrice") .contains(registeredDateTime,4000); assertThat(orderResponse.getProducts()).hasSize(2) .extracting("productNumber","price") .containsExactlyInAnyOrder( tuple("001",1000), tuple("002",3000) ); }createOrder 테스트 코드는 같이 검사를 했습니다.3.각 초기화를 해주는 정적 매서드를 테스트 코드로 작성을 했는데Order.create 테스트 코드는 필드마다 분리를 해서 테스트 코드를 작성하고,createOrder 테스트 코드는 같이 검사를 했습니다.또 강의에는 없지만 ProductResponse.of 정적 메서드로도 초기화를 했는데따로 분리해서 테스트 코드를 작성하지 않고OrderServiceTest의 createOrder()에서 같이 테스트 코드에 포함되었습니다.테스트 코드를 분리하는 경우와 같이 검사하는 경우를 나누는 기준이 있을까요?
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
선생님 강의 문의 드릴 게 있는데요~!
API하고 TPC부터 스프2탄까지 이제 거의 다 들었습니다~사물인터넷 통신은 내 손에 << 강의를 수강하려고 하는데요~나온지 기간이 좀 지난터라 진행하는데 있어서 임베디드 관련 아무런 지식이 없는 사람은관련 프로그램 다운로드가 안된다거나 그런 상황이 생기면 대처가 어려울 거 같아서요지금 시점에 들어도 강의 따라 진행하는데 문제 없을까요?사물인터넷 강의도 질문드리면 답변 해주시나요~?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
서비스 로직 질문입니다.
안녕하세요, 강사님. loanBook() 서비스 로직 관련 질문입니다. 강의를 듣기 전 혼자 작성해보았는데요,Book book = bookRepository.findByName(request.getBookName()); if(book == null) { throw new IllegalArgumentException("대출할 책이 존재하지 않습니다."); } UserLoanHistory userLoanHistory = userLoanHistoryRepository.findByBookName(book.getName()); if(userLoanHistory.getBookName() == request.getBookName()) { throw new IllegalArgumentException("이미 대출된 책 입니다."); } userLoanHistoryRepository.save(new UserLoanHistory(request.getUserName(), request.getBookName()));위와 같이 작성해보았습니다. 제가 생각한 로직은책이 존재하는지 찾고존재한다면, 책 이름으로 대출 도메인에서 정보 가져와서대출 정보의 책 이름과 대출하려는 책 이름이 같으면 예외처리를 하고대출이 가능하면 UserLoanHistory 객체를 저장한다.입니다. 하지만 userLoanHistoryRepository.findByBookName(book.getName()) 이 부분에서 findByBookName 메소드가 실행되지 않는 것 같습니다.(레포지토리에는 작성해주었습니다.) 그 이유가 UserLoanHistory도메인과 Book도메인이 연결되지 않았기 때문일까요?
-
해결됨실전! Querydsl
BooleanBuilder를 활용한 괄호 묶기
안녕하세요! QueryDsl 수업을 잘 듣고, 실제 실무에서 활용을 하다가 조금 안되는 부분이 생겨 문의드리게 되었습니다.BooleanBuilder를 활용해서 동적 조건을 적용하고자 하였고 조건 중 and((AandB) or(CandD)) 라는 조건을 추가하기 위해 코드를 작성하였습니다.해당 부분은BooleanBuilder tempBuilder = new BooleanBuilder(); for (SiteStatus status: siteStatus) { if (status.equals(SiteStatus.SERVICE)) { tempBuilder.or(Expressions.predicate(Ops.WRAPPED, (serviceBillInfo.status.ne(BillStatus.DELETE).and(serviceBillInfo.billType.eq(BillType.TRIAL))))); } else if (status.equals(SiteStatus.PAID)) { tempBuilder.or(Expressions.predicate(Ops.WRAPPED, (serviceBillInfo.status.ne(BillStatus.DELETE).and(serviceBillInfo.billType.ne(BillType.TRIAL))))); } else { tempBuilder.or(Expressions.predicate(Ops.WRAPPED, (serviceBillInfo.status.eq(BillStatus.DELETE).or(serviceBillInfo.billType.isNull())))); } } builder.and(tempBuilder);위와 같은식으로 묶어서 처리하였고 디버깅을 통해서 builder라는 BooleanBuilder에 들어간 값을 String 형태로 보면 ((serviceBillInfo.status != DELETE && serviceBillInfo.billType = TRIAL) || (serviceBillInfo.status != DELETE && serviceBillInfo.billType != TRIAL) || (serviceBillInfo.status = DELETE || serviceBillInfo.billType is null))와 같이 제가 원하는 대로 builder 안에 값이 들어 있습니다.그런데 그 이후에 queryFactory에서 조건문 내부로 들어가면다음과 같이 쿼리문을 실행하게 됩니다. 해당 부분에 대해서 혹시 해결 방법이 있을까요???
-
해결됨실전! Querydsl
로그에 native Query가 출력되게 하려면 어떻게 해야하나요?
요약QuerydslRepositorySupport 적용p6spy 적용쿼리 로그는 출력이 되고 있지만 native query로 출력되지 않음. 로그 예시-- 현재 출력되는 로그 포맷 select daOrder.id, daOrder.createDate from DaOrder daOrder -- 원하는 로그 포맷 select d.id, d.create_date from da_order d 로컬에서 네이티브 쿼리가 바로 로그에 보이도록 설정하고 싶은데테이블명이 아닌 클래스명으로 쿼리가 출력이 되고 있는데요 혹시 어떤 설정을 바꿔야하는지 알 수 있을까요??
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
section3 와 section4 32강 질문입니다!
안녕하세요, 강사님. 항상 좋은 강의 너무 감사드립니다. section3과 section4 32강을 들으면서 질문이 생겨서 글 남기게 되었습니다.인스턴스화를 new를 사용해서 객체로 만들어준다고 이해하면 될까요? 예를 들어 User.class를 Board.class에서 사용할 때 User user = new User()로 만드는 것이 인스턴스화인지 궁금합니다.스프링 컨테이너에 대해 맞게 이해한 것인지 궁금합니다. 제가 이해한 바로는 컨테이너는 스프링 빈들을 대신 인스턴스화하고, 빈들끼리의 관계를 자동으로 맺어주고(의존성 자동으로 설정), 생성자를 통해 스프링 빈들끼리 서로 사용이 가능하게 한다는 것입니다. 이해한 개념이 맞는지 궁금합니다.returnBook관련 질문입니다. loanBook의 코드를 최대한 재활용해서 작성해보았는데요,@Transactional public void returnBook(BookReturnRequest request) { Book book = bookRepository.findByName(request.getBookName()); if(book == null) { throw new IllegalArgumentException("대출할 책이 존재하지 않습니다."); } // 유저 찾고 User user = userRepository.findByName(request.getUserName()); if(user == null) { throw new IllegalArgumentException("사용자가 존재하지 않습니다."); } // 이미 대출 중인 책인지 확인하고 if(userLoanHistoryRepository.existsByBookNameAndIsReturn(book.getName(), true)) { throw new IllegalArgumentException("이미 반납된 책입니다."); } // 책 찾고, 반납 UserLoanHistory history = userLoanHistoryRepository.findByBookName(book.getName()); history.returnBook(); }테스트 결과, 딱히 이상이 없어보입니다. existsByBookNameAndIsReturn(book.getName(), true)를 사용해도 괜찮을까요?감사합니다!
-
미해결실전! 스프링 데이터 JPA
엔티티 매니저에 대해!!!!
[벌크성 수정 쿼리] 강의 11:20쯤에"같은 트랜잭션이면 같은 엔티티 매니저를 불러온다"라고 강사님이 언급을 하셨습니다.질문 : 엔티티 매니저는 싱글톤 객체처럼 딱 1개만 가지고 재활용하면서 사용하는 것이 아니라, 트랜잭션이 실행될 때[마다] 새로운 엔티티 매니저가 생성되는 건가요??
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
스프링 2.7.x 사용자 오류
오류 난 거 몇 가지 적겠습니다.이제 User 클래스에 @Table(name = "users") 붙여줘야 합니다. h2 버전 올라가면서 테이블 이름 user를 사용 못 합니다. 9:15에서 실행하면 중간에 에러 떠요.15:44sql:init:mode: always 그리고 이전까지 h2가 잘 실행됐는데 이번 편에서localhost:8080/h2-console 접속 시 whitelabel이 계속 나오고 Application 실행 시에 h2가 실행된다는 메시지도 안 나오는 미친 에러 걸려서 (h2 로그 안 나옴)해결법을 못찾아서 압축하고 드라이브 올리고 마지막으로 확인차 다운받아서 확인해 봤는데 다시 h2 실행이 잘 되네요..? 왜 그런지 아시는 분 댓글 부탁드립니다 ㅎㅎ
-
해결됨실전! Querydsl
Querydsl random select 쿼리
https://www.inflearn.com/questions/284950/querydsl-random-select%EA%B4%80%EB%A0%A82년정도 전에 Querydsl에서 ramdom select는 지원하지 않는다고 하셨는데 지금은 찾아보니 Expressions.numberTemplate()을 통해 SQL Function을 사용할 수 있다고 하는데 권장하는 사용법인지, 올바른 random select 방법인지 궁금합니다.추가로 같은 결과를 반환하는 random select, distinct, limit, 프로젝션을 한번에 수행하는 2개의 방법인데 2개의 차이는 다음과 같고 어느것을 추천하시는지 궁금합니다.case1의 방법이 limit를 가져오기에 불필요한 count쿼리를 추가로 날리지 않지만 실행 시간이 더욱 큽니다.case1 - Querydsl 사용테스트 실행시간 : 78mscount 쿼리를 추가로 생성하지 않음public List<QuizWordDto> findMyWordRandomForQuiz() { return queryFactory .select(Projections.constructor(QuizWordDto.class, myWord.name, myWord.morpheme, myWord.mean)) .distinct() .from(myWord) .orderBy(Expressions.numberTemplate(Double.class, "RAND()").asc()) .limit(40) .fetch(); } case2 - 페이징을 이용하여 Limit 가져오기테스트 실행시간 : 22mscount 쿼리를 추가로 생성@Query(value = "SELECT DISTINCT new com.ll.kotudy.word.service.dto.QuizWordDto(mw.name, mw.morpheme, mw.mean) " + "FROM MyWord mw " + "ORDER BY FUNCTION('RAND')", nativeQuery = false) Page<QuizWordDto> findDistinctRandomQuizWords(Pageable pageable);테스트 코드@BeforeEach void init() { for (int i = 0; i < 50; i++) { myWordRepository.save(new MyWord("동물" + i, "명사", "사람을 제외한 길짐승, 날짐승, 물짐승 따위를 통틀어 이르는 말." + i)); } } @Test void findMyWordForQuiz() { long startTime = System.currentTimeMillis(); PageRequest pageRequest = PageRequest.of(0, 40); Page<QuizWordDto> distinctRandomQuizWords = myWordRepository.findDistinctRandomQuizWords(pageRequest); long endTime = System.currentTimeMillis(); System.out.println(String.format("코드 실행 시간: %20dms", endTime - startTime)); } @Test void findMyWordForQuiz_querydsl() { long startTime = System.currentTimeMillis(); List<QuizWordDto> myWordRandomForQuiz = myWordRepository.findMyWordRandomForQuiz(); long endTime = System.currentTimeMillis(); System.out.println(String.format("코드 실행 시간: %20dms", endTime - startTime)); }
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
작성글 저장2 - 클래스 분리
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.selfstudy.request.PostCreate]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.selfstudy.request.PostCreate (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2] 안녕하세요 호돌님, 강의의 '작성글 저장2 - 클래스 분리' 파트 초반부분에서 영상대로 따라했는데 테스트가 실패하여서 관련 오류를 찾아 PostCreate 클래스에 @NoArgsConstructor 어노테이션을 이용해 기본생성자를 추가하는 방법으로 오류를 해결했습니다.그런데 영상에선 분명히 PostCreate 클래스에 따로 기본생성자를 추가한 것이 안보이는데 어떤 차이로인해 오류가 발생한 것인지 궁금합니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpa save 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]보통 jpa에서 제공하는 save는 Customer를 저장하고 싶은 경우(모든 컬럼에 값이 설정돼있지 않음)Customer customer = new Customer();customer.setCustomerName("aa");customerRepository.save(customer);setter로 설정하기엔 컬럼이 너무 많은데이게 맞는건지 아니면 컨트롤러에서 파라미터를 OrderVO로 받아서 Entity로 변환한 다음 저장하는게 맞는지 잘 모르겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대일 매핑 테일에 대해서.. spring jpa 연관관계
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이런식으로 node 와 edge가 다대일 관계로마인드맵과 연관 관계를 맺으면 관리가 되나여.?node가 리스트 형식으로 저장되서 마인드맵의 id를 fk로 가져와서 이 마인드맵 번호로 관리할려고 하는데? 보통은 마인드맵쪽에서 다대일 관계로 되야하는데 그렇게 하면 이상해서..
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
메이븐 프로젝트
현재 Hello JPA - 프로젝트 생성 부분을 듣고 있는 수강생입니다.그 뒤에 있는 jpa 로드맵 모든 강의에서도 계속 메이븐 프로젝트로 프로젝트 진행을 하시는건가요?메이븐이랑 gradle 프로젝트는 많이 다를까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 실행 오류
application 파일쪽에 띄어쓰기가 2칸으로 되어있는지접속 url에 문제가 있는지 체크를 해봐도 특이 사항은없었는데요 MemberRepositoryTest 실행 시킬때 테이블 생성이 정상적으로 이루어 지고 있지 않습니다...could not prepare statement; SQL [call next value for hibernate_sequence]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statementorg.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [call next value for hibernate_sequence]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259) at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551) at app//org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at app//org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at app//org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at app//org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at app//com.todel.sample.MemberRepository$$EnhancerBySpringCGLIB$$cc977298.save(<generated>) at app//com.todel.sample.MemberRepositoryTest.testMember(MemberRepositoryTest.java:25) at java.base@11.0.16.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.16.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.16.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.16.1/java.lang.reflect.Method.invoke(Method.java:566) at app//org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at app//org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at app//org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at app//org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at app//org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at app//org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at app//org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@11.0.16.1/java.util.ArrayList.forEach(ArrayList.java:1541) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@11.0.16.1/java.util.ArrayList.forEach(ArrayList.java:1541) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at app//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 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62) at java.base@11.0.16.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.16.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.16.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.16.1/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement at app//org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) at app//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at app//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:75) at app//org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:105) at app//org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40) at app//org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:534) at app//org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:114) at app//org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) at app//org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) at app//org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) at app//org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at app//org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:756) at app//org.hibernate.internal.SessionImpl.persist(SessionImpl.java:742) at java.base@11.0.16.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.16.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.16.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.16.1/java.lang.reflect.Method.invoke(Method.java:566) at app//org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:315) at app//com.sun.proxy.$Proxy98.persist(Unknown Source) at app//com.todel.sample.MemberRepository.save(MemberRepository.java:15) at app//com.todel.sample.MemberRepository$$FastClassBySpringCGLIB$$e449817d.invoke(<generated>) at app//org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at app//org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ... 90 moreCaused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "HIBERNATE_SEQUENCE" not found; SQL statement:call next value for hibernate_sequence [90036-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:632) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.command.Parser.readSequence(Parser.java:8471) at org.h2.command.Parser.readTermWithIdentifier(Parser.java:5347) at org.h2.command.Parser.readTermWithIdentifier(Parser.java:5217) at org.h2.command.Parser.readTerm(Parser.java:4901) at org.h2.command.Parser.readFactor(Parser.java:3398) at org.h2.command.Parser.readSum(Parser.java:3385) at org.h2.command.Parser.readConcat(Parser.java:3350) at org.h2.command.Parser.readCondition(Parser.java:3132) at org.h2.command.Parser.readExpression(Parser.java:3053) at org.h2.command.Parser.parseCall(Parser.java:6980) at org.h2.command.Parser.parsePrepared(Parser.java:765) at org.h2.command.Parser.parse(Parser.java:689) at org.h2.command.Parser.parse(Parser.java:661) at org.h2.command.Parser.prepareCommand(Parser.java:569) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) at org.h2.server.TcpServerThread.process(TcpServerThread.java:288) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.lang.Thread.run(Unknown Source) at app//org.h2.message.DbException.getJdbcSQLException(DbException.java:632) at app//org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at app//org.h2.engine.SessionRemote.done(SessionRemote.java:606) at app//org.h2.command.CommandRemote.prepare(CommandRemote.java:78) at app//org.h2.command.CommandRemote.<init>(CommandRemote.java:50) at app//org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:480) at app//org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) at app//org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92) at app//org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) at app//com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) at app//com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:90) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176) ... 114 more
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터베이스 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]맥을 쓰고 있는데 h2 데이터베이스 접속이 안되고이런 문구가 나와요.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
List로 만든 뒤 Map으로 변환시 메모리 사용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.V5를 만들면서 List를 만든 뒤에 이것을 다시 Map으로 변환하셨는데 이럴 경우 메모리 사용량이 많아져 OOM이 발생하기 쉬울 수 있다고 생각했습니다. 제가 생각한게 맞을까요?만약 맞다면 em에서 받아올때부터 stream으로 받아서 map으로 만들면 이러한 문제가 해결될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
./gradlew clean build 맥북 실패
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]정답 찾았습니다.1.h2를 끄신 줄 알아서 껏는데 백그라운드로 돌리고 계신 거였습니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터베이스 생성이 안됩니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]cd ~ls -alrth 하는데 없어요아. 1.4.199 버전으로 다시 설치하니 됩니다ㅎ...
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
H2 database 실행 안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Create table Member()해서 테이블을 만들어서 실행버튼을 누르면 멤버테이블이 만들어 지잖아요 근데 실행버튼을 눌러도 테이블이 안만들어져요..
-
미해결실전! Querydsl
동적 쿼리 생성시 질문이 있습니다. (+패치조인)
안녕하세요 항상 강의 잘보고 있습니다.현재 강의에서 알려주신것을 토대로 토이프로젝트를 진행하고 있습니다. 토이프로젝트를 진행하던중 동적 쿼리 관련하여 이슈가 생겼고 해당 이슈를 해결하기위해 궁리를 하던 중 궁금한 점이 생겨 질문드립니다.현재 강의에서는 조건절에 BooleanExpression을 이용해서 동적으로 쿼리를 생성하고 있는데 혹시 join절에도 동적 쿼리를 적용할수 있는지 궁금합니다. 만약 적용이 가능하다면 어떤식으로 가능한지 궁금합니다.추가로 패치조인에 대해서 질문이 있습니다. ToOne관계에 있어서는 기존 전략을 지연로딩으로 가져가되 연관관계가 걸려있는 객체에 대해서 선택적으로 fetch join을 사용하라고 이해했습니다. 여기서 질문은 Querydsl에서 @QueryProhection을 사용하여 DTO로 조회를 할때는 fetch join을 사용할수는 없는지 궁금합니다.