묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
왜 @Enumerated 타입 디폴트값이 ORDINAL 일까요?
말씀대로 ORDINAL일 때 이점이 될 경우가 거의 없을거 같은데 왜 디폴트값이 이걸로 설정되있는지 궁금하네요 실무에서도 일일히 Enum 타입을 STRING으로 지정해야 하는게 은근히 불편할것 같은데 혹시 추후에 바뀔 가능성은 없을까요? ㅋㅋ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http 요청을 보낼때마다 request, response 객체의 주소값이 변하지 않는 이유?
안녕하세요 강의 정말로 잘 듣고 있습니다! 정말 별거 아닌 질문일 수 있는데 궁금해서 질문 남겨봅니다. 서블릿에서 Request 객체와 Response 객체는 HTTP 요청이 들어올때마다 새로 생성한다고 했는데, 왜 요청을 줄때마다 같은 주소값이 찍히는건가요? 한번 요청 - 응답 하고나면 끝이고 다시 페이지 새로고침을 하면 새로운 HTTP 요청이 가서 새로운 response, request 객체가 생성되야 하는게 아닌지 궁금합니다!! 그냥 WAS에 구현체가 싱글톤으로 있어서 요청이 올때마다 덮어써서 보내주는 방식?? 그런건가요? 스프링, HTTP 지식이 부족해서 나온 너무 이상한 질문이었을지도 모르겠네요 ㅠㅠㅠ..
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
An error happened during template parsing (template: "class path resource [templates/order/orderList.html]") 에러 문의
안녕하세요. 상품 주문 시 에러 관련해서 문의드립니다. 시간되실 때 확인 한번 부탁드립니다.. Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sun Sep 12 09:02:21 KST 2021 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:362) at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1394) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1139) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) 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:626) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) 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:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "item.member.name" (template: "order/orderList" - line 43, 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 43, col 21) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:290) 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:337) at org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:263) ... 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:170) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:310) 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$Dlx421be.getName(Unknown Source) ... 88 more <td th:text="${item.member.name}"></td><td th:text="${item.orderItems[0].item.name}"></td><td th:text="${item.orderItems[0].orderPrice}"></td><td th:text="${item.orderItems[0].count}"></td> 이 쪽을 전부 못가져오고 있습니다. DB에는 값이 들어가있습니다. @Controller@RequiredArgsConstructorpublic class OrderController { @PostMapping("/order") public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, @RequestParam("count") int count){ System.out.println("parameter:" + memberId); System.out.println("parameter:" + itemId); System.out.println("parameter:" + count); orderService.order(memberId, itemId, count); return "redirect:/orders"; } //https://heydoit.tistory.com/7 - Parameter로 받을 때 ModelAttribute, RequestParam은 생략할 순 있으나 적는 것이 바람직하다. @GetMapping(value = "/orders") public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model) { List<Order> orders = orderService.findOrders(orderSearch); model.addAttribute("orders", orders); return "order/orderList"; }} @Service@Transactional(readOnly = true)@RequiredArgsConstructorpublic class OrderService { //@Autowired가 아닌 @RequiredArgsConstructor를 통해 주입받기 위해서는 final로 선언해야한다. private final OrderRepository orderRepository; private final MemberRepository memberRepository; private final ItemRepository itemRepository; @Transactional public Long order(Long memberId, Long itemId, int count) { //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); //배송정보 생성 Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); delivery.setStatus(DeliveryStatus.READY); //주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); //주문 생성 Order order = Order.createOrder(member, delivery, orderItem); //주문 저장 orderRepository.save(order); return order.getId(); } //취소 @Transactional public void cancleOrder(Long orderId) { //주문 엔티티 조회 Order order = orderRepository.findOne(orderId); //주문 취소 order.cancel(); } //검색 public List<Order> findOrders(OrderSearch orderSearch) { return orderRepository.findAllByString(orderSearch); }} @Entity@Table(name = "orders")@Getter @Setterpublic class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; //주문 회원 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; //배송정보 private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] //==연관관계 메서드==// public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } //==생성 메서드==// public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //==비즈니스 로직==// /** 주문 취소 */ public void cancel() { if (delivery.getStatus() == DeliveryStatus.COMP) { throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다."); } this.setStatus(OrderStatus.CANCLE); for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } //==조회 로직==// /** 전체 주문 가격 조회 */ public int getTotalPrice() { int totalPrice = 0; for (OrderItem orderItem : orderItems) { totalPrice += orderItem.getTotalPrice(); } return totalPrice; }} @Entity@Table(name = "orders")@Getter @Setterpublic class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; //주문 회원 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; //배송정보 private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] //==연관관계 메서드==// public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } public void cancel() { if (delivery.getStatus() == DeliveryStatus.COMP) { throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다."); } this.setStatus(OrderStatus.CANCLE); for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } public int getTotalPrice() { int totalPrice = 0; for (OrderItem orderItem : orderItems) { totalPrice += orderItem.getTotalPrice(); } return totalPrice; }} @Entity@Table(name = "order_item")@Getter @Setterpublic class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; //주문 상품 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; //주문 private int orderPrice; //주문 가격 private int count; //주문 수량 public static OrderItem createOrderItem(Item item, int orderPrice, int count) { OrderItem orderItem = new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; } public void cancel() { getItem().addStock(count); } public int getTotalPrice() { return getOrderPrice() * getCount(); }} @Entity@Getter @Setterpublic class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>();} List<Order> orders = orderService.findOrders(orderSearch);orders.forEach((o) -> { System.out.println(":::::::"); System.out.println(o.getTotalPrice()); System.out.println(o.getDelivery()); System.out.println(o.getId()); System.out.println(o.getOrderDate()); System.out.println(o.getMember()); System.out.println(o.getOrderItems()); System.out.println(o.getStatus());});model.addAttribute("orders", orders);return "order/orderList";//컨트롤러에서 orders 로그찍었을 때 결과org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: jpabook.jpashop.domain.Order.orderItems, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:387) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] at jpabook.jpashop.domain.Order.getTotalPrice(Order.java:69) ~[main/:na] at jpabook.jpashop.controller.OrderController.lambda$orderList$0(OrderController.java:58) ~[main/:na] at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] at jpabook.jpashop.controller.OrderController.orderList(OrderController.java:56) ~[main/: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.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 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.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
프리젠테이션 질문
안녕하세요 너무 좋은 강의 감사합니다. 관련 전공은 아니지만 이번 강의 덕분에 멋진 사이트가 하나하나 만들어져 가는 데 희열을 느낍니다. 더불의 강의 중 심플하면서 눈에 쏙쏙 들어오는 프리젠테이션도 참 좋은 데요 그냥 일반 PPT로 만드신건가요? 아님 다른 프로그램으로 만드신건가요? 그리고 색감같은 것은 따로 공부를 하신건가요? 저도 강의할 때 한번 사용해보고 싶어서요... 꼭 답변 부탁드립니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
image 전송과 함께 데이터는 json으로 보내고 싶은 경우
restAPI에서 image 와 함께 데이터를 같이 보낼때, 보내려는 데이터가 많이 복잡할 경우에는 json으로 보내는 것이 좋을 것 같아 json으로 보내는 방법을 시도해봤는데요 @RequestPart DTO dto 이런식으로 dto를 직접 넣었을때는기본적으로 requestData가 formdata 형식이라 그런지 리졸버가 아예 처리를 하지 못하고, request를 받지 않는 것 같습니다. 그래서 아래와 같이 json의 경우 string으로 받아 테스트 해보았는데요 @PostMapping// @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) public ResponseEntity<ResponseOKDto<PostResponseDto>> post( @RequestPart("data") String data, @RequestPart("file") MultipartFile file, @ApiIgnore HttpSession session) throws IOException { Account account = getSessionCheckedAccount(session); if(!file.isEmpty()){ String path = session.getServletContext().getRealPath("/") + "images/" + file.getOriginalFilename(); file.transferTo(new File(path)); } String o = objectMapper.readValue(data, String.class);// objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); PostRequestDto postRequestDto = objectMapper.readValue(data, PostRequestDto.class); Long postId = postService.post(postRequestDto.getTitle(), postRequestDto.getDesc(), postRequestDto.getPrice(), postRequestDto.getCategoryTag(), account); return new ResponseEntity<>(new ResponseOKDto<>( new PostResponseDto(postId)), HttpStatus.OK); } 이와 같이 포스트맨으로 data를 보냈을 때, 스트링으로 받은 data를 오브젝트 매퍼를 이용해서 바로 DTO로 변환해보니 jackson에서 변환할수 없다는 익셉션이 떠 (Unexpected character ('\' (code 92)): was expecting double-quote to start field name) 디버깅을 해보니 object mapper를 이용해 String으로 한번 변환하고 다시 dto로 변환해야만 잘 동작 했습니다. 아래와 같이 데이터를 ""로 감싸주지 않은 경우에는 해당 에러가 출력되었고요 no String-argument constructor/factory method to deserialize from String value ('{"title":"test","desc":"test","price":10,"categoryTag":"Digital"}') at [Source: (String)""{\"title\":\"test\",\"desc\":\"test\",\"price\":10,\"categoryTag\":\"Digital\"}""; line: 1, column: 1] 제가 했던 접근 방식은 문제점이 일단 2개가 보이는데 - 스트링으로 한번 더 변환을 해줘야해 복잡하다 - 들어온 data 값에 대해 @Validated 를 적용하지 못한다. Q1. 다른 방식으로 data를 json형식으로 받아오고 dto에 대한 validtaion을 적용할 수 있는 방법이 있을까요? Q2. 필드가 아주 많을 경우에 form으로 하나씩 받는건 너무 코드가 지저분 해지는 것 같은데, 벨리데이션과 함께 적용하려면 이렇게 해야하는 걸까요? Q3. objectMapper로 두번 변환 대신에 doubleQuetoALLOW 옵션을 주었는데도 에러가 떴는데, 더블쿼터 에러를 해결할 수 있는 방법이 있을까요? 답변주시면 감사드리겠습니다. 항상 좋은 강의해주셔서 감사합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Controller service
1.아키텍처 중 service와 contrioller의 차이는 무엇인가? 혹시 api개발이 되는곳이 controller 인가요? 2. Mvc 라고할때 model에 해당하는 부분이 아키텍처에서는 domain인가요? 감사합니다
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
res 안에 status
const res 객체안에 status 를 jest.fn() 이 아닌 jest.fn(() => res) 를 넣어주는 이유가 뭔가요?? 그리고 안의 res의 의미도 궁금합니다.
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
스프링 플라스크 질문
안녕하세요, 다름이 아니라 실무에서 플라스크 스프링의 차이점이 궁금합니다. 아무래도 스프링의 범용성이 더 넓은 것으로 알고 있는데.. 실무에서는 두 프레임워크가 어떠한 면에서 어떤 차이점이 존재하는지 감이 잘 안오네요... 어떤 개발자 커리어를 지향하느냐에 따라서 프레임워크의 선택도 달라질거라 생각이 되는데... 감이 잘 안옵니다! 항상 훌륭한 강의 잘 수강하고 있습니다. 감사합니다!
-
미해결iOS/Android 앱 개발을 위한 실전 React Native - Basic
리액트 네이티브 웹뷰 질문입니다
리액트네이티브를 가지고 프로젝트를 진행중입니다. 리액트로 웹을 만드는것은 어느정도 익숙한데요. 이번에 앱을 만드는 것은 처음입니다. 그러던중 webview 라는 것을 알게 되었습니다. react 환경에서 웹앱을 만들고 리액트 네이티브 webview 를 이용해서 앱 개발 배포로 어플리케이션 프로젝트 진행이 가능할까요?
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
AmazonS3FileInterceptor의 dynamicPath 에러
수업 내용의 4분정도까지 잘 따라오다가, dynamicPath에 에러가 발생했습니다. 라이브러리도 제대로 설치하고 문제없이 코드를 작성한 것 같은데 에러가 떳네요. 뭐가 문제인지 모르겠어서 질문 남깁니다. 에러 내용입니다. --- error TS2345: Argument of type '{ dynamicPath: string; }' is not assignable to parameter of type 'MulterExtendedOptions'. Type '{ dynamicPath: string; }' is missing the following properties from type 'MulterExtendedOptions': fileFilter, limits 74 AmazonS3FileInterceptor('image', { ~ 75 dynamicPath: 'cats', --- 상세 소스는 https://github.com/GroundP/CatsCommunity를 참고 해주세요!
-
미해결[비전공자 대환영] 제로베이스도 쉽게 입문하는 파이썬 데이터 분석 - 캐글입문기
선생님 문의드립니다.
안녕하십니까. 선생님 수업을 듣다가 궁금한 점이 생겨서 질문드립니다. 진짜 재난뉴스 분류 대회 강의를 수강하면서 다른 대회에도 참여해보고 싶다는 생각이 들었습니다. 혹시 이 대회 이후에 kaggle에 있는 텍스트 기초, 꼭하면 좋을 것 같다는 대회가 있다면 추천 가능할까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:field의 의미
addForm 에서 등록 지역 선택 버튼을 만들 때 th:field = "*{regions}"라고 하면 넘어오는 item의 regions는 비어있는 list이지 않나요? 근데 왜 regions라는 id가 생성되는 거죠?? th:field의 정확한 기능이 무엇인가요?
-
미해결그림으로 배우는 쿠버네티스(v1.35)
master 노드가 2대 이상 일때 apiserver-advertise-address 는 어떻게 지정하나요?
master 노드가 2대 이상 일때 apiserver-advertise-address 는 어떻게 지정하나요?
-
미해결코딩테스트 실전 모의고사(with C++) : 대기업 대비
a.find 함수 대신 string a를 for 루프로 탐색해도 시간복잡도가 괜찮을까요?
안녕하세요, 선생님! 오늘도 강의를 잘 듣고 있습니다. 다름이 아니오라 이 문제를 a.find 함수 대신 string a를 for루프로 캐릭터 탐색해서 문제를 풀었는데요. 시간복잡도에 큰 차이는 없을까요? 면접시 find 함수가 생각이 안나면 이렇게라도 풀어 제출해야 될것 같아서요. 아니면 find함수가 생각이 안날때 대체할수 있는 다른 좋은 방법이 있을까요? 감사합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Spring Cloud Configuration 서버 장애시 작동원리
여러 마이크로 서비스의 환경 프로퍼티를 한곳에서 관리하고 동적으로 변경할수 있는 방법은 참 좋은것 같은데, 이 GIT으로 관리되는 저장소 혹은 Spring Cloud Configration 서버가 내려갔다거나 하면 어떻게 되는 건가요? 모든 마이크로서비스가 장애후 재시작이 안된경우는 이미 가져온 프로퍼티 정보가 메모리 같은곳에 있어서 문제 없을것 같은데 재시작이 필요한 경우는 GIT이나 Spring Cloud Configration 서버등에 중앙 관리 서버 장애시, 구동도 못하게 되는 상황이 연출되는지요?
-
미해결React 기반 Gatsby로 기술 블로그 개발하기
ProfileImage컴포넌트 질문드립니다.
애로우펑션을 이용할시 안되는데 특별한 이유가 있나요? const ProfileImage = (): FunctionComponent => { return <ProfileImageWrapper src={PROFILE_IMAGES} alt="Profile Image" />;}
-
미해결게임 프로그래머 취업 전략 가이드
학원 취소 후 독학 전환을 어떻게 생각하시나요?
WinAPI 다 들었고, 포폴은 실패했습니다.. 다만 내용정리는 다 해두었고, 혼자 시간만 있다면 해낼 자신 있습니다. 다시 기수를 내려가서 처음부터 해내자니 시간이 너무 아쉽고, 강사님이 달라지니까 한 번 배운걸 다른 스타일로 다시 하게 되어 더 힘이 듭니다. '아 이부분은 전 강사님이 더 좋은데' 하면서 살짝 뒤틀리면, 나비효과로 그 뒤의 구현이 전혀 다르게 되어버립니다. 그냥 학원 취소 후 지금부터 다렉 11 책과 루키님의 12 영상을 이용해서 포폴 제작하는건 어떨까요?
-
해결됨홍정모의 따라하며 배우는 C언어
3:20 getchar()
왜 갑자기 getchar() 이 나오는 건지 모르겠어요. getchar가 아니라 scanf로 입력받았던 건데 왜 갑자기 getchar가 나오나요?
-
미해결Slack 클론 코딩[실시간 채팅 with React]
Cannot use import statement outside amodule 에러
안녕하세요 제로초님. npm run build 명령어를 수행했는데 다음과 같은 에러가 발생합니다. wepback.config.js 내부에서 import와 같은 ES6 문법을 읽지 못해서 발생하는 에러인것 같은데 해결법을 잘 모르겠습니다. https://dev.rase.blog/21-01-03-unavailable-import-on-typescript/ 위와 같은 블로그도 찾아봤는데 해결법은 아닌것 같고 setting의 ts 폴더에서 npm run build를 수행해봐도 결과는 똑같은 에러가 발생합니다. ㅠㅠ 해결법이 있을까요??
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
3WayHandshake에 대하여 질문 드립니다
tcp/ip 설명하실 떄 3wayHandshake는 개념적으로만 연결됬다고 얘기하는거지 실제로는 다르다고 말씀하셨는데요. 그 이유가 거쳐가는 노드들은 클라이언트와 서버가 handshake를 하는지 모르기 때문이라고 하셧는데 이게 무슨 영향을 끼치는지 궁금하며 이 문제를 해결하기 위해 어떤 것들이 있을까요?