물론입니다! 발표하면서 보기에 편한 논리 구조 형태로 스크립트를 다시 작성해드리겠습니다. 각 섹션별로 중요한 포인트와 설명을 쉽게 전달할 수 있도록 구성했습니다.
1. 도입
안녕하세요.
저는 PHCCS 프로젝트의 백엔드 파트를 발표할 전진구입니다.
발표를 시작하겠습니다.
2. 발표 개요
먼저
오늘 제가 설명할 내용은 다음과 같습니다:
1. MVC 패턴 구조
2. 기술 스택 소개
3. JWT와 WebSocket 기반의 1:1 채팅 서비스 설명
3. MVC 패턴 구조
간단히 짚고
약자
먼저 PHCCS 프로젝트는 REST 기반의 MVC 패턴을 따릅니다.
- MVC 패턴이란?
- M (Model): 데이터와 비즈니스 로직을 처리합니다.
- V (View): 사용자가 보는 화면을 렌더링합니다.
- C (Controller): 사용자의 요청을 받아서 데이터를 처리한 후 View에 전달합니다.
하지만 저희 프로젝트는 REST 기반으로 설계되어, View 역할을 React가 담당합니다.
즉, 백엔드는 Model과 Controller의 역할을 중점적으로 수행합니다.
4. 디렉토리 구조 및 기능 설명
핵심
간략하게 설명
다음은 PHCCS 프로젝트의 디렉토리 구조입니다.
-
Common 디렉토리
-
Service 디렉토리
- 각종 비즈니스 로직을 담고 있는 서비스 클래스를 포함합니다.
- 예시:
chatroom, comment, member, message, pet, post, skinimage 등 주요 기능을 구현하는 서비스 클래스를 포함하고 있습니다.
구체적으로 member 디렉토리를 보면:
dto, repository, token 하위 디렉토리가 포함되어 있으며,
Member, MemberController, MemberService 클래스들이 존재합니다.
-
Resources 디렉토리
- 설정 파일과 정적 리소스, 템플릿 파일을 포함합니다.
- 예:
application.properties, application-jwt.properties
- MyBatis 매퍼 파일이 있는
mapper 디렉토리도 포함되어 있습니다.
5. 기술 스택 소개
PHCCS 프로젝트에서 사용된 기술 스택은 다음과 같습니다.
- Spring Boot: 백엔드 프레임워크로 사용하였으며, Spring MVC 구조로 설계되었습니다.
- REST API: 클라이언트와 서버 간 데이터를 교환하는 방식으로 사용되었습니다.
- MySQL: 데이터베이스로 사용하였으며,
- MyBatis: 데이터베이스와 상호작용을 위해 사용됩니다.
- JWT (JSON Web Token): 사용자 인증과 보안을 위해 사용됩니다.
- WebSocket: 1대1 채팅 기능을 위해 사용된 양방향 통신 프로토콜입니다.
6. JWT (JSON Web Token) 설명
이제
먼저
JWT란 무엇인가?
- JSON 기반의 웹 표준 토큰으로, 보안성이 높습니다.
- 토큰 생성 시 사용자 정보를 포함할 수 있으며, 서명을 통해 위조 여부를 검증할 수 있습니다.
- 두 가지 토큰을 사용합니다:
- Access Token: 짧은 유효 기간 동안 API 요청에 사용됩니다.
- Refresh Token: Access Token이 만료되었을 때, 새로운 Access Token을 발급받기 위한 용도로 사용됩니다.
왜 JWT를 사용했는가?
- 보안 강화: 서명된 토큰은 위조를 방지할 수 있습니다.
- 사용자 정보 포함: 토큰에 사용자 ID와 권한정보를 포함시켜 DB 에 저장된 사용자 정보에 빠르게 접근 할 수 있음
- Acesstoken 과 refreshtoken으로 인한 보안과 사용자경험: 균형있게 유지가능
물론입니다! 강조 부분을 굵게 적용한 수정된 텍스트는 다음과 같습니다.
7. JWT 관련 의존성 추가
JWT를 사용하기 위해 필요한 의존성을 추가해야 합니다.
build.gradle 또는 pom.xml 파일에 다음과 같은 의존성을 추가합니다.
-
JJWT API:
- JWT 생성, 파싱, 검증을 위한 기본 API를 제공합니다.
- 이 API는 JWT를 생성하고, 서명하고, 유효성을 검증하는 등의 작업을 처리하는 데 사용됩니다.
-
JJWT 구현체:
- 기본 API를 사용해 실제로 JWT 토큰을 생성하고, 서명하고, 검증하는 로직을 포함합니다.
- JWT의 생성 및 서명 로직을 이 구현체가 담당합니다.
-
JJWT Jackson 지원 라이브러리:
- JSON 데이터를 처리하기 위한 라이브러리입니다.
- Jackson 라이브러리를 사용하여 JWT 토큰 내에서 JSON 형식의 데이터를 쉽게 관리할 수 있습니다.
8. JWT 속성 정의
의존성 추가가 끝난 후, JWT 속성을 정의해야 합니다.
이 설정은 주로 application-jwt.properties 파일에서 이루어집니다.
- 발급자(issuer): 해당 토큰을 발급하는 서버의 정보를 정의합니다.
- 비밀키(secret key): 토큰을 서명하고 검증할 때 사용하는 비밀키입니다. 이는 대칭키 또는 비대칭키로 사용할 수 있습니다.
- AccessToken 유효시간: Access Token의 만료 기간을 설정합니다. 일반적으로 짧은 유효 기간(예: 15분)이 설정됩니다.
- RefreshToken 유효시간: Refresh Token의 유효 기간을 설정합니다. 보통 더 긴 유효 기간(예: 7일 또는 그 이상)을 가집니다.
이 설정을 통해 토큰 발급 및 검증 시 필요한 주요 정보를 정의합니다.
9. JWT 생성 및 인증 과정
JWT 생성 흐름
- 이메일과 비밀번호 검증: 클라이언트의 입력값을 DB와 대조하여 유효성을 확인합니다.
- Access Token 생성: 사용자의 ID와 역할을 포함하여 생성됩니다.
- Refresh Token 생성: 비교적 더 긴 유효 기간을 갖고, Access Token이 만료되면 사용됩니다.
- 클라이언트에게 두 토큰 반환: 이후 클라이언트는 이 토큰들을 이용해 인증된 요청을 보냅니다.
10. JWT 인증 흐름
JWT 인증 필터의 흐름:
- 화이트 리스트 확인: 인증이 필요 없는 경로는 필터를 통과합니다.
- Authorization 헤더 검증: JWT가 포함되어 있는지 확인합니다.
- JWT 토큰 검증: 유효성을 검증한 후, 통과된 요청만 컨트롤러로 전달됩니다.
11. WebSocket 기반의 1:1 채팅 서비스 설명
왜 WebSocket을 사용했는가?
- 실시간 상호작용을 위한 1:1 통신을 구현하기 위함입니다.
- 양방향 통신이 가능하여 클라이언트와 서버가 모두 데이터를 주고받을 수 있습니다.
- HTTP 프로토콜로 핸드셰이크 후, WebSocket으로 전환되며 연결을 유지합니다.
이를 통해 성능을 최적화하고, 빠른 데이터 전송이 가능합니다.
12. WebSocket 처리 흐름
핸들러 클래스를 통해 3가지 주요 처리 작업이 가능합니다:
- 초기 연결 처리: 클라이언트가 채팅방에 접근할 때, 연결을 설정합니다.
- 메시지 전송 처리: 연결 후, 채팅 메시지를 주고받는 로직을 처리합니다.
- 연결 해제 처리: 채팅이 끝나면, 연결을 해제하고 채팅방에서 나가는 작업을 처리합니다.
13. SSE (Server-Sent Events) 설명
SSE란 무엇인가?
- Server-Sent Events의 약자로, 서버에서 특정 이벤트가 발생하면 비동기적으로 클라이언트에게 데이터를 전송하는 기술입니다.
- SSE는 단방향 통신으로, 서버에서 클라이언트로만 데이터를 전송합니다.
왜 SSE를 사용했는가?
- 폴링 방식의 비효율성 해결: 클라이언트가 주기적으로 서버에 요청을 보내는 방식은 서버 부하가 커집니다.
- WebSocket과의 차이: WebSocket은 양방향 통신이 필요할 때 적합하지만, 알림 기능처럼 단방향 통신에는 SSE가 더 적합합니다.
- HTTP 기반의 SSE는 WebSocket보다 적은 비용으로 동작할 수 있습니다.
14. SSE 적용 흐름
- SseEmitter 객체 생성: 스프링에서 제공하는
SseEmitter 객체를 통해 SSE 연결을 설정합니다.
- 이벤트 등록: SSE를 통해 비동기적으로 연결 종료, 타임아웃, 에러 처리를 관리합니다.
- 더미 데이터 전송: 첫 연결 시 더미 데이터를 전송해 503 오류를 방지합니다.
15. 마무리
이상으로 PHCCS 프로젝트의 백엔드 구성 및 주요 기술에 대한 설명을 마치겠습니다.
질문이 있으시면 언제든지 해주시기 바랍니다.
이렇게 논리적으로 구성한 대본은 발표 중 참고하기 쉽게 작성되었습니다. 추가적인 수정이나 보완이 필요하시면 말씀해 주세요!