-
Notifications
You must be signed in to change notification settings - Fork 4
백엔드 구현 기능 상세 설명 페이지
kim dong hyuk edited this page Nov 14, 2024
·
18 revisions
- Google OAuth2로 구현
- 몇 가지 예외처리된 경로를 제외하고 구글 로그인 요구
- 스웨거
- /
- H2 console
- 구글 로그인
- 멤버 조회 및 생성
-
Flow:
-
토큰 검증:
-
토큰이 없다면:
- 로그인 시도
- 가입 정보가 없으면 회원가입
- 성공 시 토큰 생성 및 반환
-
GET
Parameter로 반환
-
- 실패 시
/error
로 이동
- 로그인 시도
-
토큰이 있다면:
- 토큰 검증
- 토큰 내부 정보를 파싱
-
토큰이 없다면:
-
토큰 검증:
- 토큰 내 정보를 통해 요청한 본인의 정보를 조회할 수 있다.
- 유저명, 이메일, 사진URL, 권한, 생성일을 json형태로 반환
- 토큰 내 정보를 통해 유저를 조회 후 정보를 수정한다.
- 수정 가능 항목:
- 유저 이름(
username
) - 사진(
picture
)
- 유저 이름(
-
입력된 값만 검증해서 변경:
- 공백 값: 기존 값 유지
- 이미지 URL 검증: URL 패턴 어길 시
400
에러 반환
- 유저명, 이메일, 사진URL을 json형태로 반환
- 토큰 내 정보를 통해 유저를 조회 후 삭제한다.
- Soft Delete 방식으로 구현
- 유저명, 이메일, 사진URL을 json형태로 반환
- 인증 코드로 토큰 반환
-
Flow:
- 멤버 ID를 AES-256으로 암호화하여 코드 생성
- 코드를 복호화하여 검증
- 인증 후 멤버 이메일로 토큰 생성 및 반환
- 스프링 시큐리티에 필터(TokenAuthenticationFilter)를 적용해서 예외처리
- 필터에서 토큰의 존재 유무와 토큰의 형식 및 exp를 검증한다.
- 예외 검출시 401과 에러 메세지를 반환한다.
- 토큰이 필요한 api이나 토큰이 존재하지 않으면 구글 로그인을 시도한다.
- 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 프로젝트 ID를 통해 특정 프로젝트 단건 조회
- 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 토큰 내 유저의 이메일 정보를 통해 본인이 관리하는 프로젝트를 페이지네이션 방식으로 조회
- 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 토큰 내 유저의 이메일 정보를 통해 본인이 관리하는 프로젝트의
일정 정보
를 페이지네이션 방식으로 조회
- 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 프로젝트가 존재하는 지 검증
- 프로젝트의
옵션 정보
를 리스트 형식으로 반환
- Flow:
- 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 토큰에서 이메일을 추출하여 유저 존재 여부 검증
- DTO 내
OptionEntity
들의 ID를 통해 해당OptionEntity
가 존재하는지 조회하여 검증 -
OptionEntity
를ProjectOptionEntity
로 매핑-
ProjectOptionEntity
는ProjectEntity
와OptionEntity
의관계 엔티티
-
-
ProjectEntity
생성 및 저장 - 각
ProjectOption
의ProjectEntity
필드를 생성한 ProjectEntity로 설정
- Flow:
- 사용자의 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 프로젝트 존재 여부 검증
- 기존의
ProjectOption
리스트 삭제 - DTO 내
OptionEntity
들의 ID를 통해 해당OptionEntity
가 존재하는지 조회하여 검증 -
OptionEntity
를ProjectOptionEntity
로 매핑 - 나머지 정보 업데이트 후 저장
- 토큰에서 권한정보를 추출하여 사용자인지 검증.
- 프로젝트 ID를 통해 해당 프로젝트가 존재하는 지 확인
- ProjectEntity의 isDeleted 필드를 True로 변경
- 해당 상태는 삭제된 상태(Soft Delete 방식)
- 새로운 팀원 생성 API
- 프로젝트 ID와 만료 시간(exp)을
getAttendURL()
로부터 뽑아준다. (팀원은 요청할 때, 어텐드 링크를 보낼 것이므로) - 초대 코드의 만료 시간(exp)을 검사한다.
- 프로젝트 ID로 프로젝트 존재 여부를 검증한다.
- 프로젝트 만료 기일을 검증한다.
- 저장되어 있는 이메일과 중복되는지 검증한다.
- 팀원의 이메일로 참여 코드를 생성하여 보낸다.
- 기존 팀원 정보 수정 API
- 토큰으로부터 정보를 뽑아서 팀장인지 검증한다.
- 프로젝트 ID와 멤버 ID로 멤버 존재 여부를 검증한다.
- 프로젝트 만료 기일을 검증한다.
-
memberMapper.toUpdate()
로 정보를 업데이트 한다. -
memberMapper.toPutResponseDTO()
로 결과를 반환한다.
- 팀원 정보 삭제 API
- 토큰으로부터 정보를 뽑아서 팀장인지 검증한다.
- 프로젝트 ID와 멤버 ID로 멤버 존재 여부를 검증한다.
- 프로젝트 만료 기일을 검증한다.
- Soft Delete이므로
setDelete
를 설정한다.
- 특정 프로젝트 내 팀원 정보 조회 API
- 토큰에서 정보를 뽑아서, 팀원인지 검증한다.
- 프로젝트 ID와 멤버 ID를 이용하여 해당 멤버가 프로젝트에 존재하는지 검증한다.
- 프로젝트의 만료 기일을 검증한다.
-
memberMapper.toGetResponseDTO()
를 통해 결과를 반환한다.
- 특정 프로젝트 내 팀원 정보 전체 조회 API
- 토큰에서 정보를 뽑아서, 팀원인지 검증한다.
- 프로젝트 ID를 이용하여 프로젝트에 멤버가 존재하는지 검증한다.
- 프로젝트의 만료 기일을 검증한다.
- 팀원 정보를
memberList.toPageable()
객체로 반환한다.
- 사용자의 플로우는 다음과 같다.
팀장의 플로우:
- 로그인 → 프로젝트 생성 → 어텐드 링크 생성 → 팀원 초대.
팀원의 플로우:
- 어텐드 링크 접속 → 정보 입력 → 참여 코드 수신 → 프로젝트 참가.
위 플로우에서 어텐드 링크를 제작하는 API이다.
- 팀장으로부터 어텐드 링크 생성 요청을 받으면, 프로젝트 ID와 이메일로 프로젝트 존재 여부를 검증한다.
-
projectEntity
로부터 프로젝트 마감 기한을 검증한다. - 토큰에서 추출한
role
로 팀장인지 검증한다. - 프로젝트 ID와 현재 시간을 조합한 뒤,
AesEncrypt
클래스를 통해 암호화하여 최종 어텐드 링크를 생성한다.
-
이메일 전송이 필요한 경우는 다음의 3가지이다:
- 멤버 생성 요청이 와서 멤버를 데이터베이스에 저장한 뒤, 팀원의 이메일로 참여 코드를 생성하여 보낼 때.
- 멤버 생성 요청이 프로젝트 중간에 들어올 때.
- 프로젝트 마감 기한이 얼마 남지 않았을 때.
-
위 상황들에 대해 이메일을 전송해야 하며, 구현 과정은 다음과 같다:
- Gmail을 사용할 것이기 때문에 구글에서 앱 패스키 및 2단계 인증 등의 설정을 해준다.
-
yml
파일이나properties
파일에 관련 설정을 추가한다. - 발신자 메일과 앱 패스키는 민감한 정보이므로
yml
파일이나 환경 변수로 따로 관리한다. - 완료 후
JavaMailSender
를 선언하여 메시지 내용, 제목, 수신자 이메일 등을 설정한다
- 멤버들이 프로젝트에 최종적으로 참여할 때 사용하는 참여 코드를 생성하는 API이다.
-
randomUUID()
를 이용하여 랜덤 문자를 생성한 뒤, 현재 시간과 섞어서 참여 코드를 만들어준다. - 이를 통해 유일한 코드를 생성한다.
- 프로젝트 ID를 기반으로 태스크 리스트 조회
- status, priority, ownerName으로 필터링한 결과를 반환
- ownerName에 의한 필터링이 필요할 경우 멤버 ID를 받아와서 조회
-
taskMapper.toDetailWithOwner()
매핑하여 페이지네이션 적용한 결과를 반환
- 태스크 ID로 단건 조회
- 태스크의 존재 여부 검증(id가 존재하는 값인지,
isDeleted
가 0인지) -
taskMapper.toDetail()
로 결과를 반환
- 태스크 생성 기능
- 태스크 생성은 팀장만 가능
- 프로젝트 ID와 유저 Email 정보로
isDeleted
가 0인 프로젝트 존재 유무 검증 - 태스크의 기한이 프로젝트 범위를 넘어서지 않도록 검증
- 프로젝트와 관련있는 팀원인지 검증
- 멤버ID를 통해 존재하는 멤버인지 검증
- 태스크 생성 후
taskMapper.toDetail()
로 결과를 반환
- 기존 태스크 정보 수정
- 태스크 수정은 팀장과 태스크를 수행하는 팀원일 경우 가능함
- 태스크 존재 여부 검증
- 프로젝트 기한이 정상적으로 설정되었는지 검증
- 태스크 수정 권한이 있는 사용자의 요청인지 확인
- 멤버 ID에 해당하는 사용자가 존재하는지 검증
-
taskMapper.toUpdate()
로 정보를 업데이트 -
taskMapper.toDetail()
로 결과를 반환
- 태스크 정보 삭제
- 태스크 삭제 권한이 있는지 검증 후 삭제 가능
- softDelete 방식 사용
- 프로젝트 마감 기한이 얼마 남지 않았을 때, 독려 이메일 전송.
- 따로 서비스 계층에 구현함
- @Scheduled 어노테이션과 기존의 메일 기능에서 사용된 JavaMailSender를 이용하여 구현함.
- 프로젝트 참여자(게스트)의 진행도와 할당된 태스크 리스트를 조회
- 아래의 3번 기능과 마찬가지로, 빵빠레 및 나무키우기 기능에 활용되는 API
- 프로젝트 ID를 통해 해당 프로젝트에 참여중인 멤버의 정보를 리스트로 저장
- 삭제되지 않은 멤버들을 순회하며 할당된 태스크 정보를 가져옴
- 해당 멤버의 progress 평균을 구하여 결과에 페이지네이션을 적용하여 반환
- 프로젝트 내 태스크 진행 상황 조회
- 프로젝트에 할당된 태스크가 있는지 조회
- 활성화된 태스크들의 모든 progress의 평균을 계산하여 프로젝트 진행도를 구함
- 프로젝트 진행도에 따라 나무의 생장 정도를 "새싹", "묘목", "어린 나무", "성장한 나무"로 분류하여 결과값 반환