실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
수강정보
(149개의 수강평)
1661명의 수강생
3개월 할부시
월 29,333원88,000원
지식공유자 : 김영한
35회 수업 · 총 7시간 44분 수업
기간 : 평생 무제한 시청
수료증 : 발급 강의
수강 난이도 : 중급이상
정창훈 프로필

JUnit 4와 JUnit 5 (에러 발생 문제) 정창훈 6시간 전
안녕하세요 선생님. 테스트 자바 클래스 작성하기 전에 JUnit 4로 할지 JUnit 5로 할지 선택하는 부분있잖아요? 그동안 JUnit5로 계속 해오다가 이번에 JUnit 4 선택해서 작성 중에 오류가 나서 진행을 못하고 있는 상황입니다. 다시 5를 선택해서 해도 오류 나고 4에서는  Test랑 RunWith assertEquals 쪽에서 오류가 나네요... 무슨 문제인지 모르겠습니다.. ㅠㅠㅠ

0
doyeon_kim 프로필

antlr.NoViableAltException: unexpected token: MEMBER doyeon_kim 1일 전
음.. 구글링 해보아도 모르겠네요 ㅠㅠ 이 부분때문에 insert 쿼리가 안나가는데 질문 드립니다. 강의는 11분까지 들었습니다. 감사합니다. antlr.NoViableAltException: unexpected token: MEMBER at org.hibernate.hql.internal.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1524) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1348) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1068) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:748) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:319) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:198) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:294) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:113) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:73) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:604) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:716) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:816) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:113) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314) ~[spring-orm-5.2.8.RELEASE.jar:5.2.8.RELEASE] at com.sun.proxy.$Proxy64.createQuery(Unknown Source) ~[na:na] at jpabook.jpashop.repository.MemberRepository.findName(MemberRepository.java:41) ~[main/:na] at jpabook.jpashop.repository.MemberRepository$$FastClassBySpringCGLIB$$97f1c501.invoke() ~[main/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at jpabook.jpashop.repository.MemberRepository$$EnhancerBySpringCGLIB$$af909806.findName() ~[main/:na] at jpabook.jpashop.service.MemberService.validateDuplicateMember(MemberService.java:60) ~[main/:na] at jpabook.jpashop.service.MemberService.Join(MemberService.java:34) ~[main/:na] at jpabook.jpashop.service.MemberService$$FastClassBySpringCGLIB$$560b731b.invoke() ~[main/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) ~[spring-tx-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE] at jpabook.jpashop.service.MemberService$$EnhancerBySpringCGLIB$$ec5e8741.Join() ~[main/:na] at jpabook.jpashop.service.MemberServiceTest.회원가입(MemberServiceTest.java:38) ~[test/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) ~[junit-platform-commons-1.6.2.jar:1.6.2] at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) ~[junit-jupiter-engine-5.6.2.jar:5.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.6.2.jar:1.6.2] at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.6.2.jar:1.6.2] at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.6.2.jar:1.6.2] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) ~[.cp/:na] at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) ~[.cp/:na] at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) ~[.cp/:na] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) ~[.cp/:na] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:141) ~[.cp/:na] at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) ~[.cp/:na]

3
kjhkjh9753 프로필

@RequireArgsCconstructo 관련 질문 드립니다. kjhkjh9753 1일 전
이러한 에러가 발생하였는데 MemberRepository.java에서 @RequireArgsCconstructor를 주석처리하고 @PersistenceContext를 작성하니 에러가 해결되었습니다.  @RequireArgsCconstructo 이 어노테이션을 제가 사용할 수 없던 이유가 무엇인지 알 수 있을까요??

1
kjhkjh9753 프로필

h2 database 버전 관련해서 kjhkjh9753 2일 전
현재 dependencies에 h2 database 버전이 1.4.200인데 1.4.199를 받아야하는건가요??

1
kjhkjh9753 프로필

디비 생성이 안되네요 도움 주시면 감사드리겠습니다!! kjhkjh9753 2일 전
이전에 member 하나만은 잘 만들어졌는데 이 강의에서 실행을 시켰을 때 디비 생성이 안되는 문제점이 있습니다!! 원인 알려주시면 감사드리겠습니다.

1
조원진 프로필

Entity 연관관계 관련하여 질문드립니다. 조원진 2일 전
안녕하세요 강사님. 늘 강사님 강의 잘 듣고 있습니다. 강사님의 JPA 강의를 듣고 실무에 적용하는 도중에 막히는 부분이 있어서 질문을 좀 드립니다. 실제 비즈니스 모델을 전부 설명 드리기는 복잡해서 강사님 강의의 Entity 다이어그램으로 설명을 드리자면 아래 Album Book Movie가 각각 Detail Entity를 1:N 관계로 갖고 있습니다. 이 때 OrderItem 안에 OrderItemDetail을 가져야하는 상황인데 각각의 Detail 컬럼 성격이 달라서 하나의 Detail Entity로 합칠 수는 없고 데이터 보존이 필요하여 OrderItemDetail이 각각 Detail Entity를 Id로 참조하는 방식으로 갖고 있을 수도 없습니다. 우선 제가 진행한 방식은 OrderItem Entity 안에 OrderAlbumDetail, OrderBookDetail, OrderMovieDetail 모두를 갖게하는 방식으로 진행을 했는데 서로 겹칠 일이 없는 Entity를 모두 OrderItem 안에 넣어놓으니 영 찜찜해서 문의 드립니다ㅜ 이런 경우 주문할 때 각각 Detail Entity를 어떤 형태로 OrderItem에 넣는게 좋을까요?

3
이상현 프로필

오류가 뜹니다 이상현 2일 전
junit을 버전4로 설정하고 작성했는데 이런 오류가 뜹니다 문제가 뭔가요 ㅠㅠ

1
남기석 프로필

강의를 듣다 궁금한 점이 생겨서 질문 드립니다 남기석 7일 전
우선 강의 정말 잘 듣고 있습니다!  복습을 하다 여쭤보고 싶은 부분이 생겨서 글을 남깁니다. 강의 - 주문 상품 수정 중 아래 매서드가  itemId 파라미터를 사용하는데 이 itemId가 정확히 어디서 무엇을 어떻게 받아오는지 과정에 대해 여쭤보고싶습니다!  @GetMapping("/items/{itemId}/edit")public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setAuthor(item.getAuthor()); form.setIsbn(item.getIsbn()); model.addAttribute("form", form); return "items/updateItemForm";}

1
닉네임님 프로필

프로젝트 환경설정 파트에서 테스트케이스에서 계속 막혀요 ㅠㅠ 닉네임님 8일 전
MemberRepositoryTest 를 돌리면 계속 fail이 뜹니다..ㅠ 스프링 버젼도 2.1.x 버젼이고 h2도 1.4.199로 하고 여기 질문방 검색해서 yml 2칸 들여쓰기도 제대로 했는데 ㅠㅠ안됩니다..ㅠㅠ h2도 연결은 시켜놨는데..ㅠㅠ이게 잘안된건지.. 오류코드는 이렇습니다.ㅠㅠ org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:403) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:256) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at jpabook.jpashop.MemberRepository$$EnhancerBySpringCGLIB$$7d284dd8.save(<generated>) at jpabook.jpashop.MemberRepositoryTest.testMember(MemberRepositoryTest.java:22) 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.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 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) Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:294) at com.sun.proxy.$Proxy83.persist(Unknown Source) at jpabook.jpashop.MemberRepository.save(MemberRepository.java:14) at jpabook.jpashop.MemberRepository$$FastClassBySpringCGLIB$$a3e1a60b.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:752) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ... 34 more

1
blowinds32 프로필

Interface를 이용한 다형성 매핑을 실무에서는 어떻게 풀어나가나요? blowinds32 8일 전
안녕하세요, 선생님(?). 영한님의 온라인 팬인 스프링 주니어 백엔드 개발자입니다. 영한님의 교재와 ORM관련 강의를 듣고, 열심히 사내에서 적극적으로 도입하자고 강추한 결과 실무에 도입을 할 기회가 생겨서 적용하고 있습니다 ! (뿌듯) ----------- 인터페이스를 통한 다형성의 경우에는 JPA 스펙에서 지원하지 않는 것으로 알고있는데요, 강의에 나온 예제 도메인과 같이 (Item, Book ... 등등) 공통적으로 묶어줘야 할 데이터가 있는 경우에는 abstract class를 통한 부모-자식 상속관계로 표현하는 것이 맞다고 생각하나, 이는 자식 클래스가 부모 클래스에게 강하게 결합되기 때문에 다양한 타입의 객체가 수행해야 할 책임을 묶는 경우에는 '인터페이스를 통해서 다형성을 구현하는 것이 더 맞지 않나?'라고 생각해서 질문드리게 되었습니다. 그러면, 실무에서는 JPA를 사용해서 도메인 객체를 표현할 때 인터페이스는 사용하지 않는지 궁금합니다. 혹은  사용하려면 이러한 문제를 실무에서는 어떻게 풀어나가는지에 대해서도 궁금합니다. ----------- 항상 질 좋은 강의 들을 수 있게 해주셔서 감사합니다. - 영한님의 온라인 팬 주니어 개발자 -

1
신수웅 프로필

updateItem() 메소드에 대해서 질문이 있습니다. 신수웅 8일 전
안녕하세요? 김영한님 강의는 매우 잘 보고 있습니다. 다름이 아니라 변경감지와 병합 챕터를 보면서 정리 중에 있었는데 updateItem() 메소드를 아래와 같이 이해를 해도 될까요? @PostMapping(value = "/items/{itemId}/edit") public String updateItem(@ModelAttribute("form") BookForm form, @PathVariable String itemId) { Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/items"; } 여기서 보면, 객체는 우리가 만든 새로운 객체일지라도 setId(item.getId()) 을 통해서 기존 DB내에 존재하던 book의 식별자를 넣어준다. 따라서 JPA에 한번 들어갔다 나온 객체로 볼 수 있다. 하지만, new() 를 통해서 내가 직접 생성한 객체이기 때문에 JPA가 이것을 관리하지 않는다.정리하자면, JPA가 식별할 수 있는 식별자를 갖고 있으나, 사용자가 임의로 생성한 객체라 JPA가 직접 관리하지 않는 객체를 준영속 엔티티라 볼 수 있다.이 준영속 엔티티를 처리하기 힘든 이유가 무엇일까?영속성 컨텍스트 관리 하에 있는 영속상태 엔티티는 JPA에 의해 감지가 되기때문에 변경 감지가 일어난다. 하지만, 준영속 엔티티는 JPA가 기본적으로 감지하지 않으므로 변경 감지가 일어나지 않는다.위의 코드에서도  itemService.saveItem(book); 이 없다면, JPA 트랜잭션 안으로 우리의 준영속 엔티티인 Book이 들어갈리가 없기에 해당 문구가 없으면 아무런 변화도 일어나지 않는다.즉, 여기서 우리는 itemService.saveItem(book); 을 통해서 해당 객체를 영속성 컨텍스트에 올려놓고 변경감지를 강제한다고 볼 수 있다. 위의 내용처럼 정리해도 맞는 부분일까요? itemService.saveItem()내를 타고 들어가면 ItemRepository.save() 함수가 나오는데 em.persist()와 같이 영속성컨텍스트에 올리는 것을 이를 가능하게끔 한다고 생각해서 정리해봤습니다. 물론 뒤에 em.merge()를 통해서 병합처리를 하는거지만요.

1
김성인 프로필

안녕하세요! h2DB에 테이블이 만들어지지 않아서 질문을 남깁니다! 김성인 9일 전
김영한님 강의를 보면서 mybatis와 JPA를 같이 개발하고 있습니다.  콘솔창에는 create 쿼리문이 찍히는데h2 디비에는 테이블이 생성이 안됩니다 ㅠㅠ 질문확인해주시면 감사하겠습니다! properties 설정파일입니다. 이렇게 콘솔엔 찍히는데 DB를 확인해보면 아무것도 생성되있지 않습니다... 확인부탁드립니다 ㅠ

1
이해령 프로필

modelAttribute에 값이 null로 넘어옵니다. 이해령 11일 전
왜 orderSearch가 null로 넘어올까요.. 코드를 봐도 문제가 없어보이는데 잘 모르겠습니다. findAll 은 정상적으로 동작하는데 도움이 필요합니다.  https://github.com/apalsl/jpashop.git

1
썬 프로필

EntityManager를 사용하는 Repository의 단위 테스트는 어떻게 수행하나요? 12일 전
이번 강의에서는 Service 단위 테스트를 주로 수행하셨는데, Repository나 Domain 단위 등으로 쪼개서 테스트를 수행하는 게 보다 확실하다고 말씀해주셨습니다. 그 장점으로는 1) 테스트 속도가 빠르다. 2) 보다 정확하다. 를 말씀해주셨던 걸로 기억합니다. 강의 완강 후 학습 내용을 바탕으로 작은 실습을 해보고 있는데 이와 관련된 궁금증이 있어 질문드립니다. Repository에서 EntityManager @RequiredArgsConstructor으로 주입 받아 사용중입니다. 이 경우 Spring에서 EntityManager를 주입해주는 것이기 때문에 @SpringBootTest가 필수적인 걸까요? 만약 그렇다면 Repository와 Service단에서는 빠른 테스트를 수행하는 게 불가능하다고 생각하면 될까요? 혹은 다른 방법이 있다면 경험과 지식을 공유해주시면 감사하겠습니다. 좋은 하루 보내세요.

1
실력늘리자 프로필

디비에 값이 입력이 안됩니다 실력늘리자 14일 전
안녕하세요 ~  계속 디비에 값이 입력이 안됩니다.. 테이블 생성까지는 잘되는데 오류도안나오구 뭐가 문제인지 감이 안잡힙니다 그리고 확인해보니깐 저는 transactional rollback 로그가 계속 안찍힙니다.. gradle 빌드가 너무 오래걸려서  인텔리j로 빌드로 되게 옵션을 설정을 한 상태입니다 The Class-Path manifest attribute in C:\Users\User\.gradle\caches\modules-2\files-2.1\org.glassfish.jaxb\jaxb-runtime\2.3.1\dd6dda9da676a54c5b36ca2806ff95ee017d8738\jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/C:/Users/User/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.1/dd6dda9da676a54c5b36ca2806ff95ee017d8738/jaxb-api-2.3.1.jar,file:/C:/Users/User/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.1/dd6dda9da676a54c5b36ca2806ff95ee017d8738/txw2-2.3.1.jar,file:/C:/Users/User/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.1/dd6dda9da676a54c5b36ca2806ff95ee017d8738/istack-commons-runtime-3.0.7.jar,file:/C:/Users/User/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.1/dd6dda9da676a54c5b36ca2806ff95ee017d8738/stax-ex-1.8.jar,file:/C:/Users/User/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.1/dd6dda9da676a54c5b36ca2806ff95ee017d8738/FastInfoset-1.2.15.jar,file:/C:/Users/User/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.3.1/dd6dda9da676a54c5b36ca2806ff95ee017d8738/javax.activation-api-1.2.0.jar   .   ____          _            __ _ _  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )   '  |____| .__|_| |_|_| |_\__, | / / / /  =========|_|==============|___/=/_/_/_/  :: Spring Boot ::  (v2.1.17.BUILD-SNAPSHOT) 2020-07-31 20:13:32.572  INFO 1008 --- [  restartedMain] jpashop.jpabook.JpabookApplication       : Starting JpabookApplication on DESKTOP-H66EP9G with PID 1008 (C:\Users\User\Spring\jpabook\out\production\classes started by User in C:\Users\User\Spring\jpabook) 2020-07-31 20:13:32.576  INFO 1008 --- [  restartedMain] jpashop.jpabook.JpabookApplication       : No active profile set, falling back to default profiles: default 2020-07-31 20:13:32.679  INFO 1008 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable 2020-07-31 20:13:32.680  INFO 1008 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' 2020-07-31 20:13:34.406  INFO 1008 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2020-07-31 20:13:34.456  INFO 1008 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 35ms. Found 0 JPA repository interfaces. 2020-07-31 20:13:35.837  INFO 1008 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http) 2020-07-31 20:13:36.026  INFO 1008 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat] 2020-07-31 20:13:36.027  INFO 1008 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.37] 2020-07-31 20:13:36.289  INFO 1008 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext 2020-07-31 20:13:36.290  INFO 1008 --- [  restartedMain] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3610 ms 2020-07-31 20:13:36.563  INFO 1008 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting... 2020-07-31 20:13:36.674  INFO 1008 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed. 2020-07-31 20:13:36.774  INFO 1008 --- [  restartedMain] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [ name: default ...] 2020-07-31 20:13:36.877  INFO 1008 --- [  restartedMain] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.17.Final} 2020-07-31 20:13:36.879  INFO 1008 --- [  restartedMain] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found 2020-07-31 20:13:37.087  INFO 1008 --- [  restartedMain] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final} 2020-07-31 20:13:37.291  INFO 1008 --- [  restartedMain] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2020-07-31 20:13:38.041 DEBUG 1008 --- [  restartedMain] org.hibernate.SQL                        :           drop table member if exists 2020-07-31 20:13:38.045 DEBUG 1008 --- [  restartedMain] org.hibernate.SQL                        :           drop sequence if exists hibernate_sequence 2020-07-31 20:13:38.048 DEBUG 1008 --- [  restartedMain] org.hibernate.SQL                        : create sequence hibernate_sequence start with 1 increment by 1 2020-07-31 20:13:38.048 DEBUG 1008 --- [  restartedMain] org.hibernate.SQL                        :           create table member (        id bigint not null,         username varchar(255),         primary key (id)     ) 2020-07-31 20:13:38.050  INFO 1008 --- [  restartedMain] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@70dc37ec' 2020-07-31 20:13:38.053  INFO 1008 --- [  restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2020-07-31 20:13:38.075  INFO 1008 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729 2020-07-31 20:13:38.544  INFO 1008 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor' 2020-07-31 20:13:38.624  WARN 1008 --- [  restartedMain] aWebConfiguration$JpaWebMvcConfiguration : 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 2020-07-31 20:13:38.683  INFO 1008 --- [  restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html] 2020-07-31 20:13:39.089  INFO 1008 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '' 2020-07-31 20:13:39.095  INFO 1008 --- [  restartedMain] jpashop.jpabook.JpabookApplication       : Started JpabookApplication in 7.38 seconds (JVM running for 8.413)

4
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스