묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 cmd창에서 gradlew build 오류
안녕하세요 현재 윈도우 쓰고있는 학생입니다. 빌드하고 실행하기 단계에서 cmd창을 열어서 gradlew.bat과 강의상에 나와있는 clean build 을 입력해도 사진첨부해드린거와 같이 계속 오류가 나는데 무엇이 문제일까요 ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew 이후 실행안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.인텔리제이 와 Git Bash 연동을 하고 Alt + F12 눌러서 터미널 실행했습니다../gradlew build 와 cd build/libs 까지 성공했는데java -jar hello-spring-0.0.1-SNAPSHOT.jar 는 엔터를 눌러도 아무일도 일어나지 않네요파일의 권한이 rw 밖에 없어서 그런거 같아서 chmod 777 hello-spring-0.0.1=SNAPSHOT.jar로 실행 권한을 부여하려고 했는데도 실행 권한이 바뀌지가 않네요....어떻게 해야 해당 자바 파일 실행할 수 있을까요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의 15분30초 ppt 내용중에서 질문드립니다.
강의를 보다가 15분30초 ppt 내용중에서 제가 이해한 바가 맞는지 확인하고 싶어서 질문드립니다. 웹 애플리케이션 서버의 요청 응답 구조를 보면, 내장톰캣서버 = WAS+서블릿컨테이너 이다.WAS가 HTTP요청 메시지를 기반으로 request 객체, response객체를 생성한다.WAS가 Response 객체정보로 HTTP응답 메시지를 생성한다.이렇게 이해하는게 맞을까요?추가적으로 스프링 부트를 실행하면 스프링 부트가 내장 톰캣서버를 띄워준다고 말씀하셨는데, '띄워준다' 라는 말이 무슨 말씀이실까요? 내장톰캣서버를 생성해준다 라고 이해하면 될까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
외부에서 설정해 주는 방식으로 작성해 봤는데, 어떤 구조가 더 나은 코드인지 궁금합니다!
안녕하세요! 강의 너무 잘 듣고있습니다~~HandlerConfig... public class HandlerConfig { public void configureHandlerMappingMap(Map<String, Object> handlerMappingMap) { 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()); } public void configureHandlerAdapters(List<MyHandlerAdapter> handlerAdapters) { handlerAdapters.add(new ControllerV3HandlerAdapter()); handlerAdapters.add(new ControllerV4HandlerAdapter()); } }FrontControllerServletV5... @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() { HandlerConfig handlerConfig = new HandlerConfig(); handlerConfig.configureHandlerMappingMap(handlerMappingMap); handlerConfig.configureHandlerAdapters(handlerAdapters); } ... 위와 같이 HandlerConfig 클래스 내부의 메서드에서 handlerMappingMap과 handlerAdapters를 매개변수로 전달받아 값을 세팅해 주도록 코드를 작성해 봤습니다. 이런 방식 보다는 아래의 방식이 더 나을까요??아래가 좀 더 '주입'이라는 느낌에 가까운 것 같아서 어떤 구조가 좋은 구조인지 고민됩니다..!HandlerConfig... public class HandlerConfig { public Map<String, Object> handlerMappingMap() { Map<String, Object> handlerMappingMap = new HashMap<>(); 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()); return handlerMappingMap; } public List<MyHandlerAdapter> handlerAdapters() { List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); handlerAdapters.add(new ControllerV3HandlerAdapter()); handlerAdapters.add(new ControllerV4HandlerAdapter()); return handlerAdapters; } }FrontControllerServletV5... @WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { private final Map<String, Object> handlerMappingMap; private final List<MyHandlerAdapter> handlerAdapters; public FrontControllerServletV5() { HandlerConfig handlerConfig = new HandlerConfig(); this.handlerMappingMap = handlerConfig.handlerMappingMap(); this.handlerAdapters = handlerConfig.handlerAdapters(); } ...
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
webapp 연동 문의
localhost 8080에 들어갈 때 시작 페이지가 whitepage로 떠서 다시 문의 들입니다.webapp의 시작 페이지가 적용이 안되는 것 같은데 원인을 잘 모르겠습니다.프로젝트 파일은 구글 드라이브로 링크 남기겠습니다.감사합니다.https://drive.google.com/file/d/1LAeBuz3E_PZGdqTg4bzgw8Ocn7WB2KyV/view?usp=share_link
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 database와 연결이 안 되는 것 같습니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]h2 database 설치 하여 console띄우고 jdbc url도 jdbc:h2:tcp://localhost/~/test 로 설정 후 Member 테이블 만들었습니다build.gradle에 필요한 라이브러리 추가 후 코끼리도 눌러주고application.properties에도 강의 내용과 똑같이 작성하였습니다. 그런데 여기가 뭔가 강사님께서 보여주시는 것과 다른 것 같습니다 글씨에 색깔도 다르고 무엇보다 spring이나 datasource 등을 쳤을 때 밑에 뜨는 것이 없습니다 무엇이 문제일까요? 다음은 제 코딩화면과 localhost:8080에서 회원 목록을 눌렀을 때 오류 화면 입니다.답변 부탁드립니다 감사합니다
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ModelAttribute 원리
@ModelAttribute Item item 이런식으로 사용하면Item 객체를 만들고 프로퍼티를 찾아서 setter로 값을 바인딩시킨다고 배웠습니다. (model.addAttribute()는 생략 가능)이 부분이 궁금한데 사용자가 넘긴 데이터를 어떻게 파싱해서 각각 필드에 setter로 값을 바인딩 시켜줄 수 있는건가요?@ModelAttribute 내부에서 @RequetParam을 사용하는건가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 메시지 컨버터가 작동 과정
HTTP 메시지 컨버터가 작동되었다는 건 HTTP 바디에 요청 혹은 응답이 이루어진다는 것인데@ResponseBody public String hello() { return "ok" }그러면 이런 코드가 있을 때 메시지 컨버터가 사용이 됩니다.MVC구조에 따라 위 코드 수행 과정이 제가 이해한 게 맞나요?HTTP 요청이 들어오면 디스패처 서블릿에서 핸들러 매핑으로 적절한 핸들러를 찾고 그 핸들러를 처리할 핸들러 어댑터를 찾습니다.찾은 핸들러 어댑터를 호출하고 핸들러 어댑터에서 적절한 아규먼트 리졸버를 찾아 호출해 보내줄 파라미터 데이터를 생성합니다. (여기선 파라미터가 없으므로 생성x)이제 핸들러(위 코드)를 호출하고 반환되면서 리턴밸류핸들러가 실행됩니다.@ResponseBody가 있으므로 HTTP 메시지 컨버터를 실행합니다. 여기까지가 제가 이해한게 맞나요? 이제 HTTP 메시지 컨버터가 HTTP 바디에 값을 직접 넣어주어 화면을 띄웠을 때 ok라는 문자가 그대로 보이게 되는 것으로 알고 있습니다. 이 과정을 더 상세하게 알고 싶습니다.HTTP 메시지 컨버터에서 HTTP 바디에 값을 직접 넣어주고 모든 작업이 끝나게 되는건가요?아니면 HTTP 메시지 컨버터에서 또 어떤 값을 리턴해주어 계속 진행이 되는건가요? 후자가 맞다면 HTTP 메시지 컨버터는 어떤 것을 리턴밸류핸들러에 리턴해주는 것이며리턴밸류핸들러는 어떤 것을 핸들러어댑터에 리턴해주는 지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberRepositoryTest / Testcase 작성 질문드립니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 테스트 코드 작성중에 의문사항 있어서 문의 드립니다. 1. MemoryMemberRepository(왼쪽사진)의 save method에서 return member를 해주고 있습니 다. save함수는 Map<Long,Member> store 변수에 값을 저장하는 method로 생각되는데, return을 하는 이유가 궁금합니다. findByName(오른쪽사진) method에서 repository.save(member1)는 Member member3 = repository.save(member1) 와 같이 Member member3을 선언을 안해도 되는것인지 문의드립니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
whitepage 질문
section 1,2 까지 잘 진행 하다가 갑자기 webapp 부분이 적용이 되지 않으면서 whitepage가 계속 뜹니다 어디가 오류 난 부분인지 몰라 계속 해결해 보려다 해결하지 못하고 질문을 올립니다. 구글 드라이브를 통해 올리겠습니다. 감사합니다.https://drive.google.com/file/d/14T7D_uAwO18z7lSwv2TQnvyGOAkNwCx0/view?usp=share_link
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
타임리프 th:href
<td><a href="item.html" th:href="@{/basic/items/{itemId}(itemId=${item.id})}" th:text="${item.id}">1</a></td> <td><a th:href="@{/basic/items/{itemId}(itemId=${item.id})}" href="item.html" th:text="${item.id}">1</a></td>위에 코드의 url은 타임리프의 href가 적용된 반면 아래코드는 그냥 일반 html의 속성인 href가 적용됩니다.그래서 타임리프 문법은 무조건 html 속성 뒤쪽에다 써야 되는건 줄 알았는데 아닌경우도 많더라구요.어떤 경우에 뒤에 써야 하는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
FieldError가 아닌 Item으로 사용자 입력 값 유지하기
상품명, 가격, 수량 필드에 각각 (입력 x), 1, 10000을 입력했고, Item 객체에 각각 "", 1, 10000이 저장되었음을 확인했습니다.그리고 addForm.html에 아래와 같이 코드를 작성해보았고, 동일하게 Item 객체에 "", 1, 10000이 저장되었음을 확인했습니다.<div th:text="*{itemName}"></div> -> <div></div> <div th:text="*{price}"></div> -> <div>1</div> <div th:text="*{quantity}"></div> -> <div>10000</div> FieldError가 아닌 Item 객체에 저장된 값을 통해서 사용자가 입력한 값을 유지할 수 있을 것이라 생각하였습니다.시도1.addForm.html <input type="text" id="price" th:field="*{price}" class="form-control" th:errorclass="field-error" placeholder="가격을 입력하세요">th:field에 의해서 value속성이 생길 때, item.getPrice()해서 value="1"이 만들어질 줄 알았으나-> value=""가 만들어짐(이때, 사용자 입력값 유지를 Item 객체 통해서 하기 위해, bindingResult.addError(new FieldError("item", "price", "가격은 1,000 ~ 1,000,000 까지 허용합니다.")를 사용했습니다. item.getPrice()를 넣지 않음)시도2. 위 코드에 th:value="*{price}" 속성 추가당연히 value="1"이 만들어질 줄 알았으나-> value=""가 만들어짐왜 value 속성이 제가 예상한 대로 만들어지지 않고, value=""로 만들어지는 것일까요?(타입 오류는 발생하지 않고, 오직 검증 오류가 발생한다고 가정했을 때,) Item 객체로 사용자 입력 값을 유지할 수는 없을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
index 페이지
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]index페이지 안에 작성을 했는데도 열었을 때 사진과 같이 열어집니다. 뭐가 문제일까요ㅜㅜ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestMapping 질문
안녕하세요 김영한 강사님!강의 너무 잘 듣고 있습니다.다름이 아니라 @Controller와 @RequestMapping에 대한 궁금증이 생겨서 질문을 올리게 되었습니다.기존 DispatcherServlet, 핸들러 매핑, 핸들러 어댑터, ... 를 배운것을 토대로 생각해봤을 때1) @Controller를 애노테이션 기반 컨트롤러 (핸들러) 로 인식하고 컨트롤러로 등록한다.2) @Controller 안에 있는 @RequestMapping 정보들을 모두 핸들러 매핑 정보로 넣어서 요청 URL이 들어왔을 때 이 매핑 정보를 활용한다.3) 이 매핑 정보에 맞는 컨트롤러 (핸들러)에 맞는 핸들러 어댑터를 찾고 이를 통해 핸들러를 호출하여 ModelAndView를 반환한다. 이렇게 이해해도 괜찮을까요?@RequestMapping의 요청 정보 매핑이 어떤 과정으로 전개되는지 확실하게 알고 싶습니다..!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
setname이 안보이고 객체생성에 오류가 납니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]setname이 보이지않고 객체생성 옆에 오류가 납니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
클라이언트사이드렌더링vs서버사이드렌더링
둘의 차이에 대해 설명해보라고하면클라이언트 사이드 렌더링은 web서버에서 html생성하는것이고 서버사이드렝더링은 was에서 html생성함이라고 말할 수 있나요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
적절한 메시지 컨버터 선택하는건 어디에서 이뤄지나요?
바로 전 강의에서 컨트롤러의 파라미터 타입이나 반환 타입에 따라 메시지 컨버터를 순차적으로 돌면서 찾아 수행한다고 하셨는데아큐먼트 리졸버도 마찬가지로 적절한 파라미터 타입이나 반환타입에 따라 여러 종류가 있다고 하셨습니다.그러면 디스패처 서블릿에서 파라미터 타입에 따른 적절한 아규먼트 리졸버를 찾아 호출하게 된다면 메시지 컨버터를 순차적으로 돌며 찾는 과정은 없어도 되는거 아닌가요?만약 존재한다면 어디에서 이루어지는건가요? ReturnValueHandler도 반환타입에 따라 종류가 여러 가지라고 하셨는데 이 ReturnValueHandler 종류를 찾고 호출하는 건 어디에서 이루어지는건가요? 핸들러 어댑터는 디스패처 서블릿으로 ModelAndView를 반환해야 되는데그러면 ReturnValueHandler가 HTTP 메시지 컨버터를 호출해서 만든 응답결과가 ModelAndView 타입이고 이 응답결과를 핸들러 어댑터로 반환한 후 다시 핸들러 어댑터는 디스패처 서블릿으로 반환하는건가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
requestParamV1 실행 과정
RequestParamController의 requestParamV1는/request-param-v1 에 요청이 들어오면 실행이 되는데 파라미터 보면 request랑 response가 있습니다.여기서 궁금한 게 mvc 동작과정이 핸들러 매핑으로 핸들러를 찾아서 그 핸들러에 맞는 어댑터를 찾은 후 그 어댑터가 핸들러(컨트롤러)의 메소드(requestParamV1)를 호출하는거잖아요?1. 어댑터는 requestParamV1이라는 메소드명은 어떻게 알고 호출할 수 있는건가요?2. requestParamV1의 파라미터가 지금은 request, response인데 이것 말고도 사용자가 다양한 파라미터를 적을 수 있는데 이처럼 메소드가 요구하는 파라미터들을 어떻게 알고 다 넘겨줘서 호출할 수 있는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@RestControllAdvice를 Async에서 활용
@RestControllAdvice를 Async 환경에서도 사용을 하려고 했는데 Async에는 적용이 되지 않는 것 같습니다. 관련해서 혹시 어떻게 처리를 하는게 좋은 방법일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
CSR부분이 잘 이해가 안가요
제가 프론트랑 백엔드를 둘다 작업한적이있었는데 그떄는url: 프론트서버/orders을 호출하면프론트가 백으로 orders에 대한 정보를 달라고 해요그리고 백엔드가 프론트로 정보를 넘겨줘요그리고 프론트는 그 정보를 가지고 화면을 그리죠근데 이사진을 보면 자바스크립트 링크를준다는얘기도 무슨 얘기인지모르겠고자바스크립트를 요청한다는데 그말도 뭔말인지 모르겠어요 저는 저런 작업을 안했던것같은데 말이죠 다시 생각해보니까 저서버가 프론트서버(웹서버)+ 백서버(was)를 모두 포함한것같네요.. 맞나요?근데 그래도 다음 세가지 말이 무슨말인지 모르겠어요자바스크립트 링크를 내려준다 (링크가 뭘말하는것인지)웹브라우저가 서버에 자바스크립트를 요청한다(링크를 받았는데 왜또요청하는지)