❤ 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤
gayulz - Overview
개발자가 되고싶은 개발어린이💟. gayulz has 11 repositories available. Follow their code on GitHub.
github.com
GitHub - gayulz/EMBAD_project: EMBAD , MY PROJECT
EMBAD , MY PROJECT. Contribute to gayulz/EMBAD_project development by creating an account on GitHub.
github.com
🙏 양해의 말씀
그동안 포스팅을 잠시 미뤘다.
마지막 프로젝트에 집중하고 싶었고, 이 프로젝트는 이력서에도 포트폴리오에도 첨삭되는 거라
옵시디언에 열심히 중간중간 메모 하며 포스팅만 미루었다.
지금은 최종 PPT가 완료되고, 포트폴리오 정리를 하면서 미루었던 포스팅을 다시 올려 본다
공공데이터포털이란?
정부나 공공기관이 제공하는 다양한 공공 데이터를 한 곳에서 쉽게 접근하고 활용할 수 있도록
제공되는 웹 사이트 또는 플랫폼이다
이러한 포털은 개발자, 연구원, 기업, 일반 시민 등 누구나 공공 데이터를 검색하고
다운로드하여 활용할 수 있도록 하는데 목적이 있다
회원 가입 후 원하는 데이터를 검색하고 api를 이용할 경우 신청하면 된다
신청을 하게 되면 마이페이지에서 확인할 수 있다.
인증키는 인코딩 된 키와 인코딩이 안된 키 이렇게 2가지를 제공한다
이 인증키로 🪓 엄청난 삽질과 도끼질을 할지 이때까진 몰랐다.
(인증키로 발생된 오류이슈는 추후 오류 관련 해결 정리한 것을 포스팅할 때 포함하겠다)
국민중앙의료원 전국 응급의료기관 정보 조회 서비스
필요한 데이터를 찾다가 open API가 있는 것을 확인하고 바로 활용신청을 했다
이용가이드 : https://www.data.go.kr/ugs/selectPublicDataUseGuideView.do
승인이 되기까지 오래 걸리진 않았던 것 같다.
상세 보기를 눌렀을 때 이러한 화면들을 볼 수 있는데
미리 보기에 확인을 눌렀을 때 요청에 대한 응답코드에 결과를 보여준다.
내가 신청한 api는 샘플 코드도 제공했다
이런 식으로 여러 언어에 샘플 코드를 제공해서 이때는 정말 행복했다.
POSTMAN으로 테스트했을 때 잘 되는 것도 확인했다
Spring 적용하기
데이터처리 흐름
JSP 👉 JS 👉 controller 👉 service 👉 API요청 👉 API응답 👉 파싱 👉 controller 👉 JSP
이론은 완벽했다!
적용만 하면 되는 거였다!
열심히 컨트롤러를 구현하고 , service도 진행했다
ServiceKey도 properties파일에 별도로 관리하여 좀 더 안전하게 관리되도록 했다.
공부하다가 알게 된 점
properties파일을 별도 관리 시 해당 클래스명 위에 @PropertySource어노테이션을 사용해야 하고, 해당 경로도 명시해줘야 한다는 것을 알게 됐다.
또한 @Value어노테이션을 사용해 해당 키의 값도 변수에 주입시키는 방법을 써야 한다는 것을 배웠다.
/**
* 공공데이터포털 API 1번째 항목 :: 도시명 기준 병원 명 기관ID 를 리턴함
* @param : 사용자 입력 도시이름
* @return : xml형식 파싱을 처리하도록 StringBuilder로 리턴
* */
public StringBuilder getHospitalData(HospitalReturnVO hospitalReturnVO) {
try {
// 1. URL 생성
StringBuilder urlBuilder = new StringBuilder(String.valueOf(hospitalURL));
urlBuilder.append("?" + "serviceKey=" + hospitalKEY);
urlBuilder.append("&" + URLEncoder.encode("STAGE1", "UTF-8") + "=" + URLEncoder.encode(hospitalReturnVO.getCity(), "UTF-8")); /*주소(시도)*/
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("100", "UTF-8")); /*목록 건수*/
// URL 매핑
URL url = new URL(urlBuilder.toString());
// URL 전송
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
//api응답값 - xml
BufferedReader resultData;
// 응답값 확인
if (connection.getResponseCode() >= 200 && connection.getResponseCode() <= 300) {
// 응답헤더가 정상이라면 DOM 구조로 파싱하기위해 대입
resultData = new BufferedReader(new InputStreamReader(connection.getInputStream()));
} else {
// 응답헤더가 에러라면 에러응답값 대입
resultData = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
}
// 응답으로 온 resultData를 라인별로 재조합한다
StringBuilder recombination = new StringBuilder();
String line;
while ((line = resultData.readLine()) != null) {
recombination.append(line);
}
// io 리소스 반납
resultData.close();
connection.disconnect();
return recombination;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 재조합된 데이터를 파싱을 하기 위해 DOM구조로 재구성 후 리턴
* @param : xml문서 그대로 가져옴
* @return : dom 객체로 재 조립 후 반환
* */
public Document returnDomData(StringBuilder recombination) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new InputSource(new InputStreamReader(new ByteArrayInputStream(recombination.toString().getBytes("utf-8")))));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 회원 가입 용 노드 재조립 메서드
* @param : xml에서 dom으로 조립된 객체
* @return : {@link HospitalReturnVO} 의 dutyName , hpid 을 요소 추출 후 대입하고 리턴 */
public List<HospitalReturnVO> returnSignupHospitalData(Document parsingData) {
List<HospitalReturnVO> list = new ArrayList<>();
// NODE를 기준 데이터를 추출
NodeList dutyNameNodes = parsingData.getElementsByTagName("dutyName");
NodeList hpidNodes = parsingData.getElementsByTagName("hpid");
// 원하는 List<HospitalReturnVO>구조로 재조립
for (int i = 0; i < dutyNameNodes.getLength(); i++) {
HospitalReturnVO temp = new HospitalReturnVO();
Element dutyNameElement = (Element) dutyNameNodes.item(i);
Element hpidElement = (Element) hpidNodes.item(i);
temp.setDutyName(dutyNameElement.getTextContent());
temp.setHpid(hpidElement.getTextContent());
list.add(temp);
}
return list;
}
병원 데이터를 가져오는 코드는 이렇게 구성했다.
코드가 너무 길어지고 복잡해진 것 같아서 고쳐보려 했으나, 좀 더 고민해봐야 할 것 같다
'👀 Side Project > Eᴍʙᴀᴅ (23.12~24.01)' 카테고리의 다른 글
Spring email 정의하기 (0) | 2024.01.28 |
---|---|
공공데이터포털 API serviceKey 오류/SERVICE KEY IS NOT REGISTERED ERROR/해결 (0) | 2024.01.28 |
HTML, CSS 파일 Spring JSP파일에 적용하기 include적용하기 (1) | 2024.01.28 |
Javascript 서버요청/비동기통신/노드제어 (2) | 2024.01.28 |
ER다이어그램, ERD, Spring구축 (0) | 2024.01.07 |