30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
6분 무한루프가 뜨지않습니다.
안녕하세요 선생님 강의를 진행하던도중 에러를 만나 해결해보려 하였으나. 해결이 되지않아 질문드립니다. 해당오류를 검색하여 해결방법을 찾아본 결과 1. 엔티티의 fetch 가 lazy로 되어있으면 생긴다고 하여 EAGER로 바꾸어 보았지만 해결하지못해 질문드립니다. 오류코드입니다. 2021-07-26 23:48:13.214 ERROR 6092 --- [nio-8080-exec-2] 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["orderItems"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem["item"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI["hibernateLazyInitializer"])] with root cause 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["orderItems"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem["item"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI["hibernateLazyInitializer"]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1277) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:400) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1512) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1006) ~[jackson-databind-2.11.4.jar:2.11.4] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:454) ~[spring-web-5.3.5.jar:5.3.5] at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.3.5.jar:5.3.5] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:290) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-5.3.5.jar:5.3.5] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.5.jar:5.3.5] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.5.jar:5.3.5] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.44.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.5.jar:5.3.5] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.44.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.44.jar:9.0.44] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.5.jar:5.3.5] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.5.jar:5.3.5] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.5.jar:5.3.5] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] 여기서부터는 POSTMAN에 뜨는 오류입니다. "timestamp": "2021-07-26T14:48:13.221+00:00", "status": 500, "error": "Internal Server Error", "trace": "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[\"orderItems\"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem[\"item\"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI[\"hibernateLazyInitializer\"])\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:460)\n\tat org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104)\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:290)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181)\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:626)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\nCaused by: 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[\"orderItems\"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem[\"item\"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI[\"hibernateLazyInitializer\"])\n\tat com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)\n\tat com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1277)\n\tat com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)\n\tat com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71)\n\tat com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33)\n\tat com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)\n\tat com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)\n\tat com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)\n\tat com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)\n\tat com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)\n\tat com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)\n\tat com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)\n\tat com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)\n\tat com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)\n\tat com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)\n\tat com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:400)\n\tat com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1512)\n\tat com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1006)\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:454)\n\t... 48 more\n", "message": "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[\"orderItems\"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem[\"item\"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI[\"hibernateLazyInitializer\"])", "path": "/api/v1/simple-orders""timestamp": "2021-07-26T14:48:13.221+00:00", "status": 500, "error": "Internal Server Error", "trace": "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[\"orderItems\"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem[\"item\"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI[\"hibernateLazyInitializer\"])\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:460)\n\tat org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104)\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:290)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181)\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:626)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\nCaused by: 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[\"orderItems\"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem[\"item\"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI[\"hibernateLazyInitializer\"])\n\tat com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)\n\tat com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1277)\n\tat com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)\n\tat com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71)\n\tat com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33)\n\tat com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)\n\tat com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)\n\tat com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)\n\tat com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)\n\tat com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)\n\tat com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)\n\tat com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)\n\tat com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)\n\tat com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107)\n\tat com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)\n\tat com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)\n\tat com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:400)\n\tat com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1512)\n\tat com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1006)\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:454)\n\t... 48 more\n", "message": "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[\"orderItems\"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.domain.OrderItem[\"item\"]->jpabook.jpashop.domain.item.Item$HibernateProxy$RxqT9FxI[\"hibernateLazyInitializer\"])", "path": "/api/v1/simple-orders"
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Update 질문
안녕하세요. 강사님 강의 듣고 프로젝트에 적용시켜 보고 있습니다. 만약 예를들어, 상품 테이블과 추가상품 테이블이 1대 다 관계로 있다고 가정하고, 판매자 입장에서 상품을 등록한다고 합니다. 추가상품은 상품 테이블의 pk를 외래키로 받고, 예를들어 [{볼펜 : 3개}, {공책 : 2개}, {지우개 : 4개}] 이런식으로 등록된다고 합니다.(컬럼은 추가상품과 개수. 2개가 되겠죠) 그런데 여기서 판매자가 상품을 수정할때, 추가상품도 동시에 수정할수 있는데 [{볼펜 : 3개}, {공책 : 2개}, {파일 : 2개}] 이런식으로 개수가 똑같은 상태에서 수정될 경우에는 문제 없이 되는데 [{볼펜 : 4개}, {파일 : 1개}] 추가상품의 개수를 3개에서 2개로 줄이거나, 3개에서 4개로 늘려버린다면, 이럴 경우에는 상품 수정을 어떻게 해야하나요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ObjectOptimisticLockingFailureException
안녕하세요. 좋은 강의 제공해주셔서 감사합니다. 지금은 강의를 바탕으로 개발을 진행하고 있는데요. 궁금한 점이 생겨서 질문을 남겨봅니다. Spring Boot에 spring-data-jpa를 사용하고 있습니다. 2개의 API가 동시에 들어와 같은 row를 삭제하는 상황입니다. 이 때, 하나의 트랜잭션에서 ObjectOptimisticLockingFailureException이 발생하는데요. select한 값에 대해서 다른 트랜잭션이 이미 delete하여 delete할 row가 없다는 에러로 확인했는데요. 보통 spring-data-jpa로 delete하실 때, jpql을 사용해서 바로 delete native query가 날라가게 하시는지, 아니면 해당 에러를 따로 처리하는 방법이 있으신지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 V5 방식을 현재 강사님 SPRING DATA JPA를 듣고 변환해보려고 하는데요~
강사님 jpa활용2 수강을 마치고 강사님의 데이터 JPA 페이징 부분들 듣고있는데요~ 현재 JPA활용2편 에 페이징 V5 부분 (DTO 직접조회) 를 SPRING DATA JPA로 페이징 해보려합니다 결과 이렇게 V5의 MAP을 이용한 성능최적화를 Spring data jpa 방식으로 바꿔보았습니다. 이렇게해서 결과는 잘나옵니다만 이렇게하는것이 옳은 것 인지 확신이안가 질문남깁니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문조회 V3.1을 현재듣고있는 스프링데이터 JPA 식으로 바꿔보고싶습니다
삭제된 글입니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA 조회시 트랜잭션 관련 문의입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강의를 다 들은 학생입니다. JPA OrderApiController 쪽 수업을 들으면서 궁금한점이 생겼는데, 기존에는 Service 단에서 @Tranctional 어노테이션을 통해 트랜잭션을 가져오는 것으로 알고있습니다. 그런데 OrderApiController에서 바로 OrderRepository를 통해 em.createQuery로 데이터를 조회하는데 트랜잭션이 사용되지 않는것 같더라구요. JPA를 사용할때 단순히 조회만 하는 경우에는 트랜잭션이 필요가 없는 건가요?? 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
"엔티티 조회" 의미 질문 드립니다.
안녕하세요 강의 잘 보고 있습니다~!^^ 엔티티를 직접 노출하면 안된다고 배웠고, 그래서 지금까지 줄곧 DTO를 생성, 변환해서 API를 설계했는데요. 이번 API 개발 고급 정리에서는 DTO를 생성해서 처리하는 것보다 JPA에서 자동 처리해주는 혜택을 받으면서 엔티티로 조회하는 것이 더 괜찮을 선택일 수도 있다고 이해했습니다. 그런데 이 엔티티를 조회한다는 것이 API에서 엔티티를 직접 사용한다는 것인가요? "엔티티 조회" 가 "엔티티 직접 노출"은 아닌 것 같은데 어떤 맥락에서 "엔티티 조회"를 말하는 것인지 궁금합니다. 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa 숙련도 향상 관련
영한님이 조언해주신 것 처럼 Spring data jpa 익히기 전에 JPA 먼저 제대로 숙지하고 넘어가고자 하는데요. 강의에서 빠른 수업 진행을 위해 간략히 구성한것들 full로 구현해보는 것 외에 추가적으로 학습하기 좋은 방법이 잇을까요? 개인적으로 공부하는거라 실무에 적용해 볼수가 없어 질문드립니다. 답변주시면 감사드리겠습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 선생님 V2방식에대한 질문
회원등록 V2 방식을 그대로 사용하고 POSTMAN에서 POST방식으로 BODY안에 CreateMemberRequest 클래스의 필드와 같은값으로 데이터를 전송해봤습니다. 그런데 기본생성자가 없을경우에는 "org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class jpashops.ormonetwocombine.dto.RequestItemDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `jpashops.ormonetwocombine.dto.RequestItemDto` 포스트맨 에러입니다 이런 에러 구문이 나오더군요, 그런데 기본생성자를 CreateMemberRequest에 추가해주고 다시 Postman으로 전송하더니 잘되더군요, 받아온 JSON 데이터를 파싱하는데 기본생성자가 원래 필수인가요~?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
선생님 회원 등록에대해 질문이 있습니다
DTO 두개로 회원의 (데이터를 받고) (반환) 하는 이유가 반환할때는 필요한 필드만 따로 찝어서 반환할 수도 있기 때문일까요? DTO를 한개만만들어두고 데이터를받고 반환해도 될거같아서요~~
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1:1 관계 left join 관련 stream 관련 질문.
QueryDsl로 answer를 leftjoin하는데. DTO로 변환하는 과정에서 Answer 객체의 answerId나, answerContent를 불러오면 자꾸 NullPointerException 문제가 발생합니다. 일대다였으면 그냥 null로 처리되는데... 일대일은 stream으로 데이터를 변환하는 과정에서 NullPointer 문제가 발생하는 것 같습니다. projection할 때만, null 문제가 발생 안 하고, Answer 엔티티의 null 데이터까지 정상적으로 나오더군요. 계속 1:1 관계에서 leftJoin을 할 때는 projection을 해야하는건가요? 아니면 DTO로 변환 시, stream을 돌릴 때 무슨 filter 처리를 해야하는건가요? stream 문법에 너무 익숙치 않아서 조언을 구합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
orderitem 내 item 초기화 관련
초기화 진할때 forEach로 하면 초기화가 되는데, 같은 방법을 map으로 루핑하면 초기화가 안됩니다. 어떤 차이 때문에 안되는 걸까요? forEach는 실행시 내부 array들의 값을 직접 변경하고, map은 새 array를 생성하는데 여기서 오는 차이일까요? @RestController@RequiredArgsConstructorpublic class OrderApiController { private final OrderRepository orderRepository; @GetMapping("api/v1/orders") public List<Order> ordersV1(){ List<Order> orders = orderRepository.findAllByString(new OrderSearch()); for (Order order: orders){ order.getMember().getName(); order.getDelivery().getAddress(); order.getOrderItems().stream() .forEach(orderItem -> orderItem.getItem().getName());// order.getOrderItems().stream()// .map(orderItem -> orderItem.getItem().getName()); } return orders; }}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA , SPRING DATA JPA
예제들로 JPA 완벽히 숙지하고 나서 SPRING DATA JPA학습하는게 좋을까요? 아니면 SPRING DATA JPA 공부하고 두개 적절히 쓰는게 좋은가요 실제 업무에서 두개의 활용도가 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1편 프로젝트 소스코드 복붙 후 파라미터 타입 에러 질문드립니다~!
안녕하세요 강의 잘 듣고 있습니다~! 활용1편을 듣고 와서 1차 완성된(?) 프로젝트가 있습니다. 2편은 1편에서 좀더 성능 최적화해서 발전시키는 것 같은데 저는 1편 프로젝트는 그대로 두고 1편을 프로젝트를 그대로 복사해서 2편을 새로운 프로젝트로 생성해서 발전시켜나가고 싶어서요. start.spring.io에서 프로젝트를 새로 생성한 후, 1편에서 만들었던 소스코드를 모두 복사하고, 소스코드 내에서 프로젝트 이름도 모두 변경해주었습니다. 그런데 대부분 정상적으로 복붙이 된 것 같은데 Orderservice에서 OrderRepository를 사용하는 부분에서 매개변수로 객체 인스턴스를 넘겨주는데에서 에러가 발생합니다. 예를 들어 주문을 저장하는 orderRepository.save(order); 부분에서 나타나는 오류 메시지는 'Change variable 'order' type to 'Order'' 라고 나옵니다..다른 오류들도 이런 오류이구요.. 어디서 설정 같은 것이 잘 못됐는지 모르겠습니다..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V5 에서 질문이있습니다.
여기서 oi.order.id in 을사용하셨는데욤 이곳은 배치사이즈가 안먹히나요?~~ 배치사이즈설정도 in 쿼리로 나가는걸로 이해를해서요~ List<OrderItemQueryDto> orderItems = em.createQuery( "select new jpabook.jpashop.repository.order.query.OrderItemQueryDto " + " ( oi.order.id, i.name, oi.orderPrice, oi.count )" + "from OrderItem oi " + " join oi.item i " + " where oi.order.id in :orderIds ", OrderItemQueryDto.class) .setParameter("orderIds", orderIds) .getResultList();
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요!! v3.1 , v4 의 방식에서 의아한점이있는데욥
v3.1에서는 join fetch 를사용한 이유는 Order에대한 모든 객체그래프를 조회하기때문이고, v4에서는 필요한 필드만 콕콕집어 조회를 해야하기때문에 join fetch를 사용하지 못하는건가요? join fetch는 모든 객체그래프를 끌어오는거니까요~? v4 return em.createQuery( "select new jpabook.jpashop.repository.order.query.OrderItemQueryDto " + " ( oi.order.id, i.name, oi.orderPrice, oi.count )" + "from OrderItem oi " + " join oi.item i " + " where oi.order.id = :orderId ",OrderItemQueryDto.class) v3.1 return em.createQuery( " select o from Order o" + " join fetch o.member m " + " join fetch o.delivery d ", Order.class)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Repository 질문입니다.
안녕하세요 강사님. 강의 잘 듣고 있습니다. 궁금한점이 생겨 질문 드립니다. 회원 조회할때는 MemberService를 이용하여 회원을 조회하셨는데, 주문조회할때는 OrderRepository를 이용하여 조회하신 이유가 무엇인지 궁금합니다. DB에 접근하는것은 Repository에, 접근한 데이터를 이용하여 비즈니스 로직을 짜는것은 Service에 둔다고 알고있는데 왜 member쪽 controller에서는 Service를 이용하셨고, Order쪽 Controller에서는 Repository를 이용하셨는지 모르겠습니다. 2. api/v1/simple-orders에서 order.getMember().getName()에서도 질문이 있는데, order.getMember()까지는 지연로딩으로 인해서 Member의 프록시 객체가 넘어오고, order.getMember().getName()에서는 프록시 객체가 아직 실제 엔티티를 가리키지 않는(아직 데이터가 없는 상태)상황에서 Member의 내부 함수를 호출함으로 인해 프록시가 초기화된다고 이해했습니다. 그럼 여기서 초기화하기 위해서 getName이든, 아니면 꼭 getName이 아니어도 프록시는 초기화 된다고 봐도 되는게 맞는것인지 궁금하고, order.getMember.getName()에서 getName()은 프록시객체를 초기화할 목적이었으므로 api/v1/simple-orders를 포스트맨으로 get요청을 보냇을때, Member의 전체 데이터가 나오는게 맞는건지 궁금합니다. order.getMember().getName()이 프록시를 초기화할 목적이었더라도 get요청에서는 member의 name데이터만 나올줄 알았는데(getName), address데이터까지 모조리 다 나오니 조금 의문이 들었습니다. 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
dto 에서의 setter 필요여부 질문입니다.
앞서 활용 1편에서 무분별한 세터는 코드의 유지보수를 떨어뜨린다고 하셨는데요, 그렇다면 혹시 dto에서도 세터의 사용을 지양하는 방법도 실무에서 사용되는지 궁금합니다. 저는 아래처럼 최초 생성시에만 값을 할당하는 방식입니다. @Getterstatic class JoinMemberResponse { private final Long id; public JoinMemberResponse(Long id) { this.id = id; }}
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
default_batch_fetch_size의 원리가 궁금합니다!
안녕하세요 영한님! 페이징과 한계돌파 부분을 수강하면서 질문하고 싶은 내용이 생겨 남기게 되었습니다. default_batch_fetch_size=n 으로 지정할 경우, 컬렉션에서 n개씩 값을 가져오는 것으로 이해하였습니다. 코드로 그 과정을 살펴보면, List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) 을 통해서 각각의 order를 순회하면서 OrderDto의 생성자를 호출하고, 생성자 안에서 orderItems = order.getOrderItems().stream() .map(orderItem -> new OrderItemDto(orderItem)) 이렇게 orderItem을 순회하면서 OrderItemDto를 만들고, public OrderItemDto(OrderItem orderItem) { itemName = orderItem.getItem().getName(); orderPrice = orderItem.getOrderPrice(); count = orderItem.getCount();} 최종적으로 OrderItemDto의 생성자 안에서 orderItem.getItem().getName() 를 호출하면서 orderItem과 그 안의 Item이 지연로딩되는 것으로 이해하였습니다. 그렇다면 JPA는 default_batch_fetch_size=n으로 인해 어떤 n개의 orderItem을 쿼리로 요청할지 결정해야 하는데, 이는 어떠한 방식으로 이루어지는 것인가요? 위와 같이 iteration을 돌면서 요청 보낼 orderItem의 id를 하나하나 모았다가 n개가 다 차게 되면 쿼리를 보내는 식인지, 아니면 다른 방식으로 결정이 되는 것인지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
pk가 아닌 컬럼과 join으로 인한 문제
CREATE TABLE team ( id integer NOT NULL, name character varying(100) NOT NULL, team_id integer, CONSTRAINT team_pkey PRIMARY KEY (id) ); CREATE TABLE member ( id integer NOT NULL, team_id integer NOT NULL, name character varying(100) NOT NULL, CONSTRAINT member_pkey PRIMARY KEY (id), CONSTRAINT member_team_id FOREIGN KEY (team_id) REFERENCES team (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION NOT VALID ); ------------------------------------------------------------------------------------------------------------------ @Data @Entity @Builder @AllArgsConstructor @NoArgsConstructor @Table( name = "team" ) public class Team implements Serializable{ @Id @GeneratedValue(generator = "incrementSeq") @GenericGenerator(name="incrementSeq", strategy = "org.hibernate.id.IncrementGenerator") @Column(name = "id", nullable = false) private int id; @Column(name="name", length = 20) private String name; @Column(name="team_id") private int teamId; @OneToMany( mappedBy = "team", cascade = CascadeType.ALL, fetch = FetchType.LAZY ) private List<Member> members = new ArrayList<Member>(); } ------------------------------------------------------------------------------------------------------------------ @Data @Entity @Builder @AllArgsConstructor @NoArgsConstructor @Table( name = "member" ) public class Member{ @Id @GeneratedValue(generator = "incrementSeq") @GenericGenerator(name="incrementSeq", strategy = "org.hibernate.id.IncrementGenerator") @Column(name = "id", nullable = false) private int id; @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL) @JoinColumn(name = "team_id", referencedColumnName = "team_id") private Team team; @Column(name="name", length = 20) private String name; } 테이블 구조와 Class는 구성입니다. 테스트 중 oneToMany에 문제점이 있어 이를 해결할수 있는 방법을 알고싶어 문의 드립니다. QueryResults<Team> result = queryFactory .selectFrom(team) .leftJoin(team.members, member) .fetchJoin() .fetchResults(); result.getResults().get(0); result.getResults().get(0).getMembers(); fetchJoin시 쿼리 확인결과 select team0_.id as id1_22_0_, members1_.id as id1_2_1_, team0_.name as name2_22_0_, team0_.team_id as team_id3_22_0_, members1_.name as name2_2_1_, members1_.team_id as team_id3_2_1_, members1_.team_id as team_id3_2_0__, members1_.id as id1_2_0__ from scop.team team0_ left outer join scop.member members1_ on team0_.team_id=members1_.team_id; 전체 left outer join 쿼리가 나가고 select team0_.id as id1_22_0_, team0_.name as name2_22_0_, team0_.team_id as team_id3_22_0_ from scop.team team0_ where team0_.team_id=? team 갯수만큼 쿼리가 나가는 문제점을 확인하였습니다. team_id가 pk가 아닌 컬럼과 fk로 oneToMany일때 이러한 현상이 발상하는데 pk가 아닌 컬럼과 조인할 경우 이러한 문제를 해결 할 수 있는 방법이 있는지 궁금합니다.