월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
pathvariable 사용 시 인터셉터 문제
경로 변수를 사용하는 URL에 인터셉터가 예상대로 동작하지 않아서 예시를 통해 질문드립니다.@GetMapping("/{item}/{itemId}") public String itemDetail(@PathVariable("item") ItemType itemType, @PathVariable Long itemId, ...) {...}ex) "/book/4", "/album/10"...상품을 단순 조회하는 url은 로그인 체크 인터셉터 대상에서 제외합니다.registry.addInterceptor(new LoginCheckInterceptor()) .order(1) .addPathPatterns("/**") .excludePathPatterns("/", "/{item}", "/{item}/{itemId}", ...);이후 "/book/11"과 같이 접속하면 비로그인 상태에서도 조회됩니다.근데 판매자만 접근할 수 있어서 로그인이 필요한 "/book/new"라는 url이 요청되면, 예상과 달리 로그인 인터셉터를 거치지 않고 정상 조회됩니다. @GetMapping("/{item}/new")addpathpatterens에 "/{item}/new"를 따로 추가해보거나 공식 메뉴얼을 참고해봤는데 관련된 내용을 찾지 못했습니다.원인은 excludePathPatterens에 추가한 "/{item}/{itemId}"의 {itemId}에 요청한 url "/book/new" new가 매칭되기 때문에 "/book/new"도 인터셉터에서 제외된 것 같습니다.그래서 url을 "/movie/100"이 아니라 "/items/movie/100"과 같이 사용하거나 또는 상품 등록 url을 "/items/new"처럼 정해서 사용해야 하는데..이와 관련해 해결 방법이 있을까요?그냥 dtype이나 Id값은 쿼리파라미터로 따로 받는 게 나을지도 모르겠네요..
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
homeLoginV3에서 세션에서 멤버를 꺼내와서 타입변환을 하는 이유
@GetMapping("/") public String homeLoginV3(HttpServletRequest request, Model model) { //세션 관리자에 저장된 회원 정보 조회 HttpSession session = request.getSession(false); if (session == null) { return "home"; } // 여기에요 여기!! Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); //세션이 유지되면 로그인으로 이동 model.addAttribute("member", member); return "loginHome"; }세션에서 값을 꺼내와서 Object 타입을 그대로 넣지 않고 Member로 강제 타입 변환을 시키는 이유가 무엇인가요?타입 변환없이 돌려도 작동하는데 굳이 타입을 변경하는 이유가 궁금합니다!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
request값으로 뭘 넣어야할지 잘 감이 안옵니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]김영한 강사님의 mvc와 jpa 수업을 어느정도 듣고 프로젝트를 참가하였는데 종종 까먹어서 다시 와서 듣곤 합니다. 근데 최근 프로젝트를 하면서 계속 헷갈리는게 request 값을 어떻게 넣어줘야할지 모르겠습니다...restController를 만들고있는데 만약 댓글 생성하는 컨트롤러를 만든다고 치면, board_Id는 @pathvariable을 통해서 가져와 getID 하면 된다고 치지만. 글을 작성하는 User는 어떻게 받아와야할지... 그냥 냅다 request에 User user를 받아와도 되는건지 헷갈립니다.. 프론트를 안해봐서 그런지 더 헷갈리는거같아요. 만약에 댓글을 작성하는 컨트롤러를 만든다고 하였을 때, User user, @pathvariable board_id, comment comment 라고 한다면 comment는 form에서 Post로 값이 넘어오는 건 알겠는데 User같은 경우는 어떻게 받아야하나요..?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
요청 로그 남기기
요청로그를 남길때 인터셉터보다 서블릿 필터에서 남기는게 더 좋지 않나요?왜냐하면 mvc로 진입하기 이전에 문제가 발생하면 로그 자체도 못남길수 있을텐데처음에 더 앞단인 서블릿 필터에서 요청 로그를 남기는게 좋지않나요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
메시지, 국제화 처리 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]메시지, 국제화 처리를 thymeleaf에서는 #{} 로 처리를 하지만 리액트와 협업을 할 때는 어떻게 메시지, 국제화 처리를 하나요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
글로벌 예외 처리를 서블릿?
스프링으로 rest api 서버를 만들때 RestControllerAdvice를 사용하여 컨트롤러 이하 레벨의 예외를 공통으러 처리하는데 서블릿 필터를 이용하여서도 공통 예외 처리가 필요할까요..?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
섹션 6. 로그인 처리1
@PostMapping("/logout") public String logout(HttpServletResponse response) { expired(response, "memberId"); return "/"; } private void expired(HttpServletResponse response, String cookieName) { Cookie cookie = new Cookie(cookieName, null); cookie.setMaxAge(0); response.addCookie(cookie); }로그아웃 할 때, 쿠키에 setMaxAge(0)으로 쿠키를 날리는 것은 이해가 되는데, 쿠키를 새로 만들어서 보내는 이유는 뭔가요? 원래 있던 쿠키의 setMaxAge(0)으로 바꾸는 것도 아니고, new Cookie를 만들어서, 새로 만든 쿠키의 기간을 0으로 맞추는데 어째서 원래 있던 쿠키가 사라지는 건지 모르겠습니다!
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
상품 등록에서 상품명을 빈 칸으로 넣었을 때
html <form action="item.html" th:action th:object="${item}" method="post"> <label for="itemName" th:text="#{label.item.itemName}">상품명</label> <input type="text" id="itemName" th:field="*{itemName}" th:errorclass="field-error" class="form-control" placeholder="이름을 입력하세요"> <div class="field-error" th:errors="*{itemName}"> 상품명 오류 </div> controller @PostMapping("/add") public String addItemV3(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { log.info("objectName={}", bindingResult.getObjectName()); log.info("target={}", bindingResult.getTarget()); //검증 로직 if (!StringUtils.hasText(item.getItemName())) { 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", 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", 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)); } } //검증에 실패하면 다시 입력 폼으로 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}"; } log 2024-06-26T10:44:00.155+09:00 INFO 22592 --- [nio-8081-exec-8] h.i.w.v.ValidationItemControllerV2 : target=Item(id=null, itemName=, price=null, quantity=null)상품 등록 창에서 전체 칸을 빈칸으로 넣어서 로그를 출력했을 때,id, price, quantity는 null이 들어갔는데 itemName는 null이 아니라 그냥 빈칸인가요??
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Session ID의 저장 위치는 어디인가요?
서버가 받은 요청의 JSESSIONID가 A12345이고, 서버 측 HTTP Session의 사용자 {username: "john123"}의 JSESSIONID가 A12345라고 가정하겠습니다. 그럼 A12345 == {username: "john123"}인데, A12345라는 세션ID 요청을 받았을 때 john123이라는 사용자에 대한 정보를 제공해야 합니다. 이때 서버에서 Session ID를 저장하는 곳은 어디인가요?그 클래스는 아래와 같은 작업을 수행할 것입니다. public void addSession(String sessionId, HttpSession session) { sessions.put(sessionId, session); } public HttpSession getSession(String sessionId) { return sessions.get(sessionId); }
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
자바와 스프링 버전 변경 방법
수업에 사용되는 파일의 스프링 버전을 변경하려면 어떻게 해야하나요?버전이 17일 때는 한글이 나오는데 그 외의 버전은 한글이 깨져서 나옵니다ㅠㅠ수업에 사용되는 파일의 버전은 자바 11, 스프링 2.4.4입니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션에 보관하면 안되는 정보
세션 하이재킹이란 게 세션 id가 담긴 쿠키를 탈취하는 것인데, 이때 세션에 민감한 정보가 보관된 상태라면 사용자에게 노출할 가능성이 있어서 보관하면 안되는 것인가요?member_id와 같은 pk 값은 세션에 보관해도 되나요? (현재 레디스 세션을 사용 중입니다)
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
afterCompletion()은 완전히 응답이 나가고 난 이후에 호출된다는 의미
[질문 내용]강의에서 afterCompletion()은 완전히 응답이 나가고 난 이후에 호출된다고 하신 의미가 궁금합니다.아래 그림으로 생각하면, 클라이언트에게 원래 보내고자 하는 응답이 WAS를 통해 클라이언트 쪽으로 보내진 다음, 그다음에 또 afterCompletion()이 호출되면서 예외가 WAS 쪽으로 보내진다는 의미인 건가요? 만약 afterCompletion() 코드 내에서 response에 뭔가를 넣어서 보내려고 하면, 클라이언트 쪽으로 원래 응답 + afterCompletion()으로 생긴 응답 2개가 보내지는 건가요? 제가 잘못 이해한 것 같아서 질문드립니다! +) 그림에서 X 그림이 총 4개인데 postHandle()에 있는 X는 그냥 postHandle()이 호출 안 된다는 의미로의 X이고, 나머지는 예외를 그냥 X라는 그림으로 표현했다고 생각하면 되는 거죠? X를 예외라고 생각하면 될 것 같았는데 postHandle()에도 있으니깐 postHandle()에도 예외가 전달되는 거처럼 보여서, 혹시 몰라서 질문드립니다!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 템플릿 레이아웃 사용 시 js 안 됨
현재 스프링데이터JPA와 스프링 활용2에서 타임리프를 보며 개인 프로젝트를 진행하던 중 같은 main.html이지만 url이 다르면 js 코드가 적용이 안 되어 도움을 구합니다....user_search.js에서 UserSearchController에 url 매핑을 하여 return으로 그냥 다시 main.html을 호출하는 방식인데 안되네요... 어느 부분이 오류인지 못 찾겠습니다...https://drive.google.com/file/d/19zwAkqf9PijmfLiNzg8amCdJrJtvjsmA/view?usp=sharing
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Exception 던질 때 String 으로 반환값을 설정하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] @GetMapping("/api/response-status-ex2") public String responseStatusEx2() { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "error.bad", new IllegalArgumentException()); } 이 코드를 보면 String 을 반환하게 되어 있는데 저렇게 exception 던지면 String 반환하는 게 아니지 않나요? void 대신 String 을 쓰는 이유가 있는지 궁금합니다!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Validator에 대하여 질문
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class LoginDto { @NotBlank private String email; @NotBlank private String password; } ------------------------------------- @Component public class LoginValidator implements Validator { private final UserRepository userRepository; public LoginValidator(UserRepository userRepository) { this.userRepository = userRepository; } @Override public boolean supports(Class<?> clazz) { return LoginDto.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { LoginDto loginDto = (LoginDto) target; User user = userRepository.findByEmail(loginDto.getEmail()); if (user == null) { throw new LoginFailedException("User not found"); } if (!user.getPassword().equals(loginDto.getPassword())) { throw new LoginFailedException("Invalid password"); } } }위 코드처럼 DTO 클래스에서 간단한 검증은 bean validation으로 시행하고, 복잡한 검증로직은 LoginValidator에서 관리 및 커스텀 예외를 리턴하는 방식은 안좋은 방식인가요?제가 알기로는 errors는 bindingresult처럼 복잡한 검증이 아니라 단순한 검증결과를 담는 것으로 알고 있는데, validate를 override하여 복잡한 검증 실행 및 검증 결과를 LoginFailedException(커스텀 예외)으로 반환하려고 하니 Errors를 리턴해야 한다는 강제성 때문에 혼란이 생겼습니다. 따라서 제가 궁금한 점은, 간단한 검증작업(ex. 정규식) 과 복잡한 검증작업(ex.이메일,비밀번호가 DB에 있는지 검증)은 어떻게 처리하는게 이상적인가? 입니다. 저는 각각 Bean Validation, Validator(커스텀 예외 반환)로 해보려했는데 아닌 것 같아서 질문드립니다. 감사합니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Validator 클래스
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class LoginDto { @NotBlank private String email; @NotBlank private String password; } ------------------------------------- @Component public class LoginValidator implements Validator { private final UserRepository userRepository; public LoginValidator(UserRepository userRepository) { this.userRepository = userRepository; } @Override public boolean supports(Class<?> clazz) { return LoginDto.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { LoginDto loginDto = (LoginDto) target; User user = userRepository.findByEmail(loginDto.getEmail()); if (user == null) { throw new LoginFailedException("User not found"); } if (!user.getPassword().equals(loginDto.getPassword())) { throw new LoginFailedException("Invalid password"); } } }위 코드처럼 DTO 클래스에서 간단한 검증은 bean validation으로 시행하고, 복잡한 검증로직은 LoginValidator에서 관리 및 커스텀 예외를 리턴하는 방식은 안좋은 방식인가요?제가 알기로는 errors는 bindingresult처럼 복잡한 검증이 아니라 단순한 검증결과를 담는 것으로 알고 있는데, validate를 override하여 복잡한 검증 실행 및 검증 결과를 LoginFailedException(커스텀 예외)으로 반환하려고 하니 Errors를 리턴해야 한다는 강제성 때문에 혼란이 생겼습니다. 따라서 제가 궁금한 점은, 간단한 검증작업(ex. 정규식) 과 복잡한 검증작업(ex.이메일,비밀번호가 DB에 있는지 검증)은 어떻게 처리하는게 이상적인가? 입니다. 저는 각각 Bean Validation, Validator(커스텀 예외 반환)로 해보려했는데 아닌 것 같아서 질문드립니다. 감사합니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오타라고 봐도 될지 모르겠는데 일단 제보합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6. 로그인 처리1 - 쿠키, 세션.pdf (v20240408) '쿠키를 사용해서 로그인Id를 전달해서 ~~~' 이런 식으로 나와 있는데여기에 써진 로그인Id가 loginId랑 같은 의미라면 혹시 오타일까요?쿠키를 통해 전달하는 건 MemberRepository의 store에 저장된 id라서 memberId 혹은 id가 좀 더 명확하지 않나 싶어서 제보합니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
postman에서 message : ??? 나올 때
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 Postman으로 요청을 보냈을 때 ??? 값이 나온다면Setting > File Encodings > Transparent native-to-ascii conversion 을 체크 해주시고 다시 Postman을 확인해보면 잘 나옵니다!
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
예외 처리에 대해 질문 있습니다.
아래 내용은 제가 정리한 글입니다. - 예외 처리 흐름🧸 Spring MVC 내부에서 예외 처리:1. 예외 발생: 컨트롤러에서 예외가 발생한다.2. 예외 전파: 예외가 DispatcherServlet으로 전파된다.3. HandlerExceptionResolver: DispatcherServlet은 등록된 예외 처리기를 통해 예외를 처리하려고 시도한다.4. Custom Exception Handlers: @ControllerAdvice에 정의된 예외 처리기가 있으면 이를 사용하여 예외를 처리한다.5. BasicErrorController: 위의 처리기들에서 예외를 처리하지 못하면, /error 경로로 요청이 전달되어 BasicErrorController가 기본적인 에러 처리를 수행한다.6. 클라이언트 응답: BasicErrorController가 예외를 처리하고 클라이언트에게 적절한 에러 응답을 반환한다.🧸 WAS로 예외 전파:1. 예외 처리 실패: DispatcherServlet이나 BasicErrorController가 예외를 처리하지 못한다.2. WAS로 전파: 예외가 WAS(톰캣)로 전파된다.3. 에러 설정에 따른 재요청: WAS는 Spring Boot가 설정한 에러 핸들링 설정에 따라 /error 경로로 재요청을 보낸다.4. 에러 처리: /error 경로로 재요청된 에러를 BasicErrorController가 처리한다.5. 클라이언트 응답: BasicErrorController가 예외를 처리하고 클라이언트에게 적절한 에러 응답을 반환한다.위의 흐름에서 알 수 있듯이, 기본적인 에러 처리 방식은 컨트롤러에서 발생한 예외를 BasicErrorController를 통해 처리하는 것이다. 예외가 WAS까지 전파되는 경우는 예외적인 상황이며, 일반적으로는 Spring MVC 내부에서 예외가 처리된다. 간단하게 얘기해서 예외 또는 에러가 WAS까지 전파되는 상황은 드물고, 주로 Spring MVC(ControllerAdvice, RestControllerAdvice, ExceptionHandler, ResponseStatus, ResponseStatusException, BasicErrorController)가 처리하여 컨트롤러단에서 예외가 처리되는 것으로 이해를 하고 정리를 하였습니다. 그런데 검색을 하다보니 아래와 같은 내용들을 발견하였습니다.Spring은 BasicErrorController를 구현해두었다. ExceptionHandler나 ControllerAdvice처럼 직접 에러를 반환하는 경우에는 BasicErrorController를 거치지 않지만, @ResponseStatus, ResponseStatusException 등과 같이 직접 에러 응답을 반환하지 않는 경우에는 최종적으로 BasicErrorController를 거쳐 에러가 처리된다. 클라이언트 입장에서는 이를 모르지만 내부에서는 2번 컨트롤러로 요청이 전달되는 과정이 진행된다.우리가 만든 예외 클래스에 다음과 같이 @ResponseStatus로 응답 상태를 지정해줄 수 있다. @ResponseStatus(value = HttpStatus.NOT_FOUND) public class NoSuchElementFoundException extends RuntimeException { ... } // 그러면 ResponseStatusExceptionResolver가 지정해준 상태로 에러 응답이 내려가도록 처리한다. { "timestamp": "2021-12-31T03:35:44.675+00:00", "status": 404, "error": "Not Found", "path": "/product/5000" }하지만 에러 응답에서 볼 수 있듯이 이는 BasicErrorController에 의한 응답이다. 즉, @ResponseStatus를 처리하는 ResponseStatusExceptionResolver는 WAS까지 예외를 전달시키며, 복잡한 WAS의 에러 요청 전달이 진행되는 것이다. (WAS까지 예외가 전달되고, WAS의 에러 요청 전달이 진행됨)그렇다면 제가 정리한 내용과 위 내용은 반대되는데, 어떤 것이 맞는건지 잘 모르겠습니다.제가 정리한 내용이 맞다면, @Responsestatus는 ExceptioNResolver, 정확하게는 ResponseStatusExceptionResolver에 의해서 처리되므로 컨트롤러단에서 예외처리가 되어야 하는것이 맞다고 생각하는데, 어떤 것이 참인가요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
"서블릿 필터 - 인증 체크" 강의에서 질문있습니다.
강사님께서 설명해주신대로 LoginCheckFilter를 만들어서 적용해서 Chrome에서 실행해봤는데 localhost:8080/items를 입력해도 자동으로 localhost:8080 으로 이동합니다... 그래서 혹시나 싶어서 LoginCheckFilter를 적용하기 전으로 하고 다시 localhost:8080/items 를 입력했더니, 그래도 localhost:8080 으로 이동이 됩니다.제가 코드를 잘못 입력한건가 싶었는데 Chrome이 아니라 Safari로 들어가서 localhost:8080/items를 입력하면 Filter적용전에는 localhost:8080/items 에 접근이 가능하고, Filter 적용시에는 http://localhost:8080/login?redirectURL=/items 로 redirect가 이루어집니다.Chrome에서 어떤 설정을 만져야 제대로 동작하게 될까요....?Safari에서는 제대로 동작하는데 왜 Chrome만 동작이 안되는지 모르겠습니다...