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



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



Spring Boot에서 Json 파싱을 위해 Jackson을 기본적으로 제공해준다. Spring에서는 maven 또는 gradle을 xml에 추가해야한다.

사실 기본적인 기능은 앞선 gson과 다를게 없다.


Spring boot Json 1편, 2편, 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/12 - [Develop/Spring Boot] - Spring Boot Deserialization Json, Deserialization JsonString to JsonObject - Json 4편

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. Jackson ObjectMapper (JsonString to Object)


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

		String Json =
		    "{ \"id\" : 1, \"password\" : \"1234\" }";

		try {
		    TestDTO t = objectMapper.readValue(Json, TestDTO.class);	// String to Object로 변환

		    System.out.println("id = " + t.getId());
		    System.out.println("password = " + t.getPassword());
		    
		    String jsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(t); //다시 jsonString으로 변환
		    System.out.println(jsonString);
		} catch (IOException e) {
		    e.printStackTrace();
		}
}


(위의 TestDTO은 1편에 나와있다.)


objectMapper를 통해 JsonString을 Object로 변환할 수 있었고 writeValueAsString을 통해 다시 JsonString으로도 변환이 가능하다


2. Object From JsonFile



ObjectMapper objectMapper = new ObjectMapper();

URL url = new URL("file:data/test.json");

TestDTO t = objectMapper.readValue(url, TestDTO.class);


test.json 파일엔

{

"id" : 1,

"password" : 1234

}

들어 가있다.



기본적인 사용방법은 여기까지이다 다음편에 Jackson JsonNodeClass를 설명한다.

Jackson 가이드 - https://www.baeldung.com/jackson


아래의 파이썬 슬랫봇을 이용하여 점심 알리미 봇을 만들었다.

- Python Slack bot 만들기

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

- 파이썬 웹훅으로 만들기

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


- slack를 이용한 파이썬 슬랙봇 만들기

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

- Node.js Webhooks

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


- Spring boot Webhook (Java Webhook)

2018/11/24 - [Develop/Spring Boot] - Spring boot Slack WebHook. 슬랙 웹훅(Java Slack WebHook)



파일은 여기서 확인가능하다. https://github.com/wonkwangyeon/Slack-Lunch-Bot

선택장애가 있는 사람들을 위한 랜덤 점심 선택 및 점심 알리미 봇.

파이썬으로 제작한 Slack 점심 알리미 봇이다. 점심 메뉴를 데이터베이스에 등록해 놓으면, 지정시간마다 점심메뉴를 봇이 슬랙채널을 통해 알려준다.

1. 특징 및 사용방법

한 주마다 메뉴가 초기화되며 같은 음식을 먹을 일이 없게 한다.

ex) 데이터베이스에 밥종류가 7가지(밥1, 밥2, 밥3, 밥4, 밥5, 밥6, 밥7)가 있다면 기본적으로 월요일 오전 9시에 메뉴가 7가지로 초기화가된다.

그리고 메뉴를 자동으로 선택해주는 알림이 오게되면 그 메뉴는 삭제가된다.

'밥3'이 선택되어 알람이 온다면 밥3은 삭제되어 (밥1, 밥2, 밥4, 밥5, 밥6, 밥7) 이렇게 남게되고 그 주에는 밥3은 다시는 선택되지 않게 된다.

이렇게 날마다 밥들이 선택되고 하나씩 줄어간다. 그렇기 때문에 한 주에 똑같은 메뉴를 먹을일이 없어진다.

그리고 매주 월요일 오전 9시에 새로(밥1, 밥2, 밥3, 밥4, 밥5, 밥6, 밥7)으로 초기화가 되고 다시 시작된다.

만약 밥종류가 3가지밖에 없다면 (밥1, 밥2, 밥3) 월, 화, 수 만에 밥3개를 다먹게 되면 월요일 오전 9시에 초기화되는거 처럼 자동으로 다시 초기화가 된다.

기본적인 프로그램 사용방법

  1. 밥추천/추천/메뉴추천/메뉴 추천 ex) 밥추천
  2. 추가/밥추가/메뉴추가 ex)밥추가 돈가스
  3. 삭제/밥삭제/메뉴삭제 ex) 삭제 돈가스
  4. 확인/메뉴기록/메뉴로그 ex) 확인 2018-11-07
  5. 초기화/재세팅 ex) 초기화
  6. 모든메뉴 ex) 모든메뉴
  7. 알람설정 ex) 알람설정 110000
  8. 기타설명
  9. 채널변경 및 등록 ex) 등록

1. 정상적인 채널의 알림을 위해 먼저 채널 등록을 한다

ex) 등록

2. 알람설정은 매일 점심메뉴 알람이 오는 시간 설정으로써 HHMMDD 시간으로 항상 입력해준다.

기본세팅은 110000이다. (오전 11시) ex) 알람설정 153030 (3시30분30초)

3. 메뉴로그는 날짜를 입력하게 되면 그날 어떤 음식이 자동으로 선택되었는지 알 수 있다.

항상 yyyy-mm-dd로 입력해준다. ex) 확인 2018-11-07

2. Sqlite3 Table

create table menu(
	name text not null primary key);

create table menu_log(
    id integer primary key autoincrement,
    name text not null,
    time timestamp DATE DEFAULT(datetime('now', 'localtime')));


  1. new 2019.06.14 17:55

    혹시 슬랙과 깃헙 push 웹훅도 만들어보신적있으실까여?
    깃헙에 push된 내용을 슬랙 채널에 떨구고싶거든여~

    • 팡연 2019.06.17 17:34 신고

      슬랙에서 Github를 추가하신 뒤 채널 선택후 그 URL을 Github 저장소의 Setting에서 Webhooks에 추가하시면 아마도 간단하게 될 겁니다.


1편에서 Spring Boot에서 데이터를 JSON형식으로 표현하는 가장 기본적인 방법인 클래스를 이용한 방법을 배웠다.

이번에는 Gson을 이용한 JsonOjbect to String, String to JsonObject를 알아아보자.


개인적인 경험으론 Gson이 가장 Json파싱에서 핵심이 아닐까 생각한다.



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

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

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

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

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. 먼저 pom.xml에 의존성을 추가한다.



		com.google.code.gson
		gson
		2.8.5


2. Gson을 이용한 Json 생성


public String test3() {
		
		Gson gson = new Gson();
		JsonObject obj = new JsonObject();
		String id=null;
		obj.addProperty("id", id);
		obj.addProperty("pass", 1234);
		
		String i = obj.toString();
		String j = gson.toJson(obj);
		System.out.println(i);
		System.out.println(j);
		return i;
}


Gson의 JsonObject를 Import받고 JsonObject를 이용하여 Json 형식으로 만들었다.

위의 toString()으로 호출한 결과와 gson.toJson()을 이용한 결과가 다르다는 걸 볼 수 있다.

아래의 gson.toJson()을 이용하면 null값이 들어올 경우 키값이 사라져 버린다.


3. String to JsonObject


public void test3() {
		
		Gson gson = new Gson();
		String json = "{\"id\": 1, \"password\": \"1234\"}";

		TestDTO test = gson.fromJson(json, TestDTO.class);
		System.out.println(test.getId());
		System.out.println(test.getPassword());
		
}


1편에서 사용한 TestDTO를 통해 Json객체를 생성할 수 있다.


4.  객체를 Json으로 만들기


	public void test3() {
		
		Gson gson = new Gson();
		TestDTO test2 = new TestDTO();
		test2.setId(2);
		test2.setPassword("2222");
		String i=gson.toJson(test2);
		System.out.println(i);
	}


5.  Gson의 JsonParser와 JsonElement를 통한 JsonParsing


	public void test3() {
		
		String json = "{\"id\": 1, \"password\": \"1234\"}";
		JsonParser jp = new JsonParser();
		JsonElement je = jp.parse(json);
		int id = je.getAsJsonObject().get("id").getAsInt();
		String pass = je.getAsJsonObject().get("password").getAsString();
		System.out.println(id + " / " + pass);
	}


6. Gson을 이용하여 Class의 toString() 을 이용한 Json 생성


1편의 TestDTO클래스에 Gson을 이용한 toString() 으로 보다 빠르고 편리하게 Json을 생성할 수 있다.


import com.google.gson.Gson;

public class TestDTO {

	private Integer id;
	private String password;
	
	
	public TestDTO() {
		super();
	}
	public TestDTO(Integer id, String password) {
		super();
		this.id = id;
		this.password = password;
	}
	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;
	}
	
	@Override
	public String toString() {
		return new Gson().toJson(this);
	}
}

	public void test3() {

		Gson gson = new Gson();
		TestDTO test2 = new TestDTO();
		test2.setId(2);
		test2.setPassword("2222");
		String json = test2.toString();
		System.out.println(json);
	}


7. 기타


이외에도 Json 예쁘게 출력하는 방법 등 여러가지 기능이 존재한다.



Gson가이드 - https://github.com/google/gson/blob/master/UserGuide.md



Spring Boot에서 데이터를 JSON형식으로 표현하는 가장 기본적인 방법으로는 클래스를 이용하는 방법이다.

이 방법을 알아야 다음에 Deserialization한 JSON을 만들 수 있다.


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

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

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

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

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 값 가져오기




먼저 DTO를 생성한다.

public class TestDTO {

	private Integer id;
	private String password;
	
	
	public TestDTO() {
		super();
	}
	public TestDTO(Integer id, String password) {
		super();
		this.id = id;
		this.password = password;
	}
	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;
	}
	
}
다음 컨트롤러를 하나 생성해준다.
@RestController
@RequestMapping(value = "/jsontest")
public class TestClass {
	
	@GetMapping()
	public TestDTO test() {
		TestDTO test = new TestDTO(1, "1111");
		return test;
	}
	
	@GetMapping("/2")
	public List test2() {
		List test = new ArrayList();
		test.add(0, new TestDTO(1, "1111"));
		test.add(1, new TestDTO(2, "2222"));
		test.add(2, new TestDTO(3, "3333"));
		return test;
	}
}


그리고 실행하게 되면


1. test() 실행화면


2. test2() 실행화면

이렇게 Json 형태로 출력된다

참고로 Map은 Json형태로 출력되지 않고 {"id" = 1, "password"="1111"} 형식으로 출력된다. List만 Json형식으로 출력된다.

또한, 이렇게 클래스로 만든 JsonObject는 Return할 때만 Json으로 출력되지, log또는 print할 경우엔 Json형식으로 출력되지 않는다.

Json형식으로 출력되게 하려면 다음에 할 2편을 참고.


기초는 마무리.


+ Recent posts