부트캠피 64일차 후기
오늘은 아침부터 공통적인 Code부분을 코딩하였다. Intellij의 Code with Me를 사용해서, 공통적으로 사용할 Entity나 Config 파일을 팀원분들과 함께 작성하였다. 이 과정에서, 다른 팀원 분이 작업한 부분을 내가 건들여버려서 팀원 분과 충돌이 있었는데, 아직 push 하기 전의 코드라서 다른 팀원 분의 코드라는 것을 의식하지 못해서 생긴 내 실수였다. 앞으로 이런 일이 없도록 의식하도록 노력하자. 이후 대화를 통해 팀 프로젝트를 진행하며 각자의 불만점을 얘기하는 시간으로 발전하였다. 이러한 경험을 하고 앞으로의 거름판으로 삼기를 다짐하게 되는 계기가 되었다.
이어서 외부 API를 가져오는 방법을 공부하였다.
외부 API를 호출하는 방법에는 여러가지가 있다. 그 중 대표적인 것은 3가지로 들 수 있다. 첫 번째는 RestTemplate을 사용하는 것이다. 이 기능은 스프링 3.0 부터 생긴 기능으로, REST 서비스를 호출하도록 설계되어 여러 메소드를 제공한다는 특징을 가진다. 두 번째는 WebClient을 이용하는 것이다. 이 기능은 스프링 5.0 이후로 생겼으며, 비동기 클라이언트로 사용하던 AsyncRestTemplate 대신에 사용을 권장받는다.
위의 두 가지의 큰 차이점은 비동기 지원과 Non-Blocking 지원이다. 여기서 Non-Blocking은 시스템의 동작을 기다리지 않고, 다른 작업을 진행할 수 있는 기술이다. 비동기는 일이 끝나는 동시에 반환되는 결과에 관심이 없다는 의미다. 즉, 일이 끝나는 대로 바로 일을 하지 않는다는 것이다.
WebClient는 위의 두가지를 지원하지만, RestTemplate은 지원하지 않기 때문에 WebClient를 사용하는 것이 더 좋다. 하지만, 단점이 있는데, WebClient는 WebFlux에 종속되어 있어서, WebFlux에 대해 알아야 잘 사용할 수 있다는 점이다.
이 단점을 극복하기 위해서 스프링 6.1.2 부터 WebClient를 대체할 수 있는 기능이 출시되었는데, 그것이 세번째 방법인 RestClient이다. 이 방식은 WebClient와 유사하게 작동하고, WebFlux에 종속되지 않아서, 사용하기 용이하다.
이 내용을 바탕으로 생각을 해본 결과, RestTemplate은 사용하기엔 오래되었고, WebFlux를 공부할 염두도 안나기 때문에 RestClient를 사용하게 되었다.
이렇게 RestClient를 활용해서 외부 API로 부터 JSON을 받는 것 까진 성공했는데, 여기서 데이터를 가공하는 법을 고민하게 되었다. RestClient는 Jackson을 활용해서 JSON을 객체로 바꾸는 기능이 있는데, 이 기능을 어떻게 더 잘 사용할 수 있나 고민을 해보았다. 일단 Map<String, JSONNode>로 바꿔서 JSON의 구성요소를 탐색하는 것 까지는 되었다. 이것 말고는 다른 방법은 없는지, 혹은 이것을 활용해서 어떻게 효율적으로 Entity 객체로 바꿀지 고민을 하였고 2가지 아이디어가 떠올랐다.
첫 번째는 트리 자료구조를 활용하는 것이다. Set을 사용해서 해당 leaf 노드에 어떻게 도달 할 수 있는지 백트래킹을 활용해, 경로를 저장해서 어떠한 JSON이 들어와도, leaf 노드에 도달하는 과정을 프로그래머가 굳이 찾을 필요가 없게 만드는 것이다.
하지만, 중간 List가 있으면 실패하기 때문에 이 안은 폐기가 되었다. 두 번째 안은 상속을 활용하는 것이다. 이 방법을 사용하면, 편리하게 코드를 짤 수 있는 장점이 있다.