묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DB 초기화 관련 질문입니다.
강의 정말 잘 듣고 있습니다. 감사드립니다. 영한님의 경우 프로젝트 재실행마다 모든 DB 테이블이 초기화 되는데, 저는 주문 내역만 초기화되고, 이외의 테이블들은 초기화가 되지 않습니다. ( 근데 또 이상한게 아까 설정 한번 건드려봤을 땐 한번 됐었는데 또 안되네요;; ) 어떻게 설정을 바꾸면 모두 초기화가 될까요? 주문 내역 테이블은 초기화가 되는데, delivery 테이블은 초기화가 되지 않아서 PK 중복 에러가 자꾸 나네요ㅠ main의 application.yml test의 application.yml p.s. 영한님 저서 '자바 ORM 표준 JPA 프로그래밍' 책은 2015년 출간 되었던데, 이후 개정된 적은 없나요?!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 질문있습니다~~!
안녕하세요 강사님. 테스트를 따라하다가 궁금한게 생겨서 질문드립니다! 저는 JUnit5를 통해서 테스트를 작성했고. 우선 코드를 첨부하겠습니다! package jpa.boot.jpaboot.service;import jpa.boot.jpaboot.domain.Member;import jpa.boot.jpaboot.repository.MemberRepository;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.transaction.annotation.Transactional;import static org.assertj.core.api.Assertions.*;@SpringBootTest@Transactionalclass MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() { // given Member member = new Member(); member.setName("Kim"); // when Long saveId = memberService.join(member); // then assertThat(memberRepository.findOne(saveId)).isEqualTo(member); }} 여기서 테스트는 정상적으로 통과되는데, 클래스 레벨에 @Transactional을 지우니까 테스트가 실패했습니다. 실패 메세지는 다음과 같습니다 Expecting: <jpa.boot.jpaboot.domain.Member@9bf63d2> to be equal to: <jpa.boot.jpaboot.domain.Member@22ff1372> but was not. isSameAs로 실행해도 마찬가지더라고요. 1차 캐시에서 가져와서 비교하기 때문에 테스트가 통과한다는 건 알겠지만, Transactional을 지우면 어떤 원리로 테스트가 실패하는지 모르겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService테스트 질문
안녕하세요 OrderService 테스트 시 회원을 createMember()직접 만들어서 사용했는데 회원가입 기능인 join을 사용하게 되면 해당 테스트에 필요없는 join 기능이 들어가게 되므로 createMember()처럼 하는게 좋은 것 같은데 맞을까요? 즉, 의미없는 의존은 하지 않는게 좋은 테스트 같거든요. 통합테스트 보다 단위테스트가 중요하다고 하신 것도 필요없는 의존성을 제외하기 위함도 있는 것 같구요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional
@Transactional은 기본편에서 나오는 엔티티 매니저의 tx.begin() -> tx.commit의 역할과 같은 건가요?즉, 필수로 @Transactional이 있어야만 하나요? 없어도 되는걸로 알고 있어서요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order와 OrderItem의 관계
Order와 OrderItem의 연관관계 메서드를 Many인 OrderItem에 해야 하는거 아닌가요? 이유가 따로 있을까요? 이렇게 하는걸 추천하셨는데 궁금합니다!!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 ! Fetch = LAZY 에 관해서 질문남깁니다.
안녕하세요~ LAZY 관련 질문이 있어서 글을 남깁니다! LAZY 로드를 디폴트로 설정하기 위해서 propertis or yml 파일에 "spring.datasource.jpa.hibernate.enable_lazy_load_no_trans"=true 구문을 추가 하였습니다. 적용한 자바 config 파일 입니다. properties.setProperty("hibernate.enable_lazy_load_no_trans", env.getProperty("spring.datasource.jpa.hibernate.enable_lazy_load_no_trans")); 혹시 해당 프로펄티즈 구문으로 Lazy를 디폴트로 설정해본 적이 있으신가요? 매우 간편 해보여서 프로젝트에 적용해서 쓰고 있는데 안티 패턴이여서 쓰지 말라는 글도 있더라구요. 해당 설정에 대해서 김영한 개발자님의 의견이 궁금합니다! https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
컨트롤러에서 레파지토리 호출시 트랜잭션은?
안녕하세요~ 잘듣고 있습니다. 근데, 궁금한게 있어서요. 만약 컨트롤러에서 바로 (서비스 없이) 레파지토리를 호출하면 기존에 서비스에서 하던 트랜잭션 처리를 컨트롤러에서 해야 하는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
change 언급하실때
itemService 에서 change 메서드 호출해서 넣어주고, Book 엔티티 쪽에서 change 메서드를 만들어주었습니다. 기능은 정상 동작하나, 이게 최적된 방법인지는 잘 모르겠습니다. 강사님이 말씀하신 변경감지를 이용한 부분인데, 컨펌한번 받아보고자 이렇게 올렸습니다. 조언부탁드립니다 . 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
spring-boot-devtools 사용시 recompile하면 서버가 재시작되나요?
안녕하세요, html 파일 수정시 ctrl + shift + f9 단축키로 recompile하면 서버 재시작 없이 변경사항이 적용 되는줄 알았는데 리컴파일 할때마다 서버자체가 재시작 되면서 데이터베이스의 테이블도 다 드랍했다 생성합니다. ddl-auto: create으로 해놓긴 했지만 리컴파일 할때 서버 재시작이 안되고 반영되는줄 알았는데 무조건 서버 재시작이 되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
book 객체가 왜 준영속인것인가
수정을 시도하는 Book객체는 새로 만들어진것이잖아요 강사님. 이 Book객체는 이미 DB에 한번 저장이 되었다고 했는데 persist를 한적도 없고 db를 통해 find 한 객체도 아닌데 어떻게 이게 준영속 객체가 되는것이지요?????? 단지 그냥 Book이란 객체를 만들고 set으로 평범한 값을 넣어줬을 뿐인데.. 만약 set을 하고 em.persist(book) 을 해주면 뭐 영속성컨텍스트에 올라갈것이지만요... 그냥 book은 단순 객체가 아닌 이유를 이해하기가 정말 어렵습니다.ㅠ 기존식별자를 가지면 준영속이라고 하셨는데 book에 set을하여 id를 박는순간 이것은 준영속인것인가요? id는 식별자니까요 @PostMapping("items/{itemId}/edit")public String updateItem(@ModelAttribute("form") BookForm form, @PathVariable String itemId) { Book book = new Book(); book.setIsbn(form.getIsbn()); book.setAuthor(form.getAuthor()); book.setStockQuantity(form.getStockQuantity()); book.setPrice(form.getPrice()); book.setName(form.getName()); book.setId(form.getId()); itemService.saveItem(book); return "redirect:/items";}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
썜. updateItemForm에는 action이 왜 없나요
@GetMapping("items/{itemId}/edit")public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOnd(itemId); model.addAttribute("form", item); return "items/updateItemForm";} 수정버튼 눌렀을경우 바로 이렇게 item을 때려 박아서 정보를 줘도 되지않나요. 왜 폼에 넣고 폼을 전달하나요 아참. 이게 본 질문입니다. action이 없어도 되는건가요? method는 있네요. <!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head th:replace="fragments/header :: header"/><body><div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <form th:object="${form}" method="post"> <!-- id --> <input type="hidden" th:field="*{id}"/> <div class="form-group"> <label th:for="name">상품명</label> <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"/> </div> <div class="form-group"> <label th:for="price">가격</label> <input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요"/> </div> <div class="form-group"> <label th:for="stockQuantity">수량</label> <input type="number" th:field="*{stockQuantity}" class="formcontrol" placeholder="수량을 입력하세요"/> </div> <div class="form-group"> <label th:for="author">저자</label> <input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요"/> </div> <div class="form-group"> <label th:for="isbn">ISBN</label> <input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요"/> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <div th:replace="fragments/footer :: footer"/></div> <!-- /container --></body></html>
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문취소시 영속성 컨텍스트
썜. //주문취소order.cancel(); 을 했을경우. 카운트만 바꾸었지 persist를 한적이 없잖아요? 그상태로 @Transactional때문에 commit이 날라가게 될텐데 어떻게 카운트 값이 db에 번복되어 저장되는것이죠? 고비 같군요 지금이..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
왜 Transactional을 service에 두나요
영한 쌤!!! @Transactional을 Service에 말고 Repository에 달면 안되나요? 그리고 @Transactional 은 Test 폴더 안에서만 rollback을 시키는건가요? 아니면 SpringBootTest 어노테이션 안에서만 rollback 이 되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Intellij에서 갑자기 스프링 어노테이션 / 자바 인식이 안됩니다.
intellij 커뮤니티 버전을 사용하다가 학생 버전을 설치해 쓰려고 했는데.. 잘 인식하던 스프링부트 프로젝트가 자바 파일을 인식하지도 못하고, gradle의 라이브러리도 인식을 못하는것 같아 질문드립니다. 기존에 사용하던 커뮤니티 버전은 삭제했습니다. 이렇게 자바 파일을 아예 실행할 수 없는 상황입니다.. 1. intellij에서 바로 자바를 실행해보려 했으나 Gradle project 메뉴가 보이지 않습니다. 2. 프로젝트 다시 클론을 받거나 재빌드를 해도 그대로입니다. 3. src 폴더를 강제로 source root로 설정하면 자바 파일은 실행이 되나 어노테이션이 전부 인식되지 않고, 다음과 같은 에러메세지를 뱉어냅니다. 시도해본 방법은 이정도이고.. github에 올려놓고 mac과 window에서 같이 사용중인데 window에서만 이런 문제를 겪고 있습니다. https://github.com/eprj453/inflearn_spring 위의 repository에 2개의 springboot 프로젝트에서 모두 나타나는 문제입니다. 여러 방면으로 몇시간동안 찾아봤는데 해결되지 않아서 질문 올립니다. 새로 스프링부트 프로젝트를 생성하면 잘 작동하던데.. 다 밀고 다시 만드는 방법밖에는 없을지..ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DB저장관련 질문입니다
안녕하세요하이버네이트는 변경되는 값을 캐쉬에 저장해놨다가 persist나 flush신호가 있을때 db에 값을 업데이트한다고 알고있는데요,따로 flush를 주지않으신거같은데 addStock등을 활용해서 값을 변경했을때 DB에서 자동으로 플러쉬가 나가는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderItem 클래스 비즈니스 로직 & 조회로직 질문
안녕하세요 복습하면서 궁금한 점이 생겼는데요 OrderItem 클래스에서 만든 비즈니스 로직과 조회로직에서 getItem, getOrderPrice 그리고 getCount 사용하셨는데 get없이 그냥 해도 같은 결과를 얻었습니다. 혹시 get을 사용하신 이유가 있으신가요 ?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
리포지토리 반환값을 List 에서 Stream 으로 바꿔 받는 과정에 문제가 생겨 남겨보아요
안녕하세요 김영한강사님.알찬 강의 열심히 응용중에 문제가 생겼습니다. 다음처럼 Repository 반환값을 List<엔티티> 에서 Stream<엔티티> 로 했을 경우 Controller 에서 엔티티를 받아오지 못하더라구요 MemberRepository . findAll() ---> Stream<Member> 반환 em.createQuery("select m from Member m", Member.class) .getResultStream() // MemberController 의 addAttr 직전 Stream을 List변환 memberService.findMembers().collect(Collectors.toList()); error1 : The object is already closed [90007-199]error2 : could not advance using next()직감으로는, 닫혔다는것이.. Stream 이라 불변객체여서 변경이 안된다는 이야기로 보이는데List<Member> 로 싹 바꿔야 되나 고민하고 있습니다. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- LIst<엔티티> 로 바꾸니 문제없이 출력이 되었습니다. 원인이 createQeury().getResultStream() 이었는데결국 Proxy 를 Stream 에 담은 상태로불변성이 보장되어서하이버네이트가 내부에 RealEntity 값을 심어야 되는데이작업을 할 수 없으니 애러가 나는것이 맞는건가요?맞다면, Stream은 어느시점에 사용하는것이 좋은가요..?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
repository랑 service 개념 질문입니다.
1. 제가 DAO라는 방식으로 먼저 배워서 repository를 DAO라고 생각하고 이해하고 있는데요. 이게 맞는건가요? 2. repository로 바로 비즈니스로직을 수행을 해도 되는데 service로 나눠준 이유는 사용자들이 동시에 사용할 수 있게 하기 위한거라고 알고 있는데 이게 맞는건가요?
-
해결됨파이썬 웹서비스API 실전 프로젝트 - 돈 버는 디지털마케팅
광고 api 질문입니다.
get_rel_kwd_stat_list에서 'NoneType' object is not subscriptable 에러가 뜹니다. 혹시 api가 변경이 된 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 exception 관련 질문 입니다.
안녕하십니까 선생님의 강의 정말 유익하게 잘 보고 있습니다. 다름이아니라 상품주문 test 를 하게되면 ==== 오류 org.springframework.dao.InvalidDataAccessApiUsageException: id to load is required for loading; nested exception is java.lang.IllegalArgumentException: id to load is required for loading 이런식으로 납니다.그래서 id가 자동으로 생성이 안되는내용이라서 @GenereatedValue 가 이미 Item 에 id 에 선언되어있고 혹시나 해서 setId로 id 값 지정후 해보니 그다음으로는 == 오류 전문 java.lang.NullPointerException at jpabook.jpashoop.service.OrderService.order(OrderService.java:41) at jpabook.jpashoop.service.OrderService$$FastClassBySpringCGLIB$$f6e85b24.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at jpabook.jpashoop.service.OrderService$$EnhancerBySpringCGLIB$$ac50f3a2.order(<generated>) at jpabook.jpashoop.service.OrderServiceTest.상품주문(OrderServiceTest.java:44) 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:686) 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$6(TestMethodTestDescriptor.java:212) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) 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:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) 이런식으로 NullPointEception 이 일어납니다.혹시 이렇게 되면 item class가 문제인지 또는 service 와 repository 문제인지 혹시 알고싶습니다.