묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestParam Map<String, Object> paramMap
안녕하세요, 14:43초 쯤 @RequestParam Map<String, Object> paramMap에서 String 대신 Object를 사용한 이유가 있을까요?? 감사합니다!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
패키지 구조 설계
패키지 구조 설계를 강의로 다루는 부분이 있을까요? 아직 제대로된 프로젝을 만든적이 없어서 패키지 구조 설계를 어떻게 해야할지 잘 모르는 상태입니다. 뭔가 알듯하면서도 잘 모르는게 개념이 확실히 안잡혀서 그런것같은데 혹시 패키지 구조 설계를 다루는 강의가 있을까요? 현재는 Spirng 로드맵대로 강의 보고있는중인데 jpa 강의쪽에서 패키지 구조 설계를 다루는지 궁금합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
logout에 대해서
강의에서 보면 @PostMapping("/logout")public String logout(HttpServletResponse response) { expireCookie(response, "memberId"); return "redirect:/";} private void expireCookie(HttpServletResponse response, String cookieName) { Cookie cookie = new Cookie(cookieName, null); cookie.setMaxAge(0); response.addCookie(cookie);} 강의 코드가 위와 같은데요. 궁금한게 왜 굳이 POST 메서드로 컨트롤러 매핑을 했는지 궁금합니다 세션 쿠키는 어차피 요청시 값이 전달이 되어 GET으로 매핑해도 될것같은데 POST로 매핑한 이유가 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
4섹션 5번째 영상에서 @BeforEach로 감싸주는 이유가 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 이렇게 작성해도 테스트 정상적으로 실행되는데 어떤 이유가 있어서 BeforeEach에서 매번 new로 객체를 만들어주신건지 궁금합니다!
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
여태껏 들었던 강의 중 가장 불친절 한 강의
이 분은 진짜 글을 남겨야겠네요. 기본 적으로 강의 할 때 목소리 톤이 최소한의 겸손이 안되어 있는 느낌. "이건 당연히 아셔야 해요", "찾아보셔야 해요" <-- 이런 말투들도 최대한 이해하려고 노력 했음. 근데 가관은 bootstrap 코드를 자기가 copy&paste 해서 옮기는데 화면에 보여주지도 않음. 그거 하나하나 보면서 sign-up.html 파일 내용 기입하고 있어서 힘들었는데... 질문 게시판 답변 보니...그제서야 거기서 자기 git의 commit check out해서 옮기라네...참... 아니 강의를 하면서 그 때 그 때 말을 해주든가.. 불친절하고, 내용도 그냥 다 알아야 하는 것들 혼자 한 번 적용해보는 느낌. 새로운 내용이 나오면 그 내용을 친절하게 알려주면서 강의 노트에 있는 것도 아니고.... 그냥 말로 대충 지나가듯이 설명.... 좀 겸손하지 않으신 듯 해요. 강사 자체가...
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
리다이렉트 대신에 th:onclick 사용
@PostMapping("/add")public String addItemV3(Item item){ //자동적용 itemRepository.save(item); return "basic/item";} 리다이렉트를 꼭 서야하나 싶어, 주석부분처럼 th이용해 주소를 이동하면 편할거같아 시도했습니다. 상품등록 클릭 시, org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "item.id" (template: "basic/addForm" - line 38, col 17) 오류가 떴습니다. @Modelattribute에의해서 item.id 사용할 수 있을거라 생각했는데 오류원인을 모르겠습니다 ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
인텔리제이가 css, js 파일을 인식하지 못합니다
인텔리제이에 sync 버튼도 없는데 어떡하죠? mvc 편에서 out 디렉토리에서 어떻게 해주시면 된다고 말씀하셨던 걸로 기억하는데 기억이 잘 안나네요ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트래픽이 많은 상황에 대해 질문입니다
안녕하세요. 여태 배운걸 토대로 트래픽이 많은 상황에 대해서 생각해보고 있는데요. 클라이언트에서 order를 생성/변경하는 요청이 계속 들어온다고 생각해봤습니다. 각각의 요청에 대해서 결국 insert, 또는 update SQL이 생성될텐데요. 1. 그러면 클라이언트 1, 2, 3,,, 1000 이렇게 1000명이 동시에 요청해서 insert 또는 update를 하면, 1000개의 SQL이 각각 생성돼서 실행된다고 이해했는데 맞나요? 2. 위의 상황에서 제가 이해한 대로 1000개의 SQL이 각각 생성돼서 실행된다고하면, DB로 가는 네트워크에 부하가 생길수도 있을 것 같은데요. 이런게 문제되지는 않나요?? 혹시 이런 상황에 대해서 따로 처리하는 방법이 있는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO질문입니다.
DTO에대해서 말씀해주셨는데 해당강의에서는 createMemberForm을 DTO라고 생각하면 될까요??
-
미해결스프링부트 시큐리티 & JWT 강의
영상 13:41 초에 질문이 있습니다.
먼저 spring boot 2.6X 버전 java17 로 하고있습니다. 영상 13:41 에 BycryptPasswordEncoder 를 주입하면Spring 순환 참조가 걸리지 않는지 궁금해서 질문 남깁니다. 저는 순환참조에 걸려 PricipaOauth2UserService 에서new BycryptPasswordEncoder 로 생성을하여 따로 주어서해결을 했습니다. 감사합니다.
-
해결됨스프링 핵심 원리 - 고급편
이번 예제에서 Config 클래스에 @Configuration 을 적용하니, Proxy 래핑/등록이 안되는것 같습니다.
강사님 안녕하세요.저는 지금 예제 구현시 의도와 다르게 약간 틀린 설정으로 생긴예상밖의 결과로 약간 혼동을 겪고있습니다. 이유는 @Configuration 을 실수로 붙였더니, 아래와 같이Proxy 가 적용되지 않은 결과가 나옵니다. Config 클래스에 아래와 같이 @Configuration 선언시 @Configurationstatic class Config { ... ...} child.childMethod(); 실행 후 로그 메세지: child Proxy=class ...AtTargetAtWithinTest$Child(Proxy 적용이 안된 스프링 빈 출력) child.parentMethod(); Parent 는 프록시 처리가 되지 않아 출력되지 않음 관례처럼 사용해오던 @Configuration 을 지우니 강의 예제결과처럼 정상으로 나옵니다.(@Import 를 통해 Config 추가 상태) Aspect 를 빈으로 등록해도 Proxy 변환이 안되는 이 상황이 이해가 되지 않아 부득이하게 질문을 남기게 되었습니다. 질문입니다. 예전 강의에서 @Configuration 은 등록되는 빈 을 대상으로 싱글톤 후처리를 위해 선언되는 것이라 알고있었습니다.( CGLIB 을 통해 프록시 후처리), 그래서 Aspect 가 당연히 적용될 줄 알았는데 @Configuration 을 붙이니,Proxy 처리가 되지 않더라구요. 아래는 두가지 결과 입니다. @Configration Config @Import(Config.class) @Configuration 선언 시, Proxy 후처리가 되지 않는 기묘한 현상에 대한 이해가 잘 되지 않습니다.이런 이유로 Config 클래스에 @Configuration 을 쓰지않고, @Import 로 추가하신 이유가 궁금합니다. 읽어주셔서 감사드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
국제화 테스트 과정에서 글자깨짐
-
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
내부 클래스에 대해서 질문있습니다
안녕하세요 강의듣다가 궁금한 점이 생겼습니다 @Component("helloBean") static class HelloBean { .... } 이 부분인데요 BasicController는 스프링이 자동으로 컴포넌트 스캔을 해주면서 빈등록이 되는데 컨트롤러가 빈등록이 되면서 @Component 애노테이션을 써준 내부 클래스도 자동으로 빈등록이 되지않나요? 그러면 당연히 타임리프에서 사용할 수 있는데 왜 강의에서 static 키워드를 넣어준건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderITemDto 클래스 생성 위치
안녕하세요 좋은 영상 감사합니다. 다름이 아니라 OrderItemDto 는 OrderDto 안에서 사용하는 클래스이므로 OrderItemDto(내부 클래스) 의 다시 내부 클래스로 생성하는 것이 맞지 않나요? 영상에서는 OrderDto 와 동등한 레벨로 생성하셔서 궁금증이 들었습니다. 감사합니다^^
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
SpringBoot 버전 변경 후 매핑 문제
안녕하세요 강의를 보여 따라하던중 @NotEmpty 어노테이션이 안되는걸보고 질문을 검색하니 SpringBoot 버전을 변경해야 한다고 하셔서 build.gradle 파일을 교재에 나와있는데로 복붙하였습니다. 근데 그 이후부터 localhost:8080을 들어갈때 마다 아래와 같은 에러가 나면서 들어가지지를 않습니다. 코드에 문제가 있는건지 궁금합니다. 그리고 main밑에 생긴 generated 폴더도 무엇인지 궁금합니다. 2022-02-02 11:43:18.412 ERROR 12428 --- [nio-8080-exec-3] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-3] Exception processing template "home": Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10) org.thymeleaf.exceptions.TemplateInputException: Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10) at org.thymeleaf.standard.expression.FragmentExpression.resolveExecutedFragmentExpression(FragmentExpression.java:619) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.computeFragment(AbstractStandardFragmentInsertionTagProcessor.java:379) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.doProcess(AbstractStandardFragmentInsertionTagProcessor.java:110) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:592) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1394) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1139) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) ~[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:829) ~[na:na] 2022-02-02 11:43:18.413 ERROR 12428 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10)] with root cause org.thymeleaf.exceptions.TemplateInputException: Error resolving fragment: "~{'fragments/footer' :: footer}": template or fragment could not be resolved (template: "home" - line 28, col 10) at org.thymeleaf.standard.expression.FragmentExpression.resolveExecutedFragmentExpression(FragmentExpression.java:619) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.computeFragment(AbstractStandardFragmentInsertionTagProcessor.java:379) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.standard.processor.AbstractStandardFragmentInsertionTagProcessor.doProcess(AbstractStandardFragmentInsertionTagProcessor.java:110) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:592) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE] at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1394) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1139) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) ~[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:829) ~[na:na]
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
update 메소드가 void 인것과 관련된 질문 드립니다.
안녕하세요. update 메소드는 커맨드 쿼리 분리 원칙에 따라서 member 객체를 반환하지 말고 void로 반환값이 없게 하거나 id정도만 반환하라고 하셨습니다. 1. 커맨드가 수정이니 쿼리로 member를 찾지 말아야 한다고 하셨는데 findOne 메소드에서 어차피 member를 찾아야 하는 것 아닌가요? 2. update 메소드 외에도 사실 모든 메소드에서 void나 id만 반환해야 하는 것인가요? 다른 메소드도 등록, 수정, 삭제 등등 멤버를 조회하는 것이 커맨드가 아닌 것 같은데, 그렇다면 일반적으로 반환을 id만 해주는 것이 좋은가요? 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 영한님 강의를 벗어난 주제 이긴한대 궁금한게 생겨서 질문드립니다.
유저와 팔로우 팔로잉 Entity 를 구현하려고 하는데 이렇게 하는게 맞는건지 잘 모르겠어서 질문드립니다.. 조금이라도 힌트를 주신다면 정말 감사할것 같네요!!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
BatchSize, Batch Fetch Size 옵션이 적용되지 않는 문제
안녕하세요 영한님 강의 잘 듣고 있습니다! 해당 강의에서 글로벌전략을 지연로딩 설정후 Order -(one to Many) - OrderItemList -(Many To One)- Item 연관관계의 엔티티에 BatchSize, Batch Fetch Size 옵션을 적용해 3계층 깊이를 가진 엔티티 그래프를 조회하면 총 쿼리가 계층별로 하나씩, 3개 날라간다고 이해를 했습니다. 그런데 jdk 11, 스프링 Data Jpa와 mysql 등 약간의 환경 변화후 같은 예제로 테스트해보니 1. order 쿼리 2. orderItemList의 N개 쿼리(강의에서는 총 2개) 3. 이후 in절로 묶인 item 쿼리가 위의 N개쿼리때문에 N개 총 5개의 쿼리가 날라가는 현상이 발생했습니다. 요약하면 첫 연관 엔티티 orderitem은 batchsize 옵션이 적용되지 않아 N개의 쿼리가 날라가고 이후에 배치 옵션이 적용되어 각각 in절로 묶인 item 엔티티 쿼리가 날라가고있습니다. 이것저것 조작하다가 서비스단에서 transaction 어노테이션을 제거하니 강의에서처럼 엔티티 그래프 계층별로 한개씩 쿼리가 3개로 바뀌어 날라가는데 이유를 잘 모르겠습니다. transaction(Readonly = true) 일때도 정상적으로 쿼리가 3개 날라가는거보면 transaction(Readonly = false) 상황에서만 발생하는 문제같은데 혹시 원인을 알수 있을까요? 해당 문제를 고민하는 과정을 블로그에 글로 작성했는데 참조해서 정확한 원인을 알려주시면 정말 감사하겠습니다. https://www.jiniaslog.co.kr/article/view?articleId=559 언제나 양질의 강의 제공해주셔서 정말 감사하고 새해복 많이 받으세요!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 정보 채우는 방식?
안녕하세요, 이전에 V3, V4 등에서 핸들러 정보를 Map에 직접 저장했었습니다. 그러면 스프링 MVC 구조에서 핸들러 정보가 어떻게 채워지게 되나요?? 감사합니다. --- 질문이 애매한 것 같아서 추가합니다. ( ~ 4:49) /springmvc/v1/members/new-form HTTP 요청을 받은 후 어떻게 SpringMemberFormControllerV1 핸들러(컨트롤러)를 찾아올 수 있는지 정확하게 모르겠습니다. 그냥 클래스 레벨에 @Controller가 붙어있는 모든 클래스를 찾아서 그 안에 @RequestMapping으로 요청 받은 url과 동일한게 있다면 그 때 SpringMemberFormControllerV1 컨트롤러를 getHandelr()에서 반환하는 것인가요? 갑자기 애노테이션 기반 컨트롤러를 사용해서 이전 내용과 이어지질 않는 기분입니다.ㅠㅠ
-
미해결스프링 핵심 원리 - 고급편
@Aspect 안에 여러 어드바이스 작성 시, 어드바이저는 어떻게 구성이 되나요?
안녕하세요! 항상 좋은 강의 및 답변주셔서 감사합니다. 강의를 듣고 복습하던 도중 한 가지 궁금한 부분이 있어 글을 작성하게 되었습니다. @Aspect@Slf4jpublic class AspectV2 { @Pointcut("execution(* hello.aop..*.*(..))") public void allOrder(){} // public java.lang.String hello.aop.order.OrderRepository.save(java.lang.String) @Around("allOrder()") public Object doLog1(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); } @Around("allOrder()") public Object doLog2(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); }} 위의 코드에서 어드바이저는 총 몇개가 생기는지 궁금합니다. @Aspect가 있는 빈이 생길 경우, AutoProxyCreator가 @Aspect를 읽고 어드바이저를 작성해서 @Aspect Advisor 빌더 내부에 저장해두는 것으로 알려주셨는데요... 위의 코드가 실행되면, 어드바이저는 2개가 되는 걸까요? 아니면 1개만 되는 걸까요? 제가 이해하기로는 어드바이저는 주로 Default Advisor를 사용해서 1포인트컷 + 1어드바이저로 구성된다고 이해를 해서 2개가 생길 것으로 생각되긴 한데... 항상 좋은 강의 및 답변 해주셔서 고맙습니다. 감사합니다!