파이썬 말고 Spring boot(Java)에서 슬랙 웹훅을 사용해 볼 것이다.



- 파이썬으로 Slack 통신하기

1. 2018/11/03 - [Develop/Python] - Python Slack WebHook (파이썬 슬랙 웹훅) 만들기

2. 2018/11/03 - [Develop/Python] - Python Slack Bot (파이썬 슬랙 봇) - slackclient

3. 2018/11/03 - [Develop/Python] - Python Slack Bot (파이썬 슬랙 봇) - slacker

4. 2018/11/08 - [Develop/Python] - Python Slack Lunch Bot - 점심 알리미 봇

5. 2019/05/03 - [Develop/Node.js] - [Node.js] Node.js Slack WebHooks (슬랙 웹훅)



1. 먼저 아래의 경로에 들어가서 슬랙 웹훅 추가하는 법을 보고 온다.

2018/11/03 - [Develop/Python] - Python Slack WebHook (파이썬 슬랙 웹훅) 만들기


2. 아래의 dependency를 추가한다.



  net.gpedro.integrations.slack
  slack-webhook
  1.4.0

3. 아래와 같이 연습해본다.


@GetMapping("/test")
	public void webHook() {
		
		SlackApi api = new SlackApi("https://hooks.slack.com/services/");    //웹훅URL
		api.call(new SlackMessage("#general", "TEST-WEBHOOK", "연습~~~~"));
		
	}

4. 결과





슬랙 자체에서 Java API를 많이 제공해준다
https://api.slack.com/community  - 여기에 들어가면 확인할 수 있다.

이 글에서 사용한 API는 
이것이다.



Spring boot에서 AWS S3 파일업로드 하는 방법이다.




Spring boot AWS 배포 방법

2018/10/26 - [Develop/Spring Boot] - Spring Boot AWS Elastic BeanStalk을 이용한 배포


AWS Python Lambda 사용방법

2018/11/16 - [Develop/Python] - AWS Python Lambda (CloudWatch Lambda) 사용하기



1. S3에서 버킷을 하나 생성한다.




버킷을 생성할 때 주의할 점은 이름에 대문자가 들어가면 안되고 특수문자가 들어가면안된다. 또한, 이 버킷의 이름은 AWS S3의 전체 버킷 이름들과 중복이 되면 안된다. 예를들어 test라는 버킷을 한 경우 누군가 test라는 버킷을 사용중이라면 test라는 이름으로 버킷을 생성할 수 없다.


이름을 정한 후 옵션이나 권한 설정은 필요하면 설정을 하시고 그 외 그냥 다음을 눌러 생성한다. 어차피 옵션이나 권한은 S3를 생성하고 다시 설정을 할 수 있다.




2. Spring boot pom.xml에 dependency를 추가한다.


s3 dependency를 추가한다.



    com.amazonaws
    aws-java-sdk-s3
    1.11.452


그리고 Multipartfile 을 사용할 것이기 때문에 Multipartfile dependency를 추가한다.



    commons-fileupload
    commons-fileupload
    1.3.3


3. appliaction.properties 파일 설정.


리전 정보는 옆의 링크에서 확인할 수 있다.- https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html 

cloud.aws.credentials.accessKey=IAM USER에서 확인
cloud.aws.credentials.secretKey=IAM USER에서 확인
cloud.aws.s3.bucket=buckettestgogo
cloud.aws.region.static=ap-northeast-2

추가로 Mutlipartfile의 파일 크기 범위를 정하고 싶으면 application.properties에 아래와 같이 추가한다.


spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB

4. 파일업로드


AmazonS3 의존성을 주입하고. bucket이름을 가져온다 굳이 @Value로 안가져와도 되고 buckettestgogo를 선언해도 된다.


ObjectMetadata를 통해 ContentType을 설정할 수 있다.

그리고 CloudFront를 사용하시는 분들이라면 metadata에 setCacheControl로 Cache설정이 가능하다.

또한. 파일의 권한을 지정할 수 있다. 아래 소스에는 읽기를 Public으로 설정하였다.

	@Autowired
	private AmazonS3 amazonS3;

	@Value("${cloud.aws.s3.bucket}")
	private String bucket;

	public void s3Test(MultipartFile file, String fname) {
		TransferManager tm = TransferManagerBuilder.standard().withS3Client(amazonS3).build();


		PutObjectRequest request;
		try {
	
			ObjectMetadata metadata = new ObjectMetadata();
			metadata.setCacheControl("604800"); // 60*60*24*7 일주일
			metadata.setContentType("image/png");
			request = new PutObjectRequest(bucket, fname, file.getInputStream(), metadata)
					.withCannedAcl(CannedAccessControlList.PublicRead);
			// amazonS3.putObject(request);
			Upload upload = tm.upload(request);

			upload.waitForCompletion();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AmazonServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AmazonClientException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       }


기본적인 예제를 활용하여 만들어 보았다 그 외에는 AWS에서 상세히 잘 설명되어 있다.

AWS 객체업로드 - https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/HLuploadFileJava.html

AWS 리전정보 - https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html


Expo에서 안드로이드 사용시 could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037 

가끔 Expo 말고 순수 React Native로 실행 했다가 다시 Expo를 실행 할 때 이런 에러가 떴다.


인터넷에 아무리 뒤져봐도 adb.exe를 실행하여 adb kill-server 하라고만 하지 전혀 해결되지 않았다. 수많은 삽질끝에 해결을 하였다.

해결하기 진짜 힘들었다. 


ㄹㅇ 끔찍한 사진.


1. React Native 했다가 Expo 실행 시 에러 났을 경우 에뮬레이터에 앱을 보면 React Native 앱이 깔려 있다. 이것을 일단 지우자.(사실 안지워도 될 수 도있음??) 그리고 혹시 모르니 일단 Expo앱도 지웠다.


2. 그리고 2개의 adb.exe를 찾아야한다. 

1개가 아니다. 2개가 있다. 이러니 삽질할 수 밖에.


나의 PC같은 경우는(Windows 사용)

하나는 아래의 경로에

1. C:\Users\      \AppData\Local\Android\Sdk\platform-tools

나머지 하나는 아래의 경로에 있다.

2. C:\Users\      \AppData\Roaming\npm\node_modules\expo-cli\node_modules\xdl\binaries\windows\adb


그리고 각각 실행해서

adb -version을 찍어보면 두개가 버전이 다르다. 

1번 adb가 버전이 더 높다 그러므로 2번 adb에 1번 adb로 복사 붙여넣기하여 바꾼다.

그리고 두개의 adb를 실행하여 adb kill-server를 각각 해주고

에뮬레이터와 안드로이드 스튜디오를 종료하고 새로 키고

expo start android를 하면

다음부터 에러없이 정상적으로 작동한다.



 

AWS의 Lambda 서비스와 Cloudwatch 이용하면 Batch job 역할을 할 수 있다.

덧 붙여 Python Lambda Python Package 배포 하는 방법을 해보자.



AWS ElasticBeanStalk을 이용한 배포(Spring boot) 바로가기

1. 2018/10/26 - [Develop/Spring Boot] - Spring Boot AWS Elastic BeanStalk을 이용한 배포




1. 먼저 AWS Lambda서비스를 생성합니다.






2. 그리고 AWS CloudWatch 서비스의 규칙에서 규칙생성을 합니다.




3. 이벤트 소스의 일정에 들어가 고정비율 또는 Cron식을 이용하여 시간을 선택합니다.

그리고 대상에서 아까 만든 Lambda 함수를 선택하고 생성을 합니다.


(저의 크론식은 Batchjob을 위해 매일 하루 자정마다 실행을 하는 것입니다.)

Cron식은 아래 링크의 AWS CloudWatch 레퍼런스에서 확인 할 수 있습니다. 

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html



 


4. 다시 Lambda로 들어와  아까만든 것의 편집합니다.

왼쪽 Designer 창에서 CloudWatch Events를 클릭하고

트리거 구성에 방금 만든 CloudWatch 규칙을 입력하고 추가합니다.




5. 규칙을 추가하였다면 생성한 함수의 이름을 클릭하여 함수코드 적는 란으로 돌아옵니다.




6. 직접 코드를 입력할 수도 있고, zip파일로 추가와 s3에 있는 것을 사용할 수 있습니다. 저는 .zip파일을 추가해보겠습니다.


.zip 파일을 업로드하고 저장을 하면




아래와 같이 Find not found 경고와 코드편집기가 나옵니다. 이 경고 메세지는 실행할 수 있는 핸들러(파이썬 메소드) 이름을 못찾아서 입니다. 이제 곧 수정할 예정입니다.


7. 저의 프로젝트 같은 경우는 app.py에서 실행하므로 app.py에 클릭합니다.

또한 저는 def main 메소드에서 프로그램이 실행됩니다.


이제 핸들러 정보에서 핸들러(파이썬 메소드)를 입력합니다. 

먼저 실행할 메인 파이썬파일의 이름을 적고 뒤엔 실행할 메소드 이름을 적습니다

(ex app.py 의 main() 메소드를 실행한다면 app.main 이라고 적음)

그리고 가장 중요한 실행하는 메인 메소드의 인자에 (event, context)라고 적어주어야 합니다. 

Lambda 레퍼런스에 따르면  아래와 같습니다.

  • event - AWS Lambda는 이 파라미터를 사용하여 이벤트 데이터를 핸들러에 전달합니다. 이 파라미터는 일반적인 Python dict 유형입니다. 또한 liststrintfloat 또는 NoneType 유형이 될 수 있습니다.

  • context - AWS Lambda는 이 파라미터를 사용하여 실행 시간 정보를 핸들러에 제공합니다. 이 파라미터는 LambdaContext 유형입니다.




8. 그리고 가장중요한 Python Package 추가하는 방법입니다. 

저는 사진에 이미 위 사진들에 추가가 되어있습니다.(pymysql)


저는 venv를 사용하기 때문에.

윈도우 기준

 %VIRTUAL_ENV%\Lib\site-packages


리눅스/mac 기준

$VIRTUAL_ENV/lib/python3.6/site-packages


site-packages 안에 있는 패키지 폴더들을 전부 복사하여 최상위 폴더에 붙여넣습니다. 그리고 배포할땐 압축파일에 venv파일을 제외하면 됩니다.

저 같은 경우는 mysql패키지만 사용하므로 site-packages안에 있는 mysql패키지(pymysql, PyMySQL-0.8.0.dist-info, pip-10.0.1-py3.7.egg)를 아래와 같이 최상위 폴더에 붙여놓고 venv폴더를 제외하고 .zip파일로 압축을 하였습니다.



9. 환경 변수 설정. (필요하신 분들만 사용안하시는 분들은 그냥 저장하셔도 무관함.)

저의 config.py 파이썬 파일입니다.



아래와 추가하시면 됩니다.



10. 위의 설정을 다 하셨으면 저장하시면 끝이납니다.

그리고 CloudWatch의 로그에서 필터에 아래와 같이 검색하시면 로그가 나옵니다. 그 로그를 보고 지정한 시각에 실행이 정상적으로 되었는지 확인하시면됩니다.




마지막으로. 파이썬파일에 외부 파일을 저장하는 소스가 있으면 READ_ONLY에러가 나오면서 되지않습니다. 예를 들어 log를 파일로 남기기 위해 파일 저장하는 소스가 있는데. 이는 Lambda에서 파일 저장을 제공하지 않으므로 에러가 발생합니다. 

사실 Lambda의 /tmp폴더에 경로를 지정하여 저장되게 하면, 저장되나 /tmp폴더를 확인할 수 있는 방법이 없습니다. 물론 S3를 이용하여 확인 할 수 는 있습니다.

그러므로 로그를 많이 확인하셔야 한다면 로그파일이 S3에 저장되게 할 수 있습니다. 물론 여기선 다루지 않습니다.(레퍼런스에서 확인)


또한, Lambda의 IP가 동적이므로 데이터베이스에서 IP 허용제한을 걸어 뒀을 경우. Lambda 파이썬 프로젝트에서 데이터베이스에 접근할 경우 동적ip로 인해 접근이 안 될 수 도있습니다. 그럴경우 VPC라는 것을 통해 허용할 수있습니다. 이것 또한 여기서 다루진 않습니다.(레퍼런스에서 확인)



참고

파이썬배포- https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-programming-model-handler-types.html

파이썬배포 - https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_cwet.html

파이썬배포 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html

파이썬배포 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python

CRON 시간 -https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html

VPC구성- https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/DocumentHistory_cwl.html

VPC구성 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/vpc.html

S3로그 - https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/S3ExportTasksConsole.html

S3로그 - https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/S3ExportTasks.html



MySQL  Workbench 에서 프로시저에서 CUSOR 사용시 잘못 된 CUSOR이름을 사용하면 아래와 같은 에러가 발생한다.



Error 1324: Undefined CURSOR: CUR_TEST SQL Statement

이유는 혹시 CUSOR이름을 아래와 같은 형식으로 지을 경우 발생한다.



CUSOR_TEST 의 CUSOR라는 단어가 MYSQL WORKBENCH에서 예약어로 사용되기 때문인 듯 하다.

그러므로 CUR_TEST라는 형식이든 에러가 안나도록 바꾸면 된다.

MySQL  Workbench 에서 프로시저에서 DELIMITER 사용시 아래와 같은 에러가 발생한다.


 Syntax error: unexpected 'DELIMITER'




이유는 Workbench에서 프로시저 작성할 때 이미 DELIMITER를 눈에 보이진 않지만 자동으로 제공해주기 때문이다.

아래와 같이 다시 DELIMITER를 지우고 APPLY를 한번 눌러보면 DELIMITER가 자동으로 제공해주는 것을 볼 수 있다.



따라서 Workbench에서 DELIMITER를 선언할 필요가 없다.


마지막으로 hashmap 을 json으로 만드는 방법과, JsonObject를 생성하는 방법이다.



Spring boot Json 1편, 2편, 3편, 4편

1. 2018/11/06 - [Spring Boot] - Spring Boot Json, JsonObject로 만들기 - JSON 1편

2. 2018/11/07 - [Develop/Spring Boot] - Spring Boot Json, Gson을 이용한 JsonObject to String, String to JsonObject- JSON 2편

3. 2018/11/09 - [Develop/Spring Boot] - Spring Boot Json, Jackson을 이용한 JsonParsing - Json 3편

4. 2018/11/12 - [Develop/Spring Boot] - Spring Boot Deserialization Json, Deserialization JsonString to JsonObject - Json 4편



번외 Database의 값을 Json으로 select하는 방법.

1. 2018/10/24 - [Spring Boot] - Spring boot jpa map, hashmap, JSON형식

2. 2018/10/28 - [Spring Boot] - Spring boot JPA EntityManager를 이용한 Map형식으로 mapping하기


Spring boot에서 MySQL JSON 타입 SELECT하는 방법

1. 2018/11/30 - [Develop/Spring Boot] - Spring boot MySQL JSON - MySQL JSON DATA TYPE 값 가져오기



HashMap을 Json으로 만드는 방법을 배우기에 앞서 JsonObject를 생성하는 방법을 먼저 본다.


1. google-json-simple을 이용한 JsonObject 만드는 방법.


xml에 아래와 같은 dependency를 추가한다.


		com.googlecode.json-simple
		json-simple
		1.1


우리가 만들어볼 Json예제는 4편에서 사용한 Json이다.


{
    "id": 1,
    "password": "1234",
    "details": [
        {
            "name": "test",
            "age": 20
        },{
            "name": "test2",
            "age": 21
        }
    ] 
}

그리고 아래와 같이 JSONObject라는 것과 JSONArray라는 것을 사용하여 JSON을 생성할 수 있다.


public void test() {
		JSONObject obj = new JSONObject();
		JSONArray arr = new JSONArray();
		
		obj.put("id", 1);
		obj.put("password", "1234");
		
		JSONObject obj2 =new JSONObject();
		obj2.put("name", "test");
		obj2.put("age", 20);
		
		arr.add(obj2);
		
		obj2 = new JSONObject();
		obj2.put("name", "test2");
		obj2.put("age", 21);
		
		arr.add(obj2);
		
		obj.put("details", arr);
		
		System.out.println(obj.toString());
		
}




현재는 Json이 Array를 포함하여 JSONArray를 사용하였지만 일반 적인 key : value 형태는 JSONObject 하나만으로도 생성할 수 있다.


2. Gson을 이용한JsonObject 생성


이 방법은 Json  2편에서 배웠으나 이번엔 Array를 사용하기 때문에 다시 한번 해본다. 사실 위의 json-simple과 별반 다를게 없다.



	public void test() {
		Gson gson = new Gson();
		JsonObject obj = new JsonObject();
		JsonArray arr = new JsonArray();
		
		obj.addProperty("id", 1);
		obj.addProperty("password", "1234");
		
		JsonObject obj2 = new JsonObject();
		obj2.addProperty("name", "test");
		obj2.addProperty("age", 20);
		arr.add(obj2);
		
		obj2= new JsonObject();
		obj2.addProperty("name", "test2");
		obj2.addProperty("age", 21);
		
		arr.add(obj2);
		
		obj.add("details", arr);
		
		String jsonString = obj.toString();
		
		System.out.println("gson을 이용한 객체생성");
		System.out.println(jsonString);
		
	}




3. HashMap을 Json으로 만드는 방법.


HashMap<String, Object>를 선언해서 이번 편에서 했던 모든 것들(json-simple의 obj와 gson의 obj)을 HashMap에 put해보고

일반 데이터를 HashMap에 put해서 json으로 변환해 보는 법을 해본다. 그리고 gson의 prettyprinting을 이용하여 예쁘게 출력해본다.



public void test() {
		JSONObject obj = new JSONObject();
		JSONArray arr = new JSONArray();

		obj.put("id", 1);
		obj.put("password", "1234");

		JSONObject obj2 = new JSONObject();
		obj2.put("name", "test");
		obj2.put("age", 20);

		arr.add(obj2);

		obj2 = new JSONObject();
		obj2.put("name", "test2");
		obj2.put("age", 21);

		arr.add(obj2);

		obj.put("details", arr);

		
		JsonObject g_obj = new JsonObject();
		JsonArray g_arr = new JsonArray();

		g_obj.addProperty("id", 1);
		g_obj.addProperty("password", "1234");

		JsonObject g_obj2 = new JsonObject();
		g_obj2.addProperty("name", "test");
		g_obj2.addProperty("age", 20);
		g_arr.add(g_obj2);

		g_obj2 = new JsonObject();
		g_obj2.addProperty("name", "test2");
		g_obj2.addProperty("age", 21);

		g_arr.add(g_obj2);

		g_obj.add("details", g_arr);
		
		HashMap map = new HashMap();
		map.put("json-simple", obj);
		map.put("gson", g_obj);
		map.put("HashMap", "맵테스트");
		map.put("숫자테스트", 1234567890);
		
		Gson gson = new GsonBuilder().setPrettyPrinting().create();
		String jsonString = gson.toJson(map, new TypeToken>() {
		}.getType());
		System.out.println("HashMap to JSON");
		System.out.println(jsonString);

	}



이로써 Spring boot 에서의 Json에 대한 학습을 마무리한다.

1편부터 마지막편까지의 내용과 번외편 내용 2개만 알아도 Spring boot에서 모든 데이터들을 Json으로 만들 수 있다.


어찌보면 가장 중요한 Deserialization한 JsonString 형태를 파싱하는 방법이다.

Spring Boot에서 Deserialization 파싱을 위해 Jackson과 gson을 사용하면서 동시에 클래스를 생성하여 사용해야한다.



Spring boot Json 1편, 2편, 3편, 마지막

1. 2018/11/06 - [Spring Boot] - Spring Boot Json, JsonObject로 만들기 - JSON 1편

2. 2018/11/07 - [Develop/Spring Boot] - Spring Boot Json, Gson을 이용한 JsonObject to String, String to JsonObject- JSON 2편

3. 2018/11/09 - [Develop/Spring Boot] - Spring Boot Json, Jackson을 이용한 JsonParsing - Json 3편

4. 2018/11/13 - [Develop/Spring Boot] - Spring Boot Json, hashmap to json , JsonObject 만들기- JSON 마지막



번외 Database의 값을 Json으로 select하는 방법.

1. 2018/10/24 - [Spring Boot] - Spring boot jpa map, hashmap, JSON형식

2. 2018/10/28 - [Spring Boot] - Spring boot JPA EntityManager를 이용한 Map형식으로 mapping하기


Spring boot에서 MySQL JSON 타입 SELECT하는 방법

1. 2018/11/30 - [Develop/Spring Boot] - Spring boot MySQL JSON - MySQL JSON DATA TYPE 값 가져오기



1. Class를 생성하여 Gson을 이용한 Deserializaion한 JsonString to Object(JsonObject)


앞의 1편, 2편, 3편에 사용했던 TestDTO를 수정하자.


수정하기 전 먼저 Test_2DTO를 새로 생성한다


public class Test_2DTO {
	private String name;
	private int age;
	
	public Test_2DTO() {
		super();
	}

	public Test_2DTO(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}
public class TestDTO {

	private Integer id;
	private String password;
	private List details;
	
	
	public TestDTO() {
		super();
	}


	public TestDTO(Integer id, String password, List details) {
		super();
		this.id = id;
		this.password = password;
		this.details = details;
	}


	public Integer getId() {
		return id;
	}


	public void setId(Integer id) {
		this.id = id;
	}


	public String getPassword() {
		return password;
	}


	public void setPassword(String password) {
		this.password = password;
	}


	public List getDetails() {
		return details;
	}


	public void setDetails(List details) {
		this.details = details;
	}


	@Override
	public String toString() {
		return new Gson().toJson(this);
	}
}


생성했다면, 


public void test() {
		
		String jsonString = "{\r\n" + 
				"    \"id\": 1,\r\n" + 
				"    \"password\": \"1234\",\r\n" + 
				"    \"details\": [\r\n" + 
				"        {\r\n" + 
				"            \"name\": \"test\",\r\n" + 
				"            \"age\": 20\r\n" + 
				"        },{\r\n" + 
				"            \"name\": \"test2\",\r\n" + 
				"            \"age\": 21\r\n" + 
				"        }\r\n" + 
				"    ] \r\n" + 
				"}";
		Gson gson = new Gson();
		TestDTO t = gson.fromJson(jsonString, TestDTO.class);
		System.out.println("id : " +t.getId());
		System.out.println("password : "+t.getPassword());
		System.out.println("name1 : "+t.getDetails().get(0).getName());
		System.out.println("age1: "+t.getDetails().get(0).getAge());
		System.out.println("name2 : "+t.getDetails().get(1).getName());
		System.out.println("age2: "+t.getDetails().get(1).getAge());
		
	}

위에 사용한 Json내용이다., 


{
    "id": 1,
    "password": "1234",
    "details": [
        {
            "name": "test",
            "age": 20
        },{
            "name": "test2",
            "age": 21
        }
    ] 
}


위 test() 메소드를 실행하면 아래와 같이 Deserializaion한 JsonString이 파싱되어 JsonObject에 알맞게 들어간다.



2. Jackson의 ObjectMapper를 이용한 Json String to JsonObject 이다.


Json내용은 위와 동일한 상태에서 진행하였다.


public void test() {
		ObjectMapper objectMapper = new ObjectMapper();
		 
		String jsonString = "{\r\n" + 
				"    \"id\": 1,\r\n" + 
				"    \"password\": \"1234\",\r\n" + 
				"    \"details\": [\r\n" + 
				"        {\r\n" + 
				"            \"name\": \"test\",\r\n" + 
				"            \"age\": 20\r\n" + 
				"        },{\r\n" + 
				"            \"name\": \"test2\",\r\n" + 
				"            \"age\": 21\r\n" + 
				"        }\r\n" + 
				"    ] \r\n" + 
				"}";
		  try {
	            TestDTO t = objectMapper.readValue(jsonString, TestDTO.class);    // String to Object로 변환
	            System.out.println("ObjectMapper테스트");
	    		System.out.println("id : " +t.getId());
	    		System.out.println("password : "+t.getPassword());
	    		System.out.println("name1 : "+t.getDetails().get(0).getName());
	    		System.out.println("age1: "+t.getDetails().get(0).getAge());
	    		System.out.println("name2 : "+t.getDetails().get(1).getName());
	    		System.out.println("age2: "+t.getDetails().get(1).getAge());	     
	
	        } catch (IOException e) {
	            e.printStackTrace();
	        }		
}

gson과 마찬가지로 잘 작동된다.


3. Jackson JsonNode 를 이용한 Deserializaion String to JsonObject


어떻게 보면 가장 핵심인 부분일 수도 있다. 클래스 생성없이 할 수 있다는 큰 장점이있다.


Deserializaion Json Data는 위와 동일한 데이터를 사용한다.



public void test() {
		ObjectMapper objectMapper = new ObjectMapper();

		String jsonString = "{\r\n" + "    \"id\": 1,\r\n" + "    \"password\": \"1234\",\r\n"
				+ "    \"details\": [\r\n" + "        {\r\n" + "            \"name\": \"test\",\r\n"
				+ "            \"age\": 20\r\n" + "        },{\r\n" + "            \"name\": \"test2\",\r\n"
				+ "            \"age\": 21\r\n" + "        }\r\n" + "    ] \r\n" + "}";
		try {
			System.out.println("Jackson JsonNode 테스트");
			JsonNode t = objectMapper.readValue(jsonString, JsonNode.class); // String to Object로 변환
			
			JsonNode id = t.get("id");
			System.out.println("id : " + id.asInt());
			
			JsonNode password = t.get("password");
			System.out.println("password : " + password.asText());
			
			JsonNode details = t.get("details");
			JsonNode details_1 = details.get(0);		
			System.out.println("name1 : " + details_1.get("name").asText());
			System.out.println("age1: " + details_1.get("age").asInt());
			
			JsonNode details_2 = details.get(1);	
			System.out.println("name2 : " + details_2.get("name").asText());
			System.out.println("age2: " + details_2.get("name").asText());

		} catch (IOException e) {
			e.printStackTrace();
		}
}

class 생성없이 파싱이 잘 되었다


이 처럼 웬만한 것들은 class를 생성하여 모든 Deserializaion을 파싱할 수 있으며,

Jackson JsonNode 를 이용하여 처리할 수 있다. 



이 글은 Windows(윈도우) 에서 설치하는 방법이다.


1. Visual Studio Code를 통한 React-Native 프로젝트 개발

2. 안드로이드 스튜디오를 통한 React-Native 실행하는 방법

위 2가지를 다룰 것이다.


Expo를 이용한 React Native 설치는 아래 링크에 있다.

2018/11/11 - [Develop/React Native] - React Native expo를 이용한 설치 Windows, Android Studio (v31.0.0)


1. 먼저 React Native를 설치한다.


설치하기전에 Node.js를 설치해야한다. 링크 - https://nodejs.org/

Node.js를 설치했다면 React Native를 설치한다

npm install -g react-native-cli


2. 설치후 React Native 프로젝트를 생성한다.


아래의 명령어를 통해 test1 프로젝트를 생성한다.

react-native init test1



3. React Native Visual Studio Code


React Native 의 에디터로 atom, vscode, sublimetext 등이 있지만 vscode가 가장 빠르다고 한다. 그래서 vscode를 사용한다.

https://code.visualstudio.com/ 옆의 홈페이지를 통해 간단하게 설치를 할 수 있다. 

다음 Visaul Stuido Code를 연다 연다음 아까 만든 test1 프로젝트를 추가한다.



추가 후에 App.js 파일의 빨간 줄 표시를 한번 수정해보자. 



필자는 아래와 같이 수정해 보았다. 굳이 안해도 됨.



4. React Native Android Studio


https://developer.android.com/studio/install?hl=ko 사이트에 접속하여 안드로이드 스튜디오를 우선 설치한다.


Tools - SDK Manager에 들어간다.


React Native 는 4.1 부터 지원하므로 필자는 9.0과 8.1를 설치했다.

그리고 SDK Location을 복사한다.



복사한 SDK LOCATION을 환경변수에 추가한다 ANDROID_HOME 그리고 JAV_HOME이라는 환경변수를 추가한다

JAVA_HOME은 c드라이브의 programfile에 java폴더의 jdk 폴더 경로를 추가한다. (C:\Program Files\Java\jdk1.8.0_191)



그리고 SDK Tools에 들어가 체크되어있는 것들을 설치한다.



그리고 Tools - AVD Manager에 들어가서



Create Virtual Device를 통해 ADV를 설치한다 필자는 API Ver 28을 설치했다. 그리고 Action의 시작버튼을 클릭하면 가상에뮬레이터가 실행된다.



마지막으로 다시 cmd창에서 

아래의 명령어를 입력한다.


cd test1 react-native run-android


아래와 같이 실행 된다.




필자는 아까 Visual Studio Code에서 수정한 것을 실수로 저장을 하지 않아서 내용이 바뀌지 않았지만,

이렇게 실행되는 모습을 볼 수 있다.



이 글은 Windows(윈도우) 에서 설치하는 방법이다.

1. 직접 스마트폰으로 React-Native를 실행하는 방법

2. Visual Studio Code를 통한 React-Native 프로젝트 개발

3. 안드로이드 스튜디오를 통한 React-Native 실행하는 방법

위 3가지를 다룰 것이다.


기본 React Native 설치하는 방법

2018/11/11 - [Develop/React Native] - React Native 설치 Windows, Android Studio 사용하기.



Expo 가 v31.0.0 이 되면서 홈페이지에 XDE설치하는 것이 사라지고 Expo SDK를 설치하는 것이 생겼다.

예전의 강의들을 찾아보면 죄다 XDE를 설치하라고 되어있는데, XDE를 설치하고 싶다면 v29이하에서 설치할 수 있다.


https://docs.expo.io/versions/latest/

위 사이트에 접속해서 v29.0.0 의 Installation 메뉴엔 XDE를 설치 하는 것이 있다.


하지만 이 글은 최신버전인 v31.0.0 을 설치하는 방법이다.


1. https://docs.expo.io/versions/latest/ - 사이트에 접속하여 Installation 메뉴에 들어간다.


그리고 Node.js가 없다면 Node.js를 먼저 설치한다.




2. Node.js 가 정상 설치되었다면 


package.json 파일을 만들어야한다. (안만들고 바로 expo설치하니까 없다고 에러가 뜰 수도 있음)


npm --version
npm install express
npm init -y

이렇게 하면 package.json 파일이 생성되며 생성된다면 아래와 같이 입력한다


{
  "name": " ",
  "version": "6.4.1", //처음에 1.0.0 이라고 되어있는 걸 최신 버전에 맞게 수정
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}


다음 Windows의 cmd창을 열어 아래의 명령어를 입력한다.

npm install -g expo-cli

이러면 expo설치는 끝이난다. 


3. expo 설치를 한후 react-native 프로젝트를 만든다.


expo init test-app


하면 프로젝트를 고를 수 있다 빈프로젝트로 시작하기와 아닌 걸로 시작하기. 위는 키보드의 화살표 커맨드로 선택할 수 있으며

엔터를 하면 프로젝트가 생성된다. 

프로젝트 생성 후

cd test-app npm start 또는 expo start

실행을 하게되면 



QR코드가 생성된다. 

이 QR코드를 안드로이드 휴대폰에 Expo라는 앱을 깔아서 스캔하면된다.


4. Expo 어플리케이션 설치

※ 주의할점 스마트폰과 컴퓨터의 네트워크 환경이 같은 환경에 있어야 어플리케이션이 실행됩니다.!! 같은 환경이 아니라면

7번으로 

Play스토어에 들어가서 Expo라는 앱을 설치한다. 그 후에 어플리케이션을 실행한다.



그리고 위 사진에 Scan QR Code를 클릭하고 위의 QR코드를 스캔하면



위와 같이 빌드를 한다. 맨 처음 빌드할 땐 조금 느리기때문에 기다린다.


빌드가 성공하면 위와 같이 되며 Expo를 이용한 React-native 설치 및 실행이 기본적으로 끝이난다.

(아래 Visual Studio Code로 프로젝트를 한번 간단하게 만져 볼 거기 때문에 종료시키지말고 기다린다.)


5. React Native Visual Studio Code


React Native 의 에디터로 atom, vscode, sublimetext 등이 있지만 vscode가 가장 빠르다고 한다. 그래서 vscode를 사용한다.

https://code.visualstudio.com/ 옆의 홈페이지를 통해 간단하게 설치를 할 수 있다. 

다음 Visaul Stuido Code를 연다 연다음 아까 만든 test-app 프로젝트를 추가한다.



6. App.js 에 들어가서 글 수정하고 Ctrl+s 를 눌러 저장을 해본다.

아래의 Open up App.js ~~~~부분을 



아래 테스트!!! 처럼 하고 바로 Ctrl+s를 눌러 저장을 해보자 




저장을 했으면 다시 스마트폰의 어플리케이션 화면을 보면 테스트!!! 라고 바로 바껴져있다.

실시간으로 바로바로 바뀌는 것을 Expo라는 것을 통해 확인 할 수 있다.


7. Expo Android Studio 


https://developer.android.com/studio/install?hl=ko 사이트에 접속하여 안드로이드 스튜디오를 우선 설치한다.


Tools - SDK Manager에 들어간다.

설치후 React Native 는 4.1 부터 지원하므로 필자는 9.0과 8.1를 설치했다.

그리고 SDK Location을 복사한다.



복사한 SDK LOCATION을 환경변수에 추가한다 ANDROID_HOME 그리고 JAV_HOME이라는 환경변수를 추가한다

JAVA_HOME은 c드라이브의 programfile에 java폴더의 jdk 폴더 경로를 추가한다. (C:\Program Files\Java\jdk1.8.0_191)




그리고 SDK Tools에 들어가 체크되어있는 것들을 설치한다.




그리고 Tools - AVD Manager에 들어가서


Create Virtual Device를 통해 ADV를 설치한다 필자는 API Ver 28을 설치했다. 그리고 Action의 시작버튼을 클릭하면 가상에뮬레이터가 실행된다.



마지막으로 다시 cmd창에서 

아래의 명령어를 입력한다.

npm run android 또는 expo start --android



설치후 성공적으로 테스트!!! 화면이 에뮬레이터에 뜨는 것을 확인할 수 있다.


+ Recent posts