졸업프로젝트

[그로쓰][MariaDB/Mysql][Spring boot] DB에 저장한 Json 데이터 Spring boot에서 불러와서 사용하기, PostMapping으로 RequestBody에 Json 받아서 사용하기 - Spring boot에서 Json 활용하기

달팽이포뇨 2022. 5. 16. 15:09

서론

이전편에서 MariaDB에 Json 데이터를 저장하였습니다.

저희 프로젝트에서는 사용자가 원하는 문학작품을 원하는 글씨체를 선택하여 전자 필기를 연습하도록합니다.

따라서 사용자가 글씨를 썼을 때 교본의 글씨와 분석하는 과정이 필요합니다.

그러므로 DB에 교본 글씨 분석 결과를 Json 형태로 저장하였고 사용자의 글씨를 json 형태로 PostMapping으로 받도록 설계하였습니다.


본론

 

1단계: 전달받을 Json 데이터 형식 파악하기

전달받을 Json 데이터 형식은 아래와 같습니다. json형식과 array 형식이 합쳐져 있는 복잡한 형태입니다.

(음절: x좌표, y좌표, 가로길이, 세로길이, 중심점의 y좌표 / 음소: [한음절의[x좌표, y좌표, 가로길이, 세로길이]])

[
	{
  		"syllable": { #음절
    		"0": [ [ x, y, w, h, cy], [ x, y, w, h, cy] ,...],
			"1": [ [ x, y, w, h, cy],...], ..], ..
  	},
		"character": { #음소
			"0": [ 
				[ [x,y,w,h], [x,y,w,h], [x,y,w,h] ], # 자음, 모음, 받침 
				[ [x,y,w,h], [x,y,w,h], [x,y,w,h] ] , ...
				]
			],
			"1": ...
	}
]

2단계: DB에서 Json데이터를 불러와서 Spring이 다룰 수 있는 데이터로 만들기

IntelliJ에서 정의한 DB테이블 형식은 아래와 같습니다.

Map<String, Object>를 이용하여 Json을 다루겠습니다. 

JsonStringConverter클래스를 이용하여 String을 Json형태로 바꾸어줍니다.

JsonStringConverter의 코드 및 설명은 아래와 같습니다.

AttributeConverter를 이용하여 String(DB에 Json은 longtext형으로 저장됩니다.)을 Json형태(Map<String(키), Object(밸류)>)로 바꿀 코드를 작성합니다.

AttributeConverter를 implement하여 Json<->String을 하는 코드를 작성합니다. 

 

이렇게 코드를 작성하면

아래와 같이 "테이블이름(여기서는 textbook).gettextBookAnalysis" 코드로 Map<String, Object>형태(Json 형태)로 문학작품 교본 분석 결과를 가져올 수 있습니다.


3단계: @PostMapping의 @RequestBody로 Json 형태의 데이터를 받아 Spring boot에서 활용할 수 있는 형태로 바꾸기 

@RequestBody로 받은 것을 Spring boot에서 활용할 수 있는 형태로 바꿀 때, JsonParser라이브러리의 parseString 메소드를 사용하였습니다.

다른 블로그에서는 JsonParser의 parse 메소드를 사용하는 예제가 있었지만 이 메소드가 deprecated 된 상태였기 때문에 parseString을 사용하였습니다. 

음절은 "syllable", 음소는 "character"라는 키 값으로 Json에 저장되어있으므로 이것으로 값 데이터를 뽑아내었습니다.

그리고 저희 프로젝트에서 사용하는 Json은 Json 안에 Json 형식이 또 있었기 때문에 JsonElement를 여러번 사용하였습니다.

 

간단히, 사용법을 정리하자면 {"키": 값} 형태의 Json_Object은 Map<String, Object>에 담고, Json_Object 안에 있는 Json_Array는 List<Integer> 이런 식으로 List를 사용하였습니다.

 

결론

이렇게 코드를 작성하고 잘 뽑아낸 Map을 리턴하면 아래의 postman의 결과처럼 예쁘게 Json 형태로 원하는 결과를 얻을 수 있습니다.

 

DB에서 Json 불러온 결과(교본 분석 결과 json 파일) 밑에 박스에 있는 것, localhost:8000/score/{이미지이름}/{문학작품아이디}/{폰트이름}(with 사용자 글씨 분석 결과 json파일)으로 post 요청