프로젝트를 진행하면서 검색 기능 구현 파트를 맡게 되었다.
다음 코드는 공공API를 미리 데이터베이스(MySQL)에 담은 데이터를 검색하여 원하는 데이터를 얻을 수 있도록 코드를 작성한 것이다. 우리 팀이 받아온 공공 데이터는 강원, 경기, 울산 세 지역의 데이터를 받아왔는데 울산을 예시로 들어 기록을 남기겠다.
아래 코드는 울산 지역 API를 이용하여 받아온 공공데이터를 활용한 엔티티 테이블 작성 코드이다.
@Entity
@Builder
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
@Getter
@Setter
public class Ulsan extends IdEntity {
private String unqId; // 고유 아이디
private String city; // 구군
private String facility; // 업체명
private String bsnsStts; // 영업상태명
private String tel; // 전화번호
private String cls; // 휴무일
private String remarks; // 비고
private String zipCode; // 우편번호
private String streetNameAddress; // 도로명주소
private String address; // 지번주소
private String lat; // 위도
private String lng; // 경도
private String rgstDate; // 등록일자
}
엔티티를 작성하고 이 엔티티를 활용하는 Repository 코드를 작성한다.
public interface UlsanApiRepository extends JpaRepository<Ulsan, Long> {
List<Ulsan> findAllByFacilityContaining(String facility);
List<Ulsan> findAllByCityContaining(String city);
}
facility는 시설 이름을 나타내는 함수명이고, city는 지역명을 나타내는 함수명이다.
findAllBy~Containing을 활용하여 원하는 검색어가 포함된 모든 정보를 보여주도록 하였다.
다음으로, 작성한 Repository를 주입받아서 실질적인 검색 로직을 구현하는 service단에 코드를 작성한다.
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class UlsanApiService {
private final UlsanApiRepository ulsanApiRepository;
.
.
.
public List<Ulsan> searchFacility(String facility) {
return ulsanApiRepository.findAllByFacilityContaining(facility);
}
public List<Ulsan> searchCity(String city) {
return ulsanApiRepository.findAllByCityContaining(city);
}
}
service단의 코드 작성을 완료하고 작성한 service단의 로직을 구현하고 화면에 출력하기 위해 controller단에 코드를 작성한다. service를 주입 받을 수 있도록 한다.
@RestController
@RequiredArgsConstructor
public class UlsanApiController {
private final UlsanApiService ulsanApiService;
.
.
.
@GetMapping("/ulsan/facility/{facility}")
public List<Ulsan> searchFacility(@PathVariable String facility) {
return ulsanApiService.searchFacility(facility);
}
@GetMapping("/ulsan/city/{city}")
public List<Ulsan> searchCity(@PathVariable String city) {
return ulsanApiService.searchCity(city);
}
}
/ulsan/facility/{facility} URL에 대한 GET 요청을 처리하는 컨트롤러 메서드를 정의한다. 경로 변수에서 시설 이름을 추출하고 검색 로직을 주입된 서비스 ulsanApiService에 위임한다. 그리고 메서드는 서비스로부터 얻은 결과를 반환한다.
/ulsan/city/{city}도 똑같은 방식으로 동작한다.

http://localhost:8090/ulsan 을 입력하면 위에 사진처럼 데이터들이 모두 나온다.
만약 여기서 울산에 있는 반려동물 동반 출입 가능 카페들을 찾고 싶다면 http://localhost:8090/ulsan/facility/카페 라고 검색한다.

그럼 위 사진처럼 카페에 대한 정보가 모두 나오게 된다. 추가적으로 북구에 위치한 장소 정보를 검색하고 싶다면 http://localhost:8090/ulsan/city/북구 로 검색하면 북구에 위치한 모든 장소 정보들이 나오게 된다.