Skip to content

06 ‐ 02 ‐ My Page (Profile) Wiki

juhyeonlee edited this page Nov 24, 2023 · 21 revisions

프로필 모듈(마이 페이지) 아키텍처 문서

목차

  1. 비즈니스 요구사항
  2. 아키텍처 설계
  3. API 엔드포인트 설계
  4. 다른 모듈과 상호작용 포인트
  5. 모델 수정 사항

비즈니스 요구사항

목적

  • 사용자의 개인정보와 프로필, 알람, 관심 리스트를 관리한다.

요구사항

기능명세

  • 개인정보 페이지
    • 개인정보(실명, 이메일, 지역, 소속)를 조회할 수 있다.
    • 비밀번호를 수정할 수 있다.
    • 42인증을 진행할 수 있다.
  • 프로필 페이지
    • 프로필 정보(프로필 이미지, 닉네임, 소속집단, 이메일, 자기소개)와 링크(링크 제목, 링크 URL)를 조회할 수 있다.
    • 닉네임 중복을 확인한다.
    • 프로필 정보(프로필 이미지, 닉네임, 자기소개)를 수정할 수 있다.
      • 자기소개는 한영 관계없이 150자이다.
  • 홈페이지 설정 페이지
    • 푸쉬 알람과 이메일 알람을 설정할 수 있다.
    • 등록된 알람 키워드 목록을 조회, 등록, 삭제, 전체삭제 할 수 있다.
  • 관심 리스트 페이지
    • 관심 리스트를 조회, 삭제, 전체삭제 할 수 있다.

성능명세

아키텍처 설계

모듈 구성

  1. Controller : HTTP 요청을 처리 + 데이터 전처리
    • PersonalInfoController : 개인정보(비밀번호) 처리
    • ProfileController : 프로필 정보(프로필 이미지, 닉네임, 자기소개, 링크) 처리
    • KeywordAlarmController : 알람 키워드
    • FavoriteController : 관심있는 리스트
  2. Service : 비즈니스 로직 수행
    • PersonalInfoService : 개인정보조회, 42인증, 비밀번호 수정
    • ProfileService : 프로필 조회, 타 사용자 프로필 조회, 닉네임 중복 확인(이는 회원가입 API와 공유), 프로필 정보 수정, 링크 수정
    • KeywordAlarmService : 알람 키워드 조회, 등록, 삭제, 전체 삭제
    • FavoriteService : 관심있는 리스트 조회, 전체 삭제
    • FileService : 파일(여기서는 프로필 이미지)저장, 업로드, 삭제
  3. Repository : 데이터 저장소와 상호작용을 담당한다.
    • UserRepository : 사용자와 관련된 정보들
    • UserLinkRepository : 링크와 관련된 정보들

데이터 모델

  1. User : 사용자에 대한 정보가 저장되는 데이터베이스
    • id : 사용자에 대한 고유 식별자(Long)
    • email : 사용자의 E-mail(String)
    • password : 사용자가 등록한 비밀번호로, 암호화되어 저장(String)
    • name : 사용자의 실명(String)
    • nickname : 사용자의 닉네임(String)
    • isAlarm : 사용자가 설정한 알람(Alarm)
    • address : 사용자가 설정한 지역(String)
    • imageUrl : 사용자가 등록한 프로필 이미지
    • certification : 사용자 본인 인증 여부(boolean)
    • company : 사용자의 소속(String)
    • introducte : 사용자의 자기소개(String)
    • peerLevel : 사용자의 피어 레벨(Long)
    • representAchievement : 사용자의 대표업적(String)
    • keywordAlarm : 사용자가 등록한 알람 키워드(String, ^&%로 구분)
    • PeerOperation : 42 서울에 대한 정보들(PeerOperation)
    • userAchievements : 사용자가 달성한 업적(List-UserAchievement)
    • userLinks : 사용자가 등록한 소개 링크(List-UserLink)
    • teamUsers : 사용자가 속한 팀(List-TeamUser)
    • recruiteFavorites : 사용자가 등록한 관심 목록(List-RecruitFavorite)
    • socialLogins : 소셜 로그인(42/Google)에 관한 데이터(List-SocialLogin)
    • indexList1 : 대화목록 - 먼저 대화를 한 경우(List-Message)
    • indexList2 : 대화목록 - 대화를 받은 경우(List-Message)
    • recruitList : 사용자가 작성한 모집글(List-Recruit)
  2. UserLink : 사용자가 등록한 링크들이 저장되는 데이터베이스
    • id : 사용자가 등록한 링크에 대한 고유 식별자(Long)
    • userId : 해당 링크를 등록한 사용자(User)
    • link : 링크 주소(String)
    • linkName : 링크 이름(String)

에러 처리 전략

API 엔드포인트 설계

  • HTTP 헤더에 JWT 토큰을 추가해서 전달해 주셔야합니다. 해당 토큰을 이용해서 사용자를 찾아 CRUD를 진행합니다. (JWT 토큰을 사용하는 API는 JWT 표시, 사용하지 않는 API는 표시 안함)
  1. 개인정보 조회 : GET /api/v1/info (JWT)
  2. 비밀번호 수정 : PUT /api/v1/info/password (JWT)
  3. 프로필 조회 : GET /api/v1/profile (JWT)
  4. 프로필 수정 : PUT /api/v1/profile/introduction/edit(JWT)
  5. 상대방 프로필 조회 : GET /api/v1/profile/other/?userId=?infoList=
  6. 링크 수정 : PUT /api/v1/profile/link (JWT)
  7. 알람 키워드 조회 : GET /api/v1/alarm (JWT)
  8. 알람 키워드 등록 : POST /api/v1/alarm/add (JWT)
  9. 알람 키워드 삭제 : DELETE /api/v1/alarm/delete?keyword= (JWT)
  10. 알람 키워드 전체 삭제 : DELETE /api/v1/alarm/delete/all (JWT)
  11. 관심 모집글 조회 : GET /api/v1/recruit/favorite?type=&page&pagesize= (JWT)
  12. 관심 모집글 전체 삭제 : DELETE /api/v1/recruit/favorite?type= (JWT)

다른 모듈과 상호작용 포인트

  • 프로필 변경시, 사용되는 프로필 이미지 변경은 NHN의 object storage와 연결되어 있는 ObjectStorage 모듈과 관련있습니다.
  • 관심 리스트 조회는 recruit 모듈과 관련있습니다.

로직 특이 사항

  1. PersonalService
    • 42 인증을 진행한 사용자라면, getAuthenticationFt를 통해 인트라 아이디를 전달해 줍니다.
    • Google 인증을 진행한 사용자라면, getAuthenticationGoogle를 통해 gmail을 전달해 줍니다.
  2. ProfileService
    • editLinks
      • 사용자가 가지고 있던 링크를 모두 지우고 프론트에서 요청한 링크로 덮어쓰기합니다.
      • 만일, 프론트에서 가져온 링크 중에 빈 문자열 혹은 공백으로 된 문자열들은 그냥 건너뜁니다.
    • getOtherProfile
      • 우선적으로 요청할 수 있는 정보는 닉네임(nickname)과 프로필 이미지(profileImageUrl)로 한정했습니다.
        • 이는 추후 추가 가능합니다.
        • 때문에 이외의 요청이 들어오면 예외처리됩니다.
    • editProfile
      • 프로필 이미지를 MultipartFile로 가져와야 하기 때문에, 프론트에서 form-data 형식으로 전송합니다.
        • form-data는 boolean값이 String으로 들어오기 때문에, 원래 boolean이었던 imageChange를 String으로 받아 처리하도록 했습니다.
        • 실제로, ProfileController에서 boolean값으로 반환 뒤, isChange로 가져옵니다.
          • boolean값으로 변환한 이후에는 imageChange는 사용되지 않습니다.
      • 프로필 이미지를 변경 할 때 조건문은 다음과 같은 분기문을 기반으로 작성했습니다.
        • isChange는 사용자 프로필 이미지가 기본 이미지가 아니고, 프론트에서 요청한 이미지가 없는 경우에만 고려 대상입니다.
        if (사용자 프로필 이미지가 기본 이미지가 아닌 경우 - 즉, 등록되어 있는 경우)
            if (프론트에서 요청한 이미지(`profileImage`)가 있는 경우)
                이미지를 변경합니다.
            else
                if (프론트에서 이미지 변경을 요청(`isChange`가 true)한 경우)
                    이미지를 삭제합니다.
        else
            if (프론트에서 요청한 이미지가 있는 경우)
                이미지를 저장(등록합니다.
        
  3. KeywordAlarmService
    • 알람 키워드는 리스트 형태가 아니라 구분문자(^&%)를 기준으로 하나의 문자열로 생성해 저장합니다.
      • 가령, Java와 C#을 저장한다면 JS^&%C#으로 저장됩니다.
  4. FavoriteService
    • 관심 모집글은 메인 페이지에 표시되는 관심 모집글과 동일하게 작동해야하기 때문에, 프론트에 전송하는 관심 모집글 컨텐츠 자체는 메인 페이지의 관심 모집글과 동일합니다.

아직 진행되지 않는 사항

  • 알람(알람 키워드가 아닌)은 프론트 엔드의 PWA와 연관있어 보류 했습니다.
    • DB 설계, 앤드 포인트 설계 등 전혀 되어있지 않습니다.
  • 업적은 기획 수준에서 보류되었습니다.
Clone this wiki locally