저번 포스팅에서 공공데이터를 db에 저장하는 것까지 완료했다. 이제 인자를 입력해 이 데이터를 사용자가 볼 수 있는 페이지 localhost:8080/findname 을 만들고, rest api를 만들겠다. 이를 위해 jpa named query를 이용해 db에서 역이름,역의 호선에 해당하는 데이터 List를 가져온다. 그리고 이 List를 적절하게 RestController에서 반환함으로써 rest api를 구현하겠다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>findName</title>
</head>
<body>
<p th:text="${msg}"></p>
<h3>Input substation name you want to search</h3>
<h3>Example: 서울역,시청... </h3>
<form method="POST" action="/findname">
<input type="text" name="station_name" th:value="${station_name}"/>
<input type="submit" value="CLick"/>
</form>
</body>
</html>
@Controller
public class FindNameController {
@Autowired
private SubstationInfoRepository infoRepository;
@GetMapping("findname")
public String input_name(Model model){
return "findname";
}
@PostMapping("findname")
public String stationName(@RequestParam(value = "station_name",required = true) String stationName, Model model){
List<SubstationInfo> infoList=infoRepository.findByName(stationName);
if(infoList.isEmpty()==true){//없는 역이름이면 재입력 요구
model.addAttribute("msg","역 이름을 찾을 수 없습니다. 확인 후 재입력해주세요.");
return "findname";
}else {//유효한 역이름이면 결과 반환
model.addAttribute("station_name",stationName);
return "result";
}
}
}
여기에서 findByName()을 아직 정의 하지 않았다. jparepository를 extends한 SubstationInfoRepository에서 역이름으로 데이터를 찾아오는 함수와 역의 line number로 데이터를 찾아오는 함수를 정의하자.
+참조: Spring Jpa named query reference
Spring reference의 Jpa Repository부분을 살펴보면 jpa를 다루는 여러 방법을 알 수 있다. 여기서 우리는 직접 query를 작성해 함수로 실행할 수 있다.
public interface SubstationInfoRepository extends JpaRepository<SubstationInfo,Long> {
@Query(value = "SELECT * FROM substation_info u WHERE u.sub_sta_nm = ?1", nativeQuery = true)
List<SubstationInfo> findByName(@Param("sub_sta_nm") String sub_sta_nm);
@Query(value = "SELECT * FROM substation_info u WHERE u.line_num = ?1", nativeQuery = true)
List<SubstationInfo> findByLine(@Param("line_num") String line_num);
}
findname에서 넘어가는 result페이지에서 입력된 역이름에 해당하는 rest api url로 이동할 수 있게한다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>result</title>
</head>
<body>
<a th:href="@{/result(station_name=${station_name})}">결과</a>
</body>
</html>
명세에 작성된 /result?station_name
result/line?line_num에 맞는 데이터를 return해야 한다. 그리고 Rest api의 구현을 위해 @RestController를 사용한다.
+참조: https://spring.io/guides/gs/rest-service/
@Autowired
SubstationInfoRepository infoRepository;
@RequestMapping("/result")
public List<SubstationInfo> result(Model model, @RequestParam(required = true) String station_name){
List<SubstationInfo> infoList= infoRepository.findByName(station_name);
if(infoList.isEmpty()==true) System.out.println("empty list");
return infoList;
}
@Autowired
SubstationInfoRepository infoRepository;
@RequestMapping("/result/line")
public List<SubstationInfo> resultLine(Model model, @RequestParam(required = true) String line_num){
List<SubstationInfo> infoList= infoRepository.findByLine(line_num);
if(infoList.isEmpty()==true) System.out.println("empty list");
return infoList;
}
위와 같이 json데이터를 확인할 수 있다.
혹시 파일 얻을수있을까요... 다른 공공데이터로 만들고 있는데 쉽지않네요..