본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 28. 06:55

카탈로그 다듬기 (그리고 에이전트의 영수증 읽기)

요약

OtakuShelf 프로젝트를 대상으로 에이전트를 활용해 엔티티에 페이지네이션, DTO, 서비스 레이어를 적용하고 누락된 필드를 추가하는 과정을 다룹니다. 특히 코드 생성 시 발생할 수 있는 데이터 손실을 방지하기 위한 백업 및 롤백 전략을 설명합니다.

핵심 포인트

  • JDL 옵션을 통한 일관된 엔티티 구조(Pagination, DTO, Service) 구축
  • 코드 생성기 실행 시 기존 수동 편집 내용을 보호하기 위한 백업 전략
  • 에이전트의 `--force` 옵션 사용 시 안전한 롤백 경로 제공

OtakuShelf는 이제 모든 것을 모델링하지만, 프로토타입다운 습관을 가진 프로토타입입니다. Sam이 지난주에 추가한 애니메이션 엔티티 (entities)에는 페이지네이션 (pagination)이 적용되지 않았고, 어디에도 DTO가 없으며, — Sam이 _Attack on Titan_을 추가하다가 방금 발견한 사실인데 — 특정 프랜차이즈 (franchise)가 일본에서 왔는지, 한국에서 왔는지, 혹은 다른 어디에서 왔는지를 기록할 곳이 없습니다. 이제 다듬는 작업 (polish pass)을 할 시간입니다. 그리고 OtakuShelf는 Sam이 직접 수정한 실제 프로젝트이기에, 이 단계는 안전망 (safety net)이 제 역할을 하는 지점이기도 합니다.

프로덕션 형태처럼 만들기

첫 번째는 일관성입니다. Sam은 새로운 애니메이션 엔티티에도 페이지네이션을 적용하고 싶어 하며, API가 엔티티를 직접 노출하지 않도록 전반적으로 DTO + 서비스 레이어 (service layer)를 구축하고자 합니다.

/Users/sam/projects/otakushelf에서 모든 엔티티에 페이지네이션을 적용하고, 모든 엔티티를 MapStruct DTO와 서비스 레이어 뒤로 배치하세요.

에이전트는 이러한 JDL 옵션 라인을 위한 정확한 도구인 set_option을 호출하여 다음과 같이 적용합니다:

paginate * with pagination
dto * with mapstruct
service * with serviceClass

지난번과 마찬가지로 dryRun 습관을 유지합니다. Sam은 미리보기를 통해 리소스/서비스 레이어와 Vue 서비스가 재생성되는 것만 확인하고 적용합니다. 극적인 변화는 없으며, 이것이 핵심입니다. 옵션 변경은 지루해야 합니다.

Sam이 잊어버린 필드

이제 누락된 필드 차례입니다. 이 순간은 사람들이 재생성기 (regenerators)에 대해 불안함을 느끼게 만드는 지점입니다. Sam은 Franchise Vue 상세 보기 (detail view)를 수동으로 편집했지만 아직 커밋 (commit)하지 않았습니다. 필드를 추가한다는 것은 Sam이 건드린 파일들에 대해 --force 옵션을 사용하여 생성기를 다시 실행한다는 것을 의미합니다. 그래서 Sam은 이중 안전장치 (belt and suspenders)를 요청합니다:

FranchiseoriginCountry (string)를 추가하세요. 내 편집 내용이 덮어씌워질 경우를 대비해 먼저 백업을 생성하여 롤백 (roll back)할 수 있도록 하세요.

두 가지 일이 일어납니다. 에이전트가 (프로젝트의 엔티티 리소스(entities resource)를 통해) 현재의 Franchise를 읽고, 기존의 모든 필드에 originCountry를 더하여 다시 선언(re-declare)합니다. JDL에서 엔티티를 다시 선언하는 것은 기존 것을 교체하는 것이며, 에이전트는 불완전하게 정의된 엔티티를 내보내지 않아야 한다는 것을 알고 있으므로 title/synopsis/status/startYear는 그대로 유지됩니다. 그리고 Sam이 백업을 요청했기 때문에, 서버는 --force 실행 _전(before)_에 프로젝트를 임시 폴더에 스냅샷(snapshot)으로 찍어두고, 바로 붙여넣어 사용할 수 있는 탈출 경로를 전달합니다:

Backup taken before this run: /tmp/jhipster-mcp-backup-otakushelf-9fA2
To roll back:
  cp -R "/tmp/jhipster-mcp-backup-otakushelf-9fA2/." "/Users/sam/projects/otakushelf/" && rm -rf "/tmp/jhipster-mcp-backup-otakushelf-9fA2"

이것은 일반적인 백업 디렉토리이며 git이 아닙니다. MCP는 Sam의 저장소(repo)를 절대 건드리지 않습니다. (솔직히 Sam의 트리(tree)가 깨끗한 상태였다면 커밋(commit)이 동일한 역할을 했겠지만, 이 백업은 정확히 아직 커밋되지 않은 상황을 위해 존재하는 것입니다.) 결과적으로 재생성(regeneration)은 깔끔하게 이루어졌고 Sam의 편집 내용도 살아남았으므로, 백업은 사용되지 않았습니다. 이것이 바로 가장 이상적인 형태의 안전망입니다.

영수증 읽기 (Reading the receipts)

Sam은

info 도구는 jhipster info를 실행하고 다음과 같이 내용을 나열합니다: JHipster 9.0.0, PostgreSQL, 그리고 전체 엔티티 (entity) 목록 — Franchise, BookSeries, Book, Anime, Season, Episode. Sam이 기대했던 모든 것이 포함되어 있으며, 불필요한 것은 없습니다. (참고로, 각 생성 과정 동안 진행 상황을 알리는 라인들이 꾸준히 출력되었습니다. 덕분에 실행 시간이 길어져도 멈춘 것처럼 느껴지지 않고, 그저 JHipster가 제 할 일을 하고 있다는 것을 알 수 있었습니다.)

향후 방향 (Where this is going)

이제 OtakuShelf는 DTO (Data Transfer Object) 기반의 깔끔하고 페이지가 구분된 만화 및 애니메이션 카탈로그가 되었으며, Sam은 편안한 작업 리듬을 갖게 되었습니다: 변경 사항을 설명하고, 검증하고, 드라이 런 (dry-run)을 수행하고, 적용하며, 가끔 백업을 병행하는 방식입니다. 그러던 중 JHipster 9.1.0 버전이 출시됩니다. 예전 같았으면 해당 릴리스 노트는 약간의 두려움을 유발했을 것입니다. 이제 Sam은 에이전트가 버전 업그레이드 또한 지루할 정도로 쉽게 만들어주는지 확인해 보려 합니다.

시리즈 다음 편: "OtakuShelf를 JHipster 9.1.0으로 업그레이드하기" — 단 하나의 파일도 변경되기 전, git 없이 버전 업그레이드의 범위를 정하고 미리 살펴보는 과정.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0