221006 TIL 돌다리도 두들겨 보고 건너라

오늘 메인으로 구현했던 기능은 상품 주문 내역을 불러오는 기능인데 이전에 상품 내역을 불러오는 코드를 작성해놨기 때문에 비슷한 맥락으로 생각보다 금방 구현할 수 있었다.

순조롭게 상품 주문 내역에서 특정 주문 내역을 클릭 시 세부 정보를 얻어오는 기능도 구현하는데 주문내역의 id값만 받아오지 못하는 상황이 발생했다.

주문 내역의 아이디로 세부 정보에 접근하기 때문에 아이디 값을 받아오는 게 필요했는데 받아오지 못하니 세부 정보를 볼 수 없었다.

 

 

백엔드에서 dto로 id값을 전달하게 했는데 받아오는 값을 출력해서 확인해보면 id 빼고 모두 가져오는 것을 확인했다.

너무나도 아이러니하게 무조건 필요한 id값만 빼놓고 가져오니까.. 

그래서 id를 생성을 하지 않는건가 생각을 했지만 주문 내역의 entity에 @GeneratedValue로 id를 생성하게 해 주었다.

데이터베이스 가서 확인해도 id가 잘 생성되어 있는 것을 확인했다.

 

 

근데 저 id를 전달받지 못하니 전달해줄 때 문제인 건가 생각해서 저 값들을 전달해주는 dto를 살펴봤는데 아무리 찾아봐도 내눈으로는 문제가 없어 보였다.

결국 혼자 해결하지 못하고 동료의 도움으로 문제를 해결할 수 있었다.

문제 원인은 dto를 전달해주는 get의 이름이 getId가 아니라 id로 바꿔서 생긴 문제였다.

getter를 단축키로 자동으로 생성하면 getId로 알아서 만들어진 getter의 이름을 id로 바꿨던 이유는 만들다가 갑자기 getter를 사용할 때 getter의 이름을 get을 붙여서 사용하는 것을 지양하는 게 좋다는 말이 갑자기 생각이 나서 지웠던 건데 이게 문제가 될 줄은 상상도 못 했다.

getId로 바꿔주니 getter가 실행이 돼서 id값을 받아오는 것을 확인할 수 있었다.

 

Dto클래스 getter의 이름은 무조건 get~~ 형식이어야 하는 건지 검색을 해봤는데 ObjectMapper가 JSON을 객체로 맵핑할 때,

JSON의 이름과 객체의 getter, setter 메서드의 필드명을 비교하여 매칭을 한다고 한다. 그리고 getter, setter 메서드 이름의 "get"및 "set"부분을 제거하고 나머지 이름의 첫 문자를 소문자로 변환한다고 한다.

 

그래서 내가 수정했던 id라는 이름의 getter가 "get"이 들어가 있지 않아 id값과 매칭을 하지 못해서 id값을 읽어오지 못한다고 판단을 했다.

 

솔직히 동료분이 같이 봐주지 않았다면 혼자서는 절대 못 찾았을 문제인 것 같다. 왜냐하면 코드를 하나씩 다 살핀다고 살폈는데 getter의 이름이 잘못되었다고는 절대로 생각하지 않았기 때문에 계속 다른 부분을 수정했기 때문이다.

 

 

내 코드에 100%로 확신할 수 있는 코드는 없다는 것을 다시 한번 깨달았다. 돌다리도 두들겨보고 건너라고 코드의 잘못된 부분을 살필 때 무조건 이 부분은 잘못되지 않았다고 확신하지 말고 한번 더 살펴보자.

 

 

참고 : https://jenkov.com/tutorials/java-json/jackson-objectmapper.html#how-jackson-objectmapper-matches-json-fields-to-java-fields%EF%BB%BF