Giter Club home page Giter Club logo

umbba-server's Introduction

👨‍👩‍👧‍👦 엄빠도 어렸다

부모의 추억을 자식과 공유하며 공감대를 찾는 문답형 아카이빙 서비스, 엄빠도 어렸다


🌸 금쪽이들

이동섭 박예준
ddongseop jun02160

👻 Role

담당 역할 Role
Nginx 배포, CI/CD 구축 이동섭
DB 구축 (RDS) 이동섭
ERD 작성 이동섭, 박예준
API 개발 이동섭, 박예준
소셜로그인 기능 구현 이동섭
푸시알림 기능 구현 박예준

🛠️ 개발 환경

통합 개발 환경 IntelliJ
Spring 버전 2.7.13
데이터베이스 AWS RDS(MySQL), Redis
배포 AWS EC2(Ubuntu), S3
Project 빌드 관리 도구 Gradle
CI/CD 툴 Github Actions, CodeDeploy
ERD 다이어그램 툴 ERDCloud
Java version Java 11
패키지 구조 도메인 패키지 구조
API 테스트 PostMan, Swagger
외부 연동 Slack, FCM

🔧 시스템 아키텍처


📜 API Docs


☁️ ERD


📂 Project Structure

📂 umbba-api
├── build.gradle
└── src
    ├── main
    │   ├── 📂 java/sopt/org/umbba/api
    │   │    ├── ApiApplication.java
    │   │    ├── 🗂 config
    │   │    │   ├── SecurityConfig.java
    │   │    │   ├── 🗂 auth
    │   │    │   │   ├── CustomJwtAuthenticationEntryPoint.java
    │   │    │   │   ├── JwtAuthenticationFilter.java
    │   │    │   │   └── UserAuthentication.java
    │   │    │   ├── 🗂 jwt
    │   │    │   │   ├── JwtProvider.java
    │   │    │   │   ├── JwtValidationType.java
    │   │    │   │   ├── TokenDto.java
    │   │    │   │   └── TokenRepository.java
    │   │    │   └── 🗂 sqs
    │   │    │       ├── SqsConfig.java
    │   │    │       └── 🗂 producer
    │   │    │           └── SqsProducer.java
    │   │    ├── 🗂 controller
    │   │    │   ├── 🗂 advice
    │   │    │   │   └── ControllerExceptionAdvice.java
    │   │    │   ├── 🗂 health
    │   │    │   │   ├── DemoController.java
    │   │    │   │   ├── ServerProfileController.java
    │   │    │   │   └── SlackTestController.java
    │   │    │   ├── 🗂 parentchild
    │   │    │   │   ├── ParentchildController.java
    │   │    │   │   └── 🗂 dto
    │   │    │   │       ├── 🗂 request
    │   │    │   │       │   ├── InviteCodeRequestDto.java
    │   │    │   │       │   ├── OnboardingInviteRequestDto.java
    │   │    │   │       │   └── OnboardingReceiveRequestDto.java
    │   │    │   │       └── 🗂 response
    │   │    │   │           ├── InviteResultResponseDto.java
    │   │    │   │           ├── OnboardingInviteResponseDto.java
    │   │    │   │           └── OnboardingReceiveResponseDto.java
    │   │    │   ├── 🗂 qna
    │   │    │   │   ├── QnAController.java
    │   │    │   │   └── 🗂 dto
    │   │    │   │       ├── 🗂 request
    │   │    │   │       │   └── TodayAnswerRequestDto.java
    │   │    │   │       └── 🗂 response
    │   │    │   │           ├── GetInvitationResponseDto.java
    │   │    │   │           ├── GetMainViewResponseDto.java
    │   │    │   │           ├── QnAListResponseDto.java
    │   │    │   │           ├── SingleQnAResponseDto.java
    │   │    │   │           └── TodayQnAResponseDto.java
    │   │    │   └── 🗂 user
    │   │    │       ├── AuthController.java
    │   │    │       └── 🗂 dto
    │   │    │           ├── 🗂 request
    │   │    │           │   ├── RefreshRequestDto.java
    │   │    │           │   ├── SocialLoginRequestDto.java
    │   │    │           │   └── UserInfoDto.java
    │   │    │           └── 🗂 response
    │   │    │               └── UserLoginResponseDto.java
    │   │    └── 🗂 service
    │   │        ├── 🗂 notification
    │   │        │   └── NotificationService.java
    │   │        ├── 🗂 parentchild
    │   │        │   └── ParentchildService.java
    │   │        ├── 🗂 qna
    │   │        │   └── QnAService.java
    │   │        └── 🗂 user
    │   │            ├── AuthService.java
    │   │            └── 🗂 social
    │   │                ├── 🗂 apple
    │   │                │   ├── AppleLoginService.java
    │   │                │   └── 🗂 verify
    │   │                │       ├── AppleClaimsValidator.java
    │   │                │       ├── AppleJwtParser.java
    │   │                │       ├── EncryptUtils.java
    │   │                │       └── PublicKeyGenerator.java
    │   │                └── 🗂 kakao
    │   │                    └── KakaoLoginService.java
    │   └── 📂 resources
            └── application.yaml

📂 umbba-notification
├── build.gradle
└── src
    └── main
        ├── 📂 java/sopt/org/umbba/notification
        │   ├── NotificationApplication.java
        │   ├── 🗂 config
        │   │   ├── 🗂 fcm
        │   │   │   └── FCMConfig.java
        │   │   ├── 🗂 scheduler
        │   │   │   └── ScheduleConfig.java
        │   │   └── 🗂 sqs
        │   │       ├── SqsConfig.java
        │   │       └── 🗂 consumer
        │   │           └── SqsConsumer.java
        │   └── 🗂 service
        │       ├── 🗂 fcm
        │       │   ├── FCMController.java
        │       │   ├── FCMService.java
        │       │   └── 🗂 dto
        │       │       └── FCMMessage.java
        │       ├── 🗂 scheduler
        │       │   └── FCMScheduler.java
        │       └── 🗂 slack
        │              └── SlackApi.java
        └── 📂 resources
            ├── application.yaml
            └── 🗂 firebase
                └── umbba-fcm-firebase-adminsdk.json

📂 umbba-domain
├── build.gradle
└── src
    └── main
        └── 📂 java/sopt/org/umbba/domain
             ├── UmbbaDomainRoot.java
             ├── 🗂 config
             │   └── 🗂 jpa
             │       └── JpaConfig.java
             └── 🗂 domain
                 ├── 🗂 common
                 │   └── AuditingTimeEntity.java
                 ├── 🗂 parentchild
                 │   ├── Parentchild.java
                 │   ├── ParentchildRelation.java
                 │   ├── 🗂 dao
                 │   │   └── ParentchildDao.java
                 │   └── 🗂 repository
                 │       └── ParentchildRepository.java
                 ├── 🗂 qna
                 │   ├── OnboardingAnswer.java
                 │   ├── QnA.java
                 │   ├── Question.java
                 │   ├── QuestionSection.java
                 │   ├── QuestionType.java
                 │   ├── 🗂 dao
                 │   │   └── QnADao.java
                 │   └── 🗂 repository
                 │       ├── QnARepository.java
                 │       └── QuestionRepository.java
                 ├── 🗂 redis
                 │   └── RefreshToken.java
                 └── 🗂 user
                     ├── SocialPlatform.java
                     ├── User.java
                     └── 🗂 repository
                         └── UserRepository.java

📂 umbba-common
├── build.gradle
└── src
    └── main
        └── 📂 java/sopt/org/umbba/common
             ├── UmbbaCommonRoot.java
             ├── 🗂 exception
             │   ├── ErrorType.java
             │   ├── SuccessType.java
             │   ├── 🗂 dto
             │   │   └── ApiResponse.java
             │   └── 🗂 model
             │       └── CustomException.java
             └── 🗂 sqs
                 ├── MessageType.java
                 ├── MessageUtils.java
                 └── 🗂 dto
                     ├── FCMPushRequestDto.java
                     ├── FirebaseDto.java
                     ├── MessageDto.java
                     ├── PushMessage.java
                     └── SlackDto.java

📂 umbba-external
├── build.gradle
└── src
    └── main
        └── 📂 java/sopt/org/umbba/external
             ├── UmbbaExternalRoot.java
             └── 🗂 client
                  └── 🗂 auth
                       ├── 🗂 apple
                       │   ├── AppleApiClient.java
                       │   └── 🗂 response
                       │       ├── ApplePublicKey.java
                       │       └── ApplePublicKeys.java
                       └── 🗂 kakao
                            ├── KakaoApiClient.java
                            ├── KakaoAuthApiClient.java
                            └── 🗂 response
                                 ├── KakaoAccessTokenResponse.java
                                 ├── KakaoAccount.java
                                 ├── KakaoUserProfile.java
                                 └── KakaoUserResponse.java

🌱 Branch

main, develop, feat, refactor, hotfix, release

main: 최최최최최최종본 - stable all the time

develop: 우리가 개발하면서 코드를 모을 공간, 배포하기 전까지는 이게 default로 하여 PR은 여기로 날립니다.

feat: 기능을 개발하면서 각자가 사용할 브랜치

  • Git Flow 전략에 따라 → “feat/#이슈번호-구현하려는기능” 형식으로

  • ex. feat/#3-login, feat/#5-book_info_detail

  • 해당 branch 작업 완료 후 PR 보내기

    • 항상 local에서 충돌 해결 후 → remote에 올리기
    • reviewer에 서로 tag후 code-review
    • approve 전 merge 불가!
    • 작동 확인된 기능의 branch는 삭제
  • 코드리뷰 컨벤션

    • 서로 상대 실수 한 것 없는지 귀찮아도 꼭 읽어보기
    • 긍정적인 코멘트 적극적으로 남겨주기
    • 우선순위 반영한 코드리뷰 진행하기 ex.[P1] 이건 꼭 반영해주셔야해요!

🙏 Commit Convention

- [CHORE] : 동작에 영향 없는 코드 or 변경 없는 변경사항(주석 추가 등) or 파일명, 폴더명 수정 or 파일, 폴더 삭제 or 디렉토리 구조 변경
- [RENAME] : 파일 이름 변경시
- [FEAT] : 새로운 기능 구현
- [FIX] : 버그, 오류 해결
- [REFACTOR] : 전면 수정, 코드 리팩토링
- [ADD] : Feat 이외의 부수적인 코드 추가, 라이브러리 추가, 새로운 파일 생성
- [DEL] : 쓸모없는 코드 삭제
- [CORRECT] : 주로 문법의 오류나 타입의 변경, 이름 변경시
- [DOCS] : README나 WIKI 등의 문서 수정
- [MERGE]: 다른 브랜치와 병합
- [TEST] : 테스트 코드 추가/작성
  • 커밋은 세부 기능 기준

  • 이슈번호 붙이는 단위 : FEAT, FIX, REFACTOR

    ex. git commit -m “[FEAT] 로그인 기능 구현 #2”

🙏 Code Convention

💡 동료들과 말투를 통일하기 위해 컨벤션을 지정합니다.

오합지졸의 코드가 아닌, 한 사람이 짠 것같은 코드를 작성하는 것이 추후 유지보수나 협업에서 도움이 됩니다. 내가 코드를 생각하면서 짤 수 있도록 해주는 룰이라고 생각해도 좋습니다!

  1. 기본적으로 네이밍은 누구나 알 수 있는 쉬운 단어를 선택한다.
    • 우리는 외국인이 아니다. 쓸데없이 어려운 고급 어휘를 피한다.
  2. 변수는 CamelCase를 기본으로 한다.
    • userEmail, userCellPhone ...
  3. URL, 파일명 등은 kebab-case를 사용한다.
    • /user-email-page ...
  4. 패키지명은 단어가 달라지더라도 무조건 소문자를 사용한다.
    • frontend, useremail ...
  5. ENUM이나 상수는 대문자로 네이밍한다.
    • NORMAL_STATUS ...
  6. 함수명은 소문자로 시작하고동사로 네이밍한다.
    • getUserId(), isNormal() ...
  7. 클래스명은명사로 작성하고 UpperCamelCase를 사용한다.
    • UserEmail, Address ...
  8. 객체 이름을 함수 이름에 중복해서 넣지 않는다. (= 상위 이름을 하위 이름에 중복시키지 않는다.)
    • line.getLength() (O) / line.getLineLength() (X)
  9. 컬렉션은 복수형을 사용하거나 컬렉션을 명시해준다.
    • List ids, Map<User, Int> userToIdMap ...
  10. 이중적인 의미를 가지는 단어는 지양한다.
    • event, design ...
  11. 의도가 드러난다면 되도록 짧은 이름을 선택한다.
    • retreiveUser() (X) / getUser() (O)
    • 단, 축약형을 선택하는 경우는 개발자의 의도가 명백히 전달되는 경우이다. 명백히 전달이 안된다면 축약형보다 서술형이 더 좋다.
  12. 함수의 부수효과를 설명한다.
    • 함수는 한가지 동작만 수행하는 것이 좋지만, 때에 따라 부수 효과를 일으킬 수도 있다.
      fun getOrder() {
        if (order == null) {
            order = Order()
        }
      return order
      }
      
    • 위 함수는 단순히 order만 가져오는 것이 아니라, 없으면 생성해서 리턴한다.
    • 그러므로 getOrder() (X) / getOrCreateOrder() (O)
  13. LocalDateTime -> xxxAt, LocalDate -> xxxDt로 네이밍
  14. 객체를 조회하는 함수는 JPA Repository에서 findXxx 형식의 네이밍 쿼리메소드를 사용하므로 개발자가 작성하는 Service단에서는 되도록이면 getXxx를 사용하자.

umbba-server's People

Contributors

jun02160 avatar ddongseop avatar

Stargazers

김현준 avatar  avatar Jeon Soo Min avatar sodam avatar Sangwook Park avatar Seo, Yeong-Hak avatar Ji-eun Yang avatar  avatar sehee Moon avatar TaekJun Kim avatar Wang Hoeun avatar 오승준 avatar Minseong Park avatar yangdongsuk avatar Seonheui Jeon avatar 이찬미 avatar soohyun avatar Lee SeungHeon avatar Seunghee Jin avatar  avatar Jun Seo avatar ahradev avatar Unan avatar Choi Young Lyn avatar Hwang Yeonjin avatar 김서진 avatar  avatar

umbba-server's Issues

[FIX] 온보딩 dto 관련 버그 수정

✨ 이슈 내용

  • DB에 live_together 필드가 남아 있는 것 해결
  • 푸시 알림 시간이 "23:00:00" 형식으로 리턴되는 것 "23:00"으로 리턴되게 수정
  • YES, NO가 아니라 응, 아니로 선택질문 답변 받도록 수정

✅ 체크리스트

  • DB에 live_together 필드가 남아 있는 것 해결
  • 푸시 알림 시간이 "23:00:00" 형식으로 리턴되는 것 "23:00"으로 리턴되게 수정
  • YES, NO가 아니라 응, 아니로 선택질문 답변 받도록 수정
  • 온보딩 정보 입력 (초대받는 측) API에서 parentchild_id 빠지게 변경
  • API 명세서에 수정사항 반영
  • snake_case로만 받아지는거 수정
  • 과거의 문답 리스트 조회하기 질문이 아니라 주제 보여주는걸로 변경

[FIX] Querydsl 관련 오류 해결

✨ 이슈 내용

  • 홈 Case를 구분하는 API 호출 시, Querydsl을 사용한 쿼리문에 오류가 있어 해당 부분 수정!

✅ 체크리스트

  • Dao 쿼리 코드 변경하기

[FEAT] 메인페이지 API

✨ 이슈 내용

  • 소셜 로그인과 온보딩 이후 메인페이지 뷰에 대한 API 개발

✅ 체크리스트

  • 메인페이지 API 개발
  • 이전까지의 코드 병합

[FEAT] 데모데이 테스트용 리셋 기능

✨ 이슈 내용

  • 데모데이 시연을 위해 1~7일차까지 일일문답을 주고받은 부모-자식은 다시 초기상태로 돌아오도록 구현
  • 추가적으로 필요한 관리자용 API 구현

✅ 체크리스트

  • Parentchild의 QnA 리스트에 저장된 답변과 답변여부 필드 초기화
  • 필요한 초기화 시점으로 DB값 구성하기
  • DB맨의 부담을 덜어주자.. @ddongseop

[FEAT] SQS를 적용한 푸시알림 기능 개선

✨ 이슈 내용

✅ 체크리스트

  • SQS 연동을 위한 기본 설정
  • 스케줄링 작업 효율적으로 처리하도록 리팩토링
  • Slack, Firebase, SQS 관련 기능 알림서버에서만 독립적으로 동작하도록 처리
    • API 서버에서 알림이 가는 이벤트 시 알림 처리까지 구현
  • 현재 주석처리 + TODO 표시해둔 코드에 적용

[FIX] User 테이블 2개 생성 문제 해결

✨ 이슈 내용

  • RDS db에 user라는 이름의 테이블 생성된 문제 해결

✅ 체크리스트

  • DB에서 user 테이블 drop
  • userRepository에 save하는 부분에서 객체 생성 로직 변경

[FEAT] FCM 토큰 DB에 저장

✨ 이슈 내용

  • Firebase 스프링 서버와 연동
  • 클라이언트의 FCM 토큰 DB에 저장
  • 클라이언트와의 연동 확인

✅ 체크리스트

  • 푸시알림 기능 구현을 위한 기본 세팅
  • 파이어베이스 연동하기
  • FCM 토큰 저장 테스트

[FIX] 클라이언트 API 작업 중 수정사항 반영

✨ 이슈 내용

  • FCM 토큰 로그인 할 때마다 업데이트 하도록 변경
  • 회원 탈퇴시에 FCM 토큰 삭제되게 변경
  • 스위치 잘 안됨 이슈
  • 초대코드까지 입력하고 앱을 종료한 유저에 대응하기 위해 is_receiver_relation 필드 추가
  • 애플 로그인 nonce 문제 해결
  • has_alarm 필드 싹다 삭제

✅ 체크리스트

  • FCM 토큰 로그인 할 때마다 업데이트 하도록 변경
  • 회원 탈퇴시에 FCM 토큰 삭제되게 변경
  • 스위치 잘 안됨 이슈
  • 초대코드까지 입력하고 앱을 종료한 유저에 대응하기 위해 is_receiver_relation 필드 추가
  • 애플 로그인 nonce 문제 해결
  • has_alarm 필드 싹다 삭제

[FIX] 엔딩이벤트를 위한 로직 수정

✨ 이슈 내용

  • 엔딩 뷰가 추가됨에 따라 홈화면 API 호출 시 필요한 로직 수정
  • 필드 추가 없이 index: 8일 때 엔딩페이지로 넘어가도록! (클라 입장)

✅ 체크리스트

  • 예외처리에 건드리는 부분 없는지 확인
  • 홈화면 API에서 둘다 답변한 경우, 조건에 맞게 8로 반환하도록!

[FEAT] 일일문답 페이지 질문 답변 API

✨ 이슈 내용

  • 일일문답 페이지에서 질문에 대한 답변을 처리해주는 API 개발
  • 상대방에게 푸시알림 나가는 기능은 추후 구현

✅ 체크리스트

  • API 명세서 초안 작성
  • API 기능 구현
  • DB 확인 및 리팩토링 진행

[FIX] Hikari Connection Pool 에러 해결

✨ 이슈 내용

  • 서버 통신 장애가 생겨 모든 API 호출이 불가능한 상황
  • Hikari Connection Pool 관련 에러로 추정
    -> 현재 작업이 쌓여 있어 커넥션 풀이 꽉 찬 것으로 예상된다
    -> 커넥션 풀 사이즈를 늘려서 급한 에러상황 해결

✅ 체크리스트

  • 해결 가능한 방안
    1. connection pool size 증가
    2. connection timeout 증가
    3. 트랜잭션 주기를 짧게 가져가도록!

[FEAT] 주기적인 알림 메세지 전송 및 리팩토링

✨ 이슈 내용

  • 기본 알림 메세지 전송 기능 서비스에 맞게 수정
  • 중복되는 로직 리팩토링
  • 기존 API에 알림 기능 붙이기
  • 스케줄러 이용한 주기적인 알림 전송 기능 테스트

✅ 체크리스트

  • 위 메시지 템플릿을 일정 시간에 전송하도록 고정하여 보내기 (RequestDto에 title, body를 실는 부분 대신)

    • 처음 푸시알림 요청을 보낼 때 User의 DB에 파이어베이스 토큰 저장
    • 이후 요청부터는 헤더의 JWT토큰으로 유저를 식별하여 파이어베이스 토큰 가져오고 주기적으로 푸시알림 보내도록
  • 푸시 알림 메시지에 section과 수신자 이름 정보 추가

    • userId를 파라미터로 받아 DB에서 조회하는 과정이 필요한데, 어떻게 하면 이를 효율적으로 구현할 수 있을지?
  • 상대 답변 입력 API 호출 시 알림 전송하는 로직 추가

    [질문에 답변하기 API] 명세서 수정

  • FCM Dynamic Link를 활용한 동적 링크 생성

    • 초대장에 들어갈 installUrl (릴리즈 이전에는 서비스 소개 및 홍보용 웹 링크로 이어지게?)

[FEAT] 메인 홈 API 통합 및 추가기능 반영

✨ 이슈 내용

  • 탈퇴한 회원에 대한 로직 추가
  • 초대장 보내기 API와 통합 -> 아직 매칭이 되지 않은 유저의 경우 로직 추가

✅ 체크리스트

  • 2개로 나눠져 있는 API 1개로 합치기
  • 탈퇴한 유저인지 검사하는 부분
  • API 명세서 수정

[REFACTOR] 온보딩, 홈 화면 API 리팩토링

✨ 이슈 내용

  • API 명세서를 작성하며 필요한 요청, 응답값(DTO 객체) 정리
  • 코드 리팩토링
  • isMeChild 필드 추가에 따른 부모, 자식 관련 로직 수정

✅ 체크리스트

  • Spring Data JPA를 이용한 쿼리 최적화
  • API 명세서 작성 - 온보딩, 초대, 홈 화면 API
  • 서비스 단의 비즈니스 로직 리팩토링

[DEPLOY] 개발/운영 서버 분리

✨ 이슈 내용

  • 기존에 develop 브랜치 (개발 브랜치) 에 변경 사항이 생기면 바로 운영 서버로 배포되도록 했었음
  • 이를 main 브랜치에 변경 사항이 생길 경우 운영 서버로 배포되도록 변경할 계획이며, 기존 develop 브랜치는 개발 서버로 배포되도록 할 것임
  • 현재 작동 중인 서버를 고려하여 작업 순서는 아래와 같이 구상하였음
    1. main 브랜치 - 개발 서버로 세팅 진행
    2. 기존의 develop 브랜치를 개발 서버로 연결
    3. main 브랜치는 기존에 사용하던 운영 서버로 연결

✅ 체크리스트

  • main 브랜치 - 개발 서버로 세팅
  • 기존의 develop 브랜치를 개발 서버로 연결
  • main 브랜치는 기존에 사용하던 운영 서버로 연결

[REFACTOR] 일일문답과 리스트 관련 API 리팩토링

✨ 이슈 내용

  • 일일문답과 리스트 관련 API 명세서 작성 과정에서 수정 사항 발견

✅ 체크리스트

  • 최근 질문과 답변 조회 API 수정사항 반영
  • 질문에 답변하기 API 수정사항 반영
  • 섹션별 과거의 문답리스트 조회하기 API 수정사항 반영
  • 과거의 문답 개별 조회하기 API 수정사항 반영

[FEAT] 지금 몇일차 질문에 대해 문답을 나누고 있는지 저장하는 필드 추가

✨ 이슈 내용

  • 최근 질문과 답변 조회에서도 홈 화면 처럼 index에 대한 정보를 주실 수 있나요? (ex: #1에 사용되는 1)
  • 일일 질문 가져올 때 qnaList 끝에 있는거 추가로 X, 필드 추가 따로 해야함

✅ 체크리스트

  • 최근 질문과 답변 조회에서도 홈 화면 처럼 index에 대한 정보를 주실 수 있나요? (ex: #1에 사용되는 1)
  • 일일 질문 가져올 때 qnaList 끝에 있는거 추가로 X, 필드 추가 따로 해야함

[FEAT] 온보딩 부모자식 관계 정보 입력 API

✨ 이슈 내용

  • 초대 발신 측과 초대 수신 측에서 필요로 하는 부모자식 관계 정보 입력 API 개발
  • 온보딩 View에 따른 요청, 응답 DTO 생성
  • 초대 발신과 수신을 구분하여 역할에 따른 로직 분기 처리

✅ 체크리스트

  • request, response DTO 클래스에서 각각에 필요한 필드 View에서 뽑아내기
  • 서비스 로직과 컨트롤러 구현
  • 부모자식 관계로 형성되기까지의 로직 정리 및 메서드로 구현
  • Parentchild 엔티티 nullable 필드 속성 수정

[FEAT] 오늘의 질문 리마인드 알림 기능

✨ 이슈 내용

  • 스케줄링으로 리마인드 알림 기능 구현
    • 오늘의 질문 푸시 알림 이후 다음 날부터 답변을 하지 않은 사용자에게 리마인드용 푸시 메시지 전송

✅ 체크리스트

  • 리마인드 알림 조건 분기 처리
  • 리마인드 알림 텍스트 ENUM 추가 (<- 기획 측에서 전달된 이후)
  • 스케줄링 적용 -> 오늘의 질문과 같이 예약 작업으로 구현
  • 콕 찌르기 기능 구현 (-> 기획 측에서 전달받은 내용에 따라 반영 여부 결정)

[FIX] 알림 서버 따로 배포 후 발생한 짜잘한 오류 수정

✨ 이슈 내용

  • Parentchild 아이디 3번에 술이슈 보내지는 코드 수정
  • SQS Listener 사용하는 측에 Graceful Shutdown 도입
  • 운영서버에서는 Hikari Pool 로그 안보이게 변경
  • ControllerExceptionAdvice의 500 에러들에서 모두 슬랙 메시지를 보내도록 수정
  • CD 스크립트에서 반복문을 돌며 프로세스가 종료될때까지 sleep 하도록 수정
  • EC2에서 SdkclientException 뜨는 것 해결
  • Apparent connection leak detected 해결
  • 이미 삭제된 Parentchild에 대해 스케줄링이 이루어지는 것 예외처리

✅ 체크리스트

  • Parentchild 아이디 3번에 술이슈 보내지는 코드 수정
  • SQS Listener 사용하는 측에 Graceful Shutdown 도입
  • 운영서버에서는 Hikari Pool 로그 안보이게 변경
  • ControllerExceptionAdvice의 500 에러들에서 모두 슬랙 메시지를 보내도록 수정
  • 스케줄링 정상 동작 확인
  • 슬랙 정상 동작 확인
  • CD 스크립트에서 반복문을 돌며 프로세스가 종료될때까지 sleep 하도록 수정
  • EC2에서 SdkclientException 뜨는 것 해결
  • 이미 삭제된 Parentchild에 대해 스케줄링이 이루어지는 것 예외처리
  • Apparent connection leak detected 해결

[REFACTOR] 소셜 로그인 코드 리팩토링

✨ 이슈 내용

  • JwtTokenProvider와 AuthService의 로직 분리
  • 소셜 로그인, JWT 토큰 관련 로직 리팩토링

✅ 체크리스트

  • Practice 레포 코드 반영
  • 동섭오빠 코드 확인 및 리뷰?

[FEAT] Soft Delete 기능 추가

✨ 이슈 내용

  • 탈퇴 유저에 대한 Soft Delete 추가

✅ 체크리스트

  • Soft Delete 테스트를 위한 환경 분리
  • 카카오 로그인 로컬에서도 가능하도록 수정
  • Soft Delete 기능 구현

[REFACTOR] 꼼꼼한 예외처리 추가

✨ 이슈 내용

  • 클라이언트 API 붙이면서 아직 처리되지 않은 예외 꼼꼼하게 잡아주기
  • ControllerExceptionAdvice 에서 예외 클래스마다 처리하기 -> 현재 처리해준 예외 이외에 발생하는 것들은 500으로 처리해버리는 상황
  • 해당 부분 주석처리해서 꼼꼼하게 처리할 것!

✅ 체크리스트

  • API 명세서와 와이어프레임에서 아직 처리되지 않은 부분 찾기
  • 발생하는 예외 클래스 하나씩 ControllerExceptionAdvice 클래스에서 처리하기

[FEAT] 소셜 로그인 + JWT 엑세스, 리프레시 토큰 기능 추가

✨ 이슈 내용

  • OpenFeign을 활용한 OAuth 2.0 카카오, 애플 소셜 로그인 구현
  • Spring Security를 활용해 JWT 엑세스 토큰 관리
  • Redis를 활용해 리프레시 토큰 관리

✅ 체크리스트

  • Practice 레포에서 완성한 코드 추가
  • 코드 리뷰를 바탕으로 리팩토링

[FIX] 메인 홈 API 로직 이동

✨ 이슈 내용

  • 최근 질문 답변 조회 3가지 케이스에 대한 로직 2개의 API로 분리하기

✅ 체크리스트

  • 최근 질문 답변 조회 API 수정
  • 초대장 API 따로 생성하여 분리

[FIX] is_match_finish를 넘겨주는 시점을 초대코드 입력 순간으로 변경

✨ 이슈 내용

  • 현재는 is_match_finish 필드를 login 때 넘겨주는 상황
  • 이 필드를 초대코드 입력 순간에 넘겨줘야 클라이언트에서 처리하기가 용이함

✅ 체크리스트

  • 초대코드 입력 API에서도 is_match_finish를 넘겨주는 것으로 변경
  • 로그인 API의 dto에서 is_match_finish 필드를 삭제 -> 이건 일단 냅두는 것으로 처리 (클라에서 바꾸기 어려움)
  • DB에서 is_match_finish 필드 삭제해야한다면 삭제 -> 이것도 일단 냅두는 걸로 (여러모로 쓸모가 많음)
  • 노션 API 명세서 업데이트

[FIX] 리마인드 알림 예외상황 추가

✨ 이슈 내용

  • 탈퇴한 유저가 있는 경우, 부모자식 관계가 유효하지 않은 경우에 대한 예외처리 필요

✅ 체크리스트

  • 탈퇴 유저 포함 여부 추가
  • 유효한 Parentchild 검증 추가

[FEAT] 파이어베이스 동적 링크 생성

✨ 이슈 내용

  • 파이어베이스 Dynamic Link REST API 공식문서 참고
  • 구글 플레이 스토어 / 애플 App Store로 연결 or 앱 설치된 경우는 딥링크로 연결하기
  • 새로 연결해둔 가비아 도메인 이용해서 동적 링크 생성하기

✅ 체크리스트

  • Firebase Dynamic Link 기본 세팅
  • 초대장 API에서 함께 보낼 링크 생성 및 로직에 추가

[FEAT] 마이페이지 API

✨ 이슈 내용

  • 추가된 '마이페이지' 뷰 API 구현
    [현재 포함가능한 내용]
    • 완료한 문답 수
    • 질문 일수
    • 유저 개인 정보
    • 매칭된 유저 정보

✅ 체크리스트

  • 마이페이지 API 구현

[MODIFY] 사용자 맞춤형 질문 제공을 위한 로직 추가

✨ 이슈 내용

  • 기존에 타입별로 질문이 완전히 달라졌던 것과 달리 메인 질문에서 몇가지 질문만 교체되는 로직으로 변경

✅ 체크리스트

  • Q/A 요청사항으로 질문 리스트 보일 때 아직 안쌓인 질문은 안보이도록 처리
  • Enum 타입 수정
  • 로직 변경
  • 테스트용 API 만들어서 테스트

[REFACTOR] 유저 인증 관련 API 리팩토링

✨ 이슈 내용

  • 아래 API 구현 및 리팩토링 진행 (API 명세서 작성도 진행)
    • 로그인 + 회원가입
    • 엑세스 토큰 재발행
    • 로그아웃
    • 회원탈퇴

✅ 체크리스트

  • 로그인 + 회원가입 API 리팩토링
  • 엑세스 토큰 재발행 API 리팩토링
  • 로그아웃 API 리팩토링
  • 회원탈퇴 API 구현 및 리팩토링

[FEAT] 과거의 질문과 답변 리스트 + 개별 조회 API

✨ 이슈 내용

  1. 과거의 질문과 답변 리스트 조회 API
  • 과거의 질문과 답변 리스트 조회하기
  • 섹션 필터에 따라서 조회하는 기능 필요
  • 질문 인덱스 번호와, 질문 텍스트가 담겨서 와야함
  1. 과거의 문답 개별 조회 API
  • 과거의 질문과 답변 리스트에서 클릭했을 때 상세보기
  • 섹션, 주제명, 부모/자식의 질문과 답변이 담겨서 와야함

✅ 체크리스트

  • Effect Enum을 Topic으로 바꾸기
  • API 명세서 초안 작성
  • 1번 API 기능 구현
  • 2번 API 기능 구현

[FEAT] ERD를 바탕으로 엔티티 생성

✨ 이슈 내용

  • 아래의 ERD를 바탕으로 서비스에서 사용할 엔티티 생성

✅ 체크리스트

  • User 엔티티 이외의 엔티티들 추가로 생성하기

[FEAT] SQS를 이용한 스케줄링 작업 최적화

✨ 이슈 내용

  • 오늘의 질문 알림기능을 Spring Scheduler의 cron 표현식으로 구현하는 기존 방식에서 AWS SQS를 이용하는 방식으로 스케줄링 작업 최적화를 시도해보려 한다!

✅ 체크리스트

  • API-Server 에서 SQS 관련 TODO 하나씩 해결!
  • 알림서버에 구현되어 있는 스케줄링 작업을 분리하여 대기열에 추가하는 코드 추가

[FIX] 요청, 응답 값에 관한 에러 해결

✨ 이슈 내용

  • API 명세서를 작성하면서 발견한 에러들 처리
  • DTO의 필드값 필요에 따라 수정
  • json 직렬화/역직렬화에서 발생하는 자잘한 문제들 해결

✅ 체크리스트

  • 온보딩, 홈 화면 API 명세서 작성
  • DTO 안의 DTO 구조에서 @Valid 적용 안되는 문제 해결
    • UserInfoDto에서의 형식적 Validation 처리
  • ControllerExceptionAdvice에서 예외가 잡히지 않는 문제 해결
  • jackson 라이브러리 기본 동작에 의해 boolean 필드 직렬화 과정에서 발생하는 문제 해결

[FIX] deploy.sh 실행에서 사용하는 API들 SecurityConfig에서 풀어주기

✨ 이슈 내용

  • CodeDeploy에서 deploy.sh를 실행할 때, /profile과 /health, /actuator/health를 호출하는데,
  • 스프링 Security 설정파일의 AUTH_WHITELIST 배열에 등록해놓지 않았다보니 호출할 수 없는 오류 발생

✅ 체크리스트

  • 사용하는 API들 확인
  • SecurityConfig AUTH_WHITELIST 배열에 등록
  • 정상적으로 배포되는 것 확인

[REFACTOR] Querydsl을 이용한 쿼리 최적화

✨ 이슈 내용

  • Querydsl을 적용하여 서비스 내 복잡한 쿼리 최적화

✅ 체크리스트

  • Querydsl 관련 의존성 추가
  • DAO에서 jpql 순수 쿼리로 작성한 부분에 Querydsl 적용
  • JPA 메서드를 사용한 부분까지 최적화!

[REFACTOR] 서버 분리를 위한 멀티 모듈 적용

✨ 이슈 내용

  • 멀티 모듈을 적용
  • API 서버와 푸시 서버 분리

✅ 체크리스트

  • 멀티 모듈 설계
  • 멀티 모듈 적용
  • API 서버와 푸시 서버 분리해서 빌드
  • 각각의 로컬에서 테스트

[REFACTOR] Parentchild 엔티티에 관한 비즈니스 로직 리팩토링

✨ 이슈 내용

  • 노션 리팩토링 작업으로 정리해둔 태스크 수행

✅ 체크리스트

이전 구현 시 기록 및 완료된 작업

  • 푸시알림 팝업 동의 화면에 따른 hasAlarm 필드 업데이트 로직 필요!
  • 초대코드로 매칭할 때 부모자식 관계가 이미 존재하는 경우에 대해 예외처리
    • 온보딩 발신 - 부모자식 관계 생성 API 호출할 때마다 무한생성되는 문제 해결 필요
  • User - isMeChild 필드 업데이트 by isInvitorChild
    • default: true
    • isInvitorChild와 동일하게 하고, 이 반대로 온보딩 수신 측의 isMeChild 업데이트
  • 부모자식 관계에 포함된 User를 리스트로 관리
    • 리스트는 항상 사이즈: 2로 유지되어야 함
    • 리스트 내 유저의 isMeChild는 true/false 각각 1개씩 존재해야 함
  • 초대코드 패턴 유효성 추가
  • 메인 홈 화면 API에 몇 번째 질문인지의 정보도 포함
  • 메인 홈 화면 3가지 응답으로 나눠서 반환
    • ParentchildDao에서 자신의 userId로 상대 측 User 엔티티 반환하는 메서드 만들기

고민해볼 내용

  • 초대코드로 매칭 이후 —> 온보딩 수신으로 처리되도록 예외처리
    • 초대받는 측에서, 만약 초대코드 입력이 아닌 시작하기로 새로운 관계를 생성한 경우에 대해
    • 탈퇴 후 다시 처음으로 돌아가 초대코드를 입력해야 매칭되도록 예외처리 필요
  • 한 유저는 하나의 부모자식 관계만 가지도록 예외처리 → 데모데이 이후에 멀티 프로필로 관리할수도?
  • 초대 수신과 발신 측의 입력 정보에 충돌이 없는지 예외처리
  • DAO → @Query사용으로 변경?
    • DAO - CRUD를 메서드로 정의하여 구현 → 코드의 추상화와 재사용성 UP
      • 데이터 접근 계층을 명확히 추상화하고 메서드로 정의하여 가독성과 유지보수성을 높일 수 있다는 장점
    • @query - Spring Data JPA의 기능으로, CRUD 외의 복잡한 쿼리 유연하게 처리 가능 ✅ 복잡한 쿼리 작업이 필요하다면 이 방법이 더 유리
      • 개발시간 단축 가능
      • Repository에서 어노테이션 사용만으로 구현

[FEAT] 초대코드 입력 및 온보딩 정보 입력 API

✨ 이슈 내용

  • 초대받는 측의 온보딩 정보 입력 API 개발
  • 초대코드 입력 API 개발

✅ 체크리스트

  • 초대코드 검증 로직
  • 온보딩 정보 입력 (초대받는 측) API
  • 초대코드 입력 API
  • ParentChild 관계 참여하기 로직

[FIX] 주기적 푸시알림 API 활성화 시점 수정

✨ 이슈 내용

  • 푸시알림 활성화 메서드 호출을 하는 시점이 온보딩 수신이 완료된 이후인데, 이렇게 될 경우에 스케줄링 작업 예약이 쌓여서 오래된 부모자식 관계일수록 여러 번의 알림이 전송되는 문제 발생
  • 이를 해결하기 위해 적절한 호출 시점으로 변경하거나 이미 예약된 작업에 대한 분기 처리를 할 것

✅ 체크리스트

  • 스케줄링 작업 관리를 위한 여러 방안 중 선택!
  • 이미 예약된 작업에 대한 필터링

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.