[SpringBoot+JPA]공공데이터 db저장과 API만들기-3

ttomy·2022년 1월 12일
1

Spring

목록 보기
3/4

저번 포스팅에서 공공데이터를 db에 저장하는 것까지 완료했다. 이제 인자를 입력해 이 데이터를 사용자가 볼 수 있는 페이지 localhost:8080/findname 을 만들고, rest api를 만들겠다. 이를 위해 jpa named query를 이용해 db에서 역이름,역의 호선에 해당하는 데이터 List를 가져온다. 그리고 이 List를 적절하게 RestController에서 반환함으로써 rest api를 구현하겠다.

역이름,호선이름으로 데이터 보여주기

1. 역이름,호선이름 입력받는 form구현

  • findname.html
<!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>

2. findname과 주소 매핑

  • FindNameController

@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를 작성해 함수로 실행할 수 있다.

  • SubstationInfoRepository
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);
}

result페이지

findname에서 넘어가는 result페이지에서 입력된 역이름에 해당하는 rest api url로 이동할 수 있게한다.

  • result.html
<!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>

Rest api만들기

명세에 작성된 /result?station_name
result/line?line_num에 맞는 데이터를 return해야 한다. 그리고 Rest api의 구현을 위해 @RestController를 사용한다.
+참조: https://spring.io/guides/gs/rest-service/

1. station_name 파라미터

  • ResultController
    @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;
    }

2. line_num 파라미터

    @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데이터를 확인할 수 있다.

1개의 댓글

comment-user-thumbnail
2022년 7월 29일

혹시 파일 얻을수있을까요... 다른 공공데이터로 만들고 있는데 쉽지않네요..

답글 달기