본문으로 건너뛰기

아키텍처 개요

1. 시스템 아키텍처

1.1 전체 구조

1.2 주요 컴포넌트

  • Cloud Run: 서버리스 컨테이너 플랫폼
    • 상태 비저장 컨테이너를 자동으로 확장하여 실행
    • 서버리스 마이크로서비스, API 서비스, 웹 애플리케이션 지원
    • 자세한 내용은 Cloud Run 참조
  • Cloud SQL: PostgreSQL 데이터베이스
    • 완전 관리형 관계형 데이터베이스 서비스
    • 트랜잭션 데이터 저장, 사용자 정보 관리
    • 자세한 내용은 Cloud SQL 참조
  • Cloud Memorystore: Redis 캐시
    • 완전 관리형 Redis 서비스
    • 세션 데이터 저장, API 응답 캐싱, 실시간 데이터 처리
    • 자세한 내용은 Cloud Memorystore 참조
  • Cloud Pub/Sub: 이벤트 메시징
    • 완전 관리형 실시간 메시징 서비스
    • 이벤트 기반 아키텍처 구현, 비동기 통신
    • 자세한 내용은 Cloud Pub/Sub 참조
  • Cloud Storage: 파일 저장소
    • 확장 가능한 객체 저장소
    • 사용자 업로드 파일, 정적 자산 관리
  • Firestore: NoSQL 문서 데이터베이스
    • 완전 관리형 NoSQL 문서 데이터베이스
    • 실시간 데이터 저장 및 동기화, 준구조화된 데이터 저장
    • 자세한 내용은 Firestore 참조
  • BigQuery: 서버리스 데이터 웨어하우스
    • 대용량 데이터 분석, 보고서 생성 및 BI
    • 자세한 내용은 BigQuery 참조
  • Firebase: 모바일 및 웹 애플리케이션 개발 플랫폼
    • 푸시 알림(FCM), 실시간 데이터베이스, 사용자 인증
    • 자세한 내용은 Firebase 참조

2. 애플리케이션 아키텍처

2.1 계층 구조

2.2 주요 기술 스택

  • 프레임워크: NestJS
  • 언어: TypeScript
  • ORM: Prisma
  • 데이터베이스: PostgreSQL
  • 캐시: Redis
  • 메시징: GCP Pub/Sub

3. 데이터 계층

3.1 Prisma ORM

  • Schema-first 개발 방식
  • 타입 안전성 보장
  • 자동 생성된 타입과 클라이언트
  • 마이그레이션 자동화
// schema.prisma 예시
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

generator client {
provider = "prisma-client-js"
}

model User {
id String @id @default(uuid())
email String @unique
name String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

3.2 데이터베이스 설계

  • 도메인 중심 스키마 설계
  • 관계형 데이터 모델링
  • 인덱스 전략
  • 샤딩 고려사항

4. 서비스 계층

4.1 도메인 서비스

  • 비즈니스 로직 캡슐화
  • 트랜잭션 관리
  • 이벤트 발행
  • 도메인 규칙 적용
@Injectable()
export class UserService {
constructor(
private prisma: PrismaService,
private pubSubClient: PubSub
) {}

async createUser(data: CreateUserDto): Promise<User> {
const user = await this.prisma.user.create({
data: {
email: data.email,
name: data.name
}
});

const messageId = uuidv4();
const message = {
eventId: messageId,
eventType: 'user-created',
timestamp: Date.now(),
data: user
};

const messageBuffer = Buffer.from(JSON.stringify(message));
await this.pubSubClient.topic('user-events').publish(messageBuffer);

return user;
}
}

4.2 인프라 서비스

  • 캐시 관리
  • 이벤트 처리
  • 외부 서비스 통합
  • 파일 저장소 관리

5. API 계층

5.1 REST API

  • 리소스 기반 설계
  • 버전 관리
  • 응답 형식 표준화
  • 에러 처리
@Controller('v1/users')
export class UserController {
constructor(private userService: UserService) {}

@Post()
async createUser(@Body() data: CreateUserDto): Promise<ApiResponse<User>> {
const user = await this.userService.createUser(data);
return {
status: 201,
data: user
};
}
}

5.2 GraphQL API (선택적)

  • 스키마 정의
  • 리졸버 구현
  • 타입 안전성
  • N+1 문제 해결

6. 보안 계층

6.1 인증

  • JWT 기반 인증
  • 토큰 갱신

6.2 인가

  • RBAC 구현
  • 권한 검증
  • API 보안
  • 데이터 접근 제어

7. 모니터링

7.1 애플리케이션 모니터링

  • 성능 메트릭
  • 에러 추적
  • 로그 수집
  • 알림 설정

7.2 인프라 모니터링

  • 리소스 사용량
  • 가용성 모니터링
  • 비용 모니터링
  • 보안 감사

7.3 로깅 시스템

  • 통합 출력 전략 아키텍처
  • 표준화된 로그 포맷
  • 로그 레벨별 처리
  • 환경별 로깅 전략
  • Pub/Sub 기반 실시간 로그 처리

참고: 로깅 아키텍처 문서는 현재 개발 중입니다. 추후 업데이트될 예정입니다.

8. 개발 환경

8.1 로컬 개발

  • Docker Compose 환경
  • 개발 데이터베이스
  • 테스트 데이터
  • 디버깅 도구

8.2 CI/CD

  • Cloud Build 파이프라인
  • 자동화된 테스트
  • 자동 배포
  • 환경 분리

관련 문서

변경 이력

버전날짜작성자변경 내용
0.1.02025-03-17bok@weltcorp.com최초 작성
0.1.12025-03-21bok@weltcorp.com로깅 아키텍처 다이어그램 중앙화
0.1.22025-03-26bok@weltcorp.com인프라 문서 참조 추가 및 클라우드 서비스 상세 정보 업데이트