// service - BlogService.java
@RequiredArgsConstructor // 생성자 생성, 의존성 주입
@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
@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) // 스트림의 각 요소를 ArticleResponse 객체로 매핑.
.toList();
return ResponseEntity.ok()
.body(articles);
}
}
findAll()
Spring Data JPA에서 제공되는 메서드 중 하나로, 데이터베이스에서 모든 엔티티를 검색하는 메서드이다. 해당 리포지토리에 있는 모든 엔티티를 담은 List 형태로 반환한다. T는 엔티티 타입을 의미한다.
200 ok로 상태 코드를 설정하여 ResponseEntity에 body에 articles 객체를 담아 반환.
// resources - 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')
- Given
블로그 글을 저장.
- WHEN
목록 조회 API를 호출.
- Then
응답코드가 200 OK이고, 반환받은 값 중에 0번째 요소의 content와 title이 저장된 값과 같은지 확인한다.
// test - BlogApplicationTest.java
@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));
}