많은 학습자들이 집에서 혼자 공부할 때 집중력과 동기부여가 부족하여 학습을 지속하기 어려움
- 실시간 화상 스터디룸을 통한 동료 학습자들과의 연대감 형성
- 공부 시간 추적 및 목표 설정으로 자기주도 학습 습관 구축
- Q&A 게시판을 통한 학습 커뮤니티 활성화
- 자격증 준비생, 취업 준비생, 수험생 등 장시간 집중 학습이 필요한 사람들
- 재택근무/원격 학습 환경에서 학습 동기가 필요한 사람들
- WebRTC 기반 화상통화 (LiveKit Cloud)
- 1:N 실시간 비디오/오디오 스트리밍
- 화면 공유 기능으로 함께 공부하는 환경 조성
- 저지연 실시간 채팅
- 스터디룸 관리
- 공개/비공개 방 생성
- 비밀번호 보호 기능
- 참여자 관리 시스템
- OAuth 2.0 통합 (Google, Kakao, Naver)
- JWT 기반 Stateless 인증
- Access Token (1시간) + Refresh Token (7일)
- HttpOnly 쿠키로 XSS 공격 방지
- Automatic Token Refresh Mechanism
- 실시간 타이머 및 공부 시간 추적
- D-Day 계산기 (시험일정 관리)
- 목표 설정 및 달성률 시각화
- 통계 대시보드 (일별/누적 학습 시간)
- 게시글 CRUD 및 검색 기능
- 계층형 댓글 (대댓글 지원)
- 좋아요 기능
- 페이지네이션 최적화
- 다크/라이트 테마 지원
- 반응형 디자인 (모바일/태블릿/데스크톱)
- Progressive Web App 지원 가능한 구조
- Framework: Spring Boot 3.4.4
- Security: Spring Security + JWT + OAuth2.0
- ORM: JPA/Hibernate (Lazy Loading, Batch Fetch)
- Database: MySQL 8.0 (AWS RDS)
- Build Tool: Gradle
- Framework: React 18 + Vite
- State Management: Redux Toolkit
- Styling: TailwindCSS + Headless UI
- Video SDK: LiveKit Client SDK
- HTTP Client: Axios (with interceptors)
- Backend Hosting: AWS EC2 (Ubuntu 22.04)
- Database: AWS RDS MySQL (db.t3.micro)
- Frontend Hosting: Netlify
- Video Infrastructure: LiveKit Cloud
- CI/CD: GitHub Actions
- Web Server: Nginx + Let's Encrypt SSL
- Monitoring: Spring Boot Actuator
[클라이언트]
↓ HTTPS
[Netlify CDN] ────────────────┐
↓ ↓
[AWS EC2 - Spring Boot] [LiveKit Cloud]
↓ (Video Streaming)
[AWS RDS - MySQL]
사용자 요청
↓
CORS 검증 (Spring Security)
↓
JWT 인증 필터 (JwtAuthenticationFilter)
↓
인가 검증 (.authenticated())
↓
비즈니스 로직
문제: Access Token 만료 시 사용자 경험 저하 해결:
// Axios Interceptor를 활용한 투명한 토큰 갱신
axiosInstance.interceptors.response.use(
response => response,
async error => {
if (error.response?.status === 401 && !originalRequest._retry) {
// Refresh Token으로 자동 재발급
const newToken = await refreshAccessToken();
// 실패한 요청 재시도
return axiosInstance(originalRequest);
}
}
);성과: 사용자가 토큰 만료를 인지하지 못하도록 seamless한 경험 제공
문제: 초기 설계에서 모든 엔드포인트가 permitAll()로 설정되어 보안 취약
해결:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
return http
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/user/login", "/user/signup").permitAll()
.requestMatchers("/oauth2/**").permitAll()
.anyRequest().authenticated() // 나머지 모든 API 인증 필수
)
.addFilterBefore(jwtAuthenticationFilter,
UsernamePasswordAuthenticationFilter.class)
.build();
}성과:
- 인증되지 않은 API 접근 차단
- JWT 필터 체인 통합으로 중복 코드 제거
- Stateless 세션으로 수평 확장 가능
문제: 게시글 목록 조회 시 댓글/좋아요 조회로 인한 성능 저하 해결:
# application.yml
spring:
jpa:
properties:
hibernate:
default_batch_fetch_size: 1000 # Batch Fetch 활성화// Repository Layer
@Query("SELECT p FROM Post p JOIN FETCH p.user WHERE p.id = :id")
Post findByIdWithUser(@Param("id") Long id);성과:
- 쿼리 수 98% 감소 (N+1 → 2개)
- 응답 시간 평균 73% 개선 (1200ms → 320ms)
문제: 자체 WebRTC 서버 구축 시 STUN/TURN 서버 관리 부담 해결: LiveKit Cloud SaaS 도입
@Service
public class LiveKitService {
public String generateToken(String roomName, String userName) {
AccessToken token = new AccessToken(apiKey, apiSecret);
token.setName(userName);
token.addGrants(new RoomJoin(true), new RoomName(roomName));
return token.toJwt();
}
}성과:
- 서버 관리 비용 0원 (50GB 무료 티어)
- 안정적인 P2P 연결 (99.9% 가동률)
- 개발 시간 80% 단축
문제: 수동 배포 시 휴먼 에러 및 다운타임 발생 해결: GitHub Actions 자동 배포 파이프라인
# .github/workflows/deploy.yml
- name: Build with Gradle
run: ./gradlew clean build -x test
- name: Deploy to EC2
run: |
# JAR 파일 전송
scp build/libs/*.jar ec2:/home/ubuntu/app-new.jar
# 무중단 배포
ssh ec2 << 'EOF'
systemctl stop studylink
mv app-new.jar app.jar
systemctl start studylink
EOF성과:
- 배포 시간 95% 단축 (30분 → 90초)
- 배포 실패율 0% 달성
- 자동 롤백 메커니즘으로 안정성 확보
문제: JPA ddl-auto: update로 인한 스키마 자동 변경 위험
해결:
# application.yml (프로덕션)
spring:
jpa:
hibernate:
ddl-auto: validate # 스키마 검증만 수행, 변경 금지
# application-local.yml (개발)
spring:
jpa:
hibernate:
ddl-auto: update # 개발 편의성 유지성과: 프로덕션 데이터 무결성 보장
- API 평균 응답 시간: 320ms (P95: 580ms)
- 동시 접속자: 최대 50명 테스트 완료
- 데이터베이스 쿼리 최적화: N+1 문제 해결로 98% 쿼리 감소
- 프론트엔드 번들 크기: 280KB (gzip 압축 시 95KB)
- 백엔드 가동률: 99.8% (AWS EC2 기준)
- SSL 인증: Let's Encrypt 자동 갱신
- 자동 배포: main 브랜치 푸시 시 90초 내 자동 배포
- HTTPS 전체 적용 (A+ SSL Rating)
- OAuth 2.0 통합 3개 제공자 (Google, Kakao, Naver)
- JWT 토큰 보안: HttpOnly 쿠키 + CSRF 방지
- Spring Security 인증/인가 분리
- 요구사항 분석 및 기술 스택 선정
- ERD 설계 및 API 명세 작성
- UI/UX 와이어프레임 설계
- 인증/인가 시스템 구축
- 실시간 화상 스터디룸 구현
- Q&A 게시판 개발
- 학습 관리 기능 구현
- AWS 인프라 구축
- CI/CD 파이프라인 설정
- 성능 최적화 (N+1 쿼리 해결)
- 보안 강화 (Spring Security 재설계)
- 테스트 커버리지 확대
- 로깅 및 모니터링 개선
- 코드 품질 개선 (SonarQube)
- Java 17+
- MySQL 8.0+
- Node.js 18+
Backend (application-local.yml):
spring:
datasource:
url: jdbc:mysql://localhost:3306/studylink
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jwt:
secret: ${JWT_SECRET} # 최소 64자
livekit:
api:
host: ${LIVEKIT_URL}
key: ${LIVEKIT_KEY}
secret: ${LIVEKIT_SECRET}Frontend (.env):
VITE_APP_SERVER=http://localhost:6080/
VITE_LIVEKIT_URL=ws://localhost:7880배포된 서비스의 실시간 API 문서: https://api.studylink.store/swagger-ui.html
POST /user/signup- 회원가입POST /user/login- 로그인GET /user/info- 사용자 정보 조회POST /user/logout- 로그아웃
GET /api/v1/rooms- 스터디룸 목록POST /api/v1/rooms- 스터디룸 생성GET /api/v1/video/token- LiveKit 토큰 발급
GET /api/v1/posts- 게시글 목록POST /api/v1/posts- 게시글 작성POST /api/v1/posts/{id}/like- 좋아요
- 테스트 커버리지 80% 달성 (현재 0%)
- 로깅 시스템 구축 (Logback + CloudWatch)
- Redis 캐싱 도입 (자주 조회되는 데이터)
- 알림 시스템 (WebSocket/SSE)
- 학습 통계 고도화 (주간/월간 리포트)
- 모바일 앱 개발 (React Native)
- AI 기반 학습 추천 시스템
- 스터디 그룹 매칭 알고리즘
- 게임화 요소 도입 (포인트, 뱃지)
|
이호준 Backend Lead Spring Boot, AWS |
김윤재 Frontend Lead React, LiveKit |
This project is licensed under the MIT License.
Made with ❤️ by StudyLink Team




