Jackson, 순환참조, 게시글 목록/단건 조회 API 구현
이번 글에서는 Spring Boot REST API 실습 4강과 5강 내용을 한 번에 정리한다.
게시글 목록 조회와 단건 조회 API를 구현하면서
Jackson의 역할, 엔티티 순환참조 문제, @RestController, @RequestMapping 개념을 함께 정리했다.
REST API 방식에서는 백엔드가 화면을 렌더링하지 않는다.
따라서
👉 컨트롤러가 JSON만 응답하는 것은 전혀 이상한 구조가 아니다.
👉 화면 구성은 프론트 애플리케이션의 책임이다.
Jackson은 Java 객체와 JSON 간 변환을 담당하는 라이브러리이다.
Spring Boot에서 REST API를 구현할 때
클라이언트와 서버 간 데이터 교환을 자동으로 처리한다.
Java 객체 → JSON 문자열
JSON 문자열 → Java 객체
Spring Boot에서는
spring-boot-starter-web에 기본 포함되어 있어
별도의 설정 없이 바로 사용할 수 있다.
엔티티 간 양방향 연관관계가 존재할 경우
Jackson 직렬화 과정에서 무한 루프(순환참조)가 발생할 수 있다.
// Post 엔티티
@OneToMany(mappedBy = "post")
private List<PostComment> comments;
// PostComment 엔티티
@ManyToOne
private Post post;
Post
→ comments
→ PostComment
→ post
→ comments
→ ...
👉 무한 반복 → StackOverflowError 발생
@Entity
@Getter
@NoArgsConstructor
public class PostComment extends BaseEntity {
@ManyToOne
@JsonIgnore
private Post post;
private String content;
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/posts")
public class ApiV1PostController {
private final PostService postService;
@GetMapping
public List<Post> getItems() {
return postService.findAll();
}
}
@RestController = @Controller + @ResponseBody
@RequestMapping("/api/v1/posts")
@GetMapping
→ GET /api/v1/posts
@GetMapping("/{id}")
public Post getItem(@PathVariable int id) {
return postService.findById(id).get();
}
GET /api/v1/posts/{id} 요청 처리{id} 값을 @PathVariable로 바인딩👉 이후 화면 렌더링은 프론트엔드에서 수행한다.
아니다.
Spring은 메서드 이름을 보지 않는다.
Spring이 기준으로 삼는 것:
@GetMapping)메서드 이름은 가독성을 위한 요소이다.
컨트롤러 메서드는 반드시 public이어야 한다.
| 구분 | REST API 방식 | 타임리프 방식 |
|---|---|---|
| 역할 분담 | 백엔드: 데이터 제공 프론트: 화면 렌더링 | 백엔드: 데이터 + 화면 |
| 응답 형태 | JSON | HTML |
| 유지보수 | 프론트 중심 수정 | 백엔드 + 화면 수정 |
| 재사용성 | 모바일/웹 등 확장 가능 | 웹 전용 |
| 테스트 | API 테스트 | 화면 렌더링 포함 |
| 확장성 | 높음 | 제한적 |
@JsonIgnore 등으로 해결 가능@RestController + @RequestMapping 구조가 기본REST API 방식에서는 서버는 데이터만 책임지고,
화면과 사용자 경험은 프론트엔드 애플리케이션이 담당한다.