<aside>
📒 1. 프로젝트 개요
- 프로젝트 목적
- 영화, 드라마, 스포츠 등 다양한 콘텐츠를 큐레이팅하고 공유하며, 실시간 같이 보기 기능까지 제공하는 소셜 서비스로, 사용자들은 자신만의 플레이리스트를 만들고, 다른 사용자와 소통하며 콘텐츠 경험을 확장할 수 있는 서비스
- 핵심 기능
- 실시간 채팅 기능
- 동일한 콘텐츠를 보고있는 사용자끼리 실시간 채팅 기능 제공
- 콘텐츠 리뷰 기능
- 팔로우 기능
- DM(메시지) 기능
- 실시간 알림 기능 제공
- 플레이리스트 생성 및 구독 기능
- 사용자는 자신만의 플레이리스트를 생성하고 다른 사용자는 플레이리스트를 구독하여 플레이리스트의 업데이트에 따른 알림 기능 제공
</aside>
<aside>
📝 2. 담당한 작업
- 프로젝트 내에서 본인이 맡은 역할과 기여한 부분을 구체적으로 기술해 주세요.
- Spring Security 설정
- JWT 기반 인증/인가 구현
- ADMIN과 USER로 인가 권한에 따른 기능 분리 구현
- ADMIN은 콘텐츠 생성 및 수정 가능
- ADMIN은 유저 전체 목록 확인 및 LOCK, 권한 변경 가능
- 로그인 기능 구현
- Bcrypt 알고리즘 기반 단방향 해시를 통해 비밀번호 저장
- LOCK 속성을 추가해 로그인 제한 기능 구현
- RefreshToken Rotate 구현
- Redis를 통해 RefreshToken 별도 관리 구현
- 사용자 관리 관련 API 구현 개발
- 회원가입
- 로컬 사용자 회원가입 구현
- OAuth2 소셜 로그인(회원가입) 구현
- 사용자 수정
- 사용자의 이름 수정 가능
- 사용자의 프로필 이미지 수정 가능
- 사용자 비밀번호 초기화
- 사용자의 email을 통해 임시 비밀번호 발급
- 사용자는 지급받은 임시 비밀번호를 통해 로그인 이후 비밀번호를 수정할 수 있음
- 사용자 정보 조회
</aside>
<aside>
📈 3. 기술적 성과
- 프로젝트에서 사용한 기술 스택과 구현한 주요 기능을 설명해 주세요.
- 사용자 관리에서 사용된 기술 스택 및 주요 기능
- 기술 스택:
- backend :
JAVA, Spring Boot, Spring Security, QueryDSL, Slf4j, Spring Data JPA, JWT, OAuth2
- Database & Storage :
postgreSQL, Amanzon S3, H2, Amazon RDS
- Testing :
mockito, jacoco
- 주요 기능
- Spring Security를 통해 인증/인가 설정
- 어드민은 전체 사용자를 조회하면서 어드민 권한을 부여할 수 있음
- 전체 사용자는 QueryDSL을 통해 조건에 맞는 유저를 보여주는 동적 쿼리 구현
- 사용자는 이미지의 KEY값만 가지고 S3에 저장되어있는 이미지를 불러옴
</aside>
<aside>
🛠️ 4. 문제점 및 해결 과정
- 프로젝트 진행 중 직면한 기술적 문제와 이를 해결한 과정을 상세히 설명해 주세요.
- 임시 비밀번호 로그인 로직 오류 발생.
- 임시 비밀번호를 Redis에 저장하고 로그인 시 Redis를 확인하여 임시 비밀번호가 존재하면 임시 비밀번호로만 로그인 가능하도록 로직 설정.
- 임시 비밀번호가 있는지 확인하기 위해 Redis에 접근하는데 Redis가 오류를 일으키면 정상적인 로그인도 불가능한 상황 발생
- 현재는 로그인 시 try-catch로 묶어서 동일한 필터에서 Redis가 죽어있는 상황에서도 동작하도록 진행
- redis가 죽어있는 상황에서는 기존 로그인을 허용하고 redis 안에 임시 비밀번호가 있으면 별도의 filter chain에서 진행하도록 리팩토링해도 좋을 것 같음.
- Cache 역직렬화 오류 발생.
- 현재 프로젝트 내에서 모든 응답DTO를 record 타입으로 응답하고 있음.
https://techblog.woowahan.com/22767/ 해당 블로그에서 해당 문제를 파악
- redis에서 값을 꺼낼 때 Jackson이 타입 메타데이터를 따로 저장하지 않아서 역직렬화 실패 발생.
- 해당 블로그를 참고해 record 타입일 경우 타입 정보를 추가하도록 수정
</aside>
<aside>
💡 5. 협업 및 피드백
- 팀원들과의 협업 과정에서 느낀 점, 배운 점, 그리고 피드백을 기록해 주세요.
- 이번 프로젝트에서는 이벤트 기반 처리로 역할을 명확히 분리하면서, 각 기능을 담당한 팀원들이 서로의 구현에 과도하게 의존하지 않고 협업할 수 있었다.
- 이벤트 발행과 소비가 분리되면서 기능 간 경계가 분명해졌고, 팀원들과 각자의 책임 범위를 명확히 나눌 수 있어 병렬적으로 개발을 진행할 수 있었다.
- 이를 통해 수정 사항이나 추가 요구사항이 발생했을 때도 다른 기능에 미치는 영향을 최소화할 수 있었고 원인파악이 쉬워져서 해결에 걸리는 시간이 줄어든 것 같다.
</aside>
<aside>
💾 6. 코드 품질 및 최적화
- TDD를 적용하여 비즈니스 로직의 높은 테스트 커버리지를 확보하였고 코드 품질을 향상시켰다.
- 길어지는 코드, 반복적인 코드를 메서드로 따로 빼서 메서드 명을 코드 컨벤션에 맞추어 명확히 작성하였다.
- 비밀번호 초기화 시 3분 타임아웃 제한과 임시 비밀번호로 로그인 시 바로 비밀번호를 바꾸는 로직이기에 임시 비밀번호를 Redis에 설정하여 DB 접속을 횟수를 최소화하였다
</aside>
<aside>
</aside>