블로그 API(4) : 블로그 글 전체 조회 API작성

도람·2025년 7월 31일
post-thumbnail

service 작성

@RequiredArgsConstructor //final이 붙거나 @NotNull이 붙은 필드의 생성자 추가
@Service                 //빈으로 등록
public class BlogService {
    private final BlogRepository blogRepository;

    public List<Article> findAll() { // 블로그 글 전체 조회 메서드 
        return blogRepository.findAll();
    }
}
  • JPA 지원메세지인 findAll()을 호출하여 테이블에 있는 모든데이터를 조회.

dto-ArticleResponse 작성

@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 작성

@RequiredArgsConstructor
@RestController //HTTP Response Body에 HTTP 응답으로 객체 데이터를 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/article GET 요청이 오면 findAll() 메서드 호출 -> 응답용 객체인 ArticleRespones로 파싱해 body에 담아 클라이언트에 전송한다.
  • stream: 데이터가 모여있는 컬렉션을 간편하게 처리하기 위한 기능.
  • ResponseEntity: HTTP 응답 전체 (상태코드 , 헤더 등)을 담는 스프링컨테이너 타입.
  • <List>: ResponseEntity가 감싸는 바디 타입.
    -> HTTP 응답 본문에 ArticleResponse 객체들이 들어있는 리스트를 JSON 형태로 담아서 보낸다.
  • ResponseEntity.ok().body(articles)는 HTTP 200 OK 상태로 위의 리스트를 응답 바디에 실어 반환한다.

작성 중 만난 에러로그

  • service, controller, dto를 작성하고 실행하는데,
2025-07-31T21:40:15.363+09:00 ERROR 15788 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class me.nahyung.springboot3_developer.dto.ArticleResponse]] with root cause

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class me.nahyung.springboot3_developer.dto.ArticleResponse and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ImmutableCollections$ListN[0])

이렇게 에러가 떴으며,

postman으로 'http://localhost:8080/api/articles' 으로 GET요청을 보냈을 때에는,

{
    "timestamp": "2025-07-31T12:41:11.464+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "path": "/api/articles"
}

라고 에러가 떴다. 잘 작성한 것 같은데 왜 에러가 나는지 이해가 안 갔다.
구글링 해보니
ArticleResponse에 직렬화할 프로퍼티가 하나도 없어서 에러를 던진것이었다.

그렇다. 내가 dto를 작성하면서 @Getter 애너테이션을 빼먹어서 생긴 오류였다.

내가 작성한 ArticleResponse dto에 getter이 있어야
JSON으로 변환이 되는데 이 getter를 빼먹어서 직렬화가 불가능한 것이었다.

이를 수정하고 test하니, 아주 잘 실행되었다.


해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽

profile
정도를 걷는 엔지니어

0개의 댓글