## 첨부파일 모듈 실제 운영 시나리오: 외부 모듈과의 협업
작성하신 컨트롤러를 보니 **파일의 생애주기(업로드, 조회, 다운로드, 삭제, 영구 삭제)**를 처리하는 API 규격이 아주 잘 잡혀 있습니다. 특히 `uploadNewGroup`에서 ID를 먼저 생성해서 반환하고, 클라이언트가 이 ID를 나중에 메인 데이터와 엮어서 보내는 방식은 현대적인 SPA/앱 환경에서 가장 선호되는 방식입니다.
---
### 🧐 실제 운영 시나리오: 게시판(Board) 모듈과의 협업
1. **파일 업로드 (사용자 → AttachFileController)**
- 사용자가 글쓰기 화면에서 파일을 올립니다.
- `uploadNewGroup`이 호출되고, 서버는 물리 파일을 저장한 뒤 `AttachFileId` (예: "01JBT...")를 반환합니다.
- 이때 DB에는 `is_linked = false` 상태로 저장되어 있습니다. (Moments가 째깍째깍 삭제 타이머를 돌리기 시작합니다.)
2. **본문 저장 (사용자 → BoardController)**
- 사용자가 "저장" 버튼을 누르면 게시판 모듈로 본문 내용과 함께 아까 받은 `attachFileId`를 보냅니다.
- 게시판 모듈은 자기 테이블에 이 ID를 저장합니다.
3. **연결 확정 (Board 모듈 → AttachFile 모듈)**Java
- **이 시점이 바로 아까 우리가 정의한 이벤트를 던지는 순간입니다!**
- 게시판 모듈 내부에서 다음 코드가 실행됩니다.
```java
// BoardService.java 내부
eventPublisher.publishEvent(new AttachFileConfirmCommand(attachFileId));
```
- `AttachFile` 모듈의 리스너가 이를 받아 `is_linked = true`로 바꿉니다. 이제 이 파일들은 안전하게 보호됩니다.
---
### 🏛️ 컨트롤러 코드에 대한 Pragmatic 리뷰
동환님의 컨트롤러 코드에서 한두 가지만 보완하면 완벽할 것 같습니다.
### 1. `uploadNewGroup`의 응답 구조
현재는 `String`으로 ID만 반환하고 있는데, 보통 클라이언트에서는 업로드 직후 화면에 파일 목록을 그리거나 썸네일을 보여줘야 합니다. ID와 함께 **업로드된 파일들의 정보(FileItemResponse 목록)**를 같이 내려주면 클라이언트가 두 번 요청(`GET`)할 필요가 없어 더 효율적입니다.
### 2. 사용자 정보(Auditor) 주입
현재 `"SYSTEM"`으로 하드코딩된 부분을 실제 로그인한 사용자 정보로 바꿀 준비를 해야 합니다. (예: `SecurityContextHolder` 또는 커스텀 `@LoginUser` 어노테이션 활용)
### 3. `purgeFile`과 `remove`의 구분
- `remove` (POST): 사용자가 화면에서 'X' 버튼을 눌렀을 때 호출. `isRemoved = true`가 되고, 나중에 마음이 바뀌면 복구할 수도 있습니다.
- `purge` (DELETE): 관리자가 강제로 지우거나 특수한 경우.
- *배치(Moments)**는 이 두 가지를 모두 체크해서 깨끗하게 치워줄 것입니다.
댓글
댓글 쓰기