묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
쓰레드 질문드립니다.
안녕하세요. 강의 잘 듣고있습니다!다름이 아니라 요청마다 쓰레드를 생성하여 다중 요청에 대응하는 부분을 보고 질문이 생겨서 남깁니다.servlet은 서블릿 컨테이너에 의해 싱글톤으로 관리되는 것으로 배웠는데, 기존 쓰레드가 요청 1을 servlet을 사용하여 처리하고 있는 와중에 새로운 요청 2가 들어와서 새로운 쓰레드가 생성되고 servlet을 사용하려고 하면 이미 요청 1이 servlet을 사용하고 있기 때문에 사용할 수 없지 않은지 질문드립니다.감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
변수 바로 찾아가는 단축키
변수이름 클릭하시고 선언된 곳으로 바로 이동하시던데 단축키좀 알려주세욤
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
맥에서 pdf 내용 복사붙여넣기
영한님 핵심원리 강의부터 열심히 듣고있는중입니다.맥에서 미리보기 혹은 어도비 리더로 pdf파일을 열어 사용중인데 코드 복사할 때 제대로 코드가 복사되지 않아 너무 불편합니다.혹시 나름의 팁이 있을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ViewResolver 구현체를 찾는 방식
안녕하세요!논리 뷰 이름 획득 이후 적합한 ViewResolver를 찾는 방식에 대해 질문드립니다.HandlerAdapter 때와 비슷하게 ViewResolver에 메시지를 보내 특정 논리 뷰 이름에 대응하는 View를 생성할 수 있는 ViewResolver인지(?) 확인하는 방식으로 찾게 되는건가? 하고 생각했는데 이러한 방식이 맞는 것일지 궁금합니다!감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
중첩 bean validation 질문입니다.
안녕하세요? 지난번에 Collection Bean 검증 관련해서 질문 글을 올렸었어요. 지난번 글은 아래 링크를 통해서 보실수 있습니다.https://www.inflearn.com/questions/639710Collection Bean 검증까지도 잘 되었고 1차 중첩 검증 까지는 잘 되었었습니다. 코드를 보여드리자면...@Component @Slf4j @RequiredArgsConstructor public class CollectionValidator implements ConstraintValidator<CustomValid, Object> { private final ElementValidator validator; @Override public void initialize(CustomValid constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(Object values, ConstraintValidatorContext context) { log.info("validator 로직 실행 {}", values.toString()); DataBinder dataBinder = new DataBinder(values); BindingResult bindingResult = dataBinder.getBindingResult(); //bindingResult를 생성해서 전달 validator.validate(values,bindingResult);//필드에 선언된 어노테이션에 따라 검증 if(bindingResult.hasErrors())return false; return true; } }//지난번 글에서 David님의 조언에 따라 수정되었습니다.@Data public class Item { @CustomValid private PatternDto pattern;//내부에는 phonNumber라는 필드와 @Pattern으로 전화번호 형식인지 검사합니다 public Item() { } } @PostMapping("/nested") public Object nested(@RequestBody @Validated Item item){ return item; }여기까지는 검증이 잘 되었습니다. 즉 POST: /nested 로 아래 형식으로는 잘 검증이 되었습니다.{ "pattern" : { "phoneNumber":"01045309731" } } 하지만 PatternDto안에 새로운 객체 ItemValid를 넣고 검증 어노테이션을 추가하게 되면 ItemValid에 대한 검증이 되지 않아요.즉, 정리하자면 POST: /nested url로 Item 객체에 선언된 PatternDto pattern 필드 객체는 검증이 잘 되지만, PatternDto 클래스 안에 있는 ItemChild의 @Min(10) value에 대한 검증은 이뤄지지 않네요.@Data @NoArgsConstructor public class ItemChild { @Min(10) private Long value; }@Data @EqualsAndHashCode @NoArgsConstructor public class PatternDto { @Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message ="잘못된 번호 형식입니다.") private String phoneNumber; @CustomValid private ItemChild itemChild; }이렇게 domain을 수정 후에 다음과 같이 요청을 보내면{ "pattern" : { "phoneNumber":"01045309731", "itemChild":{ "value":10 } } } 아래 사진과 같은 에러가 나옵니다.구글링 해도 잘 안나오는데 어떻게 해결할 수 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
커스텀 익셉션을 만들어볼려고 합니다.
@Data @AllArgsConstructor public class ErrorResult { private String code; private String message; private Map<String, Object> map; } @Slf4j @RestControllerAdvice public class ExControllerAdvice { @ExceptionHandler public ResponseEntity<ErrorResult> userExHandler(UserException e, Map<String, Object> map) { log.error("[exceptionHandler] ex", e); ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage(), map); return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST); } }public class UserException extends RuntimeException { public UserException() { super(); } public UserException(String message) { super(message); } public UserException(String message, Throwable cause) { super(message, cause); } public UserException(Throwable cause) { super(cause); } protected UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } } 이렇게 만들고 컨트롤러에서 사용을 할려고... Map<String, Object> returnMap = new HashMap<>(); returnMap.put("errorTitle", "titleMsg"); throw new UserException("ERROR", returnMap); ...이런식으로 만들었는데 UserException 클래스에서 두 번째 파라미터로 받는 부분이 Throwable 타입이라 오류가 발생되는데..혹시 두번째 파라미터에 맵이나 리스트나 String등 원하는 값을 받아서 ResponseEneity 타입으로 보내줄려고 하면 어떻게 수정을 해야할까요?UserException을 아래처럼 수정을 했는데 public UserException(String message, Map<String, Object> map) { super(message); this.map = map; }포스트맨으로 테스트를 해 보면 원하는 에러코드가 출력되는게 아니라 기본적인 오류코드가 출력이 되어버리네요..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Bean Validator 적용 범위
안녕하세요. 영한님 항상 강의 잘 보고 있습니다. 현재 강의에서는 모든 예제가 Thymeleaf 기준으로 진행되고 있는데, 현재 Bean Validator 기술이 다른 뷰 템플릿이나 / 리액트에는 적용되지 않는 것인지 궁금합니다. 만약 적용되지 않는다면 리액트와 스프링 부트를 활용한 프로젝트를 진행할 때 어떠한 방향으로 예외처리를 진행해야 할지 궁금합니다!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Collection Bean 검증 질문입니다
안녕하세요! 영한님! 항상 강의 잘 보고 있습니다. 사실은 영한님 팬이기도 해요.아무튼 제가 며칠 계속 고민하던 부분이 있어요.제 목표는 컬렉션 타입과 상관 없이 컬렉션 안에 선언되어 있는 객체의 Bean Validation을 수행하고 싶어요.@RequestBody @Validated List<ItemSaveForm> 를 사용하게 되면 ItemSaveForm에 대한 검증이 아닌 List에 대한 검증 처리가 되더라고요. 그렇다고 List<@Validated ItemSaveForm> 는 컴파일 에러가 납니다.물론 저 스스로 해결하고자 많은 곳을 돌아 다녀 보았고 찾아낸 방법은 Validator를 구현한 객체(CollectionValidator)를 만들어서 validate 메서드 구현 을 했습니다. 이후 ItemController에서 CollectionValidation 를 주입 받아 collectionValidator.validate(itemList, bindingResult);를 통해서 검증 처리를 하는 법을 알아냈습니다.하지만 모든 Collection 마다 주입과 collectionValidator.validate 코드를 넣는게 비효율적이라 생각해서 어노테이션으로 만들거나 인터셉터에서 처리하고 싶었습니다.인터셉터에서 처리하고 싶었지만 CollectionValidation의 validate 메서드는 Errors 객체를 인자로 받는데 HandlerMethodArgumentResolver의 resolveArgument인자에서 errors 객체를 뽑아낼 방법이 안보이네요.어노테이션으로 만들고자 한 부분은 어노테이션 안에 Errors 객체를 선한 할 수가 없어서 CollectionValidator를 불러낼 수가 없었습니다.다른 해결 책이 있을 까요? 아니면 제가 보지 못한 부분이 있었던 걸까요?혹시 결국 스프링 입문때 잠시 다루었던 AOP를 통해서만 해결할 수 있는 걸까요? 어노테이션 만들기를 검색하다보니 AOP를 결국 다뤄야 하더라고요 ㅜㅜ아래 제 코드와 함께 올리겠습니다.@Data public class PatternDto { //이 어노테이션에게 검증을 맡기고자 합니다. @Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message ="잘못된 번호 형식입니다.") private String phoneNumber; }@RestController public class ValidationItemApiController { //private final CollectionValidator validator; @PostMapping("/list") public Object addList(@RequestBody List<PatternDto> request, BindingResult bindingResult){ //validator.validate(request, bindingResult); -> 이 부분을 어노테이션이나 인터셉터로 처리하고 싶어요. log.info("list valid"); if(bindingResult.hasErrors()){ log.error("검증 오류 발생 {}", bindingResult); return bindingResult.getAllErrors(); } log.info("성공 로직 실행"); return request; } }@Component @Slf4j public class CollectionValidator implements Validator { private SpringValidatorAdapter validator; public CollectionValidator() { this.validator = new SpringValidatorAdapter( Validation.buildDefaultValidatorFactory().getValidator() ); } @Override public boolean supports(Class<?> clazz) { return true; } @Override public void validate(Object target, Errors errors) { if(target instanceof Collection){ Collection collection = (Collection) target; for (Object o : collection) { validator.validate(o,errors); } } else validator.validate(target,errors); } }//이 검증기를 통해 List<@Valid PatternDto>와 같이 검증하고 싶었지만 //validtor.validate에게 검증을 위임하려고 할때(많은 검증 로직들이 간소화 되기 때문에) validate메서드의 두번째 인자인 errors //에 넣을 값을 찾지 못한게 문제였습니다. //ArgumentResolver를 통해 해결하고자 했지만 이때도 validate의 errors 인자를 넣을 값을 못찾았습니다. @Component @Slf4j @RequiredArgsConstructor public class CustomValidator implements ConstraintValidator<CustomValid, List<PatternDto>> { private final CollectionValidator validator; @Override public void initialize(CustomValid constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(List<PatternDto> values, ConstraintValidatorContext context) { log.info("validator 로직 실행"); validator.validate(values,null); //null 대신에 어떤 값을 넣어야 할까요? 이 부분만 해결 되어도 문제가 해결 될거 같아요. return true; } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
결과창에 test results라고 안뜨는 이유..?
테스트 결과를 보기 위해 run을 하면 강의 화면에서는 Test Result라고 뜨고, 그 아래에 어떤 메소드를 실행했는지 뜨는데 저는 좀 다르게 떠서요,, 이게 제가 뭘 잘못한건지 아니면 별로 신경 쓰지 않아도 되는 문제인지 잘 모르겠어서 질문 남깁니다..! 문제가 없더라도 강의 화면과 다르게 떠서 은근히 거슬리는데 혹시 Test Result가 뜨도록 하려면 어떻게 해야하나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
update함수에서 질문이 있습니다.
update함수에서 굳이 long itemId를 사용하는지 모르겠습니다.그냥 updateParam에서 getid를 하여 사용해도 되지않나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
용어 관련 질문입니다.
public int add(int a, int b){ ... }이렇게 메서드를 정의할 때 a와 b를 파라미터 내지는 인자라고 부르는데,@ResponseStatus(code= HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류")애너테이션에서 중괄호를 사용해 code = ... , reason = ... 데이터를 추가할 때 추가되는 요소들은 뭐라고 부르나요?code나 reason을 부르는 어떻게 불러야 하는지 궁금합니다.감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Formatter적용에서 locale 정보
Formatter를 이용하여 문자 변경시 테스트는 따로 ko로 설정을 하고 WebConfig에 적용하고 실행 할 때는 하지 않았는데 어떻게 locale 정보가 ko로 나오는건가요? 강사님 설명이나 자료를 찾아봐도 이것에 대한 설명은 없어서 질문 드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서버와 클라이언트
개념이 잠깐 헷갈려서 질문드립니다.모바일이나 웹 페이지에서는 서버와 클라이언트가 명확하게 구분되는데..서버 간의 통신이나 시스템 간의 통신에서는 서버와 클라이언트를 어떻게 구분하나요?웹 페이지에서의 표현을 빌려 사용하면서버 간의 통신에서는 요청하는 서버를 클라이언트로 간주하고, 응답하는 서버를 서버로 간주하면 괜찮을까요?서버와 클라이언트라는 개념에서, 서버는 응답하는 요소 / 클라이언트는 요청하는 요소로 이해해도 될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원가입 테스트 오류 발생 문의
안녕하세요,테스트 진행 중 오류가 발생하여 문의드립니다.회원가입을 테스트할 때 @Transactional을 주석처리하면 정상 작동되지만, 활성화하면 오류가 발생합니다.java.sql.SQLException: Connection is closed이것은 JdbcMemberRepository의 sava() 작성 내용입니다.@Transactional을 활성화하면 오류가 발생하는 원인과 해결 방법이 궁금합니다..!!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요 WebDataBinder와 Model관련해서 궁금한 점이 있습니다.
안녕하세요 항상 좋은 강의 만들어주셔서 감사합니다.강의 자료를 보다,강의 내용과는 조금 거리가 있을수도 있지만, 궁금한 점이 생겨 질문드립니다.강의자료에서는 "WebDataBinder 는 스프링의 파라미터 바인딩의 역할을 해주고 검증 기능도 내부에 포함한다." 라고 되어 있는데 그러면 public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model)해당 부분에서 파라미터로 넘어오는 데이터들은 @Validated에 의해서 검증기가 동작하면서 WebDataBinder 에 담기고 @ModelAttribute에 의해 model에도 담기게 되는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
컨트롤러에서 컨버터 사용
컨버터를 등록하면 컨트롤러에서 자동으로 컨버터가 작용되는데이 작동을 컨트롤 할수 있을까요 ??어떤 경로로 들어올땐 컨버터를 작용,어떨때는 미작용이런식으로 가능한가요 ??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터와 필터
인터셉터와 필터를 함께 사용하는것도 가능한가요?필터로는 로그를 찍게 하고, 인터셉터로는 로그인을 확인한다던지..둘 중 하나만 쓰는게 합리적인것 같긴 한데.. 혹시 가능하다면 현업에서 두 가지를 함께 사용하는 경우가 있나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
공통관심사항 메소드들 호출궁금한게 있습니다
서블릿 필터 destroy()메소드는 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.라고 알고있는데 이경우 Dispatcher Servlet의 종료직전 호출된다는 의미인가요? 만약 맞다면 필터의 메소드들의 종료시점은 Dispatcher Servlet 호출 이후일수도 있으니 아래 순서가 틀릴수도 있다는 뜻인지 궁금합니다HTTP 요청 -> WAS -> 필터 -> Dispatcher Servlet-> 컨트롤러(핸들러)
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
글 수정 오류 질문드립니다.
ㄷ원래 잘 되었다가. 이번 챕터진행하고 확인해보니 안되고 있습니다. console.log 찍어서 값 잘 변경되는지 확인했고 컨트롤러에서 dto를 찍으니 전부 널 값이 들어가있는데 ajax에 문제가 있는 건가요?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
restapi 관련 문의
@RestController에서 서버는 데이터를 주고 받을 때 데이터타입이 json이어야한다고 하셨습니다. 그래서 클라이언트에서 ajax통신으로 서버에 요청을 보낼때, json.stringify을 통해서 Json타입으로 변환 후 전달하셨습니다. 그렇게 하지 않으면 서버에서 제대로 값을 전달 받지 못하는 것도 확인했습니다. 그런데 궁금한게 있습니다. json이란게 아래와 같이 객체를 문자열로 표기한 거잖아요. "{"key":value."key2":value2}" 그럼 애초에 client(jsp) 에서 ajax 통신시 "{"key":value."key2":value2}" 이런식으로 data를 보내면 되야하는 거 아닌가요? json이란 게 약속된 규칙을 통해 객체를 문자열로 표기한 건데 굳이 Json.stringfy를 통해 문자열을 한번더 가공해야지 통신된다는게 이해가 잘 안됩니다. 그렇다면 "{"key":value."key2":value2}" 이건 json타입이 아니라 stringfy()로 감싸야지 json타입이 된다는 말 인것 같거든요. 아니면 @RestController 어노테이션이 붙은 상태에서 서버로 데이터를 보낼때는 Json.stringfy를 꼭 붙여야한다는 규칙이 있다 라고 생각하면 되는건가요? 답변 부탁드립니다.