묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
검증 필드의 영역
안녕하세요 사이드 프로젝트를 하면서선생님에게 배운 테스트를 적용하며 성장 하고 있습니다.감사합니다! 👍테스트를 하며 작은 궁금증이 생겼습니다.만약 10개의 필드를 업데이트 한다면 모든 필드를extracting 하여 검증 해야 하나요?3~4개의 대표적인 필드만 하는게 맞을까요?다 검증 하는게 안정성은 무조건 좋다고 생각 합니다.하지만 검증 부분이 길어 가독성이 좋지 않을것 같기도 하고3~4개면 검증 되지 않을까 하는 생각도 듭니다. 다른 질문은 프로젝트 중 고민이 있어서 혹시 선생님은어떻게 생각 하시나 궁금해서 여쭈어 봅니다. 🙏현재 프로젝트에서요청 할때 JWT 토큰을 내고 user의 정보를시큐리티 컨텍스트 홀더에 저장 하고 있습니다.api 요청이 올 떄@GetMapping("/{id}")이렇게 파라미터로 받지 않고컨텍스트 홀더의 유저 ID를 사용 하고 있습니다.컨텍스트 정보를 UserUtils로 만들고 서비스에서utils 값을 꺼내어 사용 하고 있습니다.현재 까진 문제가 없는데 혹시 안좋은 방법인가요? 마지막 질문은 블로그에 테스트에 관해 작성 해도 괜찮을까요?테스트의 전체적인 흐름을 알려주는 곳이 없어서 답답했는데컨트롤러, 서비스, 리포지토리 각 어떤것을 중점으로 테스트 하는지 적을려고 합니다.선생님 코드가 일부 인용 할 것 같아서 혹시 가능할까요?물론 출처는 남길거에요!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링부트 검증 직접 처리 중 오류 발생시 컨트롤러 진입 전에 예외 발생
스프링 MVC 2편 중 섹션4. 검증의 '검증 직접 처리-개발' 강의의 28:50에서 김영한 강사님이 강의 자료를 보고 설명하시는데 다음과 같은 문구가 있는데요. '타입 오류는 스프링MVC에서 컨트롤러 진입도 전에 예외가 발생한다' 이 부분에서 질문이 있습니다. 일단 폼에서 값을 넘기면 post를 타고 해당 requestmapping이 된 url을 컨트롤러에서 발견을 하고 넘어온 값들을 해당 메서드에서 매핑된 VO를 찾아 값을 넣어주려는 것 아닌가요?일단 컨트롤러 진입 후 VO에 값을 매핑하는 것 같은데 진입도 전에 에러가 나는 건 어떻게 에러가 나타나는 건가요?일단 VO까지는 가야지 타입이 무엇인지 알 수 있고, VO는 컨트롤러에서 확인할 수 있지 않나요?답변 부탁드립니다!
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
train_test_split()와 StratifiedKFold() 차이
예제에서는 DecisionTreeClassifier 알고리즘의 정확도를 검증하기 위해train_test_split()와 StratifiedKFold()를 사용했습니다.둘다 랜덤으로 학습데이터와 테스트데이터를 선택하는데요,영상 2:50 쯤의 그림으로 이해하기로는 학습 세트 4/5선택을 5번 하는 것으로 보이는데요(StratifiedKFold의 경우 랜덤으로 선택)결국 train_test_split(test_size=0.2)를 다섯번 시행한 후 평균을 낸것과 동일한 것 아닌가요?두 검증 방법의 본질적인 차이는 무엇인가요? *데이터가 충분하고 정규분포라고 할 때 결국은 동일한 결과가 나오지 않을까 해서요.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
validator 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] validator를 거쳐서 다시 입력 폼으로 돌아왔을때 input type=password 일때에는 값이 넘어오질않네요 ㅜㅜtext로 바꿨을때는 잘 넘어와요 방법이 없을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요 객체오류와 필드 오류에 대해서 질문이 있습니다.
안녕하세요 선생님강의 잘보고 있습니다. 지금까지 잘 따라오면서 공부하다 객체오류와 필드 오류에 대해서 궁금한 점이 있어 질문드립니다.저는 필드 오류에 대해서는 해당 필드하나에서 처리할 수 있는 오류이고 객체 오류에 대해서는 필드 오류에 해당하지 않는 오류들을 말을 하는 것으로 이해 했는데 혹시 제가 이해한 것이 맞을까요?? 그렇다면 타입이 맞지 않아서 생기는 오류는 객체 오류인가요??
-
미해결스프링 핵심 원리 - 고급편
로그 검증과 관련되어 질문드립니다.
안녕하세요! 강의를 듣다가 로그 검증이 하고 싶어 진행하다 궁금증이 생겨 질문글을 올렸습니다.☺️ 1. 생성한로그를 테스트하기 위해서 ListAppender에 로그들을 담아서 테스트를 진행하게 됐는데, 해당 방식으로 테스트를 진행하는 방법말고도 다른 방법도 있나요? 2. 실제 비즈니스 로직에서 해당 로그 출력 검증을 단위 테스트할 때 진행하게 되나요? 3. 실무에서는 로그를 검증하기 위해 어떤 방식을 사용하는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
검증 로직이 들어가는 계층
안녕하세요. BindingResult를 배우기 전에는 검증 로직을 작성할 때 Service에 작성을 했는데, BindingResult를 도입하고 나서부터는 Controller에 검증 로직이 들어가는데, 그렇다면 검증 로직이 들어가야 하는 부분이 이제는 Controller가 되는건가요? Controller는 모델과 뷰의 중간 역할을 하고 Service에서 비즈니스 로직을 처리한다고 하면, 검증 로직이 service에 들어가야 할 것 같은데 이 부분이 조금 헷갈리네요..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
테스트에서의 bindingResult 오작동
안녕하세요. 스프링 Junit 테스트로 검증 부분을 테스트 하던 중 의도대로 되지 않는 부분이 있어서 질문드립니다. 먼저 테스트 하려는 컨트롤러는 JSON 데이터를 파라미터로 받아서 검증을 하고 (@Valid @RequestBody) 검증이 실패하면(bindingResult.hasErrors가 true일 때) 예외를 발생시키는데, 해당 예외는 컨트롤러 어드바이스로 받아 http 400코드를 응답 하게끔 설계를 하였습니다. (포스트맨으로 검증에 실패하는 데이터를 보냈을 때 400으로 응답되는 것을 확인하였습니다.) 그런데 테스트 코드에선 검증에 통과못하는 데이터를 넣어 mockMvc.perform으로 테스트 해보니 기대와는 다르게 http 200코드가 찍히면서 검증이 통과되는 결과가 나왔습니다. (andExpect에서 getResolvedException()이 null로 찍히는 것을 보니 bindingResult.hasErrors가 false가 되는 것 같습니다) 컨트롤러 어드바이스가 문제인가 싶어서 다른 예외를 발생시켜 테스트 해보았는데, 다른 예외는 잘 처리되더라구요. 혹시 이러한 검증 로직을 mockMvc로 테스트 하는 방법이 따로 있는 것 일까요? 스프링은 5.x.x 버전이며 junit은 4.12 버전을 사용 중 입니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
어플리케이션 로직이 필요한 검증의 분리
안녕하세요. 항상 강의 너무 잘 듣고 있습니다! 개인 프로젝트로 질문/답변 게시판 웹사이트 구현을 진행하고 있습니다. 대부분의 로직에 질문/답변 요청의 작성자임을 확인하는 로직이 필요한데 해당 검증 로직은 필연적으로 어플리케이션(DB단 까지)로직이 필요합니다. 제 생각에 검증기validator 클래스를 도입하는 것 보다 Filter나 인터셉터를 활용하는 방식이 좋아보이는데 맞을까요?? 현재 코드는 아래와 같습니다. 게시글의 수정페이지에 대한 Get매핑과 수정하는 PostMapping입니다. Post - 게시글, Account - 계정(작성자) @GetMapping("qna/edit/{postId}")public String PostEditForm(@PathVariable Long postId, Model model){ //사용자 검증 if(!isValidEditRequest(postId)){ return "denied"; } Post post = postService.findById(postId); model.addAttribute("post",post); return "qna/edit";}@PostMapping("qna/edit/{postId}")public String PostEdit(@PathVariable Long postId, PostDto postDto){ //사용자 검증 if(!isValidEditRequest(postId)){ return "denied"; } //수정 postService.edit(postId,postDto); //수정 후 수정된 게시글로 이동 return "redirect:/qna/show/"+postId;}private boolean isValidEditRequest(Long postId) { return postService.isWrittenBy(postId, getAccount().getId());} 질문은 아래와 같습니다. 1. Validator, Filter, Interceptor가 service를 참조해도 괜찮을까요? 2. 해당 로직을 처리하는 정형화된 방식이 Spring Security에 있을까요?? 감사합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
검증 처리의 위치와 서비스 단계에서 validator처리 문제점
안녕하세요 김영한 은사님, 강의 열심히 잘 보고 있습니다.다름 아닌 개인 프로젝트 중 궁금한 질문이 생겨서 다음과 같이 남깁니다.Q1. 검증의 처리는 컨트롤러 or 서비스 단계 중 어디서 하는 것이 적당한가요? 구글링 결과 다 상황에 따라 다르다는 답변을 들었습니다. 그러나 실무 경험이 풍부한 김영한 강사님과 다른 수강생들의 의견이 궁금합니다. 만약 상황에 따라 다른 단계에 구현한다면 그에 따른 유지보수 문제는 감수하고 가는게 맞나요?Q2. 저는 재활용성을 우선시하여 서비스 단계에서 validator 를 주입하여 처리하고 있습니다. 그런데 binding result를 어떻게 처리해야할 지 모르겠습니다.물론 커스텀 에노테이션, bean validation을 사용하면 된다는 것을 알고 있습니다. 그러나 아직은 공부 단계이므로 validator을 통해서만 해결해보고 싶은데 방법이 있을까요? public String join(@ModelAttribute("member") MemberSaveForm memberForm,BindingResult bindingResult) { Member saveMember = new Member(memberForm); //아래와 같은 부적절한 코드 발생 bindingResult = memberService.join(saveMember, bindingResult); //서비스의 메소드 파라미터로 bindingResult를 넣고 그 메소드내에서 검증 처리 후 // 에러를 주입해서 다시 돌려주는 코드 if (bindingResult.hasErrors()) { return "/user/join"; } }
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@InitBinder와 @Validated 사용 시 문제 IllegalStateException: Invalid target for Validator
검증 시 @InitBinder 를 사용해서 Validator 를 추가했을 때, 강의 예제와 같은 상황에선 문제가 없습니다. 하지만, 너무 햇갈리는 상황이 일어나서 질문드립니다. 컨트롤러의 매핑 메서드의 인자에 @Validated 애노테이션을 추가하지 않더라도 매핑 메서드에서 model.addAttribute(); 에 Item 이 아닌 객체를 넣을 시 다음과 같은 오류가 발생합니다.. java.lang.IllegalStateException: Invalid target for Validator ====== 추가. 우선 디버깅을 하다보니 @Validated 를 붙이지 않아도 무엇이든지 값을 매핑해야할 일이 있다면 @InitBinder 를 통해 등록한 Validator 의 support() 가 호출 된다는 것을 알 수 있었습니다. 근데, 이걸 보고나니 더욱 의문이 남는게 Validator의 support() 를 실행했을 때 false 가 나와서 해당 검증기를 지원하지 않는다고 하면 그냥 검증을 안하고 넘어가는게 아닌가봅니다..잘 이해가 가지 않습니다. 결국 Model 객체에다가 Item이 아닌 다른 객체를 넣을 때, 결과적으로 DataBinder.java 안의 assertValidators(Validator ... validators); 메서드에서 if (validator != null && (target != null && !validator.supports(target.getClass()))) { throw new IllegalStateException("Invalid target for Validator [" + validator + "]: " + target); } 조건이 참이되버려서 지원하지 않는다면 그냥 예외가 터져버리고 맙니다. 이런식으로 된다면 @InitBinder 로 검증기를 등록해서 사용하다간, 되려 예측하지 못한 검증찾기 실패 오류만 늘어나는것이 아닌지 생각됩니다... 한 컨트롤러내에서 Model 객체에 Item 객체 말고도 실제론 다양한 객체를 넣을텐데 이런 경우엔 @InitBinder 를 사용하지 않고 전부 수동으로 메서드에서 검증을 해야하는건가요? 해결 방법이 궁금합니다.. 마지막으로 해당 상황을 재현할 수 있는 샘플코드를 작성해보았습니다.. 뭔가 질문이 난잡한거 같아서 죄송합니다..ㅠ 항상 감사드립니다. MyController.java @Controller@RequiredArgsConstructorpublic class MyController { private final MyValidator myValidator; @InitBinder public void init(WebDataBinder webDataBinder) { webDataBinder.addValidators(myValidator); } @GetMapping("/index/{text}") public String myView(@PathVariable String text, Model model) { SomeObject someObject = new SomeObject(); someObject.setText(text); model.addAttribute("someObject", someObject); return "myView"; } @GetMapping("/index") public String index(@ModelAttribute TargetObject targetObject, Model model) { model.addAttribute("targetObject", targetObject); return "myView"; }} MyValidator.java @Componentpublic class MyValidator implements Validator { @Override public boolean supports(Class<?> clazz) { return clazz.isAssignableFrom(TargetObject.class); } @Override public void validate(Object target, Errors errors) { TargetObject myTarget = (TargetObject) target; if (myTarget.getText().equals("error")) { errors.reject("error"); } }} SomeObject.java @Datapublic class SomeObject { private String text;} TargetObject.java @Datapublic class TargetObject { private String text;}