필자가 배운 내용을 정리하고자 함에 의의를 뒀으니 비유적인 표현이 많고 개념을 정의함에 있어서 정석적인 정의가 아님을 인식해주었으면한다.
피드백 절대환영!!!
MessageConverter, 그대로 직역하면 메시지 변환기이다.
그러면 이것이 무슨 역할을 하는 것일까?
예시를 통해 이해해보자.
예를 들어, 한국인과 외국인이 메시지를 주고받는다고 생각해보자.
한국인이 "안녕"이라고 보냈다. 근데 외국인은 한국말을 알아듣지 못한다.
반대로 외국인이 "Hello"라고 보냈다.
웬만하면 우리는 알아들을테지만 설명을 위해 한국인이 알아듣지 못한다고 가정하겠다.
이럴때, 이 두 사람 사이에 한국말을 영어로, 영어를 한국말로 해석해 전달해주는 중개자가 한명 있으면 편할 것이다.
스프링에서는 이 중개자 역할을 MessageConverter가 한다.
그렇다면 MessageConverter가 자바가 보낸 메시지를 어떤 언어로 변환해줄까?
그것은 바로 Json이다.
Class Animal{
int age = 10;
String name = "사자";
}
위의 자바 코드를 JSON 형식으로 표현하면 아래와 같다.
{"age":10, "name":"사자"}
다음과 같이 key : value
로 구성된 형식이다.
MessageConverter는 자바 프로그램과 다른 프로그램 사이의 중개자 역할을 해준다.
자바 코드로 요청을 하면 JSON으로 변환해주고, 다른 프로그램의 코드로 응답할때도 JSON으로 변환해준다.
BufferedReader와 BufferedWriter란 무엇일까?
우선 BufferedReader는 뭔가 읽어들이는 것 같고.. BufferedWriter는 뭔가 쓰는 것 같다.
이것을 얘기하기 전에 우리가 데이터를 통신하는 매커니즘부터 알아보자
무엇을 읽어들이고 써야할까? 그것은 바로 문자열이다.
문자는 각 언어권마다 다르다.
예를 들어 영어권의 알파벳은 a,b,c,...,z이고, 한글은 가,나,다,라,...,하 이다.
근데 영어권의 문자는 한글처럼 받침이라는 개념이 존재하지 않는다.
이게 무슨 말이냐? 언어권마다 한 문자가 표현할 수 있는 경우의 수가 다르기 때문에, 영어 한 문자를 저장하는데 1byte(8bit)면 충분하지만 한글 한 문자를 저장하는데는 가,거,고,구,궈,궤 등 다양한 문자와 받침이 있으니 적어도 2byte는 돼야한다.
번외로 중국어 한 문자는 3byte는 돼야한다고 들었다.
그래서 우리는 UTF-8이라는 1문자당 3byte로 통신하는 규약을 사용하고, 통신 단위는Byte이다.
자바는 InputStream을 통해 1Byte 단위로 문자를 읽어들인다.
Byte로 받아들이기 때문에 char로 형변환(type casting)을 해주어야한다.
이 역할을 하는게 자바의 InputStreamReader 클래스이다.
그래서 InputStreamReader는 문자로 형변환을 하여 여러 문자를 배열로 받는다.
근데, 배열은 크기가 정해져있다.
즉 크기가 작은 문자를 받을 때 메모리 낭비가 발생한다.
그래서 이때 필요한게 자바의 BufferedReader이다.
가변길이의 문자를 받을 수 있다.
BufferedWriter는 반대로 생각하면 된다.
스프링에서는 @ResponseBody
가 BufferedWriter의 역할을 한다.
반대로 @RequestBody
는 BufferedReader의 역할을 한다.
위의 사진은 스프링 스타터 페이지를 캡쳐한 것이다.
스프링은 오픈소스이기에 많은 사람들의 기여로 계속 새로운 기능과 버그 개선을 통해 새로운 버전들이 나오고있다.
- 스프링에는 다른 자바와 다른 프로그램 사이의 중개 역할을 하는 MessageConverter가 있고, 중간 데이터는 JSON이다.
- 자바의 BufferedReader와 BufferedWriter의 역할을 스프링에서는
@RequestBody
와@ResponseBody
가 한다.- 스프링은 오픈소스이므로 계속 발전하고 있다.