BindingResult의 rejectValue(), reject()를 사용하면서 오류 코드를 사용해봤는데 오류 코드를 어떻게 설계해야할까? 라는 의문이 생길 수 있다.
오류 코드를 너무 자세하게 만들면 여러 곳에서 사용하기 어렵고,, 너무 두루뭉실하게 만들면 너무 두루뭉실해서 문제다... 가장 좋은 방법은 두루뭉실하게 사용하다가 자세한 내용이 필요한 곳에는 자세한 내용이 적용되도록하는 것이다.
이게 무슨 말인지 확 와닿지 않으니 예시를 보면서 이해해보자.
스프링은 MessageCodeResolver 인터페이스를 제공한다. 이 인터페이스의 구현체로느 DefaultMessageCodeResolver()를 사용하면 된다.
반환타입을 보면 String[]배열을 반환해준다. 파라미터로 받은 erroCode와 objectName을 가지고 여러개의 오류 코드를 생성 후 반환해준다고 생각하면 된다.
먼저 Object와 관련된 오류 코드부터 보자.
Object는 2가지 오류 코드를 자동으로 생성해준다.
그 다음 field와 관련된 오류 코드부터 보자.
여기서 fieldsms itemName만 테스트해보겠다.
field는 4가지 오류 코드를 자동으로 생성해준다.
이렇게 MessageCodeResolver가 오류 코드를 다 생성해준다.
출력 결과 맨 위가 제일 자세한 오류 코드이고 밑으로 갈 수록 덜 자세한 오류 코드이다.
오류 코드를 자세한 것부터 생성하고 점점 덜 자세한 코드를 생성하는데 우리가 오류 코드를 정의한 곳에서 하나씩 살펴보는 것이다.
그래서 자세한 오류 코드가 정의되어있으면 그 오류코드의 메시지가 출력되고, 없으면 그 다음 우선순위의 에러코드를 찾는 것이다.
이렇게 하면 rejectValue()나 reject() 로직을 수정할 필요 없이 오류 코드를 정의한 파일을 수정하면서 에러 메시지를 변경할 수 있다는 점이다.
근데 주의할 점은 MessageCodeResolver가 생성해주는 오류 코드 규칙을 알고 규칙대로 오류 코드를 정의해야한다.
규칙을 알고 위에 오류 코드 출력 결과를 보면 바로 눈에 보일 것이다.