
이 글은 스프링부트3 백엔드 개발자 되기 책을 바탕으로 공부한 내용을 정리한 게시글 입니다.
블로그에 글 목록 조회를 위한 API를 구현하겠습니다.
1. 서비스 메서드 코드 작성하기
BlogService.java 파일을 열어 데이터베이스에 저장되어 있는 글을 모두 가져오는 findAll()메서드를 추가하겠습니다.
@RequiredArgsConstructor
@Service
public class BlogService {
private final BlogRepository blogRepository;
public List<Article> findAll() {
return blogRepository.findAll();
}
}
JPA 지원 메서드은 findALL()을 호출해 article테이블에 저장되어 있는 모든 데이터를 조회합니다. 이제 요청을 받아 서비스에 전달 해 줄 컨트롤러를 구성하겠습니다.
2. 컨트롤러 구성하기
/api/articles GET 요청이 오면 글 목록을 조회할 findAllArticles() 메서드를 작성하겠습니다. 이 메서드는 전체 글 목록을 조회하고 응답하는 역할을 합니다.
먼저 응답을 위한 DTO를 먼저 작성하겠습니다. dto 패키지에 ArticleResponse.java 파일을 생성하고 dto를 구성하겠습니다.
@Getter
public class ArticleResponse {
private final String title;
private final String content;
public ArticleResponse(Article article) {
this.title = article.getTitle();
this.content = article.getContent();
}
}
이제 GET 요청을 받아 매핑시켜 줄 컨트롤러를 작성해보겠습니다.
@GetMapping("/api/articles")
public ResponseEntity<List<ArticleResponse>> findAllArticles() {
List<ArticleResponse> articles = blogService.findAll()
.stream()
.map(ArticleResponse::new)
.toList();
return ResponseEntity.ok()
.body(articles);
}
/api/articles GET 요청이 오면 글 전체를 조회하는 findAll() 메서드를 호출한 다음 응답용 객체인 ArticleResponse로 파싱에 body에 담아 클라이언트에게 전송합니다. 이코드에는 스트림을 적용하였습니다.
실행테스트를 쉽게 하기 위해 data.sql파일을 생성하여 데이터를 넣겠습니다.
INSERT INTO article (title, content) VALUES ('제목1', '내용1')
INSERT INTO article (title, content) VALUES ('제목2', '내용2')
INSERT INTO article (title, content) VALUES ('제목3', '내용3')
3. 테스트코드 작성하기
블로그 글 조회 로직 테스트 코드도 given-when-then 패턴으로 작성하겠습니다. 이전에 만들었던 BlogApiControllerTest에 블로그 글 목록 조회 테스트 메서드를 작성하겠습니다.
@DisplayName("findAllArticles: 블로그 글 목록 조회에 성공한다.")
@Test
public void findAllArticles() throws Exception {
// given
final String url = "/api/articles";
final String title = "title";
final String content = "content";
blogRepository.save(Article.builder()
.title(title)
.content(content)
.build());
// when
final ResultActions resultActions = mockMvc.perform(get(url)
.accept(MediaType.APPLICATION_JSON));
// then
resultActions
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].content").value(content))
.andExpect(jsonPath("$[0].title").value(title));
}
given 단계에서 테스트 할 API의 URL과 title값 content값을 설정 한 뒤 save()메서드를 통해 블로그 글을 저장하여 데이터가 존재하도록 만듭니다.
when단계에서 mockMvc.perform(get(url))을 사용하여 /api/articles 엔드포인트에 GET 요청을 보냅니다.
accept(MediaType.APPLICATION_JSON)를 통해 응답을 JSON 형식으로 받도록 요청합니다.
실행 결과(ResultActions)를 resultActions에 저장합니다.
then단계에서는 응답코드와 응답 JSON배열을 비교해서 값이 일치하는지 확인합니다.
그럼 테스트 코드를 실행해보고 결과를 확인해보겠습니다.

사진과 같이 글 목록 조회에 성공한 것을 확인 할 수 있습니다.
4. ID로 블로그 글 조회 API 구현하기
블로그 글 전체를 조회할 API를 구현했으니 이번에는 글 하나를 조회하는 API를 구현하겠습니다.
서비스 메서드 작성하기
BlogService.java 파일을 열어 블로그 글 하나를 조회하는 메서드인 findById() 메서드를 추가합니다. 이 메서드는 데이터 베이스에 저장되어있는 글의 ID를 이용해 글을 조회합니다.
public Article findById(long id) {
return blogRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found : " + id));
}
여기도 마찬가지로 JPA 제공하는 메서드를 이용하여 ID를 받아 엔티티를 조회하고 조회된 반환값이 없으면 IllegalArgumentException 예외를 발생합니다.
컨트롤러 메서드 작성하기
/api/articles/{id} GET 요청이 오면 블로그에 글을 조회하기 위해 매핑할 findArticle()메서드를 적성하겠습니다. BlogApiController.java 파일에 작성을 하겠습니다.
@GetMapping("/api/articles/{id}") //URL에서{id}에 해당하는 값이 id로 들어옴
public ResponseEntity<ArticleResponse> findArticle(@PathVariable long id) {
Article article = blogService.findById(id);
return ResponseEntity.ok()
.body(new ArticleResponse(article));
}
@PathVariable 애너테이션은 URL에서 값을 가져오는 애너테이션입니다.
이제 테스트 코드를 작성해보겠습니다.
API테스트
@DisplayName("findArticle: 블로그 글 조회에 성공한다.")
@Test
public void findArticle() throws Exception {
// given
final String url = "/api/articles/{id}";
final String title = "title";
final String content = "content";
Article savedArticle = blogRepository.save(Article.builder()
.title(title)
.content(content)
.build());
// when
final ResultActions resultActions = mockMvc.perform(get(url, savedArticle.getId()));
// then
resultActions
.andExpect(status().isOk())
.andExpect(jsonPath("$.content").value(content))
.andExpect(jsonPath("$.title").value(title));
}
글 조회 API를 통해서 제목과 글 내용을 가져옵니다. 테스트를 실행시켜 결과를 확인해보겠습니다.

테스트가 성공적으로 수행된 것을 확인 할 수 있습니다.
'개발자 취업준비 > springboot' 카테고리의 다른 글
| 데이터베이스 트랜잭션과 병행 제어 (0) | 2025.02.20 |
|---|---|
| 스프링프로젝트3 글 삭제 및 수정 (0) | 2025.02.17 |
| 스프링부트 프로젝트1 계층구조를 구성하여 글 저장 로직 작성하기 (0) | 2025.02.16 |
| API와 REST API (1) | 2025.02.13 |
| 엔티티와 엔티티메니저 스프링JPA로 데이터베이스 조회하기 (6) | 2025.02.12 |