[완성된 프로젝트 깃허브 주소입니다.]
프로젝트의 데이터 가져오는 순서도는 다음과 같다.
- 클라이언트가 url(http://localhost:8080/basic/start?sigungu=서울특별시 성북구&eupmyundong=보문동6가&aptName=보문파크뷰자이&date=202205)로 통해 조회할 아파트 입력
- 먼저 DB에 접근하여 아파트 거래 정보가 있는지 확인
- 없을 시 OPEN API에서 정보를 가져와 파싱 후 데이터 제공
- 제공된 데이터는 DB에 저장
이 과정에서 필요한 쿼리는 save 기능인 insert,
조회 기능인 select가 필요하다.
코드를 설명하기 전 JdbcTemplate의 사용법은 쿼리 문 안에 ?를 넣어 매개변수가 된다.
예시)
insert into member (member_id, name, age) values (?, ?, ?)
그리고 ?를 채우는 방법은
List<Object> param을 하나 생성하여 파람에 순서대로 변수를 넣고 param.toArray()를 넣어주면 된다.
예시)
List<Object> param = new ArrayList<>();
param.add(member.getId());
param.add(member.getName());
param.add(member.getAge());
return template.update(sql, param.toArray());
insert
public int save(Apt apt) {
String sql = "insert into hmmh (AMOUNT, BUILD_YEAR, DEAL_YEAR, DEAL_MONTH, DEAL_DAY, SIGUNGU_CODE, EUPMYUNDONG_CODE, SIGUNGU, DONG, APT_NAME, DEDICATED_AREA, FLOOR) " +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
List<Object> param = new ArrayList<>();
param.add(apt.getAmount());
param.add(apt.getBuildYear());
param.add(apt.getDealYear());
param.add(apt.getDealMonth());
param.add(apt.getDealDay());
param.add(apt.getSigunguCode());
param.add(apt.getEupmyundongCode());
param.add(apt.getSigungu());
param.add(apt.getDong());
param.add(apt.getAptName());
param.add(apt.getDedicatedArea());
param.add(apt.getFloor());
return template.update(sql, param.toArray());
}
앞서 말한 것과 같이 매개변수를 순서대로 List에 넣어주어 return 시에 param.toArray()를 해주면 된다.
select
public List<Apt> findByInfo(UserApt userApt, int dealYear, int dealMonth) {
UserApt tempApt = new UserApt(userApt.getSigungu(), userApt.getDong(), userApt.getAptName());
String sql = "select * from hmmh where SIGUNGU like concat('%', ?,'%') and DONG = ? and APT_NAME like concat('%', ?,'%') and DEAL_YEAR = ? and DEAL_MONTH = ?";
if (tempApt.getSigungu().contains("특별시")) {
tempApt.setSigungu(tempApt.getSigungu().replace("특별시", ""));
}
List<Object> param = new ArrayList<>();
param.add(tempApt.getSigungu());
param.add(tempApt.getDong());
param.add(tempApt.getAptName());
param.add(dealYear);
param.add(dealMonth);
return template.query(sql, itemRowMapper(), param.toArray());
}
private RowMapper<Apt> itemRowMapper() {
return (rs, rowNum) -> {
Apt item = new Apt();
item.setAmount(rs.getInt("AMOUNT"));
item.setBuildYear(rs.getInt("BUILD_YEAR"));
item.setDealYear(rs.getInt("DEAL_YEAR"));
item.setDealMonth(rs.getInt("DEAL_MONTH"));
item.setDealDay(rs.getInt("DEAL_DAY"));
item.setSigunguCode(rs.getInt("SIGUNGU_CODE"));
item.setEupmyundongCode(rs.getInt("EUPMYUNDONG_CODE"));
item.setSigungu(rs.getString("SIGUNGU"));
item.setDong(rs.getString("DONG"));
item.setAptName(rs.getString("APT_NAME"));
item.setDedicatedArea(rs.getDouble("DEDICATED_AREA"));
item.setFloor(rs.getInt("FLOOR"));
return item;
};
}
select는 아파트를 조회 시 1개 이상의 데이터로 구성되어 있어 1개 이상의 row를 받아 List로 반환하도록 하였다.
sql문은 save 부분과 같다.
여기서 중요한 건 itemRowMapper()이다.
가져온 데이터들을 매핑해주는 것인데 rs.get에 DB 칼럼 이름을 넣어주고 set으로 값을 설정해주기만 하면 된다!
그리고 리턴을 해주면 끝이다.
'개발일지 > HowMuchMyHouse?' 카테고리의 다른 글
[HMMH/ToyProject] 아파트 실거래가 조회 'HowMuchMyHouse' 완성 후 실행 화면 및 느낀 점 (1) | 2022.10.05 |
---|---|
[HMMH/ToyProject] 공공데이터 키 발급 받고 코드 적용해보기 - 국토교통부 아파트매매 실거래 상세 자료 (feat. 자바 스프링) (2) | 2022.10.03 |