[URLConnection]
URLConnection은 추상 클래스로 네트워크에 대한 연결을 나타내는 자바의 기본 클래스이다. URLConnection은 http, https, ftp 등의 프로토콜을 지원한다. 기본적으로 URL 객체를 생성하고 해당 URL에 대한 openConnection() 메서드를 호출하면 해당 URL 과의 연결에 대한 URLConnection 객체를 얻을 수 있다. URLConnection을 사용하여 데이터를 읽거나 쓸 수 있고 웹페이지의 내용을 가져오는데 사용될 수 도 있다.
근데 조금 더 구체적인 웹 요청을 하기 위해서는 HttpURLConnection을 같이 사용하는게 더 적합하다.
[HTTPURLConnection]
HttpURLConnection 은 URLConnection의 하위 클래스로 HTTP 프로토콜을 사용하는 네트워크 연결을 다루는데 특화되어 있다. 즉, 웹 서버와의 HTTP 통신을 위해 사용된다고 보면 된다. HTTPURLConnection 은 GET, POST, PUT, DELETE 등의 HTTP 메서드를 사용하여 서버에 요청을 보내고 서버로부터 응답을 받아올 수 있다. 그리고 HTTP 요청 메서드, 요청 헤더, 요청 본문 등을 설정할 수 있으며, 서버로부터 받은 응답코드, 헤더 및 본문 역시 확인할 수 있다.
아래 접은 글은 내가 API를 사용하기 위해 해당 사이트에 토큰 값을 얻기 위해 작성 했던 예시이다.
[예시]
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("content-Type", "application/json");
conn.setRequestProperty("Accept", "application/json");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
JSONObject requestData = new JSONObject();
requestData.put("imp_key", impKey);
requestData.put("imp_secret", impSecret);
bw.write(requestData.toString());
bw.flush();
bw.close();
int resposeCode = conn.getResponseCode();
System.out.println("응답코드 =============" + resposeCode);
한 줄씩 살펴보면 아래와 같다.
1. URL url = new URL(strURL) : strUrl에 HTTP 연결을 수행할 대상 서버 주소를 입력한 후 URL 객체를 생성한다.
2. HttpURLConnection conn = (HttpURLConnection) url.openConnection() : 생성한 URL 객체를 사용하여 원격 서버와의 연결을 설정하고 이에 대한 HttpURLConnection 객체를 생성한다.
3. conn.setRequestMethod("POST") : HTTP 요청의 메서드를 POST로 설정한다.
4. conn.setDoOutput(true) : 출력스트림을 사용하여 POST 데이터를 서버로 전송할 것이라고 설정한다.
setDoOutput(true)는 HTTP 요청에 대해 출력 스트림을 사용하도록 설정하는 부분이다. HTTP 요청에 데이터를 담아 서버로 전송하는 경우(PUT, POST) 에만 필요한 설정으로 GET 요청과 같이 단순히 데이터를 받아오는 경우에는 설정할 필요가 없다.
5. conn.setRequestProperty("content-Type", "application/json") : HTTP 요청 헤더에 content-Type을 application/json으로 설정한다. 전송할 데이터가 JSON 형식임을 서버에 알려준다.
setRequestProperty 메서드는 HTTP 요청의 헤더에 속성(프로퍼티)를 설정하는 역할을 한다. HTTP 헤더는 클라이언트가 서버에게 요청을 보낼 때 요청의 부가 정보를 전달하는 데 사용되는 메타데이터이다. 이 헤더에는 다양한 정보를 담을 수 있으며, setRequestProperty를 사용하여 원하는 헤더를 설정할 수 있다. 일반적으로 setRequestProperty 메서드의 주요 요청 헤더로는 Content-Type, Accept, User-Agent, Authorization 등이 있다.
6. conn.setRequestProperty("Accept", "application/json") : HTTP 요청 헤더에 Accept를 application/json으로 설정한다. 이는 서버로부터 JSON 형식의 응답을 원한다는 것을 나타낸다.
7. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())) :
OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
두줄로 바꿔서 보면 위와 같다.
- OutputStreamWriter는 바이트 기반의 OutputStream을 문자 기반의 Writer로 변환해주는 클래스이다. OutputStream을 Writer로 감싸고 문자를 출력할 수 있도록 도와준다. 즉, 해당 코드는 conn의 데이터를 서버로 전송하기 위해 출력 스트림(getOutputStream()) 을이용했지만 바이트로 전송하게 되면 문자 데이터를 처리하기에 어렵다. 그래서 문자 기반의 스트림을 사용을 권장하며 그 기능을 OutputStreamWriter가 수행한다.
- BufferedWriter은 버퍼링된 문자 출력 스트림을 제공하는 클래스이며 이를 이용하여 문자 데이터를 버퍼링 하며 서버로 전송한다.
8. JSONObject requestData = new JSONObject() : JSONObject를 사용하여 JSON 형식의 데이터 객체를 생성한다.
9. requestData.put("imp_key", impKey); 생성한 JSON 객체에 "imp_key"라는 키와 impKey 변수의 값을 추가한다.
10. bw.write(requestData.toString()) : requestData 객체를 문자열로 변환하여 BufferedWriter를 통해 서버로 전송한다.
11. bw.flush() : 출력 버퍼를 비워서 데이터를 서버로 보낸다.
12. bw.close() : 출력 스트림을 닫는다.
13. int responseCode = conn.getResponseCode() : 서버로부터 받은 응답의 HTTP 응답 코드를 가져와 해당 응답을 int 변수에 담는다. 이는 정상적으로 요청이 처리되었는지 어떤 종류의 응답인지 알려주는 역할을 한다.
'JAVA' 카테고리의 다른 글
[Java] LocalDate, LocalTime, ChronoUnit 을 이용한 시간 표현 (0) | 2023.08.06 |
---|---|
[JAVA] 자바 HTTPURLConnection의 응답을 JSON 데이터로 파싱 하기 (0) | 2023.07.30 |
[JAVA] 입출력을 사용하여 입력 값을 받는 메모장 프로그램 만들기 (1) | 2023.03.13 |
[JAVA] 입출력 스트림 ⑤ 파일 복사 (0) | 2023.03.13 |
[JAVA] 입출력 스트림 ⑥ 파일 제어 및 디렉토리 (0) | 2023.03.13 |