Skip to content

핵심 기능 [BE]

Soobeom edited this page Nov 28, 2021 · 5 revisions

🔎 핵심 기능

워디 서비스의 핵심 기능은 멘티(워킹홀리데이 준비자)와 멘토(워킹홀리데이 경험자)간의 매칭 서비스입니다.
워디의 주요 핵심 기능은 다음과 같습니다.

회원 기능: 회원가입, 로그인 기능  
멘토 기능: 멘토 등록 및 프로필 관리 기능
멘토링 기능: 멘토링 신청, 결제 및 신청 현황 관리 및 알림 기능
리뷰 기능: 리뷰 등록 및 수정, 삭제 기능

전체 흐름

1️⃣ Interceptor

  • Preflight Request 처리 📌 코드 확인

    • 브라우저는 요청을 보내기 전 Preflight Request를 우선적으로 보내기 때문에 Interceptor에서 토큰을 검사하기 위해 Preflight Request를 가장 먼저 선별, 처리해 주었습니다.
  • 로그인 인가 확인 📌 코드 확인

    • @UnAuth 어노테이션을 만들어서 인가가 필요하지 않은 API 메서드에 명시하였습니다. 그 후, Interceptor에서 @UnAuth 어노테이션을 체크하여 로그인이 필요한 API와 그렇지 않은 API를 구분하였습니다.
    • @Auth 어노테이션은 차후 관리자 유저 인가 처리를 위해 생성 및 관련 로직을 구현하였습니다.

2️⃣ Controller

  • 요청 처리 📌 코드 확인

    • Controller에서는 요청을 화면단에서 넘어온 요청을 받고, Service 계층에 로직 처리를 위임합니다.
    • 로그인이 필요한 서비스의 경우, Interceptor에서 토큰 검사 후, Request에 저장해둔 userId를 HttpServletRequest 객체로 받습니다.
  • 결과 응답 📌 코드 확인

    • Service 계층에서 넘어온 로직 처리 결과(메세지)를 ResponseEntity 객체에 담아 화면단에 응답해줍니다.

3️⃣ Service

  • 검증 및 예외처리 📌 코드 확인

    • Optional의 .orElseThrow()를 활용하여 null 처리 및 검증, 예외처리를 구현하였습니다.
  • 트랜잭션 처리 📌 코드 확인

    • 서비스 메서드 단위로 Transaction 처리를 해주었습니다. 조회 쿼리 로직의 경우는 @Transactional(readOnly = true) 어노테이션을 명시하여 성능 이점을 고려했습니다.
  • stream() 활용 📌 코드 확인

    • stream()을 활용하여 코드의 가독성을 높히고, 간결한 코드를 만들었습니다.

4️⃣ Repository

  • Repository 분리 📌 코드 확인

    • 핵심 쿼리를 갖는 Repository 메서드는 스프링 데이터 JPA Repository에 구현하였습니다.
    • 그 외 단일 화면에 맞춘 쿼리는 따로 RepositoryImpl을 구현하여 핵심 쿼리 메서드와 분리하여 관리했습니다.
  • 1 + N 이슈 📌 코드 확인

    • JPA를 사용할 때 나타날 수 있는 1 + N 쿼리 이슈를 해결하고자 노력했습니다.
    • Entity의 모든 연관관계 매핑은 지연 로딩으로 설정했습니다.
    • 페치 조인을 활용하여 기본적인 1 + N 이슈를 해결했습니다.
    • 한 쿼리에서 OneToMany 관계를 여러 번 페치 조인 해야할 경우, Batch Size를 설정하여 지연 로딩으로 1 + N 이슈를 해결했습니다.

5️⃣ Etc

  • 타입 검증 처리 📌 코드 확인

    • Bean Validation을 활용하여 DTO에서 타입(형식) 검증을 수행하였습니다. 이를 통해 기본적인 타입 검증 로직을 비즈니스 로직과 분리하였습니다.
  • 예외 처리 📌 코드 확인

    • 비즈니스 로직 실행 중 발생하는 에러는 따로 exception 패키지에 사용자 정의 Exception을 정의하여 관리했습니다.
    • 이후, 발생하는 에러들은 ExceptionAdvice에서 예외를 통합하여 처리하였습니다.
  • DTO 관리 📌 코드 확인

    • Inner Class를 통해 Entity 별로 DTO를 관리하였습니다.
  • yml 설정

    • yml 설정 파일에서 개발 환경에 맞게 profiles를 common, local, dev, prod로 분리 및 group으로 묶어 관리하였습니다.