본문 바로가기
프로젝트/클론프로젝트

OPEN API / 활용한 공공데이터로 날씨 불러오기

by 임지혁코딩 2024. 1. 28.

 

가장 먼저, API의 개념을 다시 복습하자. 

 

INTERFACE란, 두개의 APPLICATION 사이에서 정보를 주고 받는, 상호작용 시의 규칙과 행위

프론트에서 REQUEST를 보내고, 백엔드에서 RESPONSE를 보내는 이러한 규칙을 의미한다. 

 

UI란, USER INTERFACE이기 때문에, 사용자가 화면과 상호작용하는 규칙과 행위를 의미한다고 볼 수 있다. 

 

RESTFUL API는 

HTTP + METHOD를 활용하여 통신하는 API를 의미한다. 

 

OPEN API란? 

이러한 API 형태와 약속을 공개하는 것을 의미한다. 

 

*헷갈렸던 개념인데, 내가 요청을 보내고 이러한 OPEN API내부에서 백엔드->DB->백엔드 다시 나에게 RESPONSE

하는 형태이지, OPEN API가 DB만을 제공하거나 이러한 의미는 아니다. 

 

 

 

OPEN API를 활용해, 날씨 정보 받아오기 

 

공공데이터 포털의 해당 OPEN API를 사용하였으며, 그 근거는 

1. 많은 사람이 사용한 OPEN API

2. *필수적으로, JSON형식의 API를 선택했다. 

 

 

예제 실행. 

현재는 이미 지정된 웹에서 API를 호출하지만, 우리는 이 호출을 JAVA를 통해서 진행하고 그에 따른 RESPONSE를 받을 것이다. 

 

HTTP 형태의 요청을 , 내 브라우저를 통해서 보내도 마찬가지의 RESPONSE를 받는다. 

 

 

XML 설정

 

1. THYMELEAF

타임리프의 기본 경로를 TEMPLATE로 설정했다.

확장자와 모드는 모두, HTML로 설정되었다. 

 

2. H2

내부 H2 DB의 아이디와 PW는 없고, 인메모리의 TESTDB를 사용한다. -> 후에 MYSQL로 변경해보겠다. 

 

3.JPA 

JPA는 실행시 스키마를 자동 UPDATE,

콘솔에 SQL 문을 띄우고, 플랫폼은 H2를 사용하겠다. 

 

++ H2는 내부적으로 존재하지만, 의존성 주입을 통하여 실행해야한다.

IMPLEMTATAION을 통해 구현했다. 

 

MSA의 구조를 위하여 

MSA의 구조로 졸업작품을 진행할 예정이기 때문에, 배포된 후에 APPLICATION.YML이 테스트 버전, 배포 버전 등 

여러가지 버전으로 가능하게끔 구현해 보겠다. 

 

application.yml. applicatoin-dev.yml을 읽겠다는 뜻이다. 

application-dev.yml. 

7070포트를 열어서 사용한다. 

 

7070이 열리고, 8080은 닫힘을 확인할 수 있다. 

 

 

 

RestController를 사용하여 json형태의 response를 반환한다.

requestparam을 사용할때, 내부적으로 어떤 value로 사용할것인지 명시를 해줘야 한다. 

get method로 header에 요청을 보냈으며, 그 값을 받아서 다시 return 하는 것으로 구현하였다. 

 

*uri는 다음과 같고, 해당 uri에서 변수를 받아서 그것을 그대로 사용할 수 있다.

현재는 get만 사용하기 때문에 이렇게 작성했지만, body가 포함되는 method라면 (post 등등)

해당 body에 대한 내용을 requestbody로 받아서 사용해야할 수도 있다. 

OPEN API 연동

 

 WEB FLUX

 이번 졸업작품에서 비동기 방식으로 진행하고자 하기 때문에, WEBFLUX를 활용해 보겠다.

 

WEBFLUX란 비동기 형식의 개발을 지원해준다. JS만을 쓴다면 바로 비동기적으로 구현이 가능하겠지만, 우리는 그런 상황이 아니기 때문에 WEBFLUX를 활용해야한다. 

 

 

 

현재 너무 많은 데이터가 전송되어 이렇게 깨지는 등 문제가 존재하지만, 이는 수정하고 

web flux의 개념을 보고자 한다. 

 

 

WebClient객체를 

1. getmethod

2. 기본 uri+apiuri로 전송 한다. 그 전송 안에는

3. key,type,sdate,stdhour가 포함되어 있다. 

4. retrieve를 통해, weatherresponse는 요청후 openapi를 통해 받은 response가 저장된다. 

5. 그 저장 형태는, 비동기적 래퍼이다. 

 

 

*MONO의 주의 점 !

MONO로 받아오는 ㅁ.class~~ 는 , 해당 객체 내용을 

TOSTRING으로 받는다!

그러므로 그 객체 내부 객체,

혹은 그 객체 모두 @DATA혹은 @TOSTRING을 통한 설정이 필수적이다. 

 

실제 response에 맞추어 변경하기

실제 reponse는, 객체 안에 list안에 정보가 들어있는 형태임으로, 이에 맞추어 변경하여 주자  .

 

toSTRING 으로 내부 DETAIL을 확인하기 때문에, TOSTRING어노테이션을 붙여준다. 

 

 

비지니스 별 분리 

 

 

Controller 단을 분할하여, 한 객체에서 2개이상의 책임이 있지 않게 했다. 

 

Service 단 또한 마찬가지, openapi를 호출하는 것을 책임을 분할하였다.

+bodytomono를, weather response가 get으로 요청이 가고 ,

그 이후 요청에 따라 open api에서 전달하는 값들을 response객체로 받아 전달한다 .

 

 

한 실수들

1. 먼저, open api의 response 구조를 보자. 

 

 

 

해당 구조랑 맞추기 위하여, response 안에, list로 details를 가지게 구현했다.

즉, open api와 내가 생성한 dto의 형태는 동일해야한다! 

 

 

2. 형태가 동일하다면, 객체에 있는 필드들은 이름이 동일하다면 자동으로 매핑된다 .

 

3. serivce단을 사용할때, private final로 사용해야하는데, 이는

final 자체의 의미 뿐만 아니라, 초기화의 의미를 가진다.

초기화를 하지 않으면 nullpointerexception이 발생한다 ! 

 

다음 post

다음 post는, mysql과 연동하여 받아온 response를 1. db에 넣고2. 요청에 따라 해당 db의 정보를 화면에 전달하는 형태로 변경하여 보겠다.