티스토리 뷰
지난 글에서는 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에도 잘 적재되는것을 확인했다.
'게시판 만들기 > 2주차' 카테고리의 다른 글
| 만들자 게시판 2주차 (6) - Board 삭제 API 구현 (0) | 2026.07.11 |
|---|---|
| 만들자 게시판 2주차 (5) - Board 수정 API 구현 (0) | 2026.07.11 |
| 만들자 게시판 2주차 (4) - Board 조회 API 구현 (0) | 2026.07.11 |
| 만들자 게시판 2주차 (2) - 카테고리 조회 API 구현 (0) | 2026.07.09 |
| 만들자 게시판 2주차 (1) - 1주차 마무리, 그리고 2주차 스프링부트로 (0) | 2026.07.09 |
