port forwarding(포트포워딩)
2018-11-18 00:00:00 +0000포트포워딩
- 외부에서 공유기로 ip가 할당된 서버에 접속할 수 있도록 접속port번호로 서버 ip, port번호를 매칭시키는 것
 - 공유기를 통해 ip를 할당받으면 서버의 외부ip, 내부ip가 다르다
 - 서버가 여러대라면 접속요청을 받아도 어느 서버에 요청한 것인지 알 수 없다
 - 포트번호로 접속할 서버 ip와 port 번호를 지정해주는 것이 포트포워딩이다.
 
포트포워딩 방법
- cmd 창을 켜서 ipconfig 명령어를 친다. 기본 게이트 웨이 ip를 인터넷창에 친다
 - 공유기 설정창이 뜨면 로그인한다 (asus)
 - WAN-가상 서버/포트 포워딩 메뉴 클릭
 - 유명한 서버 리스트 http를 선택
 - sourcetarget은 허용 ip(없으면 모든 ip 허용)
 - 포트 범위는 외부컴퓨터가 접속 요청한 포트
 - 로컬 ip는 내 컴퓨터의 내부ip를 적는다
 - 로컬 포트는 내부 포트 번호(나는 포트범위와 똑같이 적었다)
 - 프로토콜은 웹이지만 tcp
 - bitnami로 올린 아파치 server로 외부에서 접속이 잘 되는 것을 확인
 
서비스 이름 : HTTP Server
sourcetarget : 비워둠
포트 범위 : 80
로컬 ip : 192.168.1.11
내부 포트 번호 : 80
프로토콜 : TCP
kakao chatbot(카카오 챗봇)
2018-11-18 00:00:00 +0000Node.js란?
- V8 Engine 사용(구글에서 개발)
 - 이벤트가 발생했을 때 동작하는 방식(자원 소모x)
 - non-blocking
 - 싱글 스레드
 
설치
- https://nodejs.org/ko/
 - 명령 프롬프트 창을 열고 node -v 명령어를 친다. 버전이 잘 나온다면 성공
 
nodejs 초기화
- 새로운 폴더를 만들고 명령 프롬프트로 새로운 폴더로 이동
 - npm init 명령어
 - 이름, 설명, 버전 등의 정보를 작성한다 ( 전부 작성했다면 폴더에 package.json 파일이 생성되어 있다 )
 - 폴더 안에 app.js 파일을 생성하고 console.log(‘hello world’); 라고 작성한다
 - 명령프롬프트 창에서 node app.js 를 치면 hello world가 나오는지 확인한다
 
카카오 플러스친구 관리자 가입
- https://business.kakao.com/ 접속
 - 상단메뉴에서 카카오 플러스친구 를 선택해서 관리자 가입을 합니다
 - 새 플러스 친구를 선택해서 플러스 친구를 만듭니다
 - 관리자센터-관리-상세설정에서 공개설정을 합니다
 - 관리자센터-스마트채팅- 채팅유형을 선택합니다. API형 선택
 - Method : GET
 - URL : http(s)://your_server_url/keyboard
 - Content-Type : application/json; charset=utf-8
 - API Document 확인 API SPEC 메뉴를 클릭해서 API 사용 예시를 확인한다
 
{
  "type" : "buttons",
  "buttons" : ["선택 1", "선택 2", "선택 3"]
}
curl -XPOST 'https://:your_server_url/message' -d '{
  "user_key": "encryptedUserKey",
  "type": "text",
  "content": "차량번호등록"
}
nodejs api 작업
- 명령프롬프트 창에 npm install express –save 명령어를 친다. express 프레임워크를 설치한다
 - 서버 소스를 작성한다. 그리고 서버를 띄운다(명령어 node app.js)
 - localhost:포트번호/keyboard 으로 접속한다
 - 결과가 뜨는것을 확인할 수 있다
 
공인 ip 설정
- 포트포워딩 글을 참고한다( https://parkwonhui.github.io/server/2018/11/18/server-port-forwarding.html )
 
패킷 전달을 위한 모듈설치
- npm install body-arser –save
 
패킷 전달 코드 추가
- 아래 소스코드를 작성하고 http://외부 ip:포트번호/keyboard 로 접속되는지 확인한다
 - 접속 완료 시 API형-앱 url에 http://외부 ip:포트번호를 적는다 (keyboard는 안적어도 된다)
 - 응답이 잘 되면 성공한 것이고, 응답이 안되면 포트포워딩이나, url을 다시 확인한다
 
생각할 점
- 내 컴퓨터에선 80번 포트밖에 되지 않았다.
 - port open 체크 사이트에서도 open 된 상황이었음( https://www.yougetsignal.com/tools/open-ports/ )
 
소스코드
var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.get('/keyboard', function(req, res){
  console.log('get');
var data = {
    'type' : 'buttons',
    'buttons' : ['월','화','수','목','금']
  };
  res.json(data);
});
http.createServer(app).listen(80, function(){
  console.log('server start');
});
app.post('/message', function(req, res){
    var msg = req.body.content;
    console.log('전달받은 메시지:'+msg);
    
    var send = {};        // 응답할 데이터
    switch(msg){
        case '월':
        send = {
        'message':{
            'text': '햅쌀밥\n대파육계장\n파파야함박스테이크\n닭볶음탕\n철판두부구이\n메츄리알어묵볶음\n쟁반막국수'
        }
        }
        break;
        case '화':
                send = {
        'message':{
            'text':'햅쌀밥,참치김치찌개\n돼지고기주물럭\n생선까스/소스\n옛날짜장면\n비엔나피망볶음\n쪽파무생채'
        }    
        }    
        break;
        case '수':
                    send = {
        'message':{
            'text':'햄쌀밥\n스끼야끼\n수제닭강정\n파기름오징어두루치기\n한식잡채\n에그샌드위치\n숙주미나리나물\n포기김치'
        }    
        }    
    
        break;
        case '목':
                            send = {
        'message':{
            'text':'햄쌀밥\n팽이된장찌개\n등심돈까스\n매콤등뼈찜\n고구마카레\n군만두\n시금치무침'
        }    
        }    
        break;
        case '금':
                            send = {
        'message':{
            'text':'김치볶음밥\n모듬어묵탕\n수제케이준치킨\n제육간장불고기\n미트볼케첩조림\n조미구이김\n열무나물'
        }    
        }    
        break;
        
        default:
                            send = {
        'message':{
            'text':'알 수 없는 명령'
        }    
        }    
        break;
    }
    res.json(send);
});
java io
2018-11-15 00:00:00 +0000스트림이란?
- 일차원적인 데이터의 흐름
 - 외부의 데이터를 읽고 쓰려는 것
 
흐름의 방향에 따른 분류
- 입력 스트림(input stream), input은 io에 있다
 - 출력 스트림(output stream)
 
데이터 형태에 따른 분류
- 문자 스트림(character stream), Reader/Writer
 - 바이트 스트림(byte stream), input/output
 
FileReader 클래스
- 텍스트 파일을 읽는 클래스
 - 더 이상 읽을 것이 없으면 -1을 리턴한다
 - io는 무조건 예외 처리 해야한다
 
import java.io.FileReader;
public class FileReaderExam {
     public static void main(String[] args){
           FileReader reader = null;
           char arr[] = new char[30];
           
           try{
                reader = new FileReader("poam.txt");
                while(true){
                      int data = reader.read(arr);
                      if(-1 >= data)
                           break;
                      System.out.println(arr);
                }
/*              while(true){
                      int data = reader.read(); // 하나씩 옮기므로  비효율적이다
                      if(-1 == data){
                           break;
                      }
                      
                      char ch = (char)data;
                      System.out.print(ch);
                }
*/              
           }catch(Exception e){
                e.printStackTrace();
           }finally{
                // close도 예외 발생할 수 있음
                try{
                      reader.close();
                      
                }catch(Exception e2){}
           }
     }
FileWriter 클래스
- 텍스트를 파일에 쓰는 클래스
 - 파일이 없어도 알아서 만들어준다
 
import java.io.FileWriter;
import java.util.Scanner;
public class FileWriteExam {
     
     public static void main(String[] args) {
           FileWriter writer = null;
           Scanner sc = new Scanner(System.in);
           System.out.println("입력:");
           String str = "";
           String poem = "";
           
           while(!(str = sc.nextLine()).equals("q")){
                poem+=str;
                poem+="\n";
           }
           
           try{
                writer = new FileWriter("poem2.txt");
                writer.write(poem);
                
           }catch(Exception e){
                e.printStackTrace();
           }finally{
                try{
                      writer.close();
                }catch(Exception e2){}
           }
     }
}
파일 Copy
import java.io.FileReader;
import java.io.FileWriter;
public class FileCopy {
     public static void main(String[] args) {
           FileReader      fileRead = null;
           FileWriter      fileWrite = null;
           String text = new String();
           
           try{
                fileRead = new FileReader("poam.txt");
                while(true){
                      int value = fileRead.read();
                      if(-1 ==value)
                           break;
                      
                      text+=(char)value;
                }
                
                // 쓰기
                fileWrite = new FileWriter("poam_copy.txt");
                fileWrite.write(text);
                
           }catch(Exception e){             
                System.out.println(e.getMessage());
           }finally {
                try{
                      fileRead.close();
                      fileWrite.close();
                }catch (Exception e) {
                      System.out.println(e.getMessage());
                }
           }
     }
객체를 Bytes로 변환
- nodestream : 제일 앞에 있는 스트림
 - filterstream : 연결되어있는 스트림
 - 객체를 데이터로 써서 txt파일로 저장하면 데이터를 재사용할 수 있다
 - Seiralizable 한 class라면 직렬화 가능(오버라이딩 x)
 - 클래스의 멤버객체들도 Seiralizeable 되어있어야 직렬화 가능
 - ArrayList는 기본적으로 직렬화 가능하지만, 그 안의 객체도 Seiralizedable되어 있어야 가능하다
 - transient키워드를 쓰면 데이터가 null로 넘어간다(숨기고 싶은 필드에 사용)
 
Byte Stream class
- FileInputStream : 디렉토리에 있는 파일의 내용을 직렬화 한다
 - ObjectInputStream : 직렬화한 정보를 객체 타입으로 변환한다
 - FileOutputStream : 파일에 바이트 내용을 입력한다(역직렬화)
 - ObjectOutputStream : 파일이나 객체 정보를 바이트로 변환한다
 
SerialExam.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerialExam {
    Member m;
    
    public void read(){        //파일에 있는 Member객체 역직렬화
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.ser"));
            m = (Member)ois.readObject(); // 파일에 직렬화 완성
        } catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                ois.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    
    public void write(){    //Member객체를 생성 파일에 직렬화
        m = new Member("가가가", 20);
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("object.ser"));
            oos.writeObject(m);
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            try{
                oos.close();
            }catch(Exception e2){
                
            }
        }
        
    }
    
    public static void main(String[] args) {        
        SerialExam se = new SerialExam();
        se.write();
        se.m = null;
        se.read();
        
        System.out.println(se.m);
    }
}
Meber.java
package kosta.io;
import java.io.Serializable;
public class Member implements Serializable {
     private String name;
     private int age;
     public Member(String name, int age) {
           super();
           this.name = name;
           this.age = age;
     }
     public String getName() {
           return name;
     }
     @Override
     public String toString() {
           return "Member [name=" + name + ", age=" + age + "]";
     }
     public void setName(String name) {
           this.name = name;
     }
     public int getAge() {
           return age;
     }
     public void setAge(int age) {
           this.age = age;
     }
}
sort comparable, comparator
2018-11-15 00:00:00 +0000Comparable
- 처음 생성 시 정렬 조건을 정함
 - CompareTo 함수를 오버라이딩 해서 정렬기준을 재정의한다
 - -1 : 비교대상의 값이 작다
 - 1 : 비교대상의 값이 크다
 - 0 : 같다
 
SortExam.java
public class SortExam {
     public static void main(String[] args) {
           Random r = new Random();
           TreeSet<Integer> set = new TreeSet<>(new Desending());
           
           for(int i = 0; set.size() < 6;++i){
                int num = r.nextInt(49)+1;
                set.add(num);
           }
           
           System.out.println(set);
     }
}
Desending.java
importjava.util.Comparator;
public class Desending implements Comparator<Integer> {
     @Override
     public int compare(Integer o1, Integer o2){
           // 내림차순 대한 정렬기준 정의
           if(o1 < o2)
                return 1;
           else if(o1 > o2)
                return -1;
                      
           return 0;
     }
}
Comparator
- 현재 정렬조건과 다른 정렬조건을 설정할 때 사용
 - compare 함수를 오버라이딩해서 정렬 기준을 재정의 한다
 
mport java.util.ArrayList;
import java.util.Collections;
importjava.util.Comparator;
import java.util.List;
public class SortExam2 {
     
     public static void main(String[] args) {
           List<Person> list = new ArrayList<>();
           
           list.add(new Person("홍자바", 50));
           list.add(new Person("정자바", 80));
           list.add(new Person("한자바", 40));
           list.add(new Person("서자바", 100));
           list.add(new Person("김자바", 20));
           
           Collections.sort(list, new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                      // 이름을 기준으로 오름차순
                      if(o1.getName().compareTo(o2.getName()) >  0)
                           return 1;
                      else  if(o1.getName().compareTo(o2.getName()) < 0)
                           return -1;
                      return 0;
                }
                
                
           });        
           System.out.println(list);
           
     }
}
Unresolved compilation problem
2018-11-14 00:00:00 +0000Unresolved compilation problem 에러
에러
Exception in thread "main" java.lang.Error: Unresolved  compilation problem:
     at fileread.Main.main(Main.java:14)
상황
어떤 소스코드를 내 프로젝트에 포함시키고 나서 빌드하니 에러가 났다
해결
소스코드에 현재 package를 추가하지 않아서 난 에러였다
소스코드에 package 키워드로 패키지를 포함하니 해결되었다
Posts
- 
        
Interceptor(인터셉터)
 - 
        
Android Studio Install
 - 
        
계층형 게시판
 - 
        
VirtualBox Ubuntu 18.04.2 LTS
 - 
        
TransactionAwareDataSourceProxy Error
 - 
        
Java Coding Conventions
 - 
        
Java Long과 long의 차이
 - 
        
Mybatis 객체 안에 객체 매핑
 - 
        
JavaConfig mariadb 연결
 - 
        
DataTable
 - 
        
관리자 페이지
 - 
        
MappingJackson2JsonView
 - 
        
Spring Javaconfig
 - 
        
게시판 만들기-제품 등록
 - 
        
게시판 만들기-제품 페이지 제작
 - 
        
게시판 만들기-회원탈퇴 및 게시판 삭제 플래그 추가
 - 
        
footer 하단에 고정시키기
 - 
        
bootstrap4 사용법
 - 
        
Spring 데이터 검증 @Valid, BindingResult
 - 
        
brackets 실시간 미리보기
 - 
        
Spring 기본설정(pom.xml, web.xml, encoding)
 - 
        
Vue.js computed, methods, watch
 - 
        
javascript onkeyup
 - 
        
Maria DB Incorrect string value Error
 - 
        
javascript 암호화(md5, base64)
 - 
        
Vue.js template
 - 
        
Vue.js 소개
 - 
        
Nexacro 설명
 - 
        
ControllerAdvice
 - 
        
Batch
 - 
        
html 페이지 로딩 순서
 - 
        
소수구하기(PrimeNumber)
 - 
        
최소공배수,최대공약수
 - 
        
Stream
 - 
        
Lambda(람다식)
 - 
        
inner class(내부 클래스)
 - 
        
final 키워드
 - 
        
file upload
 - 
        
파이썬 빅 데이터 K-평균(K-means)
 - 
        
아나콘다(Anaconda), 주피터 개발환경 세팅
 - 
        
텐서플로우(TensorFlow) 아키텍쳐 및 Session
 - 
        
텐서플로우(TensorFlow)상수, 변수, 함수
 - 
        
머신러닝 기초
 - 
        
한글 리스트 오름차순, 내림차순
 - 
        
연속된 글자의 갯수 출력
 - 
        
java spring5 프로젝트 설정
 - 
        
restController
 - 
        
spring 세팅 및 기본설정
 - 
        
mybatis trim
 - 
        
jquery datepicker
 - 
        
ajax로 데이터 전달/응답 받는법
 - 
        
mybatis error
 - 
        
mybatis 게시판 만들기 순서
 - 
        
Java Jsp Mybatis Dynamic Query
 - 
        
mybatis
 - 
        
git 소개
 - 
        
node.js 개발환경 구축
 - 
        
node.js 기본 내장 모듈
 - 
        
node.js의 전역 객체
 - 
        
node.js http module
 - 
        
node.js event
 - 
        
jdbc
 - 
        
자바빈
 - 
        
jsp, servlet 정리
 - 
        
java null object pattern
 - 
        
다음지도 key 등록(kakao map)
 - 
        
공공 데이터 open api
 - 
        
facebook login api
 - 
        
sourcetree 사용법
 - 
        
JavaScript event3
 - 
        
JavaScript jquery
 - 
        
JavaScript dom
 - 
        
JavaScript ajax
 - 
        
JavaScript 이벤트2
 - 
        
JavaScript 캡슐화
 - 
        
JavaScript Array,내장객체
 - 
        
JavaScript var
 - 
        
JavaScript 객체,생성자
 - 
        
JavaScript 함수,클로저
 - 
        
JavaScript Event
 - 
        
javascript eclipse 자동완성(with tern)
 - 
        
CSS position
 - 
        
HTML5,CSS 선택자
 - 
        
자바 시간 측정
 - 
        
git,eclipse 연동
 - 
        
HTML 기초 정리
 - 
        
Eclipse Web 환경세팅
 - 
        
피보나치의 수
 - 
        
Oracle 반복문,커서,예외,저장 서브프로그램
 - 
        
Oracle PL/SQL
 - 
        
Oracle 다중쿼리(Multiple row query)
 - 
        
Oracle 인덱스, 뷰, 시퀀스, 트랜잭션, 세션 정리
 - 
        
Oracle JOIN 정리
 - 
        
Oracle DDL, DML 정리
 - 
        
Oracle 문자열 함수 정리
 - 
        
Oracle 숫자,날짜,자료형 변환 함수 정리
 - 
        
Oracle 제약조건 정리
 - 
        
Oracle 기초 쿼리 정리
 - 
        
문제2775
 - 
        
DFS
 - 
        
junit
 - 
        
json
 - 
        
algorithmus basic
 - 
        
circular queue(원형큐)
 - 
        
binary search(이진탐색)
 - 
        
port forwarding(포트포워딩)
 - 
        
kakao chatbot(카카오 챗봇)
 - 
        
java io
 - 
        
sort comparable, comparator
 - 
        
Unresolved compilation problem
 - 
        
ArrayList, HashMap
 - 
        
Regular(정규표현식)
 - 
        
Enum Class
 - 
        
String Function
 - 
        
refactoring 이란(상수,제어플래그,assert)
 - 
        
reference,abstract 정리
 - 
        
FileNotFoundException Solve
 - 
        
static
 - 
        
Thread Synchronization(스레드동기화,원자성)
 - 
        
Java Exception(예외처리)
 - 
        
Java 생성자, this, super
 - 
        
roomnum
 - 
        
BeeHouse
 - 
        
Git Reset, Revert
 - 
        
Git Log
 - 
        
Array
 - 
        
stack
 - 
        
pyramid draw
 - 
        
Star Draw(별 그리기4)
 - 
        
Star Draw(별 그리기3)
 - 
        
Star Draw(별 그리기2)
 - 
        
Star Draw(별 그리기1)
 - 
        
Loop(While, For)
 - 
        
자바 데이터 타입, 데이터 연산
 - 
        
시계방향 달팽이 그리기
 - 
        
정수값의 짝수,홀수 갯수 구하기
 - 
        
java, Scanner 정리
 - 
        
draw dog
 
subscribe via RSS