Wanna be Brilliant Full-Stack Developer

I don't get Spring MessageConventor & 스프링 개념잡기3 본문

Some Memos/Spring 개념

I don't get Spring MessageConventor & 스프링 개념잡기3

Flashpacker 2022. 2. 11. 18:28


목표

스프링은 MessageConverter을 가지고 있다. 기본값은 현재 Json이다!

Json이란 무엇일까? 

 

Example

영어권 국가와 한국이 소통을 할떄 그냥 자신의 나라 언어로 이야기를 하거나 서로 번역을 해서 보내는것은 가장 최선의 방법이 아니기떄문에 

중간 데이터라는것을 만드는데 이 한국어를 바로 다이렉트로 영어로 , 영어를 바로 한국어로 번역하는것은 힘들기떄문에 중간언어라는것을 만드는데 중간언어는 한국인도 이해할수 있고 영어권국가도 이해할수있는것으로 만든다.

 

중간언어가 : XML로 많이쓰이고 있었는데 이제는 JSON이라는것으로 바뀌었다.

중간언어는 모든 나라의 사람이 이해하기 쉬운 언어이다. 

자바 Obejct 와 파이썬 Obejct가 있을떄 이둘의 Object는 서로 생긴게 다르다. 

각자의 Object를 전달하면 서로 받을떄 자신의 언어로 바꿔야하니 서로 힘들다. 

 

그래서 자바하는 사람이 파이썬 하는 사람한테 데이터를 보낼때는 자바 Object를 중간에 Json object로 변경해서 파이썬한테 보낸다. 파이썬은 또한 Json오브젝트를 받고 파이썬이 받으면 파이썬 Object로 바꾼다.

 

Json이라는것은 도대체 어떻게 보일까? 

각 변수

자바언어를 누군가에게 전송할때 중간 데이터인 Json으로 컨버팅 하는것이 MessageConverter이다. 

MessageConverter란 요청할때만 일어나는것이 아니라 상대방한테 응답받을때도 Json 데이터가 응답으로 오는데 Java오브젝트로 MessageConverter가 바꿔준다. 

 

요청(Request) 과 응답(Response) 두가지 경우에 다 MessageConverter가 도와준다!

자바 프로그램를 어떤 파이썬 프로그램에게 던질때 (Request) 자바 오브젝트를 파이썬이 이해하기 힘드니까 요청시에 Json으로 바꾸는데 바꾸는 역할을 하는것이 MessageConverter이다. 

이게 스프링의 라이브러리로 존재한다! 이 메시지 컨버터는 기본적으로 Jackson으로 설정이 되어있다.

Jakson은 JSon데이터로 변경해주는 라이브러리이다.

 

마찬가지로 응답을 받을떄에도 파이썬에서 오브젝트가 Json을 거쳐 자바 프로그램에 들어갈떄도 메시지 컨버터가 Json데이터를 자바 오브젝트로 변경해준다! 

 


목표2

스프링은 BufferedReader와 BufferedWriter을 쉽게 사용할 수 있다.

이게 무엇일까??

 

Example 

데이터라는것이 전기선을 통해 간다. 이동을 할떄 통신이 bit단위로 통신이 된다. ( 0 , 1 , 0 , 1 , 1,  1, 0 )

(여기서 0은 전기 X, 1은 전기가 흐르는것을 뜻함)

통신 방식은 발전한게 영어권 국가에서 발전이 되었기 때문에 영어권 국가 애들이 이렇게 bit단위로 데이터를 통신하게 되면 사람이 이해하기가 굉장히 어렵기 떄문에 bit단위로 통신하는것이 아니라 어떻게 하면 영어 한문자로 통신할수 있을까? 생각해봤을떄 최소 8bit가 필요한것이다. 

이 8bit가 있으면 256가지의 문자 전송이 가능하다!

8bit는 2의 8승이고 2의 8승은 256이다. 

영어 알파벳은 256개 안에 있다. 만약 한글이라면 8bit안에 통신하지 못한다 왜냐하면 한글은 8bit 통신이 불가능하고 16bit 통신으로 가능하다!

 

영어권 국가에서는 8bit로 통신이 가능하다. 그래서 보낼떄 8bit씩 끊어 받으면 받는 사람은 한문자씩 받을 수 있을거다.

8bit 를 논리적인 단위로 1바이트로 불린다.

1바이트는 통신의 최소 단위가 되었다! 

 

1byte = 하나의 문자를 표현할수 있다는것이고 만약에 대한민국에서 통신이 처음으로 시작했으면 분명 1byte는 16비트가 됬을것이다. 하지만 영어권국가에서 발전했기떄문에 1byte는 8비트이다. 

 

만약에 전세계에서 인터넷으로 커뮤니케이션을 하는 시대에 자기만의 문자 방식으로 글을 인코딩 하게되면 한글은 2바이트 , 영어는 1바이트 ,중국어는 3바이트 로 하게 되면 전세계적으로 데이터 통신하는게 불가능하니까

유니코드에서 정한것이 UTF-8 이라는 Character Encoding을 제공해준다. 

이것은 3바이트 통신이다! 

그래서 요즘은 모두 전부 문자 인코딩을 3바이트로 한다! 

데이터를 보낼때 Byte Stream이라고 하는데 : 1바이트로 보낸다는것 = 8비트 전송

자바 프로그램에서 저정보를 읽으려면 InputStream으로 읽는데 

인풋스트림으로 읽는 단위가 바이트이다. 바이트가 처리할떄 머리 아프다. 

바이트는 문자가 아니라 바이트 그대로 받아들이기떄문에 

 

그것을 문자로 받아들이기 위해 Char 이라는것을 캐스팅하여 받아준다.

 

InputStreamReader라는 클래스로 감싸면 바이트를 문자로 바꿔서 문자 하나를 준다.

문자 하나뿐만 아니라 배열로 여러개의 문자를 받을수 있다. 

배열이라는게 단점이 크기라는게 정해져있어야한다.

Ex) 채팅을 하게되면 안녕 , 반가워  및 긴 문장을 보낼수도 있다.

받는 쪽에서는 얼마나 받을지를 정해놓을때 InputstreamReader를 통해 배열 크기를 6바이트로 잡아놨으면 

한글 두문자밖에 못받는다.  나머지는 다 버려진다. 

 

만약에 통신을 할떄 가장 큰 단위 즉 Max를 정해서 만약 20문자이상 못보내게 하려면 

한문자가 3바이트니까 X 20을해서 60 바이트로 크기를 정해놓고 보면 적은 데이터를 보낼떄는 낭비를 하게 된다. 

그래서 이것도 사용하지 않고 

 

결국 사용하는것은?!!

저것들을 BufferedReader 라는것으로 감싼다! 

BufferedReadr로 데이터를 받게되면 가변길이의 문자를 받을 수 있다. 

가변길이란: 프로그램 작성시 배열의 크기를 컴파일 타임에 정하지 않고, 실행 타임에 정할 수 있도록 하는 기능이다. 

즉 필요한 만큼의저장 공간 만 차지하여 저장되는 문자의 개수! 

 

BufferedReader와 BufferedWriter을 통해서 통신을 할때 상대방이 데이터를 요청할떄 요청시에 데이터를 담아서 보낼수 있다. 내가 어떤 데이터를 줄게 , 주면 상대방이 받을떄 그 사람은 BufferedReader로 받아야한다. 

JSP에서는 이것을 Request.getReader로 BufferedReader의 일을 한다

 

마찬가지로 내가 데이터를 쓸떄도 BufferedWriter을 사용해야한다. 근데 이 BufferedWriter는 내려쓰기 기능이 없어서

Java에서는 버퍼드라이터 보다는 PrintWriter를 사용하는데 PrintWriter는 BufferedWriter와 똑같은데 함수를 Print()라는 함수와 Println() 이라는 함수를 제공해준다. 

이거는 내려쓰기를 쓰고 싶을떄는 Println을 사용하고 아니면 Print 를 사용한다. 

이차이 말고는 BufferedReadr와 PrintWriter는 똑같다. 

 

BufferedWriter도 통신을 ByteStream으로 데이터를 전송할떄 전송단위가 문자열로 가변길이의 데이터를 쓰게 해주는 클래스이다! 버퍼드 라이터와 버퍼드 리더로 데이터를 통신하게 되는데

이것들을 직접 구현할 필요없이 어노테이션을 제공한다

@ResponseBody 를 사용하면 BufferedWriter가 동작한다.

@RequestBody 를 사용하면 BufferedReader가 동작한다!