[Error] Spring Dto 클래스에 Getter 가 필요한 이유

2023. 8. 12. 15:19
🧑🏻‍💻 pre-project를 진행하다가 만난 에러와 새롭게 알게된 것들에 대한 정리

 

❓ 문제 상황 

  • 게시글 전체 조회 API를 만들고 Postman으로 호출을 했는데 호출 결과가 "406, Acceptable" 로 나왔다.


✔️ 결과

HTTP (HyperText Transfer Protocol) 406 Not Acceptable 클라이언트 오류 응답 코드는 서버가 요청의 사전 콘텐츠 협상 헤더에 정의 된 허용 가능한 값 목록과 일치하는 응답을 생성 할 수 없으며 서버가 기본 표현을 제공하지 않음을 나타냅니다.
  • 찾아본 결과 위와 같은 문제 때문에 나타나는 에러인데 좀 더 자세하게 설명을 해보자면 Accept 등의 헤더에 적혀있는 형식을 생성해 낼 수 없을 때 발생하는 에러라는 것이다. 
    즉, Spring에서는 ContentType에 선언된 형식으로 변환이 불가능 할 경우 406 에러를 발생시킨다. 나의 경우  ResponseEntity를 통해 JSON 형식으로 응답을 보내는데 아무래도 JSON 형식으로 변환하는 과정에서 문제가 생긴 것 같았다. 

  • 제일 흔한 문제로는 Jackson 라이브러리의 부재라고 하는데 스프링 부트에서는 Jackson 라이브러리가 기본적으로 존재하기 때문에 그 문제는 아니었고 직렬화하는 과정에서 접근 제한자가 public이거나 getter/setter를 이용하기 때문에 필드가 private로 선언되어 있으면 JSON 변환 과정에서 문제가 발생하는 것이었다. 

    결론은 DTO 클래스에서의 Getter 메서드의 부재로 발생한 에러였다. 

    Jackson 라이브러리는 Java Object를 JSON 형태로 변환(직렬화)시켜주거나 반대로 JSON 형태의 객체를 Java Object 형태로 변환(역직렬화)시켜주는 라이브러리이다. 그런데 Jackson 라이브러리가 직렬화를 하기 위해서는 각 필드의 Getter 메서드와 기본 생성자를 필요로 한다는 것이다. 특히나 필드의 경우 private로 선언하는 경우가 많으니 접근하기 위해서는 Getter 메서드가 필수였다.

    그래서 DTO 클래스에 @Getter 어노테이션을 붙여주고 해결이 완료되었다. 

 

 


부트캠프에서 주어진 공부를 위한 코드를 치다보면 에러를 마주치기는 하지만 대부분 나의 오타의 문제거나 내가 따라치다가 빼먹은 부분이 있다거나 import에 관한 에러가 많았다. 확실히 프로젝트를 진행하다 보니 내가 코드를 치며 하던 공부들은 아직 생각의 깊이가 부족하다는 것을 뼈저리게 느끼게 된다. 위와 같은 에러를 겪으면서 왜 DTO 클래스에 Getter 메서드가 필요한지 솔직히 따라치기 급급했지 그 이유는 생각해보지는 못 했었는데 이번 기회로 잘 알게되었다. 다른 부분도 마찬가지로 조금 더 코드를 공부할 때 깊이 있는 생각, 이게 왜 여기에 있어야하지 왜 필요할까? 라는 생각을 한 번 더 하면 더 좋은 공부가 될 것 같다.

 

에러 하나를 해결한 것이지만 깨달음이 많아지는 순간이었다. 오히려 에러가 반가워질 것 같은 생각도...

 

BELATED ARTICLES

more