월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
redirectAttributes 질문
@PostMapping("/login") public String loginV4(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, // @RequestParam(defaultValue = "/") String redirectURL, RedirectAttributes redirectAttributes, HttpServletRequest request) { if (bindingResult.hasErrors()) { log.info("errors={}", bindingResult); return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); log.info("login? {}", loginMember); if (loginMember == null) { bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); log.info("bindingResult={}", bindingResult); return "login/loginForm"; } //세션이 있으면 있는 세션 반환, 없으면 생성 HttpSession session = request.getSession(); //세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); //redirectURL 적용 log.info("request.getParameter={}",request.getParameter("redirectURL")); redirectAttributes.addAttribute("redirectURL", request.getParameter("redirectURL")); return "redirect:{redirectURL}"; }맨 아래에서 강사님과 다르게 @RequestParam을 사용하지 않고 RedirectAttributes와 getParameter를 이용해서 처리를 해 보려 했는데,실행 결과 {redirectURL}의 부분이 'localhost:8080/%2Fitems' 로 뜹니다.redirectAttributes에 넣을 때 잘못된 건가 싶어서 request.getParameter의 로그를 찍어보면 정상적으로 /items로 나옵니다.어디가 잘못 된 건지 여러 번 돌려봐도 모르겠어서 질문 남깁니다! 추가 : URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험하다. 다음에 설명하는 RedirectAttributes 를 사용하자.라고 하셨는데 @RequestParam 으로 받은 변수값을 써도 괜찮은 건지 잘 모르겠습니다!
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
pdf의 Exception 자바 직접 실행 부분에서 궁금한 점이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래는 pdf에 나온 설명입니다. Exception(예외)자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main 이라는 이름의 쓰레드가 실행된다. 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰 레드는 종료된다. 자바 문법책으로 공부할 때 try catch 없이 예외가 터지면 프로그램이 종료되고,try catch 없더라도 throws를 통해 메서드를 호출한 곳으로 떠넘기면, 그곳에서 try catch를 하거나, 아니면 또 계속 떠넘겨서 main 메서드에서도 throws를 통해 JVM이 예외를 처리하는 방법도 있다고는 알고 있습니다. 강의 자료 pdf에 나온 "실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면" 이 의미는 throws 키워드를 사용해서 계속 떠넘겼다는 의미인가요? 아니면 throws를 안 쓰더라도 저런 식으로 예외가 넘어간다고 생각하면 되는 건가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의를 들어보면 loginV3메소드 파라미터에 HttpServletRequest request를 선언하고 HttpSession session = request.getSession(); 을 통해 세션을 생성하는 것을 볼 수 있었습니다.하지만, 저는 프로젝트를 진행할 때 세션이 사용되는 메서드에 파라미터를 HttpSession session을 사용했습니다.그래서, HttpSession session = request.getSession(); 이와 같은 코드 없이 세션을 생성하거나 삭제하였습니다. 둘의 차이가 있을까요? 굳이 HttpSession session = request.getSession(); 를 작성할 필요가 있나요?아래는 저의 코드입니다.
- 미해결스프링 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"를 따로 추가해보거나 공식 메뉴얼을 참고해봤는데 관련된 내용을 찾지 못했습니다.원인은 excludePathPatterns에 추가한 "/{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가 좀 더 명확하지 않나 싶어서 제보합니다.