SessionManager에서 직접 개발한 세션은 createSession() 메서드로 여러 개의 세션을 만들어서 sessionStore에 저장할 수 있는 것으로 보이는데요 HttpSession을 이용하기 위해 HttpServletRequest의 getSession() 메서드 호출 시 기존 세션이 있다면 생성하지 않고 기존 세션을 가져오는 것으로 이해했습니다. 그러면 2개 이상의 세션을 생성할 수 없고 요청 당 하나의 세션만 만들수 있는 건가요?? 질문 하나 더 드리자면 HttpServletRequest의 getSession() 호출 시 세션 ID는 자동으로 생성되고, 세션 Name과 Value는 setAttribute로 설정해야 하는 것이 맞나요? 그렇다면 세션과 세션 ID는 1개만 생성되지만 세션 Name과 Value를 여러 개 설정하는 것이 맞는 것인지요?? 머리 속이 복잡해서 질문드립니다. 읽어주셔서 감사합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] validateDuplicateMember 함수에서 member.getName(); 값이 null이 나와서 다음과 같이 계속 nullException이 납니다. 확인 부탁드려요 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 선생님 코드를 따라쳤는데 Member.java 에서 사진과 같이 빨간 밑줄이 뜨면서 에러가 납니다..ㅠ 어디서 나는걸까요..?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오) [질문 내용] 테이블 생성 스크립트를 받으려고 하는데요. 강사님이 보시는 강의노트는 어디서 확인할 수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 만약에 API로 개발할경우 인터셉터 경로는 어떻게 설정해야하죠? ex 유저API @RestController("api/user") @postmapping 유저등록api @Deletemapping 유저 삭제 api 이때만 인터셉터 실행 이렇게 있으면 .addPathPatterns("/**") 할시 둘다 등록이 되기 때문에 @Deletemapping 이때만 등록하고 싶은데 방법이 있나요? 유저등록일때만 @postmapping("/join")으로 설정해야 하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. Save 나 list를 조회할때 아래의 코드가 어떻게 돌아가는지 이해할 수 있었습니다. 이때는 해당 기능을 하는 컨트롤러가 model Map에 데이터를 주입하는 과정이 있기때문인데요, new-form같은경우는 위와같이 model 객체를 따로 만드는 것이 없는데, 그렇다면 이럴땐 그값에 Null값이 들어가게 되는 건가요? new-form 컨트롤러가 실행되었을때는 어떻게 되는지 알고 싶습니다. 만약 Map<String, Object> model 에 null 값이 들어간다고 하면 당연히 setAttribute 또한 제대로 작동이 되지 않을 것 같은데 그렇게 된다면 RequestDispatcher 부분도 제대로 작동하지 않으면서 jsp로 넘어가지 않을 것 같다는 생각이 듭니다. public void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { modelToRequestAttribute(model, request); RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response);} private static void modelToRequestAttribute(Map<String, Object> model, HttpServletRequest request) { model.forEach((key, value) -> request.setAttribute(key,value));}
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. @ModelAttribute("item")을 안한다면? bindingResult에 에러정보가 있을경우 addForm으로 돌아갈때 th:object="item"이기 때문에 itemSaveForm이 모델의 키값으로 넘어가서 렌더링이 안되는것은 이해했습니다. addItem에서 ModelAttribute name에 "item"을 넣지 않고 addItem()메서드에 Model 객체를 추가해서 model.addAttribute("item",form)으로 데이터를 전송했다면 렌더링은 됩니다. 하지만 bindingResult에 object name은 ModelAttribute name과 매핑이 되기 때문에 "itemSaveForm"이 object 값으로 들어갑니다. @PostMapping("/add") public String addItem(Model model,@Validated @ModelAttribute ItemSaveForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes) { //log.info("bindingResult codes = {}",bindingResult.getFieldError()); log.info("form = {}" , form); if (form.getPrice() != null && form.getQuantity() != null) { int resultPrice = form.getPrice() * form.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); } } //검즘 실패시 입력 폼 if(bindingResult.hasErrors()){ log.info("errors ={}",bindingResult); model.addAttribute("item",form); return "validation/v4/addForm"; } 여기서 궁금한점입니다. 2번과 같은 상황에서 #fields.hasGlobalErrors() 과 th:errors로 아무런 에러정보를 조회할 수 없게 되는거 같은데, th:object="${item}"는 모델을 통해 itemServiceForm 객체 를 넘겻는데, 오류정보를 조회 할 때 bindingResult에 담긴 object name 과 th:object="${item}" 에서 ${item}은 itemSaveForm이지만, ${}안에 item 문자열 자체 가 bindingResult의 object name과 일치 해야지 오류 정보를 조회할수 있는 건가요?? 입력폼 로그 질문하려다보니까 글이 길어졌네요 ㅠㅠ 결론은 bindingResult 에러정보를 추가할때 object name(@ModelAttribute의 name)과 th:object="${}"안에 들어가는 문자열이 일치해야 bindingResult의 오류정보를 조회할수 있는건가요?? 제가 어떤 부분을 놓치고있는 있는건가요..ㅠㅠ!?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요 영한님 강의 정말 잘 듣고 있습니다. 수강 도중 MultipartFile 사용 계층에 관해서 궁금한 부분이 생겨서 질문 드립니다. 제가 생각하기에 MultipartFile은 web 기술과 관련이 있다고 생각을 해서 그런지 서비스 계층의 파라미터로 MultipartFile을 전달하게 된다면 서비스 계층이 web 기술에 대한 의존이 생기는게 아닌가 하는 생각과, 파일을 저장하는 것도 비지니스 로직이니 서비스 계층으로 넘겨서 처리하는게 맞는 것 같다는 생각이 동시에 듭니다. 보통 인터넷을 찾아보면 서비스 계층에서 파일 저장을 수행하는 것 같은데 MultipartFile를 서비스 계층의 파라미터 넘기는 것에 대해 의문을 갖는게 맞는 걸까요? 강의 내용과 관련없는 내용이지만 추가적으로 controller에서 파라미터로 받은 dto를 서비스 계층으로 바로 넘겨도 괜찮은 걸까요?? 괜찮다면 dto의 패키지는 서비스 패키지 하위 o 컨트롤러, 서비스 패키지와 같은 계층 o 컨트롤러 하위 계층 x 이라고 생각하는데 이렇게 생각하는게 맞는 건지 궁금합니다..
안녕하세요! 강의를 학습함에 있어 궁금한 부분이 있습니다. 강의에서 폼 데이터 전달을 위한 등록, 수정용 폼 객체를 분리해서 사용을 했는데 그러면 @GetMapping("/edit")과 @GetMapping("add") 에서도 Item 도메인 객체를 반환하는 것 보다는 아래와 같이 등록, 수정용 객체를 분리해서 반환하는게 더 낫지 않을까 하고 생각되는데 혹시 어떻게 생각하시는지 궁금합니다! @GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new ItemSaveForm()); return "validation/v4/addForm"; } @GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); ItemUpdateForm form = ItemUpdateForm.from(item); model.addAttribute("item", form); return "validation/v4/editForm"; }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 여기에 질문 내용을 남겨주세요. 기존 인텔리제이를 사용하여 학교 수업 및 팀프로젝트를 수행하여 기본 값과는 다른 수 있습니다. 하지만 프로젝트 생성하고 hellospring.main 실행시 Process finished with non-zero exit value 라는 오류가 발생해 구글링 하여 설정을 변경하니 java: warning: source release 17 requires target release 17라는 오류가 발생합니다. 어디를 수정해야하나요? (참고한 사이트: https://yjh5369.tistory.com/entry/intellij-%EC%8B%A4%ED%96%89-%EC%8B%9C-finished-with-non-zero-exit-value-1-%EC%98%A4%EB%A5%98 )
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의 예제를 따라하다가 @ModelAttribute 에 매핑하는 Item 클래스에 @AllArgsConstructor 와 @NoArgsConstructor 만 붙이고, 진행을 하니 @AllArgsConstructor가 있음에도 불구하고 form 데이터의 값을 매핑하지 못했습니다. 이 경우 기본 생성자를 지우거나, @Setter 를 달면 정상작동하는데, 왜 이렇게 동작하는 것인지 질문드리고 싶습니다 !
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 가격에 문자를 입력하면 400 에러가 발생합니다. Controller @PostMapping("/add") public String addItemv3(@ModelAttribute Item item, RedirectAttributes redirectAttributes, BindingResult bindingResult) { // bindingResult 스프링 제공 검증 기능 //검증 로직 if(!StringUtils.hasText(item.getItemName())){ // bindingResult.addError(new FieldError("item","itemName","상품 이름은 필수 입니다.")); bindingResult.addError(new FieldError("item","itemName",item.getItemName(),false,new String[]{"required.item.itemName"},null,null)); } if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) { // bindingResult.addError(new FieldError("item","price","가격은 1,000 ~ 1,000,000 까지 허용합니다.")); bindingResult.addError(new FieldError("item","price",item.getPrice(),false,new String[]{"range.item.price"},new Object[]{1000,1000000},null)); } if (item.getQuantity() == null || item.getQuantity() >= 9999) { // bindingResult.addError(new FieldError("item","quantity","수량은 최대 9,999 까지 허용합니다.")); bindingResult.addError(new FieldError("item","quantity",item.getQuantity(),false,new String[]{"max.item.quantity"},new Object[]{9999},null)); } //특정 필드가 아닌 복합 룰 검증 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.addError(new ObjectError("item",new String[]{"totalPriceMin"},new Object[]{10000,resultPrice},null)); } } log.info("bindingResult ={}"+bindingResult); //검증에 실패하면 다시 입력 폼으로 if (!bindingResult.hasErrors()) { log.info("errors={}",bindingResult); return "validation/v2/addForm"; } // 성공 로직 Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:/validation/v2/items/{itemId}"; } @GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); return "validation/v2/addForm"; } 강의에서는 error 출력하는 부분에서 스프링에서 제공하는 메세지가 뜨는데 저는 위와 같이 결과가 나옵니다. 로그는 2023-07-13 08:31:36.584 WARN 20844 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'item' on field 'price': rejected value [qq]; codes [typeMismatch.item.price,typeMismatch.price, typeMismatch.java .lang.Integer,typeMismatch]; arguments [ org.springframework.context.support .DefaultMessageSourceResolvable: codes [item.price,price]; arguments []; default message [price]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'price'; nested exception is java.lang.NumberFormatException: For input string: "qq"]] 이렇게 나옵니다. 혹시 원인을 알 수 있을까여?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 6:23에 필드주입을 하면 중간에 바꿔치기를 할수있는 방법이 없다는게 무슨 말인가요? 그럼 생성자주입은 바꿔치기가 된다는건데 이게 조립될때를 말하는건가요? 그럼 필드주입은 조립될때도 안바뀐다는건가요? 실행중에 바꾸는건 세터만 된다는식으로 얘기를해서요 컨트롤러가 정확하게 어떻게 작동되는지에 대한 이해가 아직 부족한거같은데 로드맵 따라가다보면 채워지는 부분일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. MemberServiceTest에서 BeforeEach에서 새로 객체를 불러오고 AfterEach에선 다음 테스트를 위해 저장된걸 지우는걸로 이해를 했는데 어차피 객체를 새로 만드는데 지우는 과정이 왜 필요한건가요? 그래서 AfterEach 코드를 지워봤는데 회원가입()에서부터 막히더라고요 AfterEach는 테스트가 끝나고 실행되는건데 왜 첫번째 테스트부터 작동에 문제가 생기는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] JAVA 17, 스프링부트 3.0 이상 사용중입니다. 현재 매뉴얼에는 스프링부트 3.0 이상 사용자는 dependency 부분만 수정하면 작동이 가능하다고 되어있는데 회원등록 후 회원조회를 해보니 WhiteLabel Error와 함께 다음과 같은 오류가 발생했습니다. ERROR 84347 --- [nio-8080-exec-2] a.c.c.C.[.[.[.[frontControllerServletV1] : Servlet.service() for servlet [frontControllerServletV1] in context with path [] threw exception [/WEB-INF/views/members.jsp (line: [17], column: [4]) According to TLD or attribute directive in tag file, attribute [items] does not accept any expressions] with root cause 이와 관련하여 해결방법을 찾아보니 JSTL의 버전업으로 인해 taglib 사용 시 uri를 " http://java.sun.com/jstl/core " 가 아닌 " http://java.sun.com/jstl/core_rt"를 사용하면 정상적으로 회원목록 조회가 작동하는 것을 확인하였습니다. 관련자료 : https://erim1005.tistory.com/entry/JSTLAccording-to-TLD-or-attribute-directive-in-tag-file