Springboot 검색 기능 구현

진기·2024년 3월 27일

프로젝트를 진행하면서 검색 기능 구현 파트를 맡게 되었다.
다음 코드는 공공API를 미리 데이터베이스(MySQL)에 담은 데이터를 검색하여 원하는 데이터를 얻을 수 있도록 코드를 작성한 것이다. 우리 팀이 받아온 공공 데이터는 강원, 경기, 울산 세 지역의 데이터를 받아왔는데 울산을 예시로 들어 기록을 남기겠다.


코드 작성

Ulsan.java

아래 코드는 울산 지역 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 코드를 작성한다.

UlsanApiRepository.java

public interface UlsanApiRepository extends JpaRepository<Ulsan, Long> {

    List<Ulsan> findAllByFacilityContaining(String facility);
    List<Ulsan> findAllByCityContaining(String city);

}

facility는 시설 이름을 나타내는 함수명이고, city는 지역명을 나타내는 함수명이다.
findAllBy~Containing을 활용하여 원하는 검색어가 포함된 모든 정보를 보여주도록 하였다.

다음으로, 작성한 Repository를 주입받아서 실질적인 검색 로직을 구현하는 service단에 코드를 작성한다.

UlsanApiService.java

@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를 주입 받을 수 있도록 한다.

UlsanApiController.java


@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/북구 로 검색하면 북구에 위치한 모든 장소 정보들이 나오게 된다.

profile
개발 성장 이야기

0개의 댓글