Skip to content

백엔드 구현 기능 상세 설명 페이지

kim dong hyuk edited this page Nov 14, 2024 · 18 revisions

인증 (김동혁)

1. 회원가입 & 로그인

  • Google OAuth2로 구현
  • 몇 가지 예외처리된 경로를 제외하고 구글 로그인 요구
    • 스웨거
    • /
    • H2 console
    • 구글 로그인
    • 멤버 조회 및 생성
  • Flow:
    1. 토큰 검증:
      • 토큰이 없다면:
        • 로그인 시도
          • 가입 정보가 없으면 회원가입
        • 성공 시 토큰 생성 및 반환
          • GET Parameter로 반환
        • 실패 시 /error로 이동
      • 토큰이 있다면:
        • 토큰 검증
        • 토큰 내부 정보를 파싱

2. 유저 정보 조회

  • 토큰 내 정보를 통해 요청한 본인의 정보를 조회할 수 있다.
  • 유저명, 이메일, 사진URL, 권한, 생성일을 json형태로 반환

3. 유저 정보 수정

  • 토큰 내 정보를 통해 유저를 조회 후 정보를 수정한다.
  • 수정 가능 항목:
    • 유저 이름(username)
    • 사진(picture)
  • 입력된 값만 검증해서 변경:
    • 공백 값: 기존 값 유지
    • 이미지 URL 검증: URL 패턴 어길 시 400 에러 반환
  • 유저명, 이메일, 사진URL을 json형태로 반환

4. 유저 정보 삭제

  • 토큰 내 정보를 통해 유저를 조회 후 삭제한다.
  • Soft Delete 방식으로 구현
  • 유저명, 이메일, 사진URL을 json형태로 반환

5. 코드로 참여

  • 인증 코드로 토큰 반환
  • Flow:
    1. 멤버 ID를 AES-256으로 암호화하여 코드 생성
    2. 코드를 복호화하여 검증
    3. 인증 후 멤버 이메일로 토큰 생성 및 반환

6. 시큐리티 토큰 생성 예외처리

  • 스프링 시큐리티에 필터(TokenAuthenticationFilter)를 적용해서 예외처리
  • 필터에서 토큰의 존재 유무와 토큰의 형식 및 exp를 검증한다.
  • 예외 검출시 401과 에러 메세지를 반환한다.
  • 토큰이 필요한 api이나 토큰이 존재하지 않으면 구글 로그인을 시도한다.

프로젝트 (김도헌)

1. 프로젝트 조회

  • 토큰에서 권한정보를 추출하여 사용자인지 검증.
  • 프로젝트 ID를 통해 특정 프로젝트 단건 조회

2. 프로젝트 리스트 조회

  • 토큰에서 권한정보를 추출하여 사용자인지 검증.
  • 토큰 내 유저의 이메일 정보를 통해 본인이 관리하는 프로젝트를 페이지네이션 방식으로 조회

3. 프로젝트 기간 리스트 조회

  • 토큰에서 권한정보를 추출하여 사용자인지 검증.
  • 토큰 내 유저의 이메일 정보를 통해 본인이 관리하는 프로젝트의 일정 정보페이지네이션 방식으로 조회

4. 프로젝트 옵션 조회

  • 토큰에서 권한정보를 추출하여 사용자인지 검증.
  • 프로젝트가 존재하는 지 검증
  • 프로젝트의 옵션 정보를 리스트 형식으로 반환

5. 프로젝트 생성

  • Flow:
  1. 토큰에서 권한정보를 추출하여 사용자인지 검증.
  2. 토큰에서 이메일을 추출하여 유저 존재 여부 검증
  3. DTO 내 OptionEntity들의 ID를 통해 해당 OptionEntity가 존재하는지 조회하여 검증
  4. OptionEntityProjectOptionEntity로 매핑
    • ProjectOptionEntityProjectEntityOptionEntity관계 엔티티
  5. ProjectEntity 생성 및 저장
  6. ProjectOptionProjectEntity 필드를 생성한 ProjectEntity로 설정

6. 프로젝트 수정

  • Flow:
  1. 사용자의 토큰에서 권한정보를 추출하여 사용자인지 검증.
  2. 프로젝트 존재 여부 검증
  3. 기존의 ProjectOption 리스트 삭제
  4. DTO 내 OptionEntity들의 ID를 통해 해당 OptionEntity가 존재하는지 조회하여 검증
  5. OptionEntityProjectOptionEntity로 매핑
  6. 나머지 정보 업데이트 후 저장

7. 프로젝트 삭제

  • 토큰에서 권한정보를 추출하여 사용자인지 검증.
  • 프로젝트 ID를 통해 해당 프로젝트가 존재하는 지 확인
  • ProjectEntity의 isDeleted 필드를 True로 변경
    • 해당 상태는 삭제된 상태(Soft Delete 방식)

팀원 (권순호)

1. 팀원 생성

  • 새로운 팀원 생성 API
  1. 프로젝트 ID와 만료 시간(exp)을 getAttendURL()로부터 뽑아준다. (팀원은 요청할 때, 어텐드 링크를 보낼 것이므로)
  2. 초대 코드의 만료 시간(exp)을 검사한다.
  3. 프로젝트 ID로 프로젝트 존재 여부를 검증한다.
  4. 프로젝트 만료 기일을 검증한다.
  5. 저장되어 있는 이메일과 중복되는지 검증한다.
  6. 팀원의 이메일로 참여 코드를 생성하여 보낸다.

2. 팀원 수정

  • 기존 팀원 정보 수정 API
  1. 토큰으로부터 정보를 뽑아서 팀장인지 검증한다.
  2. 프로젝트 ID와 멤버 ID로 멤버 존재 여부를 검증한다.
  3. 프로젝트 만료 기일을 검증한다.
  4. memberMapper.toUpdate()로 정보를 업데이트 한다.
  5. memberMapper.toPutResponseDTO()로 결과를 반환한다.

3. 팀원 삭제

  • 팀원 정보 삭제 API
  1. 토큰으로부터 정보를 뽑아서 팀장인지 검증한다.
  2. 프로젝트 ID와 멤버 ID로 멤버 존재 여부를 검증한다.
  3. 프로젝트 만료 기일을 검증한다.
  4. Soft Delete이므로 setDelete를 설정한다.

4. 팀원 조회

  • 특정 프로젝트 내 팀원 정보 조회 API
  1. 토큰에서 정보를 뽑아서, 팀원인지 검증한다.
  2. 프로젝트 ID와 멤버 ID를 이용하여 해당 멤버가 프로젝트에 존재하는지 검증한다.
  3. 프로젝트의 만료 기일을 검증한다.
  4. memberMapper.toGetResponseDTO()를 통해 결과를 반환한다.

5. 팀원 전체 조회

  • 특정 프로젝트 내 팀원 정보 전체 조회 API
  1. 토큰에서 정보를 뽑아서, 팀원인지 검증한다.
  2. 프로젝트 ID를 이용하여 프로젝트에 멤버가 존재하는지 검증한다.
  3. 프로젝트의 만료 기일을 검증한다.
  4. 팀원 정보를 memberList.toPageable() 객체로 반환한다.

6. 어텐드 링크 생성

  • 사용자의 플로우는 다음과 같다.

팀장의 플로우:

  • 로그인 → 프로젝트 생성 → 어텐드 링크 생성 → 팀원 초대.

팀원의 플로우:

  • 어텐드 링크 접속 → 정보 입력 → 참여 코드 수신 → 프로젝트 참가.

위 플로우에서 어텐드 링크를 제작하는 API이다.

  1. 팀장으로부터 어텐드 링크 생성 요청을 받으면, 프로젝트 ID와 이메일로 프로젝트 존재 여부를 검증한다.
  2. projectEntity로부터 프로젝트 마감 기한을 검증한다.
  3. 토큰에서 추출한 role로 팀장인지 검증한다.
  4. 프로젝트 ID와 현재 시간을 조합한 뒤, AesEncrypt 클래스를 통해 암호화하여 최종 어텐드 링크를 생성한다.

7. 이메일 전송 서비스

  • 이메일 전송이 필요한 경우는 다음의 3가지이다:

    1. 멤버 생성 요청이 와서 멤버를 데이터베이스에 저장한 뒤, 팀원의 이메일로 참여 코드를 생성하여 보낼 때.
    2. 멤버 생성 요청이 프로젝트 중간에 들어올 때.
    3. 프로젝트 마감 기한이 얼마 남지 않았을 때.
  • 위 상황들에 대해 이메일을 전송해야 하며, 구현 과정은 다음과 같다:

  1. Gmail을 사용할 것이기 때문에 구글에서 앱 패스키 및 2단계 인증 등의 설정을 해준다.
  2. yml 파일이나 properties 파일에 관련 설정을 추가한다.
  3. 발신자 메일과 앱 패스키는 민감한 정보이므로 yml 파일이나 환경 변수로 따로 관리한다.
  4. 완료 후 JavaMailSender를 선언하여 메시지 내용, 제목, 수신자 이메일 등을 설정한다

8. 참여 코드 생성

  • 멤버들이 프로젝트에 최종적으로 참여할 때 사용하는 참여 코드를 생성하는 API이다.
  1. randomUUID()를 이용하여 랜덤 문자를 생성한 뒤, 현재 시간과 섞어서 참여 코드를 만들어준다.
  2. 이를 통해 유일한 코드를 생성한다.

태스크 (조서영)

1. 태스크 리스트 조회

  • 프로젝트 ID를 기반으로 태스크 리스트 조회
  • status, priority, ownerName으로 필터링한 결과를 반환
  1. ownerName에 의한 필터링이 필요할 경우 멤버 ID를 받아와서 조회
  2. taskMapper.toDetailWithOwner() 매핑하여 페이지네이션 적용한 결과를 반환

2. 태스크 단건 조회

  • 태스크 ID로 단건 조회
  1. 태스크의 존재 여부 검증(id가 존재하는 값인지, isDeleted가 0인지)
  2. taskMapper.toDetail()로 결과를 반환

3. 태스크 생성

  • 태스크 생성 기능
  • 태스크 생성은 팀장만 가능
  1. 프로젝트 ID와 유저 Email 정보로 isDeleted가 0인 프로젝트 존재 유무 검증
  2. 태스크의 기한이 프로젝트 범위를 넘어서지 않도록 검증
  3. 프로젝트와 관련있는 팀원인지 검증
  4. 멤버ID를 통해 존재하는 멤버인지 검증
  5. 태스크 생성 후 taskMapper.toDetail()로 결과를 반환

4. 태스크 수정

  • 기존 태스크 정보 수정
  • 태스크 수정은 팀장과 태스크를 수행하는 팀원일 경우 가능함
  1. 태스크 존재 여부 검증
  2. 프로젝트 기한이 정상적으로 설정되었는지 검증
  3. 태스크 수정 권한이 있는 사용자의 요청인지 확인
  4. 멤버 ID에 해당하는 사용자가 존재하는지 검증
  5. taskMapper.toUpdate()로 정보를 업데이트
  6. taskMapper.toDetail()로 결과를 반환

5. 태스크 삭제

  • 태스크 정보 삭제
  • 태스크 삭제 권한이 있는지 검증 후 삭제 가능
    • softDelete 방식 사용

이벤트

1. 독려 이메일 전달

  • 프로젝트 마감 기한이 얼마 남지 않았을 때, 독려 이메일 전송.
  • 따로 서비스 계층에 구현함
  • @Scheduled 어노테이션과 기존의 메일 기능에서 사용된 JavaMailSender를 이용하여 구현함.

2. 각 게스트별 진행도 조회

  • 프로젝트 참여자(게스트)의 진행도와 할당된 태스크 리스트를 조회
  • 아래의 3번 기능과 마찬가지로, 빵빠레 및 나무키우기 기능에 활용되는 API
  1. 프로젝트 ID를 통해 해당 프로젝트에 참여중인 멤버의 정보를 리스트로 저장
  2. 삭제되지 않은 멤버들을 순회하며 할당된 태스크 정보를 가져옴
  3. 해당 멤버의 progress 평균을 구하여 결과에 페이지네이션을 적용하여 반환

3. 프로젝트별 진행도 조회

  • 프로젝트 내 태스크 진행 상황 조회
  1. 프로젝트에 할당된 태스크가 있는지 조회
  2. 활성화된 태스크들의 모든 progress의 평균을 계산하여 프로젝트 진행도를 구함
  3. 프로젝트 진행도에 따라 나무의 생장 정도를 "새싹", "묘목", "어린 나무", "성장한 나무"로 분류하여 결과값 반환