열렬히.뛰기

코드분석 (5) : 사용자

Projects > 코드분석 (5) : 사용자

Domain

  • 클래스 3개와 enum 2개로 구성됨.
  • enum이란? 왜 enum을 쓰는가?
    • enum(열거형)은 서로 관련된 상수들의 집합을 정의하는 특별한 데이터 타입. 즉, 미리 정의된 값들만 가질 수 있는 타입을 만들 때 사용.
    • 정해진 값만 사용 가능하기에 안전하고, 가독성과 유지보수성이 향상되며, 유효성 검사 필요 없음.
    • 연관 정보 저장 가능.

종합분석

  • 사용자 영역의 Domain은 사용자의 역할, 등급, 페르소나, 상태 등을 관리하기 위한 enum과 Entity로 구성되어 있습니다.
  • Users 엔티티는 사용자의 기본 정보를 저장하고, 여러 enum을 사용하여 역할과 상태를 관리합니다.

repository

1. PersonaRepository

  • 역할: Persona 엔티티를 관리하는 JPA 리포지토리입니다.
  • 주요 메서드: findByPersonaCode(String code): 페르소나 코드를 기반으로 특정 페르소나를 검색하는 메서드. 페르소나 코드가 유일한 값이므로, 결과는 Optional로 반환됩니다.

2. UsersRepository

  • 역할: Users 엔티티를 관리하는 JPA 리포지토리입니다. 다양한 조건으로 사용자 데이터를 조회할 수 있습니다.
  • PersonaRepository와 UsersRepository는 Persona와 Users 엔티티의 데이터 조회와 관리를 담당하는 JPA 리포지토리입니다.
  • UsersRepository는 이메일사용자 상태(활성 여부)를 기반으로 로그인이나 활성 사용자 조회와 같은 다양한 검색 기능을 제공합니다.
  • 쿼리 메서드JPQL 쿼리를 사용해 사용자 데이터에 접근하며, 사용자 상태(활성/비활성)를 확인하거나 페르소나를 찾는 등 다양한 조건으로 조회할 수 있습니다.

service

1. AuthService

역할: 사용자 인증 및 소셜 로그인 처리.

주요 기능:

  1. Google 소셜 로그인 (loginGoogle): Google OAuth2로 로그인한 사용자를 처리하고, 이미 존재하는지 확인 후 신규 가입 또는 기존 사용자 업데이트를 처리합니다. 사용자가 기존에 Apple로 가입한 경우 예외를 발생.
  2. Apple 소셜 로그인 (loginApple): Apple OAuth2로 로그인한 사용자를 처리하며, Google과 비슷한 방식으로 새 계정을 생성하거나 기존 사용자를 업데이트합니다.
  3. 토큰 처리: 로그인 후 JWT 토큰을 생성하고, 이를 Redis에 저장합니다. 토큰 만료 시, 리프레시 토큰을 이용해 새 토큰을 발급합니다.
  4. 로그아웃 (logout): Redis에서 토큰을 삭제하여 사용자의 로그아웃을 처리합니다.
  5. 회원 탈퇴 (delete): 사용자의 상태를 비활성화하고, Redis에서 토큰 정보를 삭제합니다.

2. PersonaService

역할: 사용자 페르소나(Persona) 정보를 처리하는 서비스.

주요 기능:

  • 페르소나 목록 조회 (findAll): 데이터베이스에서 모든 페르소나 정보를 조회하며, 페르소나 정보가 없을 경우 예외를 발생시킵니다.

3. UsersService

역할: 사용자 정보를 관리하며, 페르소나 변경과 AI 분석 결과를 기반으로 한 사용자 상태 관리를 담당합니다.

주요 기능:

  1. 사용자 조회 (findByUserId): 사용자 ID를 기반으로 사용자를 조회하고, 사용자의 편지 상태(읽음/안읽음) 정보를 반환합니다.
  2. 페르소나 변경 (updatePersona): 사용자의 페르소나 코드를 업데이트하고, 변경된 페르소나 정보를 반환합니다.

dto

1. PersonaResponseDTO

  • 역할: 사용자의 페르소나(Persona) 정보를 클라이언트에 전달하기 위한 데이터 전송 객체입니다.
  • 주요 필드:
    1. personaId: 페르소나의 고유 ID.
    2. personaName: 페르소나의 이름.
    3. personaCode: 페르소나의 고유 코드.
  • 생성자: Persona 엔티티 객체로부터 필요한 필드들을 받아 DTO로 변환하는 생성자를 가지고 있습니다.

2. UserInfoResponseDTO

  • 역할: 사용자의 기본 정보AI 편지 상태, 페르소나 정보 등을 클라이언트에 전달하기 위한 데이터 전송 객체입니다.
  • 주요 필드:
    1. userId: 사용자의 고유 ID.
    2. name: 사용자의 이름.
    3. email: 사용자의 이메일.
    4. role: 사용자의 권한 (예: GUEST, USER, ADMIN).
    5. grade: 사용자의 등급 (예: GENERAL, PREMIUM).
    6. pieceCnt: 사용자 조각 수 (앱의 특정 기능을 위한 값).
    7. providerName: 소셜 로그인 제공자 (예: Google, Apple).
    8. personaCode: 사용자의 페르소나 코드.
    9. personaName: 사용자의 페르소나 이름.
    10. bgImage: 사용자의 배경 이미지.
    11. userStatus: 사용자의 상태 (활성화 여부).
    12. replyStatus: AI 편지의 읽음/안읽음 상태.
  • 생성자: Users 엔티티 객체로부터 사용자 정보를 받아 DTO로 변환하며, AI 편지의 읽음 상태(replyStatus)와 페르소나 이름(personaName)도 함께 설정합니다.

controller

1. AuthController

  • 소셜 로그인인증 토큰 관리에 중점을 두고 있으며, 회원 탈퇴와 로그아웃 기능도 포함.

2. PersonaController

  • 페르소나 리스트를 제공하는 간단한 서비스.

3. UsersController

  • 사용자 정보 관리를 담당하며, 회원 정보 조회, 페르소나 변경 등 사용자와 관련된 설정 기능을 제공.