|
참여 인원 : 5명 / 개발 주기 : 약 2주 (18일) / Growith 1기 우승 👑 |
1000명 중 33.6%만이 가계부를 작성하며 즉, 3명 중 1명만이 소비 기록을 실천
응답자의 60%가 가계부 작성이 소득 관리에 도움이 된다고 답했지만, 귀찮음, 절약 효과에 대한 회의감, 작성 유무에 따른 행동 변화의 부재 등을 이유로 가계부 작성을 꺼려함.
이러한 문제를 해결하고자, 절약 챌린지 기능을 통해 사용자가 목표를 설정하고, 다른 사람들과 함께 경쟁하며 동기부여를 받을 수 있도록 기획.
혼자 작성하는 것이 아닌, 함께하는 재미와 성취감을 제공함으로써 꾸준한 사용 유도
카테고리 | 기술 스택 | 상세 내용 |
---|---|---|
백엔드 | Spring Boot 3.4 / Spring Security, Java 17 |
라이브러리: Spring Data JPA, QueryDSL, JUnit5, Mockito 프로토콜: WebSocket, SSE 인프라: Firebase, AWS EC2/RDS, GitHub Actions |
프론트엔드 | Next.js, React, PWA | 주요 라이브러리: TanStack Query, Axios, React-Hook-Form, Zod, shadcn/ui |
협업 | Notion, Swagger | 협업 툴로 프로젝트 관리 및 API 문서화 |
- 카카오 OAuth2 로그인을 이용해 로그인/회원가입을 할 수 있어요.
- 회원가입 시 사용할 닉네임과 주로 사용할 카테고리를 선정할 수 있어요.
- 메인 페이지에서는 이번 달 소비 현황과 거래 내역, 챌린지에 대한 요약을 볼 수 있어요.
- 단건 또는 일정 주기의 수입 / 지출을 등록할 수 있어요.
- Codef API를 사용하여 계좌를 연결하고 실제 소비 내역을 가져올 수 있어요.
- 이번 달 예산을 설정하여 과소비 방지 알림을 받을 수 있어요.
- 어제, 지난주, 저번달과 비교하여 통계를 볼 수 있어요.
- 카테고리 별로 얼만큼 소비했는지 확인할 수 있어요.
- 챌린지를 등록하고 다른사람과 함께 도전할 수 있어요.
- 성공, 실패한 챌린지를 확인할 수 있어요.
- 챌린지 상세를 확인할 수 있어요.
- 카카오톡으로 초대 링크를 보내고 '더함'에 친구를 초대할 수 있어요.
- 친구는 내가 만든 챌린지에 초대하여 함께 참여할 수 있어요.
- 나의 프로필을 관리할 수 있어요.
- '더함'을 사용하면서 달성한 업적들을 확인할 수 있어요.
- '더함'을 사용하면서 진행한 챌린지에 대한 통계를 확인할 수 있어요.
- 회원가입 시 설정했던 주 카테고리를 변경할 수 있어요.
- Codef API에 연동할 계좌 내역을 작성할 수 있어요.
- 트랜잭션과 이벤트 기반 설계
- 모듈 간의 결합도를 줄이기 위해 이벤트 기반의 설계 진행
- 트랜잭션이 정상적으로 이어지지 않는 문제 발생
- 이벤트 리스너의 트랜잭션에 REQUIRED_NEW 전파 타입을 적용하여 독립 트랜잭션 처리
- 데이터 일관성과 안전성 확보
- N+1 문제 해결
- JPA Lazy 설정에 따른 N+1 문제 발생
- Fetch Join과 Entity Graph를 사용하여 연관 객체를 효율적으로 로딩
- 친구 초대 유저 추적
- '카카오톡 공유하기' 기능을 통해 유입된 유저가 어떤 유저를 통해 초대 되었는지 파악 필요
- 인증되지 않은 유입에 관하여 초대 기능 구현에 어려움을 겪음
- 초대한 사람을 식별하기 위해 유저별 고유 토큰을 링크에 삽입
- 유입자는 쿠키로 해당 토큰을 들고 다니며 초대 관계 유지
- 로그인 시에 커스텀 Security Filter를 구성하여 초대 정보 매
- 락 기능을 통한 동시성 문제 해결
- 참여인원이 제한된 챌린지에서는 여러 사용자의 동시 접근으로 동시성 문제 발생 가능성
- 초기에는 비관적 락(Pessimistic Lock)을 활용하여 데이터 정합성을 보장
- 이후 충돌 가능성이 낮은 상태에서 락 점유 구조가 비효율적이라고 판단하여 낙관적 락(Optimistic Lock) 적용
- 22만 건 조회 쿼리 약 7.5배 이상의 성능 개선
- 소비 내역 조회 시, 연 단위 데이터가 약 22만 건까지 증가할 수 있는 상황을 가정
- 인덱싱 및 커버링 인덱스를 도입하여 420ms 에서 41ms, 약 7.5배 이상의 성능 개선을 달성.
- AES 알고리즘으로 은행 데이터 암호화화
- Code API를 통해 소비 내역 수집 시, 사용자 계좌번호·은행 ID·비밀번호 등의 민감 정보가 필요
- 보안 강화를 위해 같은 평문이라도 다른 암호문이 반환되도록 AES-CBC(Cipher Block Chaining) + PKCS5Padding 방식으로 사용자 계좌 정보 암호화
- AES에 사용된 키는 환경변수로 처리하여 외부 노출에 방지
- 정보 노출에 대한 위협을 최소화 및 데이터 보호에 집중.
김민경 |
---|
강나연 | 신혜서 |
---|---|
박현철 | 천준민 | 김민경 |
---|---|---|