묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 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 문제인지 혹시 알고싶습니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하십니까? 도메인 설계시 인터페이스, 추상클래스 에 대한 의견을 듣고 싶습니다.
안녕하십니까? 강의 영상 모두 결제해서 잘 보고 있습니다. 바로 본론부터 말씀 드리면, 회사에서 여러개의 프로젝트를 준비하고 있고 그중 자주 쓰이는 공통적인 기능을 ( 회원, 게시판 등 ) 만들어 놓고 프로젝트마다 재활용하여 시간을 단축하자는 의견이 나왔습니다. 그래서 JPA 에서 사용하는 entity 도 인터페이스와 추상클래스를 사용해서 설계를 해보라고 해서 진행중에 있습니다. 들어가기 앞서, 스프링 프로젝트의 코드를 살펴보면 인터페이스를 잘 사용해서 설계를 잘 했다고 생각하고 있습니다.그러나 데이터베이스와 직접적인 연관이 없는 코드라서 자유롭게 쓸수 있었던것 같은데요. JPA 를 쓰고 있는 입장에서 인터페이스와 추상클래스를 사용해서 다형성을 구현할려고 할때마다 한계에 자꾸 봉착하는 느낌이 듭니다. 결국 도메인 클래스는 CRUD 가 중요한데, 인터페이스로는 실제 구현된 클래스가 뭔지 알수 없어 사용하기가 난감합니다. Item 과 Book 과 같이 강하게 결합 하는것에 대해서는 어느정도 수긍이 갑니다만, 거의 대부분은 그렇게 강하게 연결되는 경우가 잘 없는거 같아서요. 인터페이스를 쓰는경우도 잘 못본거 같습니다. 실무에서는 인터페이스와 추상클래스를 어느 정도 까지 사용하는지궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
update에대한 질문입니다!
지금은 Book 상품등록, 상품수정의 기능만 한다고 하셨는데 영화와 음반까지 추가하려면 단순히 controller와 service에 메서드들을 추가해서 로직을 짜면 되는건가요? 아니면 메서드를 추가안하고 다른 방법이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
thymeleaf 의 경로를 못찾는다고 나오네요
indx.html을 /src/main/resourcee/static/index.html을 넣어도 못찾네요 hello예제에서는 "template might not exist or might not be accessible by any of the configured Template Resolvers" 로 나오네요 경로가 차이가 있는건지 모르겠습니다. 아래는 grandle 설정입니다 어떤 문제가 있는건지 모르겠습니다. plugins { id 'org.springframework.boot' version '2.1.16.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java'}group = 'jpabook'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 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'}
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
post vs put
안녕하세요. 보통 리소스를 수정하는데 put 메서드를 사용한다고 알고 있는데, post를 사용한 이유 같은게 있나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Category 계층 구조를 보고 질문드립니다.
안녕하세요. 영한님 강의 잘 듣고 있습니다. 감사합니다. Category Entity에서 parent와 child 만드는 것을 보고 게시판에서 댓글과 대댓글 관계를 생각해보았는데 댓글 Entity에서 대댓글을 List로 담고 똑같은 계층구조로 구현하는게 객체지향적인 설계가 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
셀프로 양방향 연관관계 관련 질문입니다.
안녕하세요, 먼저 강의를 잘 듣고 있는 학생 1인 입니다. ㅎㅎ 엔티티 클래스 개발2 강의 중 셀프로 양방향 연관관계 관련 질문입니다. Category 엔티티에서 // 자식입장에서 바라보는 부모 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Category parent; 위의 JoinColumn시 "category_id"가 아니라, "parent_id"로 작성해야 되는 이유를 알 수 있을까요? 셀프를 제외한 일반적인 양방향 연관관계에서 "연관관계 주인" 쪽에서 연관관계 거울 쪽을 Join할 때 연관관계 거울의 KEY를 명시해 주는데, 이와 마찬가지로 parent_id가 아닌 category_id가 아닌지... 궁금합니다. 실제로 바꿔서 했을 때, 오류가 발생했습니다...
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Valid 유효성 체크 시 질문 있습니다!
강사님 안녕하세요! 상품 등록하는 부분에도 유효성 검사를 추가 해봤는데요. Neither BindingResult nor plain target object for bean name 오류가 나서 검색해보니 @ModelAttribute를 붙이면 된다고 해서 해결했습니다. 근데 회원등록 시에는 @ModelAttribute를 사용하지 않았어서 비교해봤더니, 모델객체에 담을 때 클래스명이랑 똑같이 설정하면 정상 동작하더라구요. 오류는 해결했는데 @ModelAttribute를 붙여야될 때도 있고 안 붙여도 될 때도 있고,,, 왜 이렇게 동작하는지 궁금합니다..ㅎㅎ 그리고 여기서 @ModelAttribute가 무슨 역할을 해주는지도 궁금합니다. model.addAttribute("form", new BookForm()); @Valid BookForm form => 오류남 model.addAttribute("form", new BookForm()); @ModelAttribute("form") @Valid BookForm form => 정상 동작 model.addAttribute("form", new BookForm()); @ModelAttribute @Valid BookForm form => 오류남 model.addAttribute("bookForm", new BookForm()); @Valid BookForm form => 정상 동작
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService의 order() 메서드 파라미터 관련 질문드립니다!
안녕하세요! 쉽고 재밌는 강의 만들어주셔서 감사합니다! OrderService 서비스의 public Long order() 메서드 관련해서 질문드리고자 합니다. 강의해주신 대로는 order() 함수에서는 여러 orderItem을 넣을 수 있는 것으로 설계가 되어 있습니다. 그래서 order 객체를 생성할 때 orderItem 여러 개를 파라미터로 받을 수 있도록 OrderItem... orderItems로 설정해주셨습니다. 그런데 public Long order() 함수에서는 파라미터가 하나의 itemId 및 count만을 받아서 order() 함수 내에서 order 객체를 생성할 때 하나의 orderItem만 추가 가능하다고 생각했습니다. 이 경우 아이템마다 외부에서 item마다 order() 함수를 호출하여 order객체의 필드인 orderItems에 orderItem을 추가하여야 하는 것인지 궁금합니다. 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Interface를 이용한 다형성 매핑을 실무에서는 어떻게 풀어나가나요?
안녕하세요, 선생님(?). 영한님의 온라인 팬인 스프링 주니어 백엔드 개발자입니다. 영한님의 교재와 ORM관련 강의를 듣고, 열심히 사내에서 적극적으로 도입하자고 강추한 결과 실무에 도입을 할 기회가 생겨서 적용하고 있습니다 ! (뿌듯) ----------- 인터페이스를 통한 다형성의 경우에는 JPA 스펙에서 지원하지 않는 것으로 알고있는데요, 강의에 나온 예제 도메인과 같이 (Item, Book ... 등등) 공통적으로 묶어줘야 할 데이터가 있는 경우에는 abstract class를 통한 부모-자식 상속관계로 표현하는 것이 맞다고 생각하나, 이는 자식 클래스가 부모 클래스에게 강하게 결합되기 때문에 다양한 타입의 객체가 수행해야 할 책임을 묶는 경우에는 '인터페이스를 통해서 다형성을 구현하는 것이 더 맞지 않나?'라고 생각해서 질문드리게 되었습니다. 그러면, 실무에서는 JPA를 사용해서 도메인 객체를 표현할 때 인터페이스는 사용하지 않는지 궁금합니다. 혹은 사용하려면 이러한 문제를 실무에서는 어떻게 풀어나가는지에 대해서도 궁금합니다. ----------- 항상 질 좋은 강의 들을 수 있게 해주셔서 감사합니다. - 영한님의 온라인 팬 주니어 개발자 -
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
EntityManager를 사용하는 Repository의 단위 테스트는 어떻게 수행하나요?
이번 강의에서는 Service 단위 테스트를 주로 수행하셨는데, Repository나 Domain 단위 등으로 쪼개서 테스트를 수행하는 게 보다 확실하다고 말씀해주셨습니다. 그 장점으로는 1) 테스트 속도가 빠르다. 2) 보다 정확하다. 를 말씀해주셨던 걸로 기억합니다. 강의 완강 후 학습 내용을 바탕으로 작은 실습을 해보고 있는데 이와 관련된 궁금증이 있어 질문드립니다. Repository에서 EntityManager @RequiredArgsConstructor으로 주입 받아 사용중입니다. 이 경우 Spring에서 EntityManager를 주입해주는 것이기 때문에 @SpringBootTest가 필수적인 걸까요? 만약 그렇다면 Repository와 Service단에서는 빠른 테스트를 수행하는 게 불가능하다고 생각하면 될까요? 혹은 다른 방법이 있다면 경험과 지식을 공유해주시면 감사하겠습니다. 좋은 하루 보내세요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
recompile말고 새로고침으로는 안 되나요?
영한님 안녕하세요! 강의 정말 잘 듣고 있습니다. 궁금한게 Spring Framework에서는 제 기억에 별 다른 세팅 없이 새로고침하면 정적 소스들이 변경됐던 것 같은데, 스프링 부트에서는 새로고침이 아니라 꼭 recompile을 해줘야 변경사항이 반영되는건가요? 새로고침만으로 변경시킬 순 없나요? 일일이 recompile하기 번거로울 것 같아서요 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUnit5 사용하시는 분들은 이렇게...
JUnit5에서는 @SpringBootTest에 @RunWith(SpringRunner.class)가 포함되어있고, public을 명시해주지 않으셔도 됩니다. @Test(expected)는 4보다 귀찮아졌네요.. package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; 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.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() throws Exception { //given Member member = new Member(); member.setName("1hoon"); //when Long joinId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(joinId)); } @Test void 중복_회원_예외() throws Exception { //given String name = "1hoon"; Member memberA = new Member(); memberA.setName(name); Member memberB = new Member(); memberB.setName(name); //when memberService.join(memberA); //then IllegalStateException thrown = assertThrows(IllegalStateException.class, () -> memberService.join(memberB)); assertEquals("이미 존재하는 회원입니다.", thrown.getMessage()); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
junit5로 테스트하시는분은 이렇게 하시면 됩니다
제가 실습중인 환경은 SpringBoot 2.3.1.RELEASE여서 error: cannot find symbol 위 오류가 발생했는데, 코드 수정해서 해결했습니다. 참고하시면 도움될것같습니다. package jpabook.jpashop.member; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional // @Rollback(false) 테스트 종료 후 데이터를 롤배하지 않고 그대로 남겨두는 옵션 public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("1hoon"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then assertEquals(findMember.getId(), member.getId()); assertEquals(findMember.getUsername(), member.getUsername()); assertEquals(findMember, member); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
데이터를 유지 하려면
안녕하세요. 방금 막 완강을 마친 학생입니다. 우선 수업 정말 잘들었습니다. jpa와 함께, 지금까지 배웠던 것을 쭉 다시 복습하고, 2편으로 넘어갈 생각입니다. 이번 질문은 다름이 아니라, 지금 서버를 재시작하면 기존의 데이터가 삭제되고 데이터가 새로 쓰이잖습니까. 이게 application.yml의 ddl-auto:create 때문인지 그래서 테이블을 서버를 run할 때마다 새로 생성하기 때문인지, 아니라면 기존 데이터를 db에 유지하는 방법을 알고 싶습니다. 더 좋은 질문을 가져올 수 있도록 복습하겠습니다. 감사합니다.