김쥬르에 개발일지
Spring Boot 블로그 글 조회 본문
저번 글 추가하기에 이어 글 조회 , 수정하기를 해보겠습니다.
BlogService.java 파일을 열어 DB에 저장되어있는
글을 모두 가져오는 findAll() 메서드를 추가하겠습니다.
@RequiredArgsConstructor // final이 붙거나 @NotNull이 붙은 필드의 생성자 추가
@Service // 빈으로 등록
public class BlogService {
private final BlogRepository blogRepository;
----------------------생략------------------
public List<Article> findAll() {
return blogRepository.findAll();
}
응답을 위한 DTO를 작성하겠습니다.
dto 디렉터리에 ArticleResponse.java 파일을 생성하고 코드를 작성합니다.
@Getter
public class ArticleResponse {
private final String title;
private final String content;
public ArticleResponse(Article article) {
this.title = article.getTitle();
this.content = article.getContent();
}
}
controller 디렉터리에 있는 BlogApiController.java 파일을 열어
전체 글을 조회한 뒤 반환하는 findAllArticles() 메서드를 추가합니다.
@RequiredArgsConstructor
@RestController // HTTP Response Body에 객체 데이터를 JSON 형식으로 반환하는 컨트롤러
public class BlogApiController {
private final BlogService blogService;
-----------------------생략-------------------
@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에 담아 클라이언트에게 전송합니다.
이제 실행테스트를 해보겠습니다.
그전에 DB에 데이터를 추가하겠습니다.
Insert Into Article (content, title) values ('내용 2', '제목 2');
Insert Into Article (content, title) values ('내용 3', '제목 3');
이제 포스트맨을 열고
HTTP 메서드 : GET
[params] 탭으로 변경
URL : http://localhost:8080/api/articles
후 send를 눌러봅시다.

전체 글 조회가 잘되는걸 볼수있네요.
이번엔 글 조회 테스트 코드를 작성해보겠습니다.
패턴
Given : 블로그 글을 저장합니다
When : 목록 조회 API를 호출합니다.
Then : 응답 코드가 200 OK 이고 ,
반환받은 값 중에 0번째 요소의 content 와 title 이 저장된 값과 같은지 확인합니다.
BlogApiControllerTest에 이어 작성하겠습니다.
@SpringBootTest
@AutoConfigureMockMvc
class 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));
}
}
이제 딱보면 어떤 흐름으로 동작하는지 눈에 들어오시죠?
별도에 설명없이 바로 진행하겠습니다.
테스트 코드를 실행해 잘 동작하는지 확인해봅시다.

블로그 글 전체를 조회해봤으니 이번에는 글 하나를 조회하는 API를 구현해봅시다.
BlogService.java 파일을 열어 블로그 글 하나를
조회하는 메서드를 추가합니다.
public Article findById(long id) {
return blogRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found : " + id));
}
findById() 메서드는 JPA에서 제공하는 메서드로
ID를 받아 엔티티를 조회하고 없으면
IllegalArgumentException 예외를 발생합니다.
/api/articles/{id} GET 요청이 오면 블로그 글을 조회하기 위해
BlogApiController.java 파일에 코드를 추가 하겠습니다.
@GetMapping("/api/articles/{id}")
public ResponseEntity<ArticleResponse> findArticle(@PathVariable long id){
Article article = blogService.findById(id);
return ResponseEntity.ok()
.body(new ArticleResponse(article));
}
@PathVarible
URL에서 값을 가져오는 어노테이션입니다.
이 어노테이션이 붙은 메서드의 동작 원리는
/api/articles/3 GET 요청을 받는다고 하면
id에 3이 들어옵니다 그리고 이 값은 앞서 만든 서비스 클래스의
findById()로 넘어가 3번 블로그 글을 찾습니다.
글을 찾으면 3번 글의 정보를 Body에 담아 웹 브라우저로 전송합니다.
이번엔 테스트 코드를 작성해보겠습니다.
Given : 블로그 글을 저장합니다
When : 저장한 블로그 글의 id값으로 API를 호출합니다.
Then : 응답코드가 200 OK 이고 반환받은 Content 와 title이 저장된 값과 같은지 확인합니다.
@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));
}
테스트 코드를 실행하여 잘되는지 확인해봅시다.

다음 포스팅에선 삭제와 수정을 해보겠습니다.
'Spring boot' 카테고리의 다른 글
| Spring Boot 화면구성 (1) | 2023.12.29 |
|---|---|
| Spring Boot 수정 삭제 (0) | 2023.12.28 |
| Spring Boot 블로그 글 추가하기 (1) | 2023.12.27 |
| Spring Boot REST API (2) | 2023.12.26 |
| SpringBoot ORM (0) | 2023.12.25 |