HAYOUNG'S MEMO

웹을 기반으로 정보를 주고 받은 웹-투-웹 프로그래밍 본문

(프로젝트1)레드마인 지연일감 알림챗봇(MattermostAPI)

웹을 기반으로 정보를 주고 받은 웹-투-웹 프로그래밍

HAyOunG0518 2019. 11. 29. 13:45

URLURLConnection을 이용한 , 웹을 기반으로 한 데이터 전송

: 기존의 여러 방법보다 간단하고 보안의 경우도 HTTPS 프로토콜을 사용하여 비교적 간단하게 해결할 수 있음.

: 더군다나 자바의 경우는 java.net.URLConnection 클래스를 통해서 소켓 프로그래밍을 직접 할 필요 없이 매우 간단하게 웹 페이지를 호출할 수 있다.

 

1. java.net.URLjava.net.URLConnection 클래스

 

URLConnection 클래스는 실제로 추상클래스로서 URLConnection 타입을 갖는 인스턴스는 java.net.URL클래스의 openConnection() 메소드를 통해서 구할 수 있다.

 

Java.net.URL 클래스URL을 나타낼때 사용되며, 프로토콜, 포트번호, 호스트 이름, 자원의 경로 등의 정보를 포함하고있다.

FTP, HTTP 프로토콜을 포함해 대부분의 URL을 표현할 수 있도록 해준다.

 

예를들어 특정 url인스턴스를 생성하고자 할 경우 아래와같이 하면된다.

이렇게 url 인스턴스를 생성하게되면 openConnection()메소드를 사용하여 해당하는 url에 대해 연결된 클래스인 URLConnection을 얻을 수 있게 된다.

URL url = new URL(“http://www.javacan.com/index.html”);
URLConnection conn= url.openConnection();

 

또한 URLConnection 인스턴스를 구하게되면 URLConnection.getInputStream() 메소드를 사용하여 원격 자원으로부터 데이터를 읽어올 수 있게 된다.

 

 

 

 

 

GetInputStream() 메소드로부터 얻어진 inputStream으로부터 직접 데이터를 읽어오기 보다는 Reader을 거쳐서 데이터를 읽어온다는 점!

 

 

 

 

 

 

 

이는 InputStream을 이용할 경우 바이트 단위로 데이터를 읽어오기 때문에 한글과 같이 아스키 코드 이외의 글자들이 깨지기 때문임

 

 

 


2.

서버에 데이터 전송하기

HTTP 프로토콜은 GET방식과 POST 방식을 사용해 데이터를 전송할 수 있도록 하고 있다.

 

- GET 방식 : url을 통해 서버에 전달됨

- POST 방식 : 스트림을 통해 서버에 전달된다.

 

전통적인 CGI의 경우 GET 방식의 데이터는 환경 변수를 통해서, POST 방식으로 전달된 데이터는 입력 스트림을 통해서 구할 수 있었으나 자바의 서블릿이나 JSP에서는 이런 하위 레벨은 알 필요 없이 단순히 HttpServletRequestgetParameter() 메소드를 사용하여 매우 간단하게 클라이언트가 전송한 데이터를 읽어올 수 있다.

이처럼 GET방식과 POST 방식 사이의 차이점 때문에 서버에 데이터를 전송하는 클래스 역시 이 차이점에 맞춰 각각의 방식을 알맞게 구현해주어야한다.

 

2.1) GET방식으로 데이터 전송하기

먼저 GET 방식으로 데이터를 전송하는 것에 대해서 살펴보자. GET 방식은 앞에서도 언급했듯이 다음과 같이 요청 URL과 함께 전송된다.

http://somhost.com/jsp/write.jsp?name=...&email=...&....

여기서 물음표 다음에 있는 부분은 서버에 전송될 파라미터의 이름과 데이터를 나타낸다. 각각의 파라미터는 앰퍼샌드 기호(&)를 통해서 분리되며, 각 파라미터의 값은 인코딩된 상태이어야 한다. 파라미터 값의 인코딩은 java.net.URLEncoder 클래스의 static 메소드인 encode() 메소드를 통해서 처리할 수 있다. 예를 들어, 파라미터의 값이 '최범균' 일 경우 이를 인코딩하면 다음과 같은 문장으로 파라미터 값이 변경된다.
  %C3%D6%B9%FC%B1%D5

이처럼 인코딩된 데이터를 GET 방식을 사용하여 파라미터 값으로 전달하고자 할 경우 단순히 URL 뒤에 인코딩된 파라미터 값을 알맞게 추가하기만 하면 된다. 예를 들어, 다음은 간단히 파라미터 값을 인코딩한 형태로 변환해주는 메소드이다.

위 코드에 있는 encodeString() 메소드를 보면 java.util.Properties를 파라미터로 전달받는다. java.util.Properties 클래스는 <이름, > 쌍을 저장할 수 있는 클래스로서 위 메소드는 파라미터의 이름과 값을 저장하고 있다. 위 코드를 보면 파라미터의 이름과 값 모두 URLEncoder.encode() 메소드를 사용하여 알맞게 인코딩하는 것을 알 수 있다.

encodeString()
메소드를 사용하여 파라미터의 이름과 값을 알맞게 인코딩할 수 있게 되었으므로 이제 GET 방식으로 전송하는 것에 대해 살펴보자. GET 방식으로 파라미터를 전달하기 위해서는 단순히 물음표 뒤에 encodeString() 메소드의 결과값을 연결하기만 하면 된다. , 다음과 같은 형태의 코드를 사용하여 GET 방식의 파라미터를 전송할 수 있다.

URLConnection conn=targetURL.openConnection();

 

conn.setDoInput(true); // URLConnection의 입력 스트림을 사용할지의 여부

conn.setDoOutput(true); //URLConnection의 출력 스트림을 사용할지의 여부

앞에서 살펴봤던 ReadDataFromURL 클래스의 main() 메소드와 크게 다르지 않으며, 단지 Properties를 이용하여 인코딩된 문자열을 알맞게 URL에 넣어준 것 밖에 차이점이 없다. 위 코드에서 URLConnection.setUseCaches() 메소드에 파라미터 값을 false를 전달한 것을 알 수 있는데, 이렇게 함으로써 캐시에 저장된 결과가 아닌 동적으로 그 순간에 생성된 결과를 읽어올 수 있게 된다. 이처럼 캐시로부터 값을 읽어오지 않는 이유는 파라미터를 전송하는 경우 대부분 웹 페이지의 결과가 그 순간 순간 파라미터의 값에 따라 달라지기 때문이다.

2.2) POST방식으로 데이터 전송하기

스트림을 통해 파라미터를 전송해야하기때문에 URLConnection으로부터 OutputStream을 구해야한다.

 

URLConnection conn=targetURL.openConnection();


conn.setDoInput(true); // URLConnection의 입력 스트림을 사용할지의 여부
conn.setDoOutput(true); //URLConnection의 출력 스트림을 사용할지의 여부


conn.setUseCaches(false);


conn.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);
// 1인자의 프로퍼티를 2인자로 변경해줌으로써 웹 서버는 Post방식의 데이터가 인코딩된 데이터라는 것을 알 수 있게 된다.




//URLConnection에 대한 모든 설정이 끝나면 URLConnection.getOutputStream()메소드를 사용해 해당 URL에 대한 출력 스트림을 구할 수 있게되고, 그 출력 스트림에 파라미터를 인코딩한 문자열을 전송하면 된다. 아래의 코드에서는 DataOutputStream을 사용하여 데이터를 전송하였다.


out=null;
try{
          out=new DataOutputStream(conn.getOutputStream());
          out.writeBytes(encodedParamString);
          out.flush();
}finally{
          if(out != null) out.close();
}
is=conn.getInputStream();

만약 HttpURLConnection을 사용한다면