[완성된 프로젝트 깃허브 주소입니다.]
강의를 듣고 마침 팀 프로젝트도 있고 지금까지 배워온 스프링, MVC, DB를 적용해보기 위해 작은 토이 프로젝트를 해보기로 하였다.
그래서 프로젝트의 주제는 크게 중요하지 않고 기술적인 면이 중요하지만 평소에 아파트 실거래가에 관심이 많아 국토교통부에서 제공하는 아파트 매매 실거래 상세 자료를 이용하기로 하였다!
키 발급
위의 링크를 타고 들어가서 로그인을 한 후 활용신청을 하면 된다!
상세 내용은 나는 공부 목적이기 때문에 공부라고 하였다.
그리고 키 발급이 되는데 키는 최소 몇 시간 후에 승인이 된다..
그래서 다음 날에 진행했었습니다...
요청 변수와 출력 결과
요청 변수와 출력 결과는 위와 같은데
서비스 키는 발급받으신 키 넣어주면 되고, 페이지 번호는 한 페이지에 아이템 몇 개를 몇 페이지까지 출력할 것인지에 대한 것이다.
지역코드는 행정 표준코드 관리시스템에서 제공한다! 하단 설명 참조!
그리고 계약월은 연도와 계약월을 입력하면 된다.
출력 결과는 사진 밑에 더 있지만 화면이 작아 잘렸다..
내가 가져올 데이터는 다음과 같다.
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Apt {
private int amount;//거래금액
private int buildYear;//건축년도
private int dealYear; //년
private int dealMonth; //월
private int dealDay; //일
private int sigunguCode; //법정동시군구코드
private int eupmyundongCode; //법정동읍면동코드
private String sigungu; //중개사소재지
private String dong; //법정동
private String aptName; //아파트
private double dedicatedArea; //전용면적
private int floor; //층
}
토이 프로젝트이기 때문에 많은 데이터는 가져오지 않았다!
지역코드는 사진을 보면 알 수 있듯이 지역마다 번호 코드가 붙게 되고 그걸 통해 분류하여 데이터를 가져온다.
활용은 동그라미 친 부분을 클릭하여 txt 파일로 다운로드하여 현 프로젝트에서는
한 줄씩 읽어 객체에 담아 리스트로 보관할 것이다!
txt 파일을 한 줄씩 읽어 폐지된 지역을 필터링하는 코드
public void saveRegionCodes() {
try {
URL resource = getClass().getClassLoader().getResource("AddressCodeList.txt");
File file = ResourceUtils.getFile(resource.getFile());
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));
BufferedReader bufferedReader = new BufferedReader(br);
String line = "";
while ((line = bufferedReader.readLine()) != null) {
if (line.contains("폐지")) {
continue;
} else {
String[] split = line.split("\t");
regionCodeItemRepository.save(new RegionCodeItem(split[0], split[1]));
}
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
log.error("IOException", e);}
}
txt 줄 안에 폐지가 있으면 List에 저장하지 않음.
여기서 한 가지 아쉬웠던 점은 지역코드가 5자리만 들어가는 것이었다 그래서 서울특별시 종로구 청운동(1111010100)을 검색하고 싶어도 서울특별시 종로구인 11110 번호만 입력해야 해서 따로 필터링 작업을 거쳐줘야 했다..!
즉, 한 달간 종로구의 모든 거래내역을 가져와 거기서 필터링을 함.
자바 코드로 가져와 활용해보자!
오픈 api를 통해 값을 가져와야 한다.
하단의 코드는 api를 Document 타입으로 xml 파일을 가져왔다.
그래서 파싱을 해줘야 하는데 xmlReader 클래스에 함수를 만들어뒀다. (하단 참조)
(키의 경우 앱 프로퍼티 파일에 따로 저장해뒀다)
@Slf4j
@Component
@RequiredArgsConstructor
public class GetApi {
private final XmlReader xmlReader;
@Value("${my.apiKey}")
String key;
public List<Apt> getApiData(RegionCodeItem regionCodeItem, String date) {
try {
StringBuilder urlBuilder = new StringBuilder("http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + key); /*Service Key*/
// urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("100", "UTF-8")); /*한 페이지 결과 수*/
int code = Integer.parseInt(regionCodeItem.getRegionNum().substring(0, 5));
urlBuilder.append("&" + URLEncoder.encode("LAWD_CD", "UTF-8") + "=" + URLEncoder.encode(String.valueOf(code), "UTF-8")); /*지역코드*/
urlBuilder.append("&" + URLEncoder.encode("DEAL_YMD", "UTF-8") + "=" + URLEncoder.encode(date, "UTF-8")); /*계약월*/
DocumentBuilderFactory dbFactoty = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactoty.newDocumentBuilder();
Document doc = dBuilder.parse(urlBuilder.toString());
return xmlReader.parser(doc);
} catch (Exception e) {
log.error("error", e);
throw new RuntimeException();
}
}
}
xml을 파싱 해볼 것이다.
public List<Apt> parser(Document doc) throws ParserConfigurationException, IOException, SAXException {
List<Apt> aptList = new ArrayList<>();
// 제일 첫번째 태그
doc.getDocumentElement().normalize();
// 파싱할 tag
NodeList nList = doc.getElementsByTagName("item");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
org.w3c.dom.Element eElement = (Element) nNode;
aptList.add(new Apt(Integer.parseInt(getTagValue("거래금액", eElement).trim().replace(",", "")), Integer.parseInt(getTagValue("건축년도", eElement)), Integer.parseInt(getTagValue("년", eElement)), Integer.parseInt(getTagValue("월", eElement)), Integer.parseInt(getTagValue("일", eElement)), Integer.parseInt(getTagValue("법정동시군구코드", eElement)), Integer.parseInt(getTagValue("법정동읍면동코드", eElement)), getTagValue("중개사소재지", eElement), getTagValue("법정동", eElement).trim(), getTagValue("아파트", eElement), Double.parseDouble(getTagValue("전용면적", eElement)), Integer.parseInt(getTagValue("층", eElement))));
}
return aptList;
}
document를 받아 위와 같이 파싱을 해줬다.
그래서 Apt 객체의 List로 반환하여 데이터를 처리해줬다!
프로젝트의 방향으로는 db에 접근하여 찾는 아파트의 정보가 있는지 없으면 api를 거쳐 데이터를 가져온 후 db에 저장할 것임!
'개발일지 > HowMuchMyHouse?' 카테고리의 다른 글
[HMMH/ToyProject] 아파트 실거래가 조회 'HowMuchMyHouse' 완성 후 실행 화면 및 느낀 점 (1) | 2022.10.05 |
---|---|
[HMMH/ToyProject] JdbcTemplate으로 insert와 select 사용하기 (feat. 1개 이상의 Row 가져오기) (0) | 2022.10.04 |