Skip to content

Commit 744cb06

Browse files
committed
feat: 구인글 검색 기능 추가
1 parent c879252 commit 744cb06

3 files changed

Lines changed: 60 additions & 0 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/community/post/controller/JoinPostController.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@
88
import com.back.web7_9_codecrete_be.global.rq.Rq;
99
import com.back.web7_9_codecrete_be.global.rsData.RsData;
1010
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.Parameter;
12+
import io.swagger.v3.oas.annotations.media.Schema;
1113
import io.swagger.v3.oas.annotations.tags.Tag;
1214
import jakarta.validation.Valid;
1315
import lombok.RequiredArgsConstructor;
16+
import org.springframework.data.domain.Pageable;
1417
import org.springframework.web.bind.annotation.*;
1518

19+
import java.util.List;
20+
1621
@RestController
1722
@RequestMapping("/api/v1/join")
1823
@RequiredArgsConstructor
@@ -73,4 +78,23 @@ public RsData<?> close(
7378
joinPostService.close(postId, user.getId());
7479
return RsData.success("구인글이 마감되었습니다.");
7580
}
81+
82+
@Operation(summary = "구인글 검색", description = "제목 또는 내용에 키워드를 포함하고 있는 구인글을 검색합니다.")
83+
@GetMapping("/search")
84+
public RsData<List<JoinPostResponse>> search(
85+
@Schema(description = """
86+
<h3>검색어가 되는 Keyword입니다.</h3>
87+
<hr/>
88+
<b>?keyword={keyword}</b> 로 값을 넘기시면 됩니다.<br/>
89+
제목 또는 내용에 해당 문자열을 포함하는 구인글을
90+
페이징된 만큼 반환합니다.
91+
""")
92+
@RequestParam String keyword,
93+
@Schema(description = "페이징 처리 또는 무한 스크롤 구현에 사용하는 Pageable 객체입니다.")
94+
@Parameter(hidden = true) Pageable pageable
95+
) {
96+
return RsData.success(
97+
joinPostService.searchByKeyword(keyword, pageable)
98+
);
99+
}
76100
}

src/main/java/com/back/web7_9_codecrete_be/domain/community/post/repository/JoinPostRepository.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,29 @@
44
import org.springframework.data.domain.Page;
55
import org.springframework.data.domain.Pageable;
66
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
9+
10+
import java.util.List;
711

812
public interface JoinPostRepository extends JpaRepository<JoinPost, Long> {
913
Page<JoinPost> findByPost_UserId(Long userId, Pageable pageable);
14+
15+
@Query("""
16+
SELECT
17+
jp
18+
FROM
19+
JoinPost jp
20+
JOIN FETCH
21+
jp.post p
22+
WHERE
23+
p.title LIKE %:keyword%
24+
OR p.content LIKE %:keyword%
25+
ORDER BY
26+
p.createdDate DESC
27+
""")
28+
List<JoinPost> searchByKeyword(
29+
@Param("keyword") String keyword,
30+
Pageable pageable
31+
);
1032
}

src/main/java/com/back/web7_9_codecrete_be/domain/community/post/service/JoinPostService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
import com.back.web7_9_codecrete_be.global.error.code.PostErrorCode;
1515
import com.back.web7_9_codecrete_be.global.error.exception.BusinessException;
1616
import lombok.RequiredArgsConstructor;
17+
import org.springframework.data.domain.Pageable;
1718
import org.springframework.stereotype.Service;
1819
import org.springframework.transaction.annotation.Transactional;
1920

21+
import java.util.List;
22+
2023
@Service
2124
@RequiredArgsConstructor
2225
public class JoinPostService {
@@ -117,4 +120,15 @@ public void close(Long postId, Long userId) {
117120

118121
joinPost.close(); // status = CLOSED
119122
}
123+
124+
public List<JoinPostResponse> searchByKeyword(String keyword, Pageable pageable) {
125+
if (keyword == null || keyword.isEmpty()) {
126+
throw new BusinessException(PostErrorCode.KEYWORD_IS_NULL);
127+
}
128+
129+
return joinPostRepository.searchByKeyword(keyword, pageable)
130+
.stream()
131+
.map(JoinPostResponse::from)
132+
.toList();
133+
}
120134
}

0 commit comments

Comments
 (0)