Day 54 - Rest API

haxxru log;·2026년 5월 20일
post-thumbnail

이 글은 2026년 05월 19일 작성된 글입니다.

오늘은 REST API 기반 프로젝트 세팅과
JPA, DTO, API 버저닝, 댓글 API 구현까지 정리했다.


1. REST API 프로젝트 세팅

implementation("org.springframework.boot:spring-boot-starter-web")

REST API 서버 개발에 필요한 기본 의존성을 추가했다.


2. REST API vs 타임리프

REST API 방식에서는
백엔드는 데이터(JSON)만 제공한다.

{
  "id": 1,
  "title": "제목 1",
  "content": "내용 1"
}

타임리프 방식은 HTML까지 서버에서 렌더링해서 응답한다.


3. Post 도메인 구성

  • JPA
  • BaseEntity
  • InitData
  • Profile 설정

등 게시글 도메인의 기본 구조를 구성했다.


4. 게시글 샘플 데이터 생성

postService.write("제목 1", "내용 1");

게시글 3개를 자동 생성하도록 구성했다.


5. 댓글 도메인 추가

postCommentService.write(post, "댓글 1");

댓글 기능과 샘플 데이터 5개를 추가했다.


6. 글 다건조회 API

@GetMapping
public List<Post> getPosts() {
    return postService.findAll();
}

엔드포인트:

/api/v1/posts

7. 순환참조 문제

양방향 연관관계에서는
JSON 직렬화 시 무한 루프가 발생할 수 있다.


8. @JsonIgnore

@JsonIgnore
private Post post;

순환참조를 방지하기 위해 적용했다.


9. @RestController

@RestController
@RequestMapping("/api/v1/posts")

@RestController
JSON 응답을 위한 컨트롤러이다.


10. 글 단건조회 API

@GetMapping("/{id}")
public Post getPost(@PathVariable long id)

엔드포인트:

/api/v1/posts/3

11. Jackson

Jackson은 Java 객체와 JSON 간 변환을 담당한다.

기능:

  • 객체 → JSON
  • JSON → 객체

12. REST API vs 타임리프 비교

구분REST API타임리프
응답JSONHTML
화면 처리프론트서버
재사용성높음낮음

13. API 버저닝

/api/v1/posts

REST API에서는 버저닝을 통해
하위 호환성을 유지한다.


14. 엔티티 직접 노출 문제

프론트 요구사항 때문에
엔티티 필드를 직접 수정하는 것은 좋지 않다.

예시:

  • createDate → createdDate
  • title → subject
  • content → body

15. DTO 도입

public record PostDto(
    long id,
    String title,
    String content
) {
}

엔티티 대신 DTO를 응답 객체로 사용했다.


16. record 사용

.map(PostDto::new)

record 기반 DTO 구조로 변경했다.


17. 댓글 다건조회 API

/api/v1/comments

댓글 전체 조회 기능을 구현했다.


18. 댓글 단건조회 API

/api/v1/posts/1/comments/2

특정 게시글의 댓글 단건 조회를 구현했다.


19. 평면 리소스 vs 중첩 리소스

방식예시
평면 리소스/api/v1/comments
중첩 리소스/api/v1/posts/1/comments

✅ 정리

  • REST API 프로젝트를 구성하면서 JSON 기반 응답 구조를 이해할 수 있었다.
  • 양방향 연관관계에서는 순환참조 문제가 발생할 수 있으며 @JsonIgnore로 해결할 수 있다.
  • DTO를 사용하면 엔티티와 API 응답 구조를 분리할 수 있다.
  • API 버저닝을 통해 하위 호환성을 유지하면서 API를 확장할 수 있다.
  • 댓글 API까지 추가하면서 게시글과 댓글 간 관계 구조를 구현할 수 있었다.

0개의 댓글