30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
stream이 아닌 querydsl transform을 이용하는 방법에대한 문의
안녕하세요 8:30초대 강의를 보면 1:N관계의 list형태를 mapping하기 위해 flats .stream ~ .collect ~ 형태를 이용하고 있는데요 실무에서도 비슷한 사례가있어, 처음에 강사님처럼 어플리케이션단에 코드를 짰다가, 코드가 너무 복잡해져서 QueryDsl에서 transform + GroupBy.list를 이용하는식으로 변경해봤는데요. (아래 예시참조) from(Entity) // 1:N 관계의 List<Object> 를 추출, key : Entity.Id .transform( groupBy(Entity.Id) .list( Projections.fields(Example.class, Entity.Id, list( Projections.fields(Detail.class, Detail.id Detail.name ) ).as("DetailList") ) ) ) 문제는 구글링을 해보니, 해당 방식이 쿼리결과를 memory에서 리스트형태로 만들어내는것이라고 하더라구요. 예전에 강사님의 강의에서 '컬렉션 fetch join은 페이징을 이용할 수 없다'는 내용을 설명해주실 때, 해당 동작이 메모리에서 일어나기때문에 OOM이 발생할 수 있다 라고 말씀해주셨는데 이와 마찬가지로 transform , Groupby.list를 이용하는 것 역시 문제가 발생할까봐 우려스럽네요 아래 두가지 질문에 답변 부탁드립니다. Q1) 강사님의 application단에서 짜는 방식이 나을지 아니면 querydsl단에서 transform & Groupby.list를 이용하는게 나을지 고민되는데 두가지 방법중 무엇을 선택하는게 좋을까요? 후자의 경우 OOM이 발생하지는 않을지도 궁금합니다.. Q2) memory에서 작업하는게 위험한 이유가 뭔가요? 강사님처럼 application단에서 로직을 수행하는것도 memory에서 동작하는것 아닌가요? 친절하고 유익한 강의 늘 감사드립니다. 답변 부탁드립니다!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
커멘드와 쿼리 분리에 대해
안녕하세요 항상 강의 잘 듣고 있습니다! 제가 이해력이 부족하여 모든 질문을 보았음에도 이해가 가지않아 질문 합니다! ㅜ 현재 강의의 예시에는 -------- orderV3 컨트롤러 -> 읽기전용 @Transactional이 설정된 OrderQueryService -> OrderRepository 이렇게 호출이 되어 있는데요 -------- 이 예시는 핵심 비즈니스 로직 없이 OrderQueryService 즉 화면이나 API에 맞춘 서비스만 있는 예시인건가요 ? 아니면 Repository 호출을 OrderService가 있다고 치고 OrderQueryService안에 OrderService(핵심비즈니스로직)이 있고 그안에 OrderRepository를 호출 했다고 치는건가요 ? -------- (예를들면 이렇게 ) orderV3 컨트롤러 -> OrderQueryService -> OrderService(생략) -> OrderRepository -------- 결론은 OrderService와 OrderQueryService가 같이 어떻게 쓰여지는지 이해가 가질 않습니다..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문내역을 들어갈 때 에러가 났습니다.
QueryDSL 마지막 강의를 듣고 주문내역을 들어가는 부분에서 에러가 났습니다. 아래와 같이 에러가 났습니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94/lecture/24342?tab=community&volume=0.70&quality=1080&speed=1.25&q=486752 이 부분을 참고하였는데 해결을 못하였습니다... Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Apr 14 00:00:05 KST 2022 There was an unexpected error (type=Internal Server Error, status=500). An error happened during template parsing (template: "class path resource [templates/order/orderList.html]") org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/order/orderList.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:366) at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:190) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1401) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "item.member.name" (template: "order/orderList" - line 34, col 21) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) at org.attoparser.MarkupParser.parse(MarkupParser.java:257) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 48 more Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "item.member.name" (template: "order/orderList" - line 34, col 21) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166) at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144) at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) at org.thymeleaf.engine.Model.process(Model.java:282) at org.thymeleaf.engine.Model.process(Model.java:290) at org.thymeleaf.engine.IteratedGatheringModelProcessable.processIterationModel(IteratedGatheringModelProcessable.java:367) at org.thymeleaf.engine.IteratedGatheringModelProcessable.process(IteratedGatheringModelProcessable.java:221) at org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640) at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleCloseElementEnd(TemplateHandlerAdapterMarkupHandler.java:388) at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322) at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleCloseElementEnd(OutputExpressionInlinePreProcessorHandler.java:220) at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:164) at org.attoparser.HtmlElement.handleCloseElementEnd(HtmlElement.java:169) at org.attoparser.HtmlMarkupHandler.handleCloseElementEnd(HtmlMarkupHandler.java:412) at org.attoparser.MarkupEventProcessorHandler.handleCloseElementEnd(MarkupEventProcessorHandler.java:473) at org.attoparser.ParsingElementMarkupUtil.parseCloseElement(ParsingElementMarkupUtil.java:201) at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:725) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) ... 50 more Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1021E: A problem occurred whilst attempting to access the property 'name': 'Unable to access property 'name' through getter method' at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:209) at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:104) at org.springframework.expression.spel.ast.PropertyOrFieldReference.access$000(PropertyOrFieldReference.java:51) at org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:406) at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:92) at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:112) at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:338) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ... 75 more Caused by: org.springframework.expression.AccessException: Unable to access property 'name' through getter method at org.springframework.expression.spel.support.ReflectivePropertyAccessor$OptimalPropertyAccessor.read(ReflectivePropertyAccessor.java:708) at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:204) ... 82 more Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.expression.spel.support.ReflectivePropertyAccessor$OptimalPropertyAccessor.read(ReflectivePropertyAccessor.java:704) ... 83 more Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [jpabook.jpashop.domain.Member#1] - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:322) at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45) at org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95) at jpabook.jpashop.domain.Member$HibernateProxy$rzzDK9hn.getName(Unknown Source) ... 88 more MemberService Interface입니다. memberService 입니다. OrderService 입니다. 따로 추가작업이 필요할까요??,,
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
<컬렉션 조회 최적화> - '엔티티를 DTO로 변환 - 페치 조인 최적화' 단원에서 궁금한 점이 있습니다.
안녕하세요 영한님 강좌 잘 보고있습니다 :) 다름이 아니라 해당 <컬렉션 조회 최적화> - '엔티티를 DTO로 변환 - 페치 조인 최적화' 에서 궁금한점이 생겨 질문을 남기게 되었습니다. 컬렉션 조회시 해당 엔티티에서 1개이상 컬렉션을 조회하지 말라고 하셨고 이게 조인되면서 테이블이 뻥튀기 되니 우리가 원했던(기대했던) 데이터가 깨져서 조회될 수 있고 이게 DB의 한계때문에 어쩔수없다는점은 이해되었습니다. 그러면 1개 이상의 컬렉션을 가져야 하는 경우는 설계의 오류인것일까요? 위와같은 구조에서 A테이블은 B 와 1:N 관계이고 B 테이블은 C테이블과 1:N 관계이며 A -> B -> C 형태로 종속되어있는 구조가 있다고 예를 들어보겠습니다. 그러면 아래와 같이 쿼리를 날리게 된다면 SELECT a FROM A a FETCH JOIN B b FETCH JOIN b.c c 이것도 A가 1개 이상의 컬렉션을 가지고 있다고 보는것이 맞을까요? 긴글 읽어주셔서 감사합니다 좋은하루되세요 :)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
조회용 샘플 데이터 입력 시에 오류가 발생합니다
조회용 샘플 데이터를 입력하고 프로그램을 실행시켰는데 계속 오류가 나네요. 활용1편 코드도 확인해보았는데 전부 똑같은 것 같아 어떤 부분이 문제인지 모르겠어서 질문드립니다. 오류는 다음과 같아요 2022-04-12 22:01:11.692 ERROR 1637 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '2' for key 'item.PRIMARY' 2022-04-12 22:01:11.694 INFO 1637 --- [ restartedMain] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements 2022-04-12 22:01:11.701 WARN 1637 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initDb': Invocation of init method failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [item.PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 2022-04-12 22:01:11.701 INFO 1637 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2022-04-12 22:01:11.704 INFO 1637 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2022-04-12 22:01:11.717 INFO 1637 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2022-04-12 22:01:11.721 INFO 1637 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2022-04-12 22:01:11.740 INFO 1637 --- [ restartedMain] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-04-12 22:01:11.759 ERROR 1637 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initDb': Invocation of init method failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [item.PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.14.jar:5.3.14] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.14.jar:5.3.14] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.2.jar:2.6.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) ~[spring-boot-2.6.2.jar:2.6.2] at jpabook.jpashop.JpashopApplication.main(JpashopApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[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:567) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.2.jar:2.6.2] Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [item.PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:276) ~[spring-orm-5.3.14.jar:5.3.14] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) ~[spring-orm-5.3.14.jar:5.3.14] at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566) ~[spring-orm-5.3.14.jar:5.3.14] at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.14.jar:5.3.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.14.jar:5.3.14] at jpabook.jpashop.InitDb$InitService$$EnhancerBySpringCGLIB$$d0ace365.dbInit1(<generated>) ~[classes/:na] at jpabook.jpashop.InitDb.init(InitDb.java:20) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[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:567) ~[na:na] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.3.14.jar:5.3.14] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.3.14.jar:5.3.14] ... 23 common frames omitted Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3375) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3908) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:723) ~[na:na] at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1402) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:493) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3285) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2420) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ~[spring-orm-5.3.14.jar:5.3.14] ... 40 common frames omitted Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2' for key 'item.PRIMARY' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1098) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1046) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1371) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1031) ~[mysql-connector-java-8.0.27.jar:8.0.27] at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na] at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final] ... 61 common frames omitted
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO 조회 방식 질문있습니다!
안녕하세요! 강의 너무 잘 듣고 있습니다! 강의를 듣다가 DTO 조회 방식에 대해 헷갈리는 부분이 있어 질문드립니다. DTO 조회 방식은 엔티티가 아니기 때문에 지연로딩이나 페치 조인을 사용할 수 없다고 알고있습니다. 그럼 DTO 조회 방식은 단순히 DB에서 데이터를 가져와서 DTO의 필드에 값을 채워주는 방식이고, 이 때, 엔티티에는 값을 따로 할당하지 않는건가요?? 그렇다면 영속성 컨텍스트에도 DB에서 조회한 데이터가 들어가지 않나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 6분정도에서 무한루프관련이 안뜨고 에러가 떠서 질문드립니다.
이 링크를 참고해서 해결하려고 하였지만 같은 에러가 떠서 질문 드립니다...(LAZY가 있는 부분에 JSONIGNORE을 넣고 돌려도 아래와 같은 에러) 2022-04-11 22:58:57.672 ERROR 46887 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->jpabook.jpashop.domain.Order["member"]->jpabook.jpashop.domain.Member$HibernateProxy$nbghfZne["hibernateLazyInitializer"])] with root cause OrderSimpleApiController입니다. Order입니다. order에 LAZY가 있는 부분에 JSONIGNORE을 넣고 돌려도 같은 에러가 뜨는 부분입니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94/lecture/24325?tab=community&volume=1.00&quality=1080&speed=1.25&q=267403 에 있는 https://ahndding.tistory.com/24 링크를 참고하였습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
질문 드립니다.
현재 스프링 강의는 고급편 빼고 다 들었고, jpa는 활용 2편 공부하고 있습니다. 저는 아직 취준생이라 김영한님의 강의를 어디까지 듣고 취업활동을 시작해야할지 모르겠습니다.. 제가 목표하는 회사는 si업체가 아닌 중소 솔루션 회사입니다. 취업활동을 시작해야하는 기준점이 사람마다 다르겠지만.. 보편적인 기준이라도 말해주실 수 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
제네릭 클래스
안녕하세요, memberV2 메소드에서 return new Result(collect); 에 대한 부분을 잘 모르겠어서 질문드립니다. 제네릭 클래스 인스턴스를 생성할 때 클래스 내부에서 사용할 데이터 타입을 외부에서 지정해야하는 것이 아닌가요?? 영한님께서 11:36 초 쯤에 말씀하신 것 처럼 타입을 지정하지 않으면 알아서 Object 타입으로 되는 건지 정확한 동작 방식을 잘 모르겠습니다. 제가 제네릭에 대한 이해가 많이 부족한거 같아서 질문드립니다.ㅠㅠ 항상 답변 감사드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티를 DTO로 변환하는 단계 질문있습니다!
해당 단계는 controller에서 이루어지는게 좋은가요, service에서 이루어지는게 좋은가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
API 메서드 안에서 엔티티 조회
회원 수정을 할 때 수정하고 id를 통해서 Member 엔티티를 반환하는데 이런 경우에도 엔티티 대신 DTO를 만들어서 반환하는 게 좋을까요?? Member findMember = memberService.findById(memberId);MemberDTO findMember = memberService.findById(memberId); 결국엔 UpdateMemberResponse에 데이터를 담아서 반환하니까 엔티티를 받아서 사용해도 되는걸까요??
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
mapping 사용법
사용 에디터: VSCode V6 Flat 버전을 할 때에 mapping에서 toList()가 먹지를 않습니다. 정확한 에러는 toList() 메소드가 없다고 메소드를 만들어 달라고 합니다. mapping 사용법에는 Map<City, Set<String>> lastNamesByCity = people.stream().collect( groupingBy(Person::getCity, mapping(Person::getLastName, toSet()))); 위와 같이 to타입()으로 쓰는 것 같은데 왜 toList() 타입이 적용 안되는지 모르겠습니다. OrderApiController @GetMapping("/api/v6/orders") public List<OrderQueryDto> ordersV6() { List<OrderFlatDto> flats = orderQueryRepository.findAllByDto_flat(); return flats.stream() .collect(Collectors.groupingBy(o -> new OrderQueryDto(o.getOrderId(), o.getName(), o.getOrderDate(), o.getOrderStatus(), o.getAddress()), Collectors.mapping(o -> new OrderItemQueryDto(o.getOrderId(), o.getItemName(), o.getOrderPrice(), o.getCount()), toList()))).entrySet().stream() .map(e -> new OrderQueryDto(e.getKey().getOrderId(), e.getKey().getName(), e.getKey().getOrderDate(), e.getKey().getOrderStatus(), e.getKey().getAddress(), e.getValue())) .collect(Collectors.toList()); } OrderFlatDto package jpabook.jpashop.repository.order.query; import java.time.LocalDateTime; import jpabook.jpashop.domain.Address; import jpabook.jpashop.domain.OrderStatus; import lombok.Data; @Data public class OrderFlatDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private String itemName; private int orderPrice; private int count; public OrderFlatDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address, String itemName, int orderPrice, int count) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; this.itemName = itemName; this.orderPrice = orderPrice; this.count = count; } } OrderQueryDto package jpabook.jpashop.repository.order.query; import java.time.LocalDateTime; import java.util.List; import jpabook.jpashop.domain.Address; import jpabook.jpashop.domain.OrderStatus; import lombok.Data; import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(of = "orderId") public class OrderQueryDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; } public OrderQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address, List<OrderItemQueryDto> orderItems) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; this.orderItems = orderItems; } } OrderQueryRepository public List<OrderFlatDto> findAllByDto_flat() { return em.createQuery("select new jpabook.jpashop.repository.order.query.OrderFlatDto(o.id, m.name, o.orderDate, o.status, d.address, i.name, oi.orderPrice, oi.count)" + " from Order o" + " join o.member m" + " join o.delivery d" + " join o.orderItems oi" + " join oi.item i", OrderFlatDto.class) .getResultList(); }
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
h2 테이블 반영 안됨
혼자 개인으로 jpa 복습중입니다 그런데 로그 창에 sql 쿼리문도 확인했고 yml 도 들여쓰기도 잘되어있는데 h2에 반영이 안됩니다..ㅠ 도저히 원인을 모르겠어요 spring: datasource: url: jdbc:h2:./FirstPortfolio username: ssa password: sa driver-class-name: org.h2.Driver jpa: show-sql: true open-in-view: true hibernate: ddl-auto: create properties: hibernate: format_sql: truelogging: level: org.hibernate.SQL : debug org.hibernate.type : trace
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
deleteAll() 원리
테스트 코드를 실행시키기 전에 DB안의 데이터를 지우기 위해 deleteAll()을 사용하고 있습니다. deleteAll()을 사용하면 DELETE 쿼리가 출력되긴 합니다만, 예를 들어 memberService.deleteAll()을 실행시키고 나서 반영해주기 위해 em.flush()와 em.clear()을 사용해야 되는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
일대다 페치 조인과 페이징에 대해
안녕하세요! 일대다 패치조인을 진행하게 될시에, 다쪽의 갯수에 맞추어서 데이터가 뻥튀기, 즉 일쪽이 뻥튀기 된다는 사실을 인지하고 있습니다. 위 코드의 진행과정을 알고싶은데요, 위 처럼 일대다 페치 조인으로 데이터가 뻥튀긴 테이블이 완성되고 -> 뻥튀기 된 데이터들이 애플리케이션(메모리)에 올라가고 -> 거기에서 jpa가 이제 List<Order>에 담는것이 맞을까요? 이게 만약 맞다면, 일대다 패치조인시 페이징할때의 위험성과 같이 저것도 다 메모리에 올라가는 상황이 아닌가요?!, 아니면 제가 메모리의 개념을 잘 이해 못하고 있는지.. 답답하네요 ㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
distinct키워드와 페이징
jpa에서 distinct는 이제 애플리케이션 단에서 jpa가 중복을 제거해준다고 말씀해주셧는데, jpa에서 페이징을 할때 메모리에 다 올린후 페이징을 진행한다고 하셨는데, 여기서 "메모리"와 "어플리케이션 단"은 같은 말이라고 생각해도 될까요??!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
최근들어 공부방법에 대해 고민이 많습니다.
강의를 여기까지 진행을 했는데 예전에는 어느정도 이해는 했다 생각하는데.. 요즘들어는 잘 못따라간다 라는 생각이 듭니다. 이론적인 부분이야 엔티티를 노출하면 안좋다. 왜 안좋다 이해는 하겠는데 그렇게 해서 코드짜는거 보면 내가 저걸 구현할 수 있을까? 이런 생각이 자꾸 드네요. 그래서 좀 고민인게 로드맵을 끝까지 그냥 진행하고 다시 돌아와서 반복학습을 하는게 좋을까요 아니면 지금이라도 돌아가서 기반을 더 탄탄하게 만드는게 좋은 방법일까요? 요즘 방향없는 바다위의 나룻배가 된 것 같습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
querydsl 질문
안녕하세요 querydsl을 따라하는 중 build.gradle을 적용하는 과정에서 다음과 같은 에러가 나서 문의드립니다. A problem occurred configuring root project 'jpashop'. > Could not resolve all files for configuration ':classpath'. > Could not find gralde.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10. Searched in the following locations: - https://plugins.gradle.org/m2/gralde/plugin/com/ewerk/gradle/plugins/querydsl-plugin/1.0.10/querydsl-plugin-1.0.10.pom If the artifact you are trying to retrieve can be found in the repository but without metadata in 'Maven POM' format, you need to adjust the 'metadataSources { ... }' of the repository declaration. Required by: project : Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 내역 페이지 문의
강의를 진행하던 중 궁금한 부분이 있어서 질문합니다. 아래 사진과 같이 대표상품주문수량의 글이 왜 저렇게 출력되는지 모르겠습니다! 화면 창 크기와는 관련 없는거 같습니다! 프로젝트 압축 폴더 주소는 https://drive.google.com/file/d/1V6hn7NUWdGVv5fnD2gBm3f29jE-KORPd/view?usp=sharing 입니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의를 듣고 비슷하게 구현 하다가 질문 남깁니다 ㅠㅠ..
강의를 한번 듣고 비슷하게 구성을 짜서 구현하려고 하다가 저장을 어떻게 해야할지 모르겠어서 질문드립니다 ㅠㅠ.. 엔티티 A 가 있고, A의 pk를 fk로 가지고 있는 엔티티 B를 A가 List<> 형태로 가지고 있을경우 즉 A에 한 인자가 List<B> 일경우 A를 List<B> 까지 세팅하여 save를 하게 되면 B에 A에 대한 fk가 빠져서 들어가는것 같은데 이런경우 어떻게 저장을 해야 하나요?? A를 저장 이후 B의 fk를 업데이트 하려면 B를 select 해서 A에 접근하여 A setter를 넣어야 해서 A,B 테이블에 세터가 각각 들어가게 되고 코드가 이상해 지는 것 같습니다 ㅠㅠ.. 이런경우 어떻게 저장을 해야 하나요?