공부/Spring 복습

날씨 데이터를 가져와 날씨 정보 띄우기 1.

ChoiDooSic 2021. 10. 16. 23:50

프로젝트중 날씨 api를 사용하게되어 그 사용한 코드에 대한 간략한 정리와

필요한 라이브러리를 정리하여본다.

사진에는 주석이 코드 위에 달려있어 설명이 보기 편하나

주석의 색이 어두워 안보일수 있음으로 밑에 글로도 달아둔다.

글쓴이도 아직 공부를 다 마친것은 아니나 최소한의 정보를 정리해두기 위해서

글을 작성한다.

 

[getStringFromURL()] 메서드는 원하는 데이터값(요청형식, 발표일자 등...)을
지닌 URL값으로 기상청 API를 호출하여 원하는 정보를 JSON 형식으로 값을 받아온다.

1. URL객체를 생성해준다. 매개변수 url에는 경로와 GET식이기에 보내야 할 값들이 들어있다.

2. 받아온 json형식의 데이터를 Buffer을 이용하여 받아준다.

 

#HttpURLConnection 에 대한 간략한 설명

HttpURLConnection 실제 외부와 connection을 하는 클래스.
JAVA 소스 내에서 SSL 적용된 사이트에 접근하기 위해, REST Api를 호출하기 위해 사용하게 되며, 
결과 데이터를 스트림 형식으로 제공받아 이용이 가능하다. 
  데이터의 타입이나 길이는 거의 제한이 없으며, 주로 미리 길이를 알지 못하는 스트리밍 데이터를 주고 받는데 사용된다.

리소스에 연결하기 전에 구성되어야 하고, 인스턴스는 재사용이 불가능하다. 각 리소스에 대한 커넥션 마다 다른 인스턴스 사용해야함.
protected로 선언되어있기 때문에 기본적으로는 개발자가 직접 HttpURLConnection 객체를 생성할 수 없다.
하지만 http URL을 사용하는 URL객체의 openConnection() 메서드가 리턴하는 URLConnection객체는
HttpURLConnection의 인스턴스가 될 수 있기 때문에 리턴된 URLConnection을 (HttpURLConnection) apiURL.openConnection();
이런 방식으로 사용해줄수 있다.

 

# setConnectTimeout(), setReadTimeout()에 대한 간략한 설명.

setConnectTimeout(), setReadTimeout() 이 사용되는 이유.
  반복적으로 API URL을 호출하는 경우 특정 차례에 요청 후 응답을 받지 못한다면 무한 대기상태(교착상태)가
  시작되며 다음 순서의 API URL 호출은 시작하지 못하게된다고 한다. 여기서 배치 시 사용할 수 있는
  스레드 풀 개수를 설정해 놓은 상태라면 모든 스레드가 사용중인 상태가되는 경우 해당 인스턴스는 모든 작업을 진행하지
  못하고 멈추게되고 LOG상에서도 URL호출시 발생하는 무한 대기 상태에는 어떠한 Exception로그도 찾아볼수 없다고한다.
  그래서 setConnectTimeOut(), setReadTimeOut() 을 설정하여 미리 선언한 시간만큼 대기하고
  응답이 없다면 EXCEPTION을 반환하여 작업을 마치게하는것이다. 이때 발생하는 exception은
  SoketTimeoutException 이라고한다.
 

#setDoOutput() 에 대한 간략한 설명
  setDoOutput() 메소드는 boolean 타입의 dooutput 파라미터를 받아 doOutput멤버 변수에 저장합니다. 
  doOutput 변수가 true이면 OutputStream으로 데이터를 전송한다는 뜻이고, false이면 하지 않는다는 뜻인데, 
  기본으로 false로 초기화되어있기 때문에 POST로 데이터를 전송하려면 꼭 옵션을 설정해줘야 합니다.

 

3. connect() 메서드를 호출하여, 네트워크 상의 다른 곳에 있는 곳과 연결을 만들어준다.

 

4. 읽어들인 데이터들을 한줄 단위로 읽어들여
result 객체에 담아준다

 

5. finally는 try, catch 문이 끝날때에 무조건 실행되는부분인데
값을 받아왔으니 모든 연결된 자원들을 끊어준다.(메모리 누수 방지)

 

[getWeather()]는 api를 이용하여 요청한 데이터값들을
 json형태로 받아와 jsp로 보내주는 역할을하는 컨트롤러이다.
메서드로 분리하여 작업하고 컨트롤러 안에는 값만 보내줄 예정이다(코드가 지저분함)

 

1. GET방식으로 JSON 형식의 자료를 요청할 서버의 주소와 가져올 값들을 구성하여준다.

 

2. getStringFromURL() 메서드를 이용해 json형식으로 받아온 값을 resultMap에 담아준다.
주의할점 HashMap등... 자바의 오브젝트 타입으로 받을시에는 JSON형식으로 받은 파일안의
 ""가 모두 사라지고 기호 (:)이 모두 (=)으로 변경됨으로 주의하자.

 

3. resultMap의 값을받은 JSONObject의 객체를 생성하여
오브젝트 안의 값들을 순서대로 꺼내어준다.

 

4. JSONArray를 이용하여 item의 값들은 배열형태로 받아주어
parse_item은 배열형태이기 때문에 하나씩 데이터를 하나씩 가져와 사용하기위해
for문을 이용하여 배열의 길이만큼 반복문을 돌려주며 JSONObject 타입의 weather을
선언하여 반복문안에서 값을 받고 weather에 키값을 주어 원하는 데이터값을 Object타입의
변수에 받아주면 원하는 값들을 분리해 낼 수 있다.

 

여기까지는 sysout을 이용해 서버에서 받아온 값을 console에 출력한 코드이다.

다음에 진행할 작업은 값을 받아오는 코드부분을 따로 메서드화 하여 필요한 값만 리턴하여주고

컨트롤러를 단순화 시키는 작업과 받아온 값들을 jsp파일로 넘겨 알맞는 이모티콘을 띄워

현재 날씨와 시간을 알려주는 것까지만 해볼 예정이다.