@RestController 애너테이션을 먼저 살펴보자. @RestController는 스프링 컨테이너에 해당 자바 클래스가 REST 기반 서비스에 사용됨을 지정하는 클래스용 자바 애너테이션이다. 이 애너테이션은 JSON 또는 XML로 서비스에 전달된 데이터 직렬화를 자동으로 처리한다(기본적으로 이 클래스는 반환 데이터를 JSON으로 직렬화한다). 기존 스프링 @Controller 애너테이션과 달리 @RestController 클래스의 메서드에서 ResponseBody 클래스를 반환할 필요가 없다. 이는 @ResponseBody 애너테이션을 포함한 @RestController 애너테이션으로 모두 처리되기 때문이다.
왜 마이크로서비스에 JSON을 사용하는가?
여러 프로토콜을 사용하여 HTTP 기반 마이크로서비스 간 데이터를 통신할 수 있지만 JSON은 다음 몇 가지 이유로 사실상 표준으로 부상했다.
• XML 기반의 SOAP(Simple Object Access Protocol) 등 다른 프로토콜에 비해 JSON은 매우 가벼워 적은 텍스트로 데이터 표현이 가능하다.
• JSON은 사람이 쉽게 읽고 사용할 수 있다. 이 점은 직렬화 프로토콜을 선택하는 데 과소평가된 기준이었다. 하지만 문제가 발생했을 때 개발자가 JSON 내용을 살펴보고 신속하게 처리하는 것은 중요하다. 프로토콜이 단순하면 이러한 작업을 매우 쉽게 수행할 수 있다.
• JSON은 자바스크립트에 사용되는 기본 직렬화 프로토콜이다. 프로그래밍 언어로 자바스크립트가 급격하게 성장하고 자바스크립트에 크게 의존하는 SPIA(Single Page Internet Application), 즉 단일 페이지 인터넷 애플리케이션도 함께 비약적으로 증가했기 때문에 JSON은 REST 기반 애플리케이션을 구축하는 데 적합했다. JSON은 프런트엔드 웹 클라이언트가 서비스를 호출하는 데 사용했다.
• 하지만 서비스 간 통신을 하는데 JSON보다 더 효율적인 다른 메커니즘과 프로토콜이 있다. 아파치 쓰리프트(Apache Thrift, http://thrift.apache.org) 프레임워크를 이용하면 바이너리 프로토콜로 상호 통신할 수 있는 다언어 서비스를 구축할 수 있다. 아파치 아프로(Apache Avro, http://avro.apache.org)는 클라이언트와 서버 호출 간 데이터를 바이너리 포맷으로 상호 변환할 수 있는 데이터 직렬화 프로토콜이다. 전송할 데이터 크기를 최소화할 필요가 있다면 이러한 프로토콜을 검토하기 바란다. 하지만 필자 경험으로는 마이크로서비스에서 JSON을 직접 사용하는 것은 효과적이었고, 서비스 소비자 및 클라이언트 간 디버깅을 위해 또 다른 통신 계층을 삽입할 필요가 없었다.