ipa 파일 위치
https://github.com/kusitms-com/27th_Meetup_T8_SeeSaw_ipa
Backend repository
https://github.com/kusitms-com/27th_Meetup_T8_SeeSaw_back
나를 이루는 가치를 중심으로
일과 삶을 바라볼 수 있도록 하는 기록 서비스, 시소(SeeSaw)
시소는 일과 삶 사이의 균형을 찾아주는 서비스입니다. 자신을 객관적으로 점검하고, 프로젝트를 정성적으로 기록하며, 가치를 중심으로 일과 삶이 하나의 방향으로 나아가 균형을 찾을 수 있도록 돕습니다.
시소는 '나'를 아우를 수 있는 가치를 바탕으로 일과 삶을 같은 방향으로 정렬하여, 가치를 향해 나란히 나아갈 수 있도록 합니다. 또한 프로젝트를 주기적으로 돌아보며 처음의 목표, 처음의 마음가짐으로 꾸준히 프로젝트에 임하며 마무리할 수 있도록 합니다. 마지막으로 나의 에너지를 객관적으로 파악하며 본인이 감당 가능한 일의 수준을 점검하고, 일상 속 사소한 실천을 통해 에너지를 충전함으로써 지치지 않고 나아갈 수 있도록 합니다.
8조와 Battery의 합성어. 배터리의 어원인 “같은 기능을 하는 조직의 모음”과 “유저에게 에너지를 제공”하는 배터리가 되고 싶다는 희망을 담았습니다.
분야 | 이름 | 포지션 |
---|---|---|
기획 | 김민혜 | 📈 서비스 기획(서비스 정책 확립, 비즈니스 모델 구축) |
기획 | 김서연 | 🔍 서비스 기획(와이어프레임 작성, UX writing) |
기획 | 박주아 | 📋 서비스 기획(서비스 정책 확립, 비즈니스 모델 구축) |
기획 | 양예인 | 🔐 서비스 기획(와이어프레임 작성, 랜딩 페이지 테스트) |
개발 | 이안진 | 🔦 iOS 화면 UI 구현, 서버 연동 |
개발 | 정태우 | 📱 iOS 화면 UI 구현, 서버 연동 |
개발 | 김민근 | 💻 DB 및 API 구축, 서버 배포 |
개발 | 한호정 | 🖥️ DB 및 API 구축, 서버 배포 |
디자인 | 한지원 | 📢 프로젝트 매니징, 서비스 디자인 |
1. 워커홀릭 실태
- 워커홀릭(Workholic)이란, '일과 생활 사이의 균형을 상실하고 강박적으로 일에 매몰되는 현상'을 지칭하는 말로, '과잉적응증후군', '일 중독' 등으로 불립니다.
- OECD의 2021년 통계에 따르면 연간 노동시간이 다른 나라에 비해 많아 한국인이 외국인보다 더 많은 시간 일하고 있음을 알 수 있습니다.
2. 일과 삶의 균형에 대한 수요
- 워라밸(Work-life balance)이란 일과 삶의 균형을 지칭하는 말로, '업무 시간과 그 외의 개인 시간을 명확히 구분하자'라는 취지로 쓰이며 '시간의 균형'을 의미하는 경우가 많습니다.
- 워라하(Work-life harmony)란 일과 삶의 조화를 지칭하는 말로, 일과 삶을 완전히 분리하기보다는 직업과 삶이라는 두 가지 영역 모두에서 만족감을 이끌어내는 라이프 스타일을 의미합니다.
📍 따라서 본 서비스는 '시간의 균형'만 강조했던 기존의 워라밸 개념을 확장해 '가치의 균형을 지향하는 서비스를 제공하고자 합니다.
3. 자체 필드 리서치를 통해 파악한 대학생의 수요
- 프로젝트 경험이 있는 20대 이상 369명을 대상으로 프로젝트 수행 양상에 관한 설문조사를 진행했습니다.
- 일 몰입: 일에 대한 극단적인 투자를 뜻합니다.
- 일 강박: 일을 하지 않고는 안 된다는 강한 내부적 압박감을 뜻합니다.
- 1점(매우 아니다)부터 5점(매우 그렇다)으로 리커트 5점 척도를 사용하였고, 점수가 높을 수록 해당 구성요인이 강력하게 작용한다고 해석하였습니다.
- 자체 필드 리서치 결과, 대학생은 모두 일 몰입, 일 강박 양상이 높게 나타났습니다.
- 일 몰입과 일 강박 모두 3점(보통이다)보다 오른쪽에 많이 분포하고 있어 20대 대학생의 프로젝트 수행에 있어 일 몰입, 일 강박이 실제로 만연하다는 것을 알 수 있었습니다.
워커홀릭을 겪고 있는 사람은 다음과 같은 문제를 경험합니다.
[문제 1] 무엇을 위해 일하는지 생각하지 않고 일 자체에만 몰두함
- 바쁘게 일하지만 지금 하고 있는 일의 목적을 상실하는 경우가 많습니다.
- 특히 청년 세대의 경우 자아실현적 일의 의미를 찾지 못하는 사람이 많습니다.
📍 따라서 어떤 목적 의식을 가지고 어떤 방향으로 자신의 일과 삶을 설계해 나갈지에 대해 점검하는 시간이 필요합니다.
[문제 2] 일을 가장 우선해 신체적/정신적 건강, 인간관계 등 다른 생활 영역을 신경쓰지 못함
- 여가,운동 부족으로 개인의 신체적/정신적 건강에 부정적인 영향을 끼치고 있습니다.
- 가족관계, 사회적 관계에 무관심하고 미숙해져 관계 문제를 야기하고 있습니다.
📍 워커홀릭을 겪고 있는 사람들의 문제를 해결하기 위해서는 일에서의 가치와 삶 전반에서의 가치를 모두 아우르는 가치를 설정하고, 이를 꾸준히 돌아볼 수 있게 하는 서비스가 필요합니다.
시소의 경쟁사로 정의되는 기존 기록 서비스는 다음과 같은 문제점을 가지고 있습니다.
1. 객관적 데이터 기록 서비스
- Garmin 웨어러블 기기를 통해 건강 정보를 제공하는 Garmin Conncet 앱은 배터리 기능을 통해 유저의 신체적 에너지를 정량적으로 보여줍니다.
- 하지만 배터리 증감 기준과 내역을 공개하지 않아 다수의 유저가 측정 기준에 의문을 가지고 있습니다.
- 또한 웨어러블 기기를 통해 수집되는 정량적 데이터를 바탕으로 신체적 에너지만 나타내어 삶 전반의 가치와 주관적 요소를 반영하지 못합니다.
2. 주관적 텍스트 기록 서비스
- 자체 리서치 결과에 따르면, 유저들은 텍스트 기반의 주관적 기록 서비스를 사용할 때 다음과 같은 페인 포인트를 느꼈습니다.
- 모아 보기 힘들어서 회고 이후, 자주 열람하지 않음
- 줄글로 정리하기 번거롭고, 템플릿을 직접 제작하는 것이 어려움
📍 현재 객관적인 데이터 기록에서 시작하여 주관적인 텍스트 기록까지 이어지는 기록 서비스가 부재한 상황입니다. 삶 전반의 가치와 에너지를 모두 반영하고, 언제 어디서든 간편하게 기록 및 열람할 수 있는 기록 서비스가 필요합니다.
시소의 목표 타겟은 일과 삶 중 어느 한 쪽에 치우치지 않고, 일과 삶을 연결 지어 균형을 찾고자 하는 대학생입니다.
1. 여가시간의 필요성은 인지하고 있으나 충분히 갖지 못하는 사람
- 대학생 129명을 대상으로 리서치를 진행한 결과, 평상시 프로젝트 외의 활동(여가, 취미 활동 등)에 시간을 할애할 필요성을 못 느낀다는 답변이 적었기 때문에 여가 시간의 필요성을 느끼고 있음을 파악했습니다.
- 하지만 평상시 프로젝트 외의 활동보다 프로젝트에 할애하는 시간이 길다는 답변에 긍정적인 답변이 나타난 결과를 통해 여가 시간의 필요성은 느끼고 있으나 여가시간을 충분히 갖지 못한다는 문제점을 도출할 수 있습니다.
2. 프로젝트를 통해 배운 것을 인생의 성장으로 연결 짓지 못하는 사람
- ‘청년세대는 자신의 발전에 일의 의미를 두고 있으나, 그것이 자신의 꿈, 사명과는 아직 거리가 있다고 볼 수 있다.’ 라는 전문가의 의견처럼, 여러 학생들이 프로젝트 진행 중 또는 종료 후에 관련된 회고를 진행하지 않아 프로젝트를 통해 배운 것을 인생의 성장으로 연결 짓지 못한다는 문제가 있습니다.
앱 다운로드 건 수 7.7만 건(수익시장의 13.8%) 확보를 시작으로, 점차 시장을 넓혀갈 예정입니다.
TAM | SAM | SOM |
---|---|---|
전국 대학생 | 하나 이상의 프로젝트에 참여하는 대학생 | 프로젝트에 강박감을 느끼는 대학생 |
247만명 | 106만명 | 56만명 |
TAM
전국 대학생 수 2,457,354만명
SAM
대학생 중 43.1%가 하나 이상의 프로젝트에 참여함 : 1,059,120명
SOM
프로젝트에 참여하는 대학생 중 37.2%가 프로젝트에 강박감을 느끼고 있음 : 558,156명
'나'를 이루는 가치를 중심으로
일과 삶을 바라볼 수 있도록 하는 기록 서비스, 시소(SeeSaw)
- 시소(SeeSaw)의 핵심 가치는 Align, Review, Remind로, 유저가 일의 가치와 자신이 추구하는 가치의 괴리에서 오는 공허함을 줄이고, ‘나의 삶의 가치’ 라는 큰 틀 안에서 프로젝트와 삶이 동행할 수 있도록 얼라인을 맞추는 것이 목표입니다.
- 얼라인을 맞춰나가기 위해선 목표를 설정하고, 목표를 향해 달려가는 과정 속에서 끊임없이 점검하는 절차가 필수적입니다.
- 따라서 시소는 ‘가치’를 목표로 설정하고, 프로젝트와 삶을 ‘가치’ 중심으로 바라보고 점검할 수 있는 흐름을 제공하여 일과 삶이 하나의 방향을 향해 나아갈 수 있도록 도와줍니다.
1. ValueLog: 가치 설계도
- 프로젝트와 일상 속에서 각각의 가치를 실현한 내역을 확인할 수 있습니다.
- 최근 5년 간 설정한 가치와 가치 실현 내역을 확인할 수 있습니다.
2. ProjectLog: 프로젝트 회고
- 프로젝트 기간, 강도, 관련된 가치, 목표를 설정함으로써 프로젝트별 회고를 진행할 수 있습니다.
- '상시 회고'와 '오늘의 질문'을 통해 프로젝트를 진행하며 느꼈던 생각과 감정을 상시 기록할 수 있습니다.
- 설정한 프로젝트 기간에 따라 진행되는 ‘중간 회고’와 ‘마지막 회고’를 통해 프로젝트와 삶을 연결 지어 되돌아볼 수 있습니다.
- 프로젝트가 종료된 후, 유저가 작성한 회고를 바탕으로 프로젝트별 리포트를 제공합니다.
3. LifeLog: 에너지 배터리
- 자신의 에너지 상태를 파악할 수 있는 배터리 잔량을 확인할 수 있습니다.
- 유저의 수면시간과 활동량 데이터를 바탕으로 에너지 배터리가 충전/소모 되어 자신의 전반적인 에너지 상태를 확인할 수 있습니다.
- 유저가 설정한 가치와 관련된 실천을 할 경우, 에너지 배터리가 충전되어 바쁜 일상 속에서도 중요한 가치를 잊지 않게끔 도와줍니다.
[Phase 1] 광고료 수익
- 광고 업체의 배너 광고를 앱 내 노출하여 광고료 수익을 얻습니다.
[Phase 2] 프리미엄 구독 상품
- 프리미엄 구독 상품을 통해 수익을 창출하고, 유저 편의성을 제공하여 충성 고객을 확보하고자 합니다.
- 프리미엄 구독 상품을 통해 제공되는 기능은 다음과 같습니다.
- 앱 내 배너 광고 제거
- 고급 프로젝트 리포트 제공
- 프로젝트별 회고록 문서화 다운로드
- 마이페이지 내 키워드 검색 기능
[Phase 3] 플랫폼 사업으로의 확장을 통한 수수료 수익
- 회고 모임, 북 클럽과 같이 소규모의 커뮤니티의 수요가 높아지는 시장 트렌드를 고려하여 시소는 비슷한 가치를 추구하는 유저들이 모일 수 있는 커뮤니티 플랫폼으로의 도약을 시도합니다.
- 서비스를 적극적으로 사용하는 유저를 대상으로 커뮤니티 내 모임 개설 권한을 부여합니다.
- 모임 개설 유저는 하나의 가치를 설정하고, '일과 삶의 균형'에 대한 자신의 노하우와 지식을 공유할 수 있는 모임을 개설할 수 있으며, 일반 유저는 참가비를 지불하고 모임에 참여할 수 있습니다.
- 유저들간의 네트워킹을 통해 서로의 삶에 긍정적이고 의미있는 관계를 만들어나갈 수 있도록 돕습니다.
- 유저 입장에 편한 회고가 가능하도록 하기 위해 접근성을 높이고자 했고, 이를 위해 언제나 간편하게 접근할 수 있는 모바일 앱을 선정하였습니다. 일반적인 PC 웹이나 모바일 웹에서는 구현하기 힘든 푸시 알림 기능, 그리고 스마트폰 내에 기본으로 제공되는 건강 API가 사용 가능하다는 차별성이 있습니다.
- Xcode는 iOS 앱 개발에 필요한 모든 도구와 기능을 통합한 IDE로, Apple 로그인을 위한 AuthenticationServices, HealthKit 등 다양한 프레임워크 이용이 간편합니다.
- SwiftUI는 native platform의 기능과 퍼포먼스를 최대한 활용할 수 있고, 선언적인 문법으로 코드 가독성이 우수합니다. @State, @Binding, @ObservableObject 등 상태 관리를 위한 state property를 사용해 값의 변경, 데이터 전달 및 상호작용을 단순화할 수 있습니다.
- Alamofire는 URLSession을 활용한 라이브러리로, Swift에서 네트워킹 작업을 수행하기 위한 간단하고 직관적인 API를 제공하여 직접 구현하는 것보다 빠르고 편리하게 작업할 수 있습니다.
- Keychain은 iOS 앱의 Sandbox 환경 내에서 동작하는 데이터 보안 메커니즘으로, 외부에서 Keychain에 직접 액세스할 수 없습니다. 앱의 중요한 데이터, 인증 토큰 등을 Keychain에 저장함으로써 앱의 보안성을 향상시킬 수 있으며, KeychainSwfit library를 이용해 간편하게 accessToken과 refreshToken을 Keychain에 저장하고, 안전하게 이용할 수 있습니다.
- IntelliJ는 Spring Boot 개발을 위해 필요한 모듈과 기능을 간편하게 사용할 수 있는 IDE입니다.
- Spring Boot는 Spring framework를 간편하게 사용할 수 있게 해주며 RDBMS와의 편리한 연동, 라이브러리의 버전 관리 자동화 등으로 Java 기반 애플리케이션 서버 개발에 특화되어 있습니다.
- Spring Security를 사용하여 JWT 기반 사용자 인증 관련 필터를 구축하였습니다.
- Spring Data JPA를 사용하여 연동한 RDBMS에 간편하게 접근하고, 필요 시 JPQL과 QueryDSL fetch join을 사용하여 N + 1 문제를 해결하였습니다.
- Slf4j와 logback-spring.xml 파일 설정을 통해 배포된 서버에서 로그를 파일에 저장하도록 구현했습니다.
- OpenId Connect는 OAuth 2.0에서 확장된 인증 프로토콜이며, 소셜 로그인 시 API 호출 횟수를 약 절반 가까이 줄일 수 있는 장점을 가지고 있습니다. 따라서 OpenId Connect를 사용하여 애플 로그인 및 카카오 로그인을 구현하였습니다.
- 일반적인 데이터를 안전하게 저장하기 위해 대표적인 RDBMS인 MySQL을 사용했고, 이를 AWS RDS를 통해 배포하였습니다.
- 매일 자정마다 DB에 insert, update 쿼리를 수행하기 위해 pymysql을 이용해 작성한 쿼리 파일을 Lambda에 업로드하고, EventBridge의 규칙에 따라 Lambda를 실행하도록 구현하였습니다.
- 로그인 과정에서 발급되는 JWT인 Access Token과 Refresh Token 중 Refresh Token을 캐싱하여 사용자가 빠르게 Access Token을 재발급 받을 수 있게 하기 위해 Redis를 사용하였습니다. JWT로 구현된 Access Token은 탈취 당하더라도 유저 정보는 안전하지만, 이를 그대로 활용하여 로그인할 수 있기 때문에 만료 시간을 짧게 설정하고 Refresh Token을 이용하여 사용자의 불편을 줄였습니다. Redis에 Refresh Token과 Request IP를 저장하여 Refresh Token 탈취에 대비했으며, 배포에는 AWS ElastiCache를 사용하였습니다.
- JAR 파일을 배포하기 위해 환경설정이 간편한 AWS EC2를 사용하였습니다.
- 무료로 사용할 수 있으며 비밀 값을 Repository Secret에 넣어 안전하게 관리할 수 있는 Github Actions를 사용하여 CI/CD를 구현했습니다.
- CI/CD 구현 및 컨테이너화를 위해 Docker를 사용하였습니다. Docker Compose를 통해 빌드된 JAR 파일 및 nginx를 EC2 상에 컨테이너를 생성해 배포하였습니다.
- 서버의 자원을 더욱 효율적으로 사용하기 위해 nginx를 사용하였습니다.
Swift
- SwiftLint
- A tool to enforce Swift style and conventions
- https://github.com/realm/SwiftLint
- Variable:
lowerCamelCase
복수는 -s - Function:
lowerCamelCase
동사원형으로 시작 - Enum
- Name:
UpperCamelCase
- case:
lowerCamelCase
- Name:
- Struct, Class
- Name:
UpperCamelCase
이름 앞에 prefix 붙이기 않기 - property, method:
lowerCamelCase
- Name:
- Delegate: protocol 이용
- Protocol: 구조를 나타내면 명사, 능력(무언가 할 수 있음)은 형용사
Java
- Class & Interface:
UpperCamelCase
- Class 이름은 일반적으로 명사, 명사구
- Interface 이름은 명사, 명사구도 되지만 형용사, 형용사구도 됨
- Package:
Lowercase
복합단어 사용 금지 - Method & Parameter:
LowerCamelCase
- Method 이름은 동사, 동사구
- Constant:
UpperSnakeCase
- 모두 대문자로 밑줄(_)로 각 단어 구분
- Non-constant field names & Local variable:
LowerCamelCase
- Camel case: defined
- 구를 일반 ASCII로 변환하고 어퍼스트로피 제거
- 단어로 나누고 공백과 나머지 구두점으로 분리
- 각 단어를
UpperCamelCase
로 표시하거나 첫 단어 제외한 각 단어는LowerCamelCase
- 모든 단어를 단일 식별자로 결합
<type>(<scope>): <short summary>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
commit 명 | commit 뜻 |
---|---|
Feat | 새로운 기능 추가 |
Fix | 버그 수정 |
Docs | 문서 수정 |
Style | 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 |
Refactor | 코드 리펙토링 |
Test | 테스트 코드, 리펙토링 테스트 코드 추가 |
Chore | 패키지 매니저 추가 |
Build | 빌드 관련 파일 수정 |
CI | CI 설정 파일 수정 |
Pref | 성능 개선 |
Design | UI 디자인 변경 |
Add | 파일 추가 |
Rename | 파일 혹은 폴더 이동, 이름 수정 |
Remove | 파일 삭제 |
- 명령문, 현재 시제, 첫 글자 소문자, 마지막에 마침표(.) 넣지 않기
- 명령문, 현재 시제, 변경한 이유와 변경 전과의 차이점 설명
- Breaking Changes
- 변경점 (description of the change)
- 변경 사유 (justification)
- 마이그레이션 지시 (migration instructions)
- Referencing Issues
Closes #123, #245, #992