LandlordOS 구축: Next.js 16을 활용한 현대적인 부동산 관리 시스템
Source: Dev.to
소개
저는 최근에 LandlordOS를 출시했습니다. 이 시스템은 소규모~중규모 임대인(5–50대의 임대 유닛)을 위해 설계된 부동산 관리 시스템입니다. 여러 임대인과 이야기를 나눈 후, 공통된 문제점을 발견했습니다: 그들은 두 극단 사이에 끼어 있었습니다:
- 엔터프라이즈 소프트웨어 – 월 $200 이상이며, 그들이 절대 사용하지 않을 기능들을 포함하고 있습니다.
- Google Sheets – 다루기 힘들고 오류가 발생하기 쉽습니다.
LandlordOS는 그 중간에 위치하는 것을 목표로 합니다: 일상 사용에 충분히 간단하면서도 실제 비즈니스 운영을 처리할 수 있을 만큼 견고합니다.
Technical Stack
- Next.js 16와 App Router (서버‑사이드 렌더링)
- TypeScript를 사용한 엔드‑투‑엔드 타입 안전성
- **PostgreSQL (Neon)**을 이용한 신뢰성 높은 데이터 저장
- Drizzle ORM을 통한 타입‑안전 데이터베이스 쿼리
- NextAuth.js v5를 이용한 인증
- Vercel을 사용한 배포 및 Edge Runtime
핵심 기능
- 자산 관리
- 상세 정보를 포함한 여러 부동산 추적
- 부동산 내 개별 유닛 관리
- 점유 상태 및 가용성 모니터링
- 세입자 관리
- 세입자 연락처 정보 저장
- 세입자를 특정 유닛에 연결
- 임대 관리
- 시작/종료 날짜가 포함된 임대 계약 추적
- 결제
- 결제 기록 (금액, 날짜, 방법)
- 세입자별 결제 내역 보기
- 미지불 잔액 추적
- 정비 요청
- 문제 제출 및 추적
- 우선순위 수준: 낮음 / 보통 / 높음 / 긴급
- 상태 추적: 대기 중 / 진행 중 / 완료 / 취소됨
보안
보안은 최우선 과제였습니다. 구현된 조치는 다음과 같습니다:
Double‑Submit Cookie CSRF 보호 (Edge Runtime)
export function validateCsrfToken(token: string, cookieToken: string): boolean {
// implementation...
}
인증 엔드포인트에 대한 속도 제한
await authLimiter.check(5, identifier); // 5 requests per 15 minutes
XSS 및 SQL 인젝션 방지
// Example of parameterized query with Drizzle ORM
const result = await db
.select()
.from(payments)
.where(eq(payments.id, sanitizedId));
공개 라우트 우회
if (isPublicRoute) {
// Skip authentication and DB calls in Edge Runtime
return NextResponse.next();
}
테스트
Comprehensive testing ensured quality:
- 31개의 단위/통합 테스트 covering:
- 사용자 인증 (회원가입, 로그인, 비밀번호 검증)
- 부동산, 세입자 및 유닛 관리
- 결제 기록
- 유지보수 요청
- 보안 (XSS, SQL 인젝션)
Result: 100 % 통과율
- 실제 사이트에서 수행된 8개의 엔드‑투‑엔드 테스트 covering:
- 페이지 로드 검증
- 사용자 회원가입 흐름
- 로그인 기능
- 네비게이션
- 핵심 기능 테스트
- Stripe 결제 연동
Result: 프로덕션에서 100 % 통과율
배포 여정
처음에 Cloudflare Pages와 Netlify를 시도했지만, Server Components를 사용하는 Next.js App Router는 정적 배포와 호환되지 않습니다. Vercel은 필요한 기능을 기본적으로 지원하므로 프로젝트를 해당 플랫폼에 배포했습니다.
환경 변수
| 변수 | 목적 |
|---|---|
DATABASE_URL | Neon PostgreSQL 연결 문자열 |
NEXTAUTH_SECRET | 세션 암호화 키 |
NEXTAUTH_URL | 인증 콜백 URL |
STRIPE_SECRET_KEY | Stripe 결제 처리 |
NEXT_PUBLIC_GA_MEASUREMENT_ID | Google Analytics 측정 ID |
미들웨어 고려 사항
미들웨어는 Edge Runtime에서 실행되며, 이 환경에는 많은 Node.js API가 없습니다. 초기에는 미들웨어가 공개 라우트를 포함한 all 라우트에 대해 auth()를 호출했으며, 데이터베이스 드라이버가 Edge 환경에서 실행될 수 없어 충돌이 발생했습니다. 해결 방법은 공개 라우트에 대해 조기 반환을 추가하는 것이었습니다 (위의 “Public Route Bypass” 스니펫을 참고하세요).
TypeScript Benefits
- 개발 중에 수많은 버그를 잡아냈습니다.
- 모든 것을 타입화하는 초기 비용이 즉시 보상되었습니다.
- 100 % 테스트 통과율을 강제하여 엣지 케이스를 신중히 처리하도록 했습니다.
향후 개선 사항
- 임대 계약서/협약서 문서 업로드
- 이메일을 통한 자동 임대료 알림
- 재무 보고 및 분석
- 모바일 앱 (React Native)
- 다국어 지원
라이브 데모
애플리케이션을 탐색하세요:
피드백 요청
저는 다음 분들의 의견을 듣고 싶습니다:
- 실제 시나리오에서 사용하고 있는 부동산 관리자
- 아키텍처에 관심 있는 개발자
- 유사한 SaaS 제품을 구축하고 있는 모든 분
부동산 관리 시스템에 무엇을 추가하고 싶으신가요?