
이 글은 2026년 05월 19일 작성된 글입니다.
오늘은 REST API 기반 프로젝트 세팅과
JPA, DTO, API 버저닝, 댓글 API 구현까지 정리했다.
implementation("org.springframework.boot:spring-boot-starter-web")
REST API 서버 개발에 필요한 기본 의존성을 추가했다.
REST API 방식에서는
백엔드는 데이터(JSON)만 제공한다.
{
"id": 1,
"title": "제목 1",
"content": "내용 1"
}
타임리프 방식은 HTML까지 서버에서 렌더링해서 응답한다.
등 게시글 도메인의 기본 구조를 구성했다.
postService.write("제목 1", "내용 1");
게시글 3개를 자동 생성하도록 구성했다.
postCommentService.write(post, "댓글 1");
댓글 기능과 샘플 데이터 5개를 추가했다.
@GetMapping
public List<Post> getPosts() {
return postService.findAll();
}
엔드포인트:
/api/v1/posts
양방향 연관관계에서는
JSON 직렬화 시 무한 루프가 발생할 수 있다.
@JsonIgnore
private Post post;
순환참조를 방지하기 위해 적용했다.
@RestController
@RequestMapping("/api/v1/posts")
@RestController는
JSON 응답을 위한 컨트롤러이다.
@GetMapping("/{id}")
public Post getPost(@PathVariable long id)
엔드포인트:
/api/v1/posts/3
Jackson은 Java 객체와 JSON 간 변환을 담당한다.
기능:
| 구분 | REST API | 타임리프 |
|---|---|---|
| 응답 | JSON | HTML |
| 화면 처리 | 프론트 | 서버 |
| 재사용성 | 높음 | 낮음 |
/api/v1/posts
REST API에서는 버저닝을 통해
하위 호환성을 유지한다.
프론트 요구사항 때문에
엔티티 필드를 직접 수정하는 것은 좋지 않다.
예시:
public record PostDto(
long id,
String title,
String content
) {
}
엔티티 대신 DTO를 응답 객체로 사용했다.
.map(PostDto::new)
record 기반 DTO 구조로 변경했다.
/api/v1/comments
댓글 전체 조회 기능을 구현했다.
/api/v1/posts/1/comments/2
특정 게시글의 댓글 단건 조회를 구현했다.
| 방식 | 예시 |
|---|---|
| 평면 리소스 | /api/v1/comments |
| 중첩 리소스 | /api/v1/posts/1/comments |