Sangil's blog

https://github.com/ChoiSangIl Admin

Spring 컨트롤러에서 Json데이터 받을 때 오류 out of START_ARRAY token DEV / WEB

2020-09-23 posted by sang12


Post형태로 아래와 같은 데이터를 받으려고 하는데... 컨트롤러에서 out of START_ARRAY token 오류가 난다...
[ { "test": 1, "test2": "test"}, { "test": 2, "test2": "test2" } ]

처음에 만들었던 구조는

ResultVo라는 객체안에 
List<TestVo> 와 같은 구조를 넣어주고 ResultVo로 해당 Json 데이터를 받으려고해서 오류가 발생했다
(
TestVo 는 위 json 데이터를 받기위한 Vo)

-오류나던 부분
private void controller(@RequestBody ResultVo> vo) {

}

-수정
private void controller(@RequestBody List<TestVo> vo) {

}

작업을 하다보니 한가지 방법이 더있어서 공유합니다. 2번째 수정한 방법으로 파라미터를 받게되면.  아래와같은 형태의 데이터를 못받게 됩니다.

{  [ { "test": 1, "test2": "test"}, { "test": 2, "test2": "test2" }]  , test3: "test"}

이럴때는 Json 데이터를 아래와같이 변형하여, test1과 test3으로 json을 만들어줍니다

{ test1: { [ { "test": 1, "test2": "test"}, { "test": 2, "test2": "test2" }] } , test3: "test"}

그리고 아래와 같이 Vo를 생성해서 받으면 됩니다. 이때 test1과 test3의 json을 감싸주는 변수의명이 같아야합니다 

Class TestVo{
    List<Test1Vo> test1;
    String test3;
}


REPLY

VUE 엑셀(EXCEL) 업로드 EXCEL TO JSON) DEV / WEB

2020-09-22 posted by sang12


VUE에서 엑셀 업로드를 하는데 JSON으로 변경해서 서버로 전송하는 방법이 있다는 것을 알았다. 파일로 전송해서 북치고 장구치고 하는것보다 좋은 방법인거 같다 (참고: https://godd.tistory.com/41)

VUE CLI환경에서 업로드 하다보니 약간 다른점과 JSON 키값을 영어로 바꾸는 부분에서 삽질한게 있어 추가로 작성한다. 

npm install xlsx 명령어로 xlsx 모듈을 받는다.

--xlsx 모듈 import

import XLSX from 'xlsx';

--input event 설정

<input type="file" @change="readFileaccept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">

--excel to json

 readFile(event) {
      const file = event.target.files[0];
      let reader = new FileReader();
      let tmpResult = {};
      reader.onload = (e=> {
          let data = reader.result;
          let workbook = XLSX.read(data, {type: 'binary'});
          workbook.SheetNames.forEach(sheetName => {
              workbook.Sheets[sheetName].A1.w = "test1";
              workbook.Sheets[sheetName].B1.w = "test2";
              workbook.Sheets[sheetName].C1.w = "test3";
              workbook.Sheets[sheetName].D1.w = "test4";
              
              console.log(workbook.Sheets[sheetName].A1);
              const roa = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]);
              tmpResult = roa;
          });
          console.log(tmpResult);
          this.excelJsonData=tmpResult;
      };
      reader.readAsBinaryString(file);
}

필자는 사용하면서 아래와 같은 엑셀데이터를 업로드 했는데  json 데이터의 키값이 한글로(상품,가격,옵션,옵션2,옵션3)으로  만들어지게 되어 이를 영어로 바꾸고 싶었다. 그래서 구글링을 해보니 위처럼 workbook.Sheets[sheetName].A1.w 값을 변경해주면 내가 원하는 키값으로 데이터를 가져 올 수 있다. 엑셀의 헤더값을 영어로바꿀까 했지만.. 사용자가 더 보기 좋게 한글로 하고.. 뒤에서 한번 더 바꾸는 방법으로 구현하기로 했다.

상품가격옵션옵션2옵션3
카니발3천만원abc
레이1천만원cba


#sheet_to_json header rename #sheet_to_json header
REPLY

Spring Boot profiles real,dev maven 배포하기 DEV / WEB

2020-09-10 posted by sang12


Spring Boot를 사용하다보면 real과 개발을 구분하기 위해 profiles를 많이 사용하게 됩니다.

하지만 배포할때마다 spring.profiles.active=real, spring.profiles.active=dev와 같은 형태로 변경하면서 배포하기엔 너무 불편하겠죠? 그래서 환경변수를 이용하여 배포하는 방법을 알아보겠습니다.

일단, pom.xml에 사용할 profile  환경변수를 등록합니다. 

-pom.xml

<profiles>
	<profile>
	    <id>dev</id>
	    <activation>
		<activeByDefault>true</activeByDefault>
	    </activation>
	    <properties>
		<build.profile.id>dev</build.profile.id>
		<profileActive>dev</profileActive>
	    </properties>
	</profile>
	<profile>
	    <id>prod</id>
	    <properties>
		<build.profile.id>prod</build.profile.id>
		<profileActive>prod</profileActive>
	    </properties>
	</profile>
</profiles>

activeByDefault가 true로 설정되어있는게 기본으로 셋팅 됩니다. 그래서 스프링부트에 내장되어있는 톰캣으로 프로젝트를 올릴때는,  개발로 올라라게 dev를 true로 설정하였습니다. 그리고 여기에서 중요한 부분은 <profileActivie> <-- 이부분입니다. application.properties에 해당 변수명으로 등록을 해줘야합니다. 아래 처럼 @profileActive@ 을 등록해줘야합니다. 

-application.properties
spring.profiles.active=@profileActive@

그리고 maven Build 설정에서 
Goals: clean install -DskipTests -Pdev, clean install -DskipTests -Pprod 형태로 빌드하고 만들어진 war파일에서 application.properties를 보면 -Pdev, -Pprod 옵션에 따라 개발과 리얼이 변경되는것을 확인 할 수 있습니다 :)

#maven 환경변수 명령어
REPLY