묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 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 사용할 수 있을거라 생각했는데 오류원인을 모르겠습니다 ㅜㅜ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
내부 클래스에 대해서 질문있습니다
안녕하세요 강의듣다가 궁금한 점이 생겼습니다 @Component("helloBean") static class HelloBean { .... } 이 부분인데요 BasicController는 스프링이 자동으로 컴포넌트 스캔을 해주면서 빈등록이 되는데 컨트롤러가 빈등록이 되면서 @Component 애노테이션을 써준 내부 클래스도 자동으로 빈등록이 되지않나요? 그러면 당연히 타임리프에서 사용할 수 있는데 왜 강의에서 static 키워드를 넣어준건지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 정보 채우는 방식?
안녕하세요, 이전에 V3, V4 등에서 핸들러 정보를 Map에 직접 저장했었습니다. 그러면 스프링 MVC 구조에서 핸들러 정보가 어떻게 채워지게 되나요?? 감사합니다. --- 질문이 애매한 것 같아서 추가합니다. ( ~ 4:49) /springmvc/v1/members/new-form HTTP 요청을 받은 후 어떻게 SpringMemberFormControllerV1 핸들러(컨트롤러)를 찾아올 수 있는지 정확하게 모르겠습니다. 그냥 클래스 레벨에 @Controller가 붙어있는 모든 클래스를 찾아서 그 안에 @RequestMapping으로 요청 받은 url과 동일한게 있다면 그 때 SpringMemberFormControllerV1 컨트롤러를 getHandelr()에서 반환하는 것인가요? 갑자기 애노테이션 기반 컨트롤러를 사용해서 이전 내용과 이어지질 않는 기분입니다.ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
mvc관련 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예 [질문 내용] 다음과 같이 안되네요 ㅜㅜ 도와주세요 여기에 질문 내용을 남겨주세요.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
파일 업로드와 관련되어 궁금한 부분이 있습니다 .
안녕하세요 영한님! 항상 강의를 열심히 시청하고 있는 취준생입니다! 상품 테이블이 있고 상품 이미지(상품이미지 파일의 경로) 테이블이 존재할 때 상품 수정 시 파일을 어떻게 수정하도록 작성해야 하는지 궁금한 점이 생겼습니다. 기존에 1 2 3 4 라는 파일의 이름으로 이미지가 저장되어 있고 수정 시 3 4 5 6 의 파일이 새로 요청될 때 3 4 번을 제외하고 1,2는 삭제 / 5 6 은 새로 갱신해주는 로직을 작성하는게 맞는 방법일지, 1 2 3 4를 한번에 다 삭제 후 새롭게 3 4 5 6 파일을 업로드 해주는게 깔끔한 방법일지 궁금증이 생겼습니다. 어떤게 더 좋은 방법일까요? 혹시 둘다 잘못된 방법이라면 어떻게 처리하는게 좋은 방법일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@PathVariable 사용 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]안녕하세요! PathVariable을 사용하다 궁금한 점이 생겨 질문 남깁니다. 변수명과 원하는 name 설정이 같으면 생략할 수 있다고 하셨는데 이를 테스트 코드로 작성 시 오류가 발생합니다. (포스트맨으로 실행 시 성공..) Controller @ResponseBody @GetMapping("/test/{id}") public void test(@PathVariable Long id) { ... } Test Code @Test public void 테스트_코드() throws Exception { Long id = 1L; mvc.perform(get("/test/" + id)) .andExpect(status().isOk()); } Error org.springframework.web.util.NestedServletException: Request processing failed; java.lang.IllegalArgumentException: Name for argument type [java.lang.Long] not available, and parameter name information not found in class file either. 제가 조사한 바로는 아래와 같은데 (Spring 공식 문서 일부) The matching of method parameter names to URI Template variable names can only be done if your code is compiled with debugging enabled. If you do have not debugging enabled, you must specify the name of the URI Template variable name to bind to in the @PathVariable annotation. debugging enabled한 compile이라는걸 이해할 수 없어 질문 납겨봅니다ㅠ.ㅠ 답변 남겨주시면 감사합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ResponseBody인 경우의 실행흐름이 궁금합니다.
안녕하세요. 항상 좋은 강의 감사합니다. 다름이 아니라 제가 정확히 이해가 안 가는 부분이 있어서 질문드립니다. @responseBody 애노테이션이 붙은 컨트롤러의 메서드는 다음과 같이 실행된다고 이해했습니다. Controller가 Http 메시지 바디에 쓸 내용 return -> ReturnValueHandler 의 구현체 중 RequestResponseBodyMethodProcessor 호출되어 HttpMessageConverter을 이용함. 위 과정과 관련해 강사님께서 @ResponseBody와 같이 view rendering이 필요 없는 작업들은 view가 생성되는 뒷 단의 작업들은(ViewResolver 와 View) 이루어지지 않는다고 설명해 주셨습니다. 그런데 여기서 의문점이 스프링 mvc의 DispatcherServlet 코드를 보면 mv = ha.handler(processedRequest, response, mappedHandler.getHandler()); 부분이 있습니다. 즉 어댑터를 통해 핸들러를 호출하면 항상 반환값으로 ModelAndView를 받습니다. 그럼 여기서 제가 궁금한 점이 생겼습니다. 클라이언트의 요청이 컨트롤러에서 @ResponseBody가 적힌 메서드가 호출되는 요청이라면 HttpMessageConverter에서 메시지 변환 과정을 진행 한 후 실제 Http 응답 메시지가 만들어서 클라이언트한테 전송되는 건가요?(이 경우는 실행흐름이 DispatcherServlet으로 가지 않고 종료) 아니면 HttpMessageConverter가 response 객체에 해당 값을 넣어두고, 흐름이 다시 DispatcherServlet으로 가서(그럼 여거서 mv는 null이 들어가나요?) 내부 로직에 의해 view를 만드는 과정이 생략되고 http 응답 메시지가 만들어지는 건가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 MVC에서 핸들러 매핑
[질문 내용]안녕하세요 스프링mvc 학습 중 궁금한 점이 생겨 질문 올립니다. 스프링 mvc에서 디스패처 서블릿이 핸들러 매핑할때 @Controller @RequestMapping 이 붙어있는 "클래스"를 찾아서 핸들러로 매핑 한다고 이해 했습니다. 그렇다면 어댑터는 해당 핸들러의 @RequestMapping("[url경로]") 애노테이션이 붙어있는 "메소드"를 실행 시켜주는것인가요?? @RequestMapping 애노테이션이 붙어있는 "메소드"를 컨트롤러라고 부르는건가요..? 만약 클래스 레벨에 @RequestMapping("[url경로]")가 있고 해당 클래스의 메서드가(애노테이션이 붙지않은 순수 자바 메서드) 단 하나뿐이라면 요청이 왔을때에 클래스의 메서드가 실행 되는것일까요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
V2 HandlerAdapter 적용하기
안녕하세요. 수업을 듣다가 V2 또한 Adapter 로 만들어 보려고 하였습니다. 김영한님이 V2 를 적용하려면 아마 FrontController 도 건드려야 할 거라고 하셨는데, ControllerV2HandlerAdapter도 MyHandlerAdapter 인터페이스를 구현하니 어떻게든 ModelView 를 리턴하게 만들 수밖에 없더라고요. (잠깐 디폴트 메소드 써볼까 했는데…어차피 추상메소드는 구현해야하니까 그것도 안되더라고요 ㅜㅜ) 그래서 차라리 ControllerV2HandlerAdapter로 ModelView 를 구현하게 만들었는데, public class ControllerV2HandlerAdapter implements MyHandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof ControllerV2); } @Override public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException { ControllerV2 controller = (ControllerV2) handler; MyView view = controller.process(request, response); String viewPath = view.getViewPath(); // 모델뷰 만들기 String viewName = parsingViewName(viewPath); ModelView mv = new ModelView(viewName); // 모델뷰에 모델 넣기 Map<String, Object> model = new HashMap<>(); request.getAttributeNames().asIterator() .forEachRemaining(attributeName -> model.put(attributeName, request.getAttribute(attributeName))); mv.setModel(model); return mv; } private String parsingViewName(String viewPath) { String[] splitList = viewPath.split("/"); int lastIndex = splitList.length - 1; String viewNameWithJSP = splitList[lastIndex]; String[] splitJSP = viewNameWithJSP.split("[.]"); String viewName = splitJSP[0]; return viewName;} 작동은 잘 되는데, 저 parsingViewName 메소드로 너무 억지로 ModelView로 반환하려는 느낌이 들어서… 조금 아쉽습니다. FrontController 에서 쉽게 바꿀 수 있는 아이디어가 있을까요? 아직 저는 구현 Adapter들이 MyHandlerAdapter 를 구현하는 것 때문에 FrontController 에서는 어떻게 바꿔야할지 모르겠습니다. 또 한편으로 Adapter의 역할이 말 그대로 110V 이나 50V 뭐든 220V 으로 맞춰주는 거라고 생각한다면, ControllerV2HandlerAdapter 에서 억지로라도 ModelView 로 반환해주는 것이 맞는 것 같다는 생각도 듭니다. 그래서, 만약 FrontController 와 구현 Adapter 중 하나를 수정해야한다면 무엇을 수정하는 것이 더 효율적인가요?(유지보수면에서요!)
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 관련 질문이 있습니다.
기존에 직접 sessionManager를 만들어서 세션을 관리하는 것에 있어서는 sessionStore라는 맵에 key값으로 sessionId와 value값으로는 loginMember를 넣어서 사용을 하고 sessionId를 가지고 사용자를 식별하여 사용한 것으로 이해했습니다. 맞나요? 그런데 session.setAttribute함수를 찾아보니 attributes라는 map에 key값으로 상수값을 value값으로 loginMember를 넣는 거 같은데 (attributes.put(name, value)이렇게 있더라고요) 그럼 map에 키값이 동일하게 지정을 해주면 다른 사용자에 대해서는 어떻게 식별을 하나요? 관리자모드로 보면 sessionId가 생기긴 하는데 이건 spring에서 생성을 해주는 것이 아닌가요? 제가 못찾은 것인지 어느 코드가 id를 생성하는지를 모르겠어어요... 아 그리고 logout에서는 v2를 보면 expire를 통해서 해당 id값에 대한 member를 지우도록 했는데 session을 사용하면서 invalidate함수를 통해 session을 지우면 session전체가 다 지워지는 건가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
사소한 오타를 발견하여 말씀드립니다!
강의 대시보드의 강의자료는 버전 수정이력이 v2021-12-01로 되어있지만 PDF파일 다운받을 시 v 2022-12-01로 오타가 있습니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 생성 후 build.gradle Open as Project 시 에러
환경 OS : Mac M1 Pro macOS Monterey Version 12.1 Intellij : Intellij IDEA 2021.3.1(Ultimate Edition) Build #IU-213.6461.79, built on December 29, 2021 Java Version : openjdk version "11.0.11" 2021-04-20 오류 메시지 Could not load wrapper properties from '{프로젝트 경로}/{프로젝트 명}/gradle/wrapper/gradle-wrapper.properties'. 현상 start.spring.io에서 [프로젝트 환경설정] - [프로젝트 생성] 후 Intellij에서 Open을 통해 프로젝트의 build.gradle Open - 오픈 -> 오픈시 Open as Project를 클릭 Window 10에서는 별다른 설정 없이 Gradle에서 라이브러리를 정상적으로 다운 하였으나, Mac에서는 Build 에러 발생(오류 메시지 참조) 해결을 위한 진행 사항 1. 'Could not load wrapper properties from Intellij' 키워드로 검색결과 gradle 버전 문제로 확인되었으나, 해당 프로젝트로 Window 10환경에서 정상적으로 gradle Build되어 해당 케이스 제외 2. Intellij에서 제공하는 New Project를 사용하여 Gradle 프로젝트 Build가 성공 ※ 정상적으로 build를 성공 하였으나, 원인 확인을 위한 분석 진행 분석 사항 1. start.spring.io에서 생성한 프로젝트(이하 spring)와 Intellij에서 생성한 프로젝트(이하 Intellij)의 gradle-wrapper.properties 비교 spring의 distributionUrl : https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip Intellij의 distributionUrl : https\://services.gradle.org/distributions/gradle-7.1-bin.zip 두 설정의 gradle 버전은 각 7.3.3-bin.zip과 7.1-bin.zip으로 버전차이가 있음 Case 1. Intellij 프로젝트의 설정파일을 spring 프로젝트의 설정파일로 덮어씌웠으나 동일한 에러 발생 Case 2. spring 프로젝트의 설정파일을 Intellij 프로젝트의 설정파일로 덮어씌웠으나 정상 결과 : 설정파일 또는 버전의 문제가 아님. 2. 구글링 중 Intellij와 Gradle sync에러 관련 글 확인결과 블로거가 Intellij의 log를 확인 한것을 따라 Intellij의 로그 체크결과 권한 관련 사항이 문제 에러로그 : java.nio.file.FileSystemException: '{프로젝트 경로}/{프로젝트 명}/gradle/wrapper: Operation not permitted' [결론 및 해결 방안] 권한의 문제로 시스템 환경설정 - 보안 및 개인 정보 보호 - 전체 디스크 접근 권한 - Intellij IDEA.app 권한 부여 [질문사항] 1. 권한 허용을 하지 않아도 Intellij에서 생성된 프로젝트는 Build성공한 이유가 궁금합니다. 2. 추가로 Mac에서는 '전체 디스크 접근 권한'을 허용하고 진행하는 것인지, 혹시 환경의 문제가 있는건지 궁금합니다. 긴 질문사항 읽어주셔서 감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@Login Member ➡ @Login Optional〈Member〉 파라미터 타입에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요 최고의 김영한 강사님.감탄하며 듣고 보고 있습니다. 고맙습니다. 새해 복많이 받으셔요! 저의 상황은 이렇습니다. HomeController 코드입니다. @GetMapping("/") public String loginHomeV4ArgumentResolver( @Login(LOGIN_MEMBER) Optional<Member> member, Model model) { if (member.isEmpty()) { return "home"; } model.addAttribute("member", member.get()); return "loginHome"; } 이 코드에서 의구심이 드는 부분은제가 커스텀 한 파라미터 부분입니다. Optional<Member> @Login(LOGIN_MEMBER) Optional<Member> member 아규먼트 리졸버에서 HomeController 로 요렇게 쏴주고 있어요 public Object resolveArgument(...) { ... ... /* 어노테이션 value 얻어오기 */ String sessionId = loginAnnotation.value(); return Optional.ofNullable(session.getAttribute(sessionId)); } 질문입니다. 메서드 파라미터로 Optional 을 쓰지 말라고 어디선가 들었는데, 그 룰이 이 상황에도 적용이 되는지 , 이렇게 Optional 를 파라미터로 넘겨도 괜찮을지 궁금합니다.잠제적인 문제를 알수 없어 질문하게 되었습니다. 읽어주셔서 감사해요!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcTemplate
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] build.gradle 파일에 jdbc 라이브러리를 추가하고, Load Gradle Changes도 해보고 File -> Open -> build.gradle을 선택해서 Open as Project도 해보았는데 JdbcTemplate을 import 못하고 있습니다. 어떤 부분에 문제가 있는 건가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
aftereach 적용하지 않아도 테스트가 정상작동됩니다.
현재 복습중입니다. 12분 34초에 나오는데, 분명 예전에는 @AfterEach 를 넣지 않으면 repository에서 기존 값들이 지워지지 않아 테스트에 오류가 생겼었습니다. 그런데 지금은 @AfterEach에서 clear 해주지 않아도 알아서 다른 테스트들에서 저장한 값들이 저장되지 않는데, 기본 구조가 바뀐 걸까요? 예를 들면 findAll에서 repository에 멤버1, 멤버2를 저장했습니다. 그러면 레포지토리의 사이즈는 2가 되어야 하는데, 다음 테스트 맨 처음에 repository.size를 출력해주면 0이 나옵니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Java HotSpot(TM) 64-Bit Server VM warning
스프링부트 gradle 2.6.2 버전인데 설치하고 나서 기본 세팅된 프로그램 돌려봤는데 다음과 같은 워닝이 떠요 Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. 어떻게 해결할 수 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿 생성 시점과 역할 관련 질문입니다!
안녕하세요. 좋은 강의 정말 감사드립니다^^! 서블릿에 관련하여 궁금한 것이 생겨서 질문 드리고 싶습니다. 1. 서블릿 객체는 언제 생성되나요? 처음 스프링 부트가 띄워질 때 만들어 지는 것인가요? 아니면 url mapping이 되어서 서블릿 객체가 필요해지면 생성되나요? 그리고 스프링에서 사용하는 dispatcherservlet은 언제 생성되나요? 2. HttpServelet reqest 객체에 HTTP 요청 메시지 파싱해서 넣고 처리해주는게 서블릿 객체라고 배웠습니다. 그렇다면 HttpServelet response의 내용을 바탕으로 HTTP 응답 메시지를 생성하는 것도 서블릿이 하나요? 3. 서블릿의 요청 메시지 처리 작업은 언제 이루어지나요? was가 url에 맞는 서블릿 객체의 service()를 수행하는데, 저희가 만든 service에는 요청 메시지 파싱 작업이 없어보입니다! service를 부르기 전에 다른 메소드가 먼저 불리는 것인가요? 감사합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실무에 대해 궁금한것이 있습니다.
그렇다면 실무에서는 REST API의 예외처리를 처리하는경우, 앞서 배운 ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver 이거는 제쳐두고 궁극기인 ExceptionHandlerExceptionResolver 의 @ExceptionHandler와 이를 모아서 관리하는 @ControllerAdvice 이렇게 2개만 사용이 되는편인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
리다이렉트 302
안녕하세요 크게 의미가 있는 질문은 아닌것 같지만 궁금해서 질문드립니다. 13:42초에 리다이렉트 후 hello-from.html을 200으로 응답코드를 내려줍니다. 그리고 HTTP 강의에서도 200으로 내려준다고 배웠던 기억이 있습니다. 그런데 왜 저는 똑같이 했는데 302로 내려주는 걸까요? 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
try catch구문 질문 있습니다
강사님께선 처음에는 try catch를 쓸까 말까 고민하시다가 나중에는 에러가 터져서 try catch를 쓰시는걸 보았는데요, 실무에서 try catch를 언제 써야하는지 기준같은게 있는지 궁금합니다.