티스토리 뷰

지난 글에서는 Category 조회만 구현 했었는데 이번에는 Category처럼 조회만 하는 게 아니라,

처음으로 쓰기(Create) 작업을 했다. 쓰기와 조회는 무엇이 다를까?

 

Category는 조회만 있어서 Response DTO 하나로 끝났는데, Board는 등록/수정이 있어서 클라이언트가 보내는 값을 받을 Request DTO도 필요해졌다.

public record BoardCreateRequest(
    Integer categoryId,
    String title,
    String writer,
    String password,
    String content
) { }

id, viewCount, createdAt처럼 클라이언트가 값을 정할 필요 없는 필드는 Request에 넣지 않았다.

(이 값들이 정확히 어떻게 채워지는지는 등록하면서 삽질을 좀 했는데 뒤에서 말하겠다)

 

흐름이 조회랑 반대 방향으로 돈다
지난 글에서 정리했던 조회의 흐름(Entity → Converter → Response)이랑 다르게, 등록은 데이터가 거꾸로 들어온다.

 

전체적인 흐름을 정리하자면 이렇다

1. 클라이언트   →  Controller     (BoardCreateRequest를 요청 본문에 담아 전송)
2. Controller   →  Service          (Request 그대로 전달)
3. Service       →  Converter      (Request → Entity 변환 요청)
4. Converter   →  Service          (Entity 반환)
5. Service       →  Mapper         (Entity로 INSERT 요청)
6. Mapper       →  DB                (INSERT 실행)
7. DB              →  Mapper         (생성된 id 반환)
8. Mapper       →  Service         (완료, board.id 채워짐)
9. Service       →  Converter     (Entity → Response 변환 요청)
10. Converter →  Service         (Response 반환)
11. Service     →  Controller     (Response 반환)
12. Controller →  클라이언트    (201 등으로 응답)

3-4번: Request → Entity 들어오는 데이터를 저장 가능한 형태로 

9-10번: Entity → Response 저장된 데이터를 보여줄 형태로

Converter가 한 요청 안에서 두 번, 서로 다른 방향으로 호출된다는 것이다

 

위에서 말한 트러블 슈팅 (id는 채워지는데 viewCount/createdAt은 null)

BoardMapper.xml에 useGeneratedKeys="true" keyProperty="id"를 걸어두면, INSERT 후에 자바 객체의 id에 DB가 생성한 값이 자동으로 채워진다. 근데 처음 만들고 테스트해보니 응답이 이렇게 나왔다

{"id":1, ..., "viewCount":null, "createdAt":null}

ㅋㅋㅋ

 

원인으로 view_count, created_at은 DB에 DEFAULT 0, DEFAULT CURRENT_TIMESTAMP로 걸려 있어서 DB엔 정확히 저장되는데, 자바 객체로는 안 돌아온다. 이유를 찾아보니 useGeneratedKeys는 JDBC의 "Generated Keys" 기능을 그대로 쓰는 건데, 이게 딱 AUTO_INCREMENT 키 하나만 돌려주는 좁은 기능이었다. 컬럼 기본값 전체를 가져오는 기능이 아니라, PK 값만 콕 집어서 알려주는 용도였던 것이다

board.setViewCount(0);
board.setCreatedAt(LocalDateTime.now());

그래서 결국 서비스 코드에서 직접 채워주는 걸로 해결했다

 

결과적으로

Postman 사용해서 테스트 했는데 POST /api/boards 호출해서, id, viewCount, createdAt까지 전부 정상적으로 채워진 응답을 확인했고 DB에도 잘 적재되는것을 확인했다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함