작성
·
621
1
선생님 안녕하세요. MediaType 설정 관련해서 질문이 있습니다. produces 속성을 MediaType.APPLICATION_JSON_VALUE로 설정하면 에러 바디도 JSON 데이터로 만들어서 반환하는 걸 이번 강의에서 배웠고 여기에서 accept 헤더가 중요한 역할을 하는 걸 알았습니다.
그런데 여기서 궁금한 것이 제가 테스트를 해보니, accept=*/*로 설정하면 왜 application/json 방식이 더 우선순위를 갖는 걸까요? ErrorPageContriol에서 produces 값을 더 구체적으로 설정해줘서 처음에는 application/json 방식이 (accept=*/* 로 설정할 경우) 더 우선권을 갖는 거라고 생각했는데, 처음에 만든 produces 값 설정을 안 한 컨트롤러 메서드를 produces=MediaType.TEXT_HTML_VALUE로 변경하고 html과 json 방식 메서드 두 개가 있는 상황에서 테스트해도 여전히 json 형식이 더 우선권을 갖는데 왜 그런지 궁금합니다.
답변 1
3
안녕하세요. 김말이님
스프링은 다음 코드와 같이 자바가 제공하는 getDeclaredMethods()를 호출해서 메서드 목록을 순서대로 적용합니다.
여기서 accept=*/*로 되어 있다면, 먼저 찾는 메서드가 실행되게 됩니다.
Method[] declaredMethods = HelloController.class.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println("declaredMethod = " + declaredMethod.getName());
}
그런데 getDeclaredMethods()는 순서를 보장하지 않습니다. 자바 언어의 버전이나 환경에 따라서 다른 순서로 호출될 수도 있습니다.
공부를 하다보면 이렇게 모호할 때는 어떻게 동작할까? 라는 의문이 들 수 있습니다. 제가 강의에서도 강조드리지만, 개발을 할 때는 이런 모호한 상황 자체를 만들지 않는 것이 매우 중요합니다.
이 경우 클라이언트가 accept=*/*로 보내면 안되는 것이지요.
추가로 이런 부분이 궁금할 때 코드를 찾아가는 방법이 필요합니다. IntelliJ 디버그 모드로 검색해보시면 도움이 되실거에요.
감사합니다.
답변해주셔서 감사합니다. 저도 나름 구글링도 해보고 그랬는데 디버깅하는 법부터 배워야겠군요. 감사합니다.