30%
69,300원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
handler의 정확한 의미
안녕하세요 핸들러가 아직 머리속으로 완전히 이해가 안됐는데요제가 이해한 핸들러는bean 이름이나 anootation으로 Controller를 찾아주는것으로 이해를했는데요 이게 아니라면 핸들러의 정확한 뜻이 뭘까요?조금 헷갈리네요 ㅠ
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
테스트코드에서 ItemRepository 주입받을 때
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]테스트코드 작성할 때 ItemRepository를 강의에서는 new 키워드로 직접 생성했는데, 저는 생성자 주입을 사용해보고 싶어서 시도했는데 주입이 안된건지 에러가 발생하네요 무언가 빼먹은게 있을까요?다시 직접 new 키워드로 직접 객체를 생성하면 에러 발생하지 않고 제대로 테스트실행이 됩니다. 찾아보니 Jupiter는 스프링 IoC와 작동방식이 다르고 @Autowired를 명시해주어야한다라고 하는데 저는 명시했는데도 같은 에러를 발생시키네요org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [hello.itemservice.repository.ItemRepository arg0] in constructor [public hello.itemservice.repository.ItemRepositoryTest(hello.itemservice.repository.ItemRepository)]. at java.base/java.util.Optional.orElseGet(Optional.java:364) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
콘솔 한글 깨짐
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현재 인프런에 나와있는 글깨짐 커뮤니티 글들과 인터넷을 찾아봐도 해결이 안되네요...ㅠㅠ 위 과정을 모두 해보았는데.....ㅜㅜ또 다른 방법이 없을까요.....
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jdk , 인텔리제이의 버전을 맞췄는데도 오류가 뜹니다
https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71216&tab=community&category=questionDetail&q=1133756 ㄴ 위의 질문 올린 분과 같은 오류가 떠서 Gradle Projects를 Gradle로 바꿨더니 아래와 같은 오류가 뜨네요 ,, 구글링 했더니 Build and Run을 인텔리제이로 바꾸라는 내용이 나오는데, 그렇게 하면 강의를 따라갈 수가 없어서요 ㅠㅠ 자바 버전을 맞추라는 내용도 있었지만 이미 다 맞춘 상태입니다 ,, 어디가 문제일까요 ?? 아래는 저의 환경설정 입니다
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션7의 PRG Post/Redirect/Get 질문입니다.
섹션 7의 PRG Post/Redirect/Get에서요, 7:30에retrun "basic/item";이 부분을 리다이렉트로 수정하시는데요, 혹시 basic/item 뷰페이지로 이동되지 않고 그대로 남는 이유가,포스트요청이라서 리턴값을 뷰페이지로 취급하지 않는 것 아닌가해서요.겟요청이였으면 저렇게 리턴을 했어도 뷰페이지로 자동 리다이렉트까지 되었지 않았을까요...? 그대로 남는 이유를 새로고침으로 인한 중복 오류를 중심으로 말씀해주시지만 리턴값과 연결해서 설명해주시지 않으셔서 헷갈리네요.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션7. 상품상세
<div class="col"> <button class="w-100 btn btn-primary btn-lg" onclick="location.href='editForm.html'" th:onclick="|location.href='@{/basic/items/{itemId}/edit(itemId=${item.id})}'|" type="button">상품 수정</button> </div>여기서 타임리프 문법에서th:|location.href='@{/basic/itesm/${item.id}/edit 로 하면 http://localhost:8080/basic/items/$%7Bitem.id%7D/edit이런식으로 url이 생기는데, 왜 그런건가요?이전에 상품목록-타임리프 강의에서는<td><a href="item.html" th:href="@{/basic/items/{itemId}(itemId=${item.id})}" th:text="${item.id}">회원 아이디</a></td> <td><a href="item.html" th:href="@{|/basic/items/${item.id}|}" th:text="${item.itemName}">상품명</a></td>이렇게 URL 표현식으로 쓸 수 있다고 배웠어서요!감사합니다!
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jsp를 사용하면 왜 war 파일을 사용하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요!김영한 선생님의 스프링 mvc 1편 - 6강을 듣다가 궁금한 점이 있어서 질문 올립니다.jsp를 사용하면 왜 war 파일을 사용해야하나요?서블릿 컨테이너가 필요한거면 springboot안에 내장 서버가 있으니깐 그것을 이용하면 되는 거 아닌가요? jar와 war 배포 차이점에 대한 자세한 설명 부탁드립니다
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Spring boot 3 gradle에 jstl 수정해도 에러 발생하네요
members.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>member list</title> <meta charset="UTF-8"> </head> <body> <a href="/index.html">메인</a> <table> <thead> <tr> <th>id</th> <th>username</th> <th>age</th> </tr> </thead> <tbody> <c:forEach var="item" items="${members}"> <tr> <td>${item.id}</td> <td>${item.username}</td> <td>${item.age}</td> </tr> </c:forEach> </tbody> </table> </body> </head> </html> build.gradleplugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'war' } configurations { compileOnly { extendsFrom annotationProcessor } } group = 'org.example' version = '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok:1.18.28' //providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' //JSP 추가 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' //스프링부트 3.0 이상 implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0' //스프링부트 3.0 이상 implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.1' //Error 스프링부트 3.0 이상 } test { useJUnitPlatform() }안녕하세요. spring boot 3 에서 jstl 사용을 위해 gradle에 위 내용처럼 추가하였는데NoClassDef Err 발생합니다. 2024-01-29 15:07:48.054 ERROR 9200 --- [nio-8080-exec-4] a.c.c.C.[.[.[.[frontControllerServletV1] : Servlet.service() for servlet [frontControllerServletV1] in context with path [] threw exception [java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator] with root causejava.lang.ClassNotFoundException: jakarta.servlet.jsp.tagext.TagLibraryValidatorat java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012) ~[na:na]at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[na:na]프로젝트 클린, gradle refresh 다해봤는데 안되네요
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontControllerServletV5 null 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]java.lang.NullPointerException: Cannot invoke "hello.servlet.web.frontcontroller.ModelView.getViewName()" because "mv" is null at hello.servlet.web.frontcontroller.v5.FrontControllerServletV5.service(FrontControllerServletV5.java:57) ~[classes/:na] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) ~[jakarta.servlet-api-6.0.0.jar:6.0.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.1.jar:6.1.1] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.1.jar:6.1.1] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.1.jar:6.1.1] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.16.jar:10.1.16] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]---package hello.servlet.web.frontcontroller.v5; import hello.servlet.web.frontcontroller.ModelView; import hello.servlet.web.frontcontroller.MyView; import hello.servlet.web.frontcontroller.v3.ControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberListControllerV3; import hello.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3; import hello.servlet.web.frontcontroller.v5.adapter.ControllerV3HandlerAdapter; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @WebServlet(name = "frontControllerServletV5" , urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { private final Map<String,Object> handlerMappingMap = new HashMap<>(); private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); public FrontControllerServletV5() { initHandlerMappingMap(); initHandlerAdapters(); } private void initHandlerMappingMap() { handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); } private void initHandlerAdapters() { handlerAdapters.add(new ControllerV3HandlerAdapter()); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object handler = getHandler(request); if (handler == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } MyHandlerAdapter adapter = getHandlerAdapter(handler); ModelView mv = adapter.handle(request, response, handler); MyView view = viewResolver(mv.getViewName()); view.render(mv.getModel(),request,response); } private Object getHandler(HttpServletRequest request) { String requestURI = request.getRequestURI(); return handlerMappingMap.get(requestURI); } private MyHandlerAdapter getHandlerAdapter(Object handler) { MyHandlerAdapter a; for (MyHandlerAdapter adapter : handlerAdapters) { if(adapter.supports(handler)){ return adapter; } } throw new IllegalArgumentException("handler adapter를 찾을 수 없습니다. handler = "+handler); } private static MyView viewResolver(String viewName) { return new MyView("/WEB-INF/views/" + viewName + ".jsp"); } } ---이런 오류가 발생하는데 어디가 문제인제 잘 모르겠습니다..왜 이런걸까요?ㅠㅠㅠ
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
(path parameter) VS (query parameter)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]리소스의 식별이냐, 정렬/필터와 같은 페이지네이션을 위함이냐와 같이 컨벤션에 따라 달라지는거 같은데, 실제로 작동하거나 기능에 있어서의 차이도 있을까요?
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
일반적인 실무에서의 Model에 할당되는 값
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]1. 선생님께서는 Model에 값을 추가할 때 항상 Member이나 Item과 같은 "객체"를 추가하셨는데 item.getId()나 member.getUsername() 같은 "단순 타입"을 추가하는 경우도 있나요?2.만약 없다면 "객체"를 모델로 추가하는 것이 정형화된 방법인가요?
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DispatcherServlet에서 핸들러와 핸들러 매핑의 동작 방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이전에 MVC 프레임워크 v5를 직접 만들었을 땐, 스프링이 실행됨과 동시에 다음 코드처럼 프론트 컨트롤러의 handlerMappingMap에 핸들러들이 자동으로 등록되었었습니다. 즉, 클라이언트로부터 요청이 오기도 전에 '핸들러 매핑 맵'에 저장되는 거로 이해했습니다. private void initHandlerMappingMap() { handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4()); } 그러면 실제 DispatcherServlet에서도 위와 비슷한지, 다른지, 정확히 어떻게 동작하는지 궁금합니다. 스프링 부트가 실행되자마자 '핸들러 매핑'들은 스프링 빈으로 등록된다고 이해했습니다. 다만 '핸들러'가 어떤지는 헷갈립니다. 스프링 부트가 실행됨과 동시에 '핸들러(컨트롤러)'들이 각각에 해당되는 '핸들러 매핑' 내부에 저장되는 건지, 아니면'핸들러'들이 '핸들러 매핑'에 처음부터 저장되는 게 아니라, 클라이언트로부터 요청이 오면 그때 '핸들러 매핑'이 스프링 컨테이너에서 핸들러를 '찾아 주는' 건지.아니면'핸들러 매핑' 인터페이스마다 방식이 다른 건지 궁금합니다. +) 한 가지 더 궁금한 점이 있습니다.애노테이션 기반의 컨트롤러들은 반드시 스프링 빈으로 등록되어야 한다고 이해했습니다.그런데 Controller 인터페이스를 구현한 컨트롤러나 HttpRequestHandler 컨트롤러들은 강의에선 BeanNameUrlHandlerMapping을 이용하기 위해 스프링 빈으로 등록되기는 했지만, BeanNameUrlHandlerMapping를 이용하지 않는다면 꼭 스프링 빈으로 등록할 필요는 없는 건가요? 컨트롤러들이 모두 스프링 빈일 필요는 없는 건지 궁금합니다.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MVC, SSR, CSR
안녕하세요 아직 강의를 절반도 채 수강하지 않았으나제 얕은 지식과 현재 배우고 있는 내용이 머릿속에서 혼란을 일으켜 여쭙습니다 entity : DB에 저장,조회 등 직접적인 데이터로 이용하기 위해 만든 객체dto : 웹을 통해 주고 받을 때, entity를 바로 쓰기에는 위험하므로 또는 entity의 필요한 부분만을 이용하기 위해 만든 객체repository layer : DB와 관련된 로직을 수행하는 계층service layer : repository를 이용하여 비즈니스 로직을 수행하는 계층controller layer : HTTP 요청을 받고 service를 이용하여 로직을 수행 후 응답을 보내주는 계층 으로 알고있습니다. 현재 김영한님 강의에서 배우는 MVC패턴을 이용한 SSR(서버사이드랜더링)에서 ,controller : (현재 Servlet을 이용) service/repository 를 이용해 로직을 수행하고 필요한 데이터를 model에 담아 view로 전달model : HttpServletRequest 객체 이용, request 내부에 데이터 저장view : (현재 JSP를 이용) model을 통해 html페이지를 동적으로 만들고, 브라우저에 랜더링 위와 같이 동작하는 것으로 이해하였는데, CSR로 바뀐다면, model : JSON형태(dto객체를 JSON으로 변환시킨)의 payload를 가진 HTTP 프로토콜 view : 클라이언트서버(브라우저와 직접 통신하여 화면을 랜더링해주는) -> 커다란 MVC패턴이라고 봐야하는건가요? 아니면 MVC패턴이 깨지고, 그냥 클라이언트단과 서버단이 API를 통해 통신한다고만 이해하면 되는 건가요? 제가 이해하고 있는 용어나 흐름 등에 잘못된 정보가 있다면 고쳐주실 수 있나요? 긴 글 읽어주셔서 감사합니다강의 너무나 잘 보고 있습니다~!
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
pdf에 업데이트된 내용의 위치가 잘못된 건가 싶어서 제보합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 5. 스프링 MVC - 구조 이해.pdf의 15~16페이지 부분에서'컴포넌트 스캔 없이 스프링 빈으로 직접 등록해도 된다'는 걸 보여 주는 내용 사이에 '주의 - 스프링 3.0 이상'에 해당하는 내용이 껴 있습니다. 위치가 잘못된 건지 의도된 건지 모르겠지만 혹시 몰라서 일단 제보합니다.
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
content-Type이 text/html;charset=UTF-8 입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.1. 컨텐트타입이 application/x-www-form-urlencoded가 아닌데, 어떻게 바꿔야 하나요?
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
start.spring.io 프로젝트 생성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]start.spring.io 에서 프로젝트를 생성할 때각 항목이 무엇을 의미하는지 궁금합니다.
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강사님이 사용하시는 그림 툴 알고싶습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 저도 강사님 자료처럼 그림으로 이해한 내용을 정리하고 싶은데강사님이 사용하시는 그림 툴 알 수 있을까요?
- 미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
paramet vs response body
안녕하세요. 수업 너무 잘 듣고있습니다.다름이 아니고 특정 url에서 값을 요청하거나 응답한다고 할 떄, 값을 언제 http paramter로 받아야하는지와 http body로 받아야하는지에 대한 차이를 알고싶습니다. 파라미터는 값이 객체가 아니고 단순히 변수일 때 혹은 받아야하는 개수가 적을 때 라고 생각이 되는데, 혹시 이 이유도 맞는지, 그리고 또 다른 이유들이 어떤 것이 있는지가 궁금합니다. 감사합니다 ㅎㅎ
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 매핑과 핸들러 어댑터들도 모두 스프링 빈으로 등록되나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링 부트를 사용하면 자동으로 핸들러 매핑과 핸들러 어댑터, 뷰 리졸버 등 여러 가지를 등록해 준다고 하셨는데 저는 처음에 '등록'이라는 의미를 DispatcherServlet에 있는private List<HandlerMapping> handlerMappings;private List<HandlerAdapter> handlerAdapters;private List<ViewResolver> viewResolvers; 이 List에 저장한다는 의미로만 생각했었습니다.그런데 강의가 진행되면서 설명해 주신 내용 중, 다음 코드처럼 스프링 부트에서 InternalResourceViewResolver를 스프링 빈으로 등록해 주듯이 @Bean ViewResolver internalResourceViewResolver() { return new InternalResourceViewResolver("/WEB-INF/views/", ".jsp"); } } 핸들러 매핑과 핸들러 어댑터들도 스프링 빈으로도 등록되는 건가요? 즉,핸들러 매핑, 핸들러 어댑터, 뷰 리졸버들은 스프링 빈으로 등록되고뷰는 기본적으로 스프링 빈으로 등록되지 않지만(https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71204&tab=community&q=782881&category=questionDetail) 원한다면 따로 스프링 빈으로 등록할 수도 있다.(BeanNameViewResolver를 사용할 때) 이렇게 생각해도 되는지 궁금합니다.
- 해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
th:action 질문드립니다
상품 등록 버튼을 눌렀을 때, items/add로 이동하는 걸th:action 대신th:onclick="|location.href='@{/basic/addForm.html}'|"로 적어도 되나요? 단순히 url 이동이 아니라, 상품 등록 버튼을 눌렀을 때, 상품을 실제로 저장하는 액션이 있기 때문에 th:action을 사용해야 하는 것인가요? 상품 등록 버튼을 눌렀을 때의 결과를 작업하는 것인데,<button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록 </button>여기가 아닌, <h4 class="mb-3">상품 입력</h4> <form action="item.html" th:action method="post">여기서 처리하는지 궁금합니다.