기획서 - prgrms-web-devcourse-final-project/WEB4_5_GAEPPADAK_BE GitHub Wiki
다양한 뉴스 채널의 실시간 속보 데이터를 수집하고, 급상승 트렌드 키워드와 주요 이슈를 탐지하여 사용자에게 여론의 흐름을 시각화하고 요약과 알림을 제공하는 서비스
<포인트>
- 뉴스가 아니라 Youtube, 트위터 분석으로도 주제 변경 가능
- 인스타, 숏폼 등 SNS로 가면 콘텐츠 마케터로 타겟팅 가능
- 활용 API: Google News RSS, Youtube API, Naver Search API, Gemini API 등
<확장>
- 실시간 뉴스 스트리밍 처리 및 키워드 분석
- 스케줄링으로 정기 뉴스 크롤링 및 트렌드 통계 자동화
- LLM 기반 내용 요약
알고리즘 기반 개인화 서비스로 인해 발생하는 확증 편향과 에코챔버 문제를 해결하고자, 실시간 인기 검색어를 중심으로 다수의 사회적 관심사를 반영한 정보를 제공하여 사용자의 시야를 넓히고 관심사를 확장시키는 서비스입니다.
- 실시간 검색어를 기준으로 현재 인기 있는 주제에 대한 정보를 찾을 수 있도록 도와준다.
- 많은 서비스가 개인의 관심사에 대한 알고리즘을 바탕으로 정보를 제공하는데, 많은 사람들이 관심있는 주제를 토대로 정보를 제공
- 알고리즘에 갇힌 사회확증편향 문제를 해소
- 한정된 정보만 소비하게 되는 에코챔버 현상을 완화하고, 다양한 관점에 노출되도록 돕기 위함
“실시간 대용량 외부 데이터를 안정적으로 수집·가공·전달하는 백엔드 파이프라인 구축”
- Google Open API 및 다양한 뉴스/검색 API를 활용한 실시간 외부 데이터 수집
- 비동기 메시징으로 고트래픽 상황에서도 유실 없이 처리
- 스케줄링을 활용해 데이터 수집 및 전처리 워크플로우 자동화
- 비정형 뉴스 데이터를 구조화하고 저장하는 데이터 가공 로직 설계
- 뉴스 기사 관련 유튜브 영상을 가져올 때 업로드 날짜, 조회수 등등을 고려하여 의미 있는 영상으로 추리기
- 해당 뉴스 기사와 날짜 차이가 많이 나면 안됨 (오래된 정보 제공 가능성 有)
- 조회수가 너무 낮아서도 안됨 (신빙성 없는 정보일 가능성 有)
- 키워드 기반 AI 내용 요약
- 키워드 감성 분석
- 키워드 검색어가 상승한 이유 간략한 설명
- 콘텐츠 별 사용자 댓글 기능
- 키워드 별 포스트 검색 기능
- 사용자 인증
- 키워드의 연관 분석 및 통계 (유료 서비스)
- 언제 순위가 오르기 시작했는가
- 얼마나 지속되었는가
- 연관되는 키워드는 무엇인가
- 관련 키워드로 영상 검색해 제공
- 버즈량, 급상승 시기 등
- 관리자 기능 - 신고, 트렌드 삭제 등
- 신고 - 악성 유저/컨텐츠 필터링
- 키워드 분석
- 키워드 감성 분석
- 키워드 검색어가 상승한 이유 간략한 설명
- 인기 키워드(주제) 기반 인기 유튜브 채널 순위차트 제공
- 크리에이터 블로그 구독 기능 (예시: 유튜브 급상승 트렌트 시리즈, 인기 숏폼 트렌드 시리즈)
- 관심 주제 알림 서비스
- 주제별 탭 제공 - 뉴스 및 유튜브 혼합
- 주제별 사용자 커뮤니티 공간 제공
- 댓글 기능, 추천, 비추천 추가
- 관리자 기능 - 신고 등
- 커뮤니티를 추가한다면 커뮤니티 관리자 기능 추가(글 삭제)
1. 개발 환경 (Development Environment)
-
통합 개발 환경 (IDE): IntelliJ IDEA
- 강력한 코드 편집 기능, 자동 완성, 리팩토링 도구 제공
- Spring Boot, Java, JPA, Maven/Gradle 등 다양한 기술 지원
- 디버깅, 테스트, 버전 관리(Git) 통합 기능 제공
-
빌드 도구 (Build Tool): Gradle
- 프로젝트 의존성 관리 및 빌드 자동화 도구
-
버전 관리 (Version Control): Git
- 소스 코드 변경 이력 관리 및 협업을 위한 분산 버전 관리 시스템
- GitHub, GitLab, Bitbucket 등의 Git 호스팅 서비스 활용
2. 백엔드 (Backend)
-
주요 언어 (Primary Language): Java 21
- 높은 성능, 안정성, 다양한 프레임워크 및 라이브러리 지원
-
프레임워크 (Framework): Spring Boot
- 빠른 개발 속도, 내장형 서버, 간편한 설정
- DI (Dependency Injection), AOP (Aspect-Oriented Programming) 등 엔터프라이즈급 기능 제공
-
ORM (Object-Relational Mapping): Spring Data JPA
- Java 객체와 관계형 데이터베이스 간의 매핑 및 데이터 접근 추상화
- 간결한 코드 작성 및 생산성 향상
-
데이터베이스 (Database): MySQL
- 오픈 소스 관계형 데이터베이스 관리 시스템 (RDBMS)
- 안정성, 확장성, 다양한 기능 제공
-
캐시 (Cache): Redis
- 인 메모리 데이터 구조 저장소 (Key-Value Store)
- 높은 읽기/쓰기 성능으로 애플리케이션 응답 속도 향상
- 캐싱, 세션 관리, Pub/Sub 등 다양한 용도로 활용
-
비동기 작업 및 스케줄링 (Asynchronous Tasks & Scheduling): Apache Airflow
- 워크플로우 관리 플랫폼
- 복잡한 스케줄링, 작업 오케스트레이션, 모니터링 기능 제공
- 데이터 파이프라인 구축 및 관리에 용이
3. API 연동 (API Integration)
-
Google Trends API
- Google 검색어 트렌드 데이터를 수집하여 실시간 관심도 파악
-
News API
- 다양한 뉴스 소스의 기사 데이터를 수집
-
YouTube API
- YouTube 동영상 정보, 트렌드 데이터 등을 수집
4. 웹 서버 (Web Server)
-
Nginx
- 고성능 웹 서버 및 역방향 프록시 서버
- 로드 밸런싱, SSL/TLS 암호화, 정적 콘텐츠 처리 등 담당
5. 배포 환경 (Deployment Environment)
- 클라우드 플랫폼 : AWS
- 컨테이너 기술 : Docker
6. API 명세 (API Specification)
- Swagger
- 댓글에 페이지네이션 적용
- 로그인을 할 시 상단 메뉴의 회원가입, 로그인 버튼이 로그아웃과 사람 아이콘(클릭 시 회원 정보 보기)으로 바뀜
-
비회원
- 메인 화면에서 인기 키워드와 콘텐츠 리스트를 볼 수 있다.
- 콘텐츠 화면에서 키워드 관련 요약된 정보를 볼 수 있다.
-
일반 회원
- 사용자는 이메일로 회원가입하고 로그인할 수 있다.
- 메인 화면에서 인기 키워드와 콘텐츠 리스트를 볼 수 있다.
- 콘텐츠 화면에서 키워드 관련 요약된 정보를 볼 수 있다.
- 콘텐츠 화면에서 댓글을 달고 반응을 공유할 수 있다.
- 내가 원하는 키워드로 검색하여 관련 콘텐츠 리스트를 최신순으로 볼 수 있다.
- 관심 있는 키워드를 저장할 수 있다.
- 내가 찜한 키워드가 이슈화될 때 알림을 받을 수 있다.
-
유료 회원
- 사용자는 특정 키워드가 이슈화된 최초/피크/퇴출 시점, 버즈량, 연속 노출 기간을 분석할 수 있다.
- 사용자는 특정 키워드의 감성 분석 데이터를 확인할 수 있다.
- 사용자는 특정 주제(공통 포함)를 구독하고 관련 주간 보고서를 메일로 받아볼 수 있다.
-
관리자
- 회원들을 관리할 수 있다.
- 신고된 댓글을 검토하고 삭제할 수 있다.
🗣️ 소통: Slack, 디스코드, Zep, 구글밋
📒 문서: Notion
⌨️ 코드 관리: Github
🖥️ UI 설계: Creatie.ai, FigJam
-
커밋 컨벤션
Commit 작성
- 커밋 전
CTRL + ALT + L
적용 (코드 포맷팅 정리) - 브랜치에서 변경 사항을 커밋으로 저장
- 명령어:
git add .
→git commit -m "내용"
- Commit Message를 더 명확하게 작성
- 실수로 인한 Commit이 발생하지 않도록 유의
📌 Commit 메시지 컨벤션(영어)
-
feat
: 새로운 기능 추가 -
fix
: 버그 수정 -
docs
: 문서 수정 -
refactor
: 코드 리팩토링 -
style
: 코드 스타일 변경 (기능 변경 없음) -
chore
: 기타 변경 사항(변경, 삭제 포함)
예 :
git commit -m “feat: add order's feature"
- 커밋 전
-
PR 컨벤션
-
Project Kanban에 Issue 생성
-
Issue 번호에 맞춰
feature
브랜치 생성- 브랜치 전략
-
main
→ 최종 결과물 브랜치(배포 자동화) -
develop
→ 개발 과정에서 병합하는 브랜치 -
feature
→ 기능 개발 브랜치{tag}/{issueNo}-{issue-name}
-
- 브랜치 전략
-
개발 작업 수행
- 명령어:
git push origin {tag}/{issueNo}-{issue-name}
- 명령어:
-
develop
브랜치 rebase로 최신화 -
develop
브랜치로 Pull Request (PR) 생성📌 PR 규칙
- Merge 전 3명 이상 승인 필요(PR 규모가 클 경우 or Release 할 때는 모든 팀원 승인 필요)
- PR 설명에 구현한 기능 간단히 작성
- PR 전 rebase 확인 필수
-
PR 작성자가 직접
develop
브랜치로 Squash and merge
- 리뷰어 자동 할당 & Spring Boot Test CI 자동화 워크플로우 추가
- 코드 PR 시 동작하는 코드를 올리기
-
-
칸반보드 규칙
-
Issue 단위를 4시간 이내 작업량으로 한정
Estimate
-
-
코드 컨벤션
-
도메인 - 하위 도메인 구조 제안
{domain}/ └── {subdomain}/ ├── controller/ ├── service/ ├── dto/ ├── entity/ └── repository/
-
intellij 컨벤션 사용 : https://greensky0026.tistory.com/303
-
네이밍 규칙
- 가독성 최우선
- 특별한 이유가 없는 경우 IntelliJ IDEA 자동 서식 준수
- 특별한 이유가 없는 경우 IntelliJ IDEA 경고 제거
- 클래스명은 파스칼 케이스(PascalCase) 사용
// ✅ 올바른 예시 public class UserAccount { } public class OrderService { }
- 변수 및 메서드는 카멜 케이스(camelCase) 사용
-
@Value
를 사용한 프로퍼티 값도 카멜 케이스 적용
// ✅ 올바른 예시 private String userName; public void processOrder() { }
- 축약어도 카멜 케이스 적용
// ❌ 잘못된 예시 String HTTP; String DTO; // ✅ 올바른 예시 String Http; String Dto;
- 상수는 대문자 스네이크 케이스(UPPER_SNAKE_CASE) 사용
// ✅ 올바른 예시 public static final int MAX_USER_COUNT = 100; public static final String API_KEY = "1234";
- 패키지명은 전부 소문자 사용
// ✅ 올바른 예시 com.example.service; org.myproject.utils;
- 논의된 경우를 제외하고 줄임말 사용 금지
// ❌ 잘못된 예시 String msg; String err; // ✅ 올바른 예시 String message; String error;
기능 Controller 메서드명 Service 메서드명 Repository 메서드명 Create (POST) createUser(UserForm userForm)
createUser(UserForm userForm)
save(User user)
(JPA 기본)Read (단일 조회) (GET) getUserById(Long id)
getUserById(Long id)
findById(Long id)
(JPA 기본)Read (목록 조회) (GET) getUserList()
getUserList()
findAll()
(JPA 기본)Update (PUT) updateUser(Long id, UserForm userForm)
updateUser(Long id, UserForm userForm)
save(User user)
(JPA 기본, ID 존재 시 업데이트)Delete (DELETE) deleteUserById(Long id)
deleteUserById(Long id)
deleteById(Long id)
(JPA 기본)- 이외의 것은 비즈니스적으로 명명하기
✅ 일관성 유지:
- Controller & Service →
get
,create
,update
,delete
- Repository →
find
,save
,deleteById
✅ Controller
- Controller는 Request, Response 전용 객체를 사용하여 클라이언트와의 데이터 교환을 담당합니다.
-
예외 케이스는 반드시 처리하고, 관련 API 스펙은
@ApiResponse
등의 애너테이션으로 문서화합니다. -
DTO 분리:
- Controller에서 사용하는 Request/Response 객체는 보통
record
로 작성하며, 네이밍 규칙은{Domain}{MethodName}Request
또는{Domain}{MethodName}Response
형태로 합니다. - Controller 내에 별도의 Dto 서브패키지를 두어 Service에서 사용하는 DTO와 구분합니다.
- Controller에서 사용하는 Request/Response 객체는 보통
✅ Service
-
트랜잭션 관리:
- 서비스 계층에서
@Transactional
을 사용하여 트랜잭션을 관리합니다.
- 서비스 계층에서
-
DTO 변환:
- 객체와 DTO 간 변환 로직은 Service 계층에서 수행합니다.
- 변환 메서드는 보통 static으로 구현하며, 아래와 같은 네이밍 규칙을 따릅니다.
-
of
: 여러 파라미터를 받아 DTO로 조합할 때 -
from
: Entity 객체 하나를 DTO로 변환할 때 -
toEntity
: DTO를 Entity로 변환할 때
-
✅ Entity
-
JPA 변경 감지:
- 엔티티 내 필드의 변경은 변경 감지(Dirty Checking)를 활용합니다.
- 이를 위해 엔티티 내에 별도의 필드 변경 메서드를 작성하며, Setter 사용은 지양합니다.
-
객체 생성:
- 객체 생성 시
new
대신 *@Builder
*를 적극 사용하여 가독성과 불변성을 높입니다.
- 객체 생성 시
✅ DTO (Data Transfer Object)
-
DTO 사용:
- Controller와 Service에 사용하는 DTO는 용도가 다르므로 분리하여 관리합니다.
- Controller에서는 클라이언트와의 요청/응답을 위한 Request/Response 객체를 주로
record
로 작성하며, Service에서 공통적으로 사용하는 데이터 구조는 별도의 DTO 레이어에 생성합니다.
-
네이밍 가이드라인:
- Controller용:
{동사}{명사}Request
/{동사}{명사}Response
- 예:
UserJoinRequest
,UserUpdateResponse
- 예:
- Service용:
{적절한이름}Dto
- Controller용:
-
DTO 변환 메서드:
- DTO 내에 변환 메서드를 작성하여 Entity와의 변환을 명확하게 합니다.
- 일반적으로 많이 사용하는 메서드 이름은
of
,from
,toEntity
입니다.
-
Java Record:
- 간결함과 불변성을 위해 Controller의 Request/Response 객체는
record
를 사용하는 것을 권장합니다.
- 간결함과 불변성을 위해 Controller의 Request/Response 객체는
- prefix 로 api와 버전정보를 갖음 (프로젝트 레벨에서 설정 완료, controller 에서 설정할 필요 없음)
- 동사는 사용하지 않고 http method 를 활용
// ❌ 잘못된 예시 /api/v1/order/create /api/v1/order/delete // ✅ 올바른 예시 (post) /api/v1/order (delete) /api/v1/order
- 리소스는 항상 복수형 사용
// ❌ 잘못된 예시 (단수형 리소스) GET /api/v1/user POST /api/v1/order // ✅ 올바른 예시 (복수형 리소스) GET /api/v1/users POST /api/v1/orders
- 비즈니스 로직이 들어간 **행위(Action)은 동사 포함 (approve, ban, login 등)
// ✅ 액션이 필요한 경우 POST /api/v1/auth/login POST /api/v1/auth/logout POST /api/v1/orders/123/approve // 주문 승인 POST /api/v1/users/456/ban // 유저 차단
- 단일 라인 조건문에도 반드시 중괄호
{}
사용
// ❌ 잘못된 예시 if (a == 0) return a; // ✅ 올바른 예시 if (a == 0) { return a; }
-
-
프로그래밍 방식: 도움 요청, 새로운 기술 도입 또는 배우고 싶은 분야가 있다면 다같이 또는 해당 담당자에게 페어 프로그래밍 신청(Task 관련해서도 함께 정리)
-
테스트 규칙
- 단위 테스트, 통합 테스트 각자 알아서 진행 (최소 1개 이상은 해야됨)
- E2E 테스트로 수동 QA 진행
-
배포 방식: local 환경에서 docker-compose 이용, aws에서 배포
- 프로젝트에서 계획 중 / 진행 중으로 나눠 큰 틀을 잡아 프로젝트 구분
- 각 프로젝트 마다 **작업**을 써 작업명, 진행 상태, 담당자, 종료일, 태그, URL 등을 작성 후 작업
날짜 | 진행 내용 |
---|---|
4월 23일 - 25일 | 💬 프로젝트 주제 선정, 역할 분담, 프로젝트 기획 및 개발 설계 |
2주차: 4월 28일 - 5월 7일 | 1차 스프린트 |
5월 8일 (목) | 중간 결과물 제출 (18시까지) |
5월 8일 - 5월 14일 | 2차 스프린트 |
4주차: 5월 14일 (수) | 중간 회고 미팅 |
5월 15일 - 5월 20일 | 3차 스프린트 |
방학: 5월 21일 - 6월 1일 | 방학 |
6월 2일 | 최종 결과물 제출 (12시까지) |