원문 캡처 · codyssey.dev
원문 캡처 · codyssey.dev

다보르 민초로프(Davor Minchorov)는 Laravel 8로 만든 사무실 대여 API Ergodnc를 장기 유지보수 관점에서 검토하고, 다섯 가지 흐름을 다시 설계한 리뷰 시리즈를 공개했다. 원본 저장소는 2021년 11월 26일 커밋 42907c0을 기준으로 살폈으며, 재구성 코드는 Laravel 13을 대상으로 한다.

Ergodnc는 모하메드 사이드(Mohamed Said)가 Laravel 공식 유튜브 채널에서 라이브로 만든 프로젝트다. 호스트가 사무실을 등록하고 게스트가 날짜 단위로 예약하며, 관리자가 새 사무실을 승인한다. 리뷰에 따르면 코드베이스에는 컨트롤러 9개, 모델 5개, 기능 테스트 파일 4개와 테스트 39개가 있으며 단위 테스트는 없다.

민초로프는 짧은 컨트롤러, API 리소스를 통한 응답, 의도적인 대량 할당 허용 설정, 다형성 맵 강제 등을 장점으로 꼽았다. 쓰기 엔드포인트 7개 가운데 6개에는 기능 테스트가 있고, 중복 예약 방지에는 Cache::lock을 사용한다. 반면 규칙과 비즈니스 로직이 프레임워크 유형별 폴더와 컨트롤러에 모여 있고, 인증 사용자에 따른 소유권 확인이나 도메인 이벤트 처리 등 장기 유지보수에 필요한 구조는 부족하다고 지적했다.

리뷰에서 제시한 기준은 컨트롤러와 핸들러는 흐름을 조정하고 데이터 소유 모델은 규칙을 책임진다는 것이다. 기능은 명령·핸들러·컨트롤러·요청·리소스·이벤트·리스너를 묶은 수직 슬라이스로 나누며, 모듈 간에는 인터페이스나 이벤트, ID를 통한 읽기 전용 조회로만 연결하도록 재구성한다.

다섯 편의 리뷰는 예약 생성, 예약 취소, 사무실 등록·수정, 사무실과 이미지 삭제, 목록 조회 흐름을 각각 다룬다. 재구성에서는 가격 계산을 값 객체로 옮기고, 소유권 확인을 모델 조회에 포함하며, 수동 검증을 폼 요청으로 나눈다. 비즈니스 규칙 오류는 검증 오류 422 대신 자체 처리되는 409 예외로 바꾸고, 파일 삭제는 큐에 넣은 리스너로 옮긴다. 목록 조회에는 쿼리 핸들러를 적용하고, 호스트 목록의 인증 미들웨어 누락도 다룬다.

재구성은 앱을 Identity, Offices, Reservations 세 모듈로 나눈다. 예를 들어 Reservations는 예약 당시 호스트 ID를 자체 host_user_id 열에 저장해 다른 모듈의 사용자 모델이나 관계에 직접 의존하지 않는다. 기존 데이터는 마이그레이션 사이에서 실행하는 일회성 명령으로 채운다. 리뷰는 자동 증가 기본 키를 그대로 두는 등 일부 기준은 적용하지 않았고, 로그인·가입·로그아웃·태그 처리, 이미지 업로드, 예약 알림 명령도 재구성 범위에서 제외했다고 밝혔다. 기존 테스트가 이전의 422 응답과 삭제 시 200 응답을 기대하므로, 변경된 동작에 맞춰 테스트도 수정해야 한다.

검토 대상 저장소의 커밋 42907c0