**“뽀모도로는 어렵지 않아요! groupNote와 함께하세요!”
- 프로젝트명: groupNote pomodoro
- 기간: 2025.5.26 ~ 2025.6.20 (기획 1주 / 개발 및 배포 4주)
- 목적: 팀단위 작업-휴식시간 관리를 위한 프로젝트
- 대상 사용자: 팀단위로 뽀모도로 등의 시간 관리 기법을 도입하고 운용하려는 사람들
팀 프로젝트를 수행하면서 하루 단위로 시간 관리를 했었습니다.
그러던 도중 뽀모도로라는 시간 관리 기법을 보게되었고,
팀단위로 작업-휴식시간 관리를 해야된다면 어떻게 해야 될지 생각해보았습니다.
해당 레포지토리는 groupNote pomodoro 서비스의 서버 관련 코드를 관리하는 저장소입니다.
⸻
기존의 레이어드 아키텍처(Layered Architecture) 에 클린 아키텍처(Clean Architecture) 사상을 적용해서 다음과 같은 4개의 주요 레이어로 구성되어 있습니다.
-
Domain 레이어 • 서비스의 핵심 비즈니스 규칙과 도메인 모델을 정의합니다. • 기술 구현과 무관한 순수한 로직(엔티티, 도메인 서비스 등)을 포함합니다. • 저장소에 대한 접근은 직접 하지 않으며, repository interface만 정의합니다.
-
Application 레이어 • 실제 사용자의 요청에 대한 유스케이스를 정의합니다. • 도메인 객체들을 조합하여 구체적인 작업 흐름을 구성합니다. • 트랜잭션 제어, 서비스 호출 순서 관리 등 처리 흐름을 담당합니다.
-
Interface 레이어 • 외부와의 연결 지점으로, Controller, Module, DTO 등이 포함됩니다. • 클라이언트 요청을 받아 application layer의 유스케이스를 호출하고, 응답을 반환합니다. • 인증, 권한 체크, 요청값 검증 등의 역할도 이 레이어에서 처리합니다.
-
Infrastructure 레이어 • 데이터베이스, 파일 시스템, 외부 API 등 외부 시스템과의 연결을 담당합니다. • repository interface의 실제 구현체들이 이곳에 위치합니다. • Prisma ORM, S3, Redis 등의 외부 도구를 사용하는 구체적인 코드가 포함됩니다.
- 사용자는 본인이 속할 그룹을 생성할 수 있습니다
- 사용자는 본인이 원하는 그룹에 등록할 수 있습니다
-
사용자는 작업시간, 휴식시간이 될 때마다 알림을 받을 수 있습니다.
-
사용자는 사이클마다 있었던 이슈나 작업에 대한 피드백을 그룹원들과 공유할 수 있습니다.
- Framework: ReactNative Expo
- Framework: NativeWind
- Framework: NestJS
- Database: MySQL
- Infrastructure: Redis
- ORM: Prisma
React Native Expo는 TypeScript/React만으로 빠르고 손쉽게 크로스플랫폼 모바일 앱을 개발할 수 있는 관리형 프레임워크입니다. Expo Go를 통해 여러 기능들을 지원받을수 있습니다.
Flutter는 Expo와 마찬가지로 많은 지원기능이 있지만 Dart를 비솟하여 고유의 러닝 커브들이 존재하고, Expo를 통해 배포도 가능하기 때문에 Expo를 사용하기로 했습니다.
Nest.js는 모듈 기반 아키텍처와 의존성 주입 기능, 데코레이터 기능들을 제공하는 TypeScript 중심의 Node.js 프레임워크입니다. Node.js를 기반으로 하기 때문에 빌드된 컨테이너의 크기가 작고, 런타임에 기본적으로 점유하는 리소스도 적어 신규 서비스를 제작하고 운영하는데 적합합니다.
Express.js 와 비교하여, 데코레이터와 모듈 의존성 컨트롤 등을 추가로 학습해야 되지만, 토큰 관리 같은 널리 쓰이는 기능들을 데코레이터를 통해 쉽게 사용할 수 있고, 리소스 점유나 빌드된 컨테이너 파일등이 전체적으로 가볍기 때문에 AWS 배포에도 적합하다고 판단되어 Nest.js 를 사용하기로 했습니다.
Prisma는 선언형 스키마와 자동 마이그레이션, 타입 선언과 검사, 직관적 API로 개발 생산성과 안정성을 극대화하는 ORM입니다. 작성한 스키마를 통해 실제 DB에 구조를 자동 생성할 수 있으며, SQL대신 Prisma에서 제공하는 기능을 사용하여 실제로 쿼리를 요청하기 전에 에러를 감지할 수 있고, transaction 같은 기능들도 Prisma를 통해 간단하게 사용할 수 있습니다.
TypeORM도 SQL 대신 제공하는 기능들을 쓸 수 있으나, 컴파일 단계에서 타입 검사를 하지 않아 오류 검사, 수정이 번거롭고, Prisma에 비해 자동으로 제공하는 기능이 적어 개발 소요가 늘어날 수 있습니다. 그래서 좀 더 간편하게 사용할 수 있고 다양한 기능들을 제공하는 Prisma를 사용하기로 했습니다.
MySQL은 오픈 소스 기반의 관계형 데이터베이스 관리 시스템으로, 안정적이고 효율적으로 대용량 데이터를 저장·관리할 수 있습니다. 데이터의 타입을 정의하여 잘못된 값이 기록될 상황을 방지할 수 있으며, 트랜잭션의 주요 속성인 ACID를 준수합니다. AWS를 비롯한 많은 클라우드플랫폼에서 MySQL을 지원하기 때문에 다양한 상황, 환경에서도 안정적으로 사용할 수 있습니다.
MongoDB등을 포함한 NoSQL은 유연한 데이터 구조를 가질 수 있으나, 현재 개발 프로젝트는 명확한 데이터 구조를 가지고 있고, 이를 자동으로 엄격하게 관리해야 하기 때문에 관계형 데이터베이스를 사용하기로 했습니다.
Redis는 메모리 기반의 고성능 키-값 데이터 저장소로, 사용자와 서버, 서버와 서버 사이에서 임시로 사용하는 데이터들을 관리하는데 사용합니다. 문자열(string), 리스트(list), 집합(set), 정렬된 집합(sorted set), 해시(hash) 등 다양한 데이터 구조를 메모리에서 직접 지원해 복잡한 캐시·큐를 손쉽게 구현할 수 있습니다. 또한 Pub/Sub과 Streams 기능을 활용해 실시간 메시징, 이벤트 기반 처리, 작업 파이프라인 기능을 통해 분산 시스템을 지원할 수 있습니다
현재 개발 프로젝트에서는 RefreshToken의 화이트리스트를 관리하기 위해 사용하기로 했습니다.
nativeWind의 .plugins is not a valid Plugin property 오류가 발생.
대다수의 조언이나 해결책, 팁은 nativeWind 의 버전을 다운그레이드 하라고 했지만, 버전을 다운그레이드하면 contentContainerClassName 등을 쓰지 못하는 문제가 있었습니다. 버전을 다운그레이드하면 nativeWind 코드를 CSS 코드로 바꿔 작업해야 했습니다.
임시로 다운그레이드하여 빠르게 CSS코드를 체크한 후 오류를 수정하고, 버전업을 수행하기 위해 공식 홈페이지를 참조하여 높은 버전으로 재설치를 수행하였습니다. CSS 코드에 문제가 있었기에, 버전업 후 이를 해결하려 했다면 상당히 복잡한 문제가 될 수도 있었습니다.
라이브러리 변경은 가능한 캐사와 빌드를 삭제하고 개발툴을 재실행하여 확인해야 제대로 변경되었는지 확인할 수 있습니다.
Name | GitHub | |
---|---|---|
이승민 | [email protected] | https://github.com/leesm0218 |
이승민
아이디어 발굴 기간이 포함된 개발기간은 정말 짧다는것을 느꼈습니다. 앱 개발은 세팅부터 많은 오류가 난다는것을 모르고 시작해서 많은 고생을 했습니다. 이러한 경험이 좀 더 나은 실력의 밑바탕이 되도록 더욱 노력하겠습니다.좋았던점: 앱 개발 세팅과 Expo를 사용하는법, FireBase를 통한 알림 송신 등을 실제로 해보고 노하우를 얻을 수 있었습니다.
클린 아키텍쳐를 한번 더 실습해보고 이름 짓는법, 미리 작성하여 복사 후 개발할 수 있는 템플릿 코드등의 노하우를 얻을 수 있었습니다.
아쉬웠던점: Prisma 가 DB와 nestJs 중간에서 DB에 대한 의존성을 낮추고 있음에도 service와 infraStructure를 모듈화 시켜 의존성을 역전시킬 필요가 있는지 확실하게 결론을 내지 못해 아쉬웠습니다.
보완할점: 처음 하는 앱 개발 세팅이다보니 라이브러리 호환, 세팅 이슈가 많았습니다. 이러한 시행착오들을 제대로 기록하고 다음에는 더 빠른 개발 속도를 낼 수 있도록 노력하겠습니다.