안녕하세요, Brad입니다. 오늘 step진행하면서 배운 내용 정리해볼게요.
@Before
과@BeforeClass
의 차이는 무엇일까요?The code marked
@Before
is executed before each test, while@BeforeClass
runs once before the entire test fixture. If your test class has ten tests,@Before
code will be executed ten times, but@BeforeClass
will be executed only once.- 즉, 정리하면
@Before
은 각 테스트 케이스마다 실행이 되는 것이고,@BeforeClass
는 전체 테이스 케이스에 걸쳐서 공용으로 사용되는 것이라고 볼 수 있겠네요.
- 즉, 정리하면
Validation check
Controller에서
@Valid
를 사용 했을 경우, RestController에서@Valid
를 사용했을 경우 차이- Controller의 매개변수에서
@Valid
를 사용했을 경우 Controller를 오기도 전DefaultHandlerExceptionResolver
에서@Valid
체크를 한 후 404 에러로 보내는 것을 확인할 수 있었습니다. - Spring 내부 클래스로 처리하다보니
MethodArgumentNotValidException
으로 받을 수 없어 Advice부분에서 해당 에러까지 닿지 않았습니다. 다만 매개변수BindingResult
를 받으면 에러 발생시 Controller내에서 별도 처리가 가능합니다.
- Controller의 매개변수에서
errorMessage의 default 값을 바꾸고 싶을 때
- default값을 바꾸기 위해선 'messages.properties' 대신 'validationMessages.properties' 라는 파일을 만들고 여기에서 template을 만들어놓은 다음 해당 Valid annotation에 설정해야 합니다!
- 다양한 실험을 해보았지만 default 에러 메시지를 바꿀 수 있는 것은 이외엔 다 실패하였습니다.
// 에러 발생시 에러 처리 메서드에서 MethodArgumentNotValidException 객체(exception) 받았을 때
List<ObjectError> errors = exception.getBindingResult().getAllErrors();
위 코드에서 개별
ObjectError
객체에FieldError
캐스팅 하였을 때FieldError
는ObjectError
을 상속하여 구현되어 있습니다.FieldError
의 객체 fieldError로getCodes()
메서드를 호출하면 다음 과 같은 결과를 얻을 수 있습니다.[Size.userDto.userId, Size.userId, Size.java.lang.String, Size]
4개의 코드가 있는데요. 여기서 저 'Size.userDto.userId' 부분이 엄청 낯익었는데요. 왜냐하면 딱 'messages.properties'에서 정의하는 템플릿이 딱 저 이름이거든요.
4개의 코드들을 보면 알 수 있듯이 → 갈수록 좀 더 추상적인 개념, ← 으로 갈수록 좀 더 구체적인 개념인 것을 알 수 있습니다. 경유에 따라 그 유용함이 다르겠죠?
// messages.properties 내에서 Size.userDto.userId=this is validation test
아래와 같은 Validation에러처리 Advice클래스 내에
getFirstCode()
라는 메서드에서 보는바와 같이 codes[0] 값을 쓰고 있었습니다. 그렇다면 위에 적용해보면 'Size.userDto.userId'로 가져오겠죠.private Optional<String> getFirstCode(FieldError fieldError) { String[] codes = fieldError.getCodes(); log.debug("codes : {}", codes); if (codes == null || codes.length == 0) { return Optional.empty(); } return Optional.of(codes[0]); }
만약 'messages.properties'에서 'Size.userId' 로 정의하고 그리고 위 7째 줄
codes[0]
을codes[1]
로 바꾸면 제대로 될지 테스트를 해봤습니다. 결론은 제대로 되더라구요.@Resource(name = "messageSourceAccessor") private MessageSourceAccessor msa; // 중간 생략 String errorMessage = msa.getMessage(code.get(), fieldError.getArguments(), fieldError.getDefaultMessage());
MessageSource
는@Configure
내에 저희가 지정해놓은 messages.properties가 적용될 수 있도록 Bean으로 등록해두었습니다. 그것에 접근하는 것이MessageSourceAccessor
인데 그 객체 msa가 조금전에 우리가 가져온 code와 그 외 arguments, defaultMessage 매개변수와 함께getMessage
를 요청하면 messages.properties 내에 저희 code로 설정한 값을 가져오는 것입니다!
'ValidationMessages.properties'에서 UTF-8 적용을 어떻게 할까요?
- 위에서 말했다싶이 'ValidationMessages.properties'에 등록하고 해당 Valid 어노테이션에 message 속성에 설정하면 defaultMessage가 바뀝니다.
- 그런데 한글로 하니까 외계어로 바뀌더라구요.. 어떻게 바꿀 수 있을까요?
'TIL' 카테고리의 다른 글
Today's Dev Notes(2019-01-15) (0) | 2019.01.15 |
---|---|
Today's Dev Notes(2019-01-14) (0) | 2019.01.14 |
Todays' Dev Notes(2019-01-10) (0) | 2019.01.10 |
서버 성능 개선 (0) | 2019.01.10 |
Today's Dev Notes(2019-01-09) (0) | 2019.01.09 |