πŸ“Œ μˆœμ„œ: CreateBoard 흐름 (ν—₯사고날 μ•„ν‚€ν…μ²˜ 관점)

0) μ‚¬μš©μž μš”μ²­

POST /api/boards
Content-Type: application/json

{
  "authorId": 1,
  "title": "첫 번째 κΈ€",
  "content": "μ•ˆλ…•ν•˜μ„Έμš”!"
}


1) Input Adapter (μ™ΈλΆ€μ—μ„œ λ“€μ–΄μ˜€λŠ” μš”μ²­ β†’ 포트 호좜)

@PostMapping
public ResponseEntity<Long> create(@Valid @RequestBody CreateBoardRequest req) {
    Long id = createBoardUseCase.handle(req.getAuthorId(), req.getTitle(), req.getContent());
    return ResponseEntity.ok(id);
}

πŸ‘‰ ControllerλŠ” μ™ΈλΆ€ 세계(Web)와 도메인을 μ΄μ–΄μ£ΌλŠ” μž…λ ₯ μ–΄λŒ‘ν„°.


2) Input Port (μœ μŠ€μΌ€μ΄μŠ€ μΈν„°νŽ˜μ΄μŠ€ = Application Layer)

@Transactional
public Long handle(Long authorId, String title, String content) {
    Board created = Board.create(authorId, title, content); // 도메인 κ·œμΉ™ μ‹€ν–‰
    return boardRepository.save(created).getId();           // 좜λ ₯ 포트 호좜
}

πŸ‘‰ CreateBoardUseCaseλŠ” β€œκ²Œμ‹œκΈ€ μž‘μ„±β€ μœ μŠ€μΌ€μ΄μŠ€λ₯Ό μ •μ˜ν•œ Input Port.


3) Domain (λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™ μ‹€ν–‰)

public static Board create(Long authorId, String title, String content) {
    LocalDateTime now = LocalDateTime.now();
    return new Board(null, authorId, title, content, now, null);
}