특정 단어를 입력하면 해당 단어를 포함하는 모든 공고를 리스트로 응답하는 API이다
필드가 정해져있지 않아서 어떻게 해야하나 여러 시도를 해봤다
repository에서 in 쿼리 사용해서 해당 단어를 가지고 있는 객체 리스트 반환(컴파일 에러 발생함)
각 필드마다 find하는 시그니처 만들어서 각자 진행하는 것(실패)
그러던 중 모든 recruitment를 찾은 다음 각 recruiment의 필드에서 해당 단어를 가지고 있으면 그걸 리스트에 추가한 후
반환하는 로직을 생각했다
- getSearchRecruitList()
위치 : /web/recruitment/RecruitmentController.class
@GetMapping("/search")
public ApiResponse<List<GetSearchRecruitResponse>> getSearchRecruitList(@RequestParam String search) {
List<GetSearchRecruitResponse> response = recruitmentService.getSearchRecruitList(search);
return ApiResponse.success(response);
}
- getSearchRecruitList()
Java에선 != 로 문자열을 비교하면 에러가 발생하므로, .equals()를 이용해야한다
문제에선 원티드로 검색했을 때 원티드와 원티드코리아의 채용공고가 조회되었으므로, 해당 단어와 정확히 일치하는 것뿐만 아니라
포함하는 것도 조회해야한다고 생각해서 .contains()를 이용했다
코드가 아직 단순하고 문제가 많을 것 같지만 일단 지금까지의 최선이다
하나의 채용공고에 서로 다른 필드가 중복되는 단어를 가지고 있는 경우 같은 공고가 여러개 반환되는 문제가 발생한다
public List<GetSearchRecruitResponse> getSearchRecruitList(String search) {
List<Recruitment> all = recruitmentRepository.findAll();
List<GetSearchRecruitResponse> result = new ArrayList<>();
for (Recruitment recruitment : all) {
if (recruitment.getCompany().getCompanyName().contains(search) || recruitment.getCompany().getCountry().contains(search) || recruitment.getCompany().getRegion().contains(search)) {
GetSearchRecruitResponse response = GetSearchRecruitResponse.of(recruitment);
result.add(response);
}
if (recruitment.getPosition().contains(search) || recruitment.getTechInfo().contains(search)) {
GetSearchRecruitResponse response = GetSearchRecruitResponse.of(recruitment);
result.add(response);
}
}
return result;
}
- GetSearchRecruitResponse
위치 : /web/recruitment/dto/response
@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class GetSearchRecruitResponse {
private Long recruitId;
private String companyName;
private String country;
private String region;
private String position;
private Integer reward;
private String techInfo;
@Builder
public GetSearchRecruitResponse(Long recruitId, String companyName, String country, String region, String position, Integer reward, String techInfo) {
this.recruitId = recruitId;
this.companyName = companyName;
this.country = country;
this.region = region;
this.position = position;
this.reward = reward;
this.techInfo = techInfo;
}
public static GetSearchRecruitResponse of(Recruitment recruitment) {
GetSearchRecruitResponse response = GetSearchRecruitResponse.builder()
.recruitId(recruitment.getId())
.companyName(recruitment.getCompany().getCompanyName())
.country(recruitment.getCompany().getCountry())
.region(recruitment.getCompany().getRegion())
.position(recruitment.getPosition())
.reward(recruitment.getReward())
.techInfo(recruitment.getTechInfo())
.build();
return response;
}
}
Postman
RequestParam
key = search, value = naver
ResponseBody
naver를 포함한 모든 회사의 채용공고 리스트를 반환하는 것을 볼 수 있다
{
"data": [
{
"recruitId": 1,
"companyName": "naverwebtoon",
"country": "korea",
"region": "seoul",
"position": "Backend Developer 1",
"reward": 125000000,
"techInfo": "Java"
},
{
"recruitId": 2,
"companyName": "naverwebtoon",
"country": "korea",
"region": "seoul",
"position": "Backend Developer 2",
"reward": 125000000,
"techInfo": "Java"
},
{
"recruitId": 3,
"companyName": "naverwebtoon",
"country": "korea",
"region": "seoul",
"position": "Backend Developer 3",
"reward": 125000000,
"techInfo": "Python"
},
{
"recruitId": 4,
"companyName": "naver",
"country": "korea",
"region": "seoul",
"position": "Backend Developer 1",
"reward": 125000000,
"techInfo": "Python"
},
{
"recruitId": 5,
"companyName": "naver",
"country": "korea",
"region": "seoul",
"position": "Backend Developer 2",
"reward": 125000000,
"techInfo": "Java"
}
]
}
'개인프로젝트 > 과제' 카테고리의 다른 글
7. 사용자가 채용공고에 지원 API (가산점 요소) (0) | 2022.08.25 |
---|---|
6. 채용 상세 페이지 조회 API (0) | 2022.08.25 |
5-1. 채용공고 목록 API (0) | 2022.08.24 |
4. 삭제 API (0) | 2022.08.23 |
3. 수정 API (0) | 2022.08.23 |