뉴스를 잘 접하지 않는 사용자들을 위해 가볍게 접할 수 있도록 추천 뉴스를 제공하는 iOS 애플리케이션입니다.
2024.02.10 ~ 2024.04.
- Naver Open API를 사용하여 검색어를 기반으로 뉴스에 대한 정보를 얻습니다.
- 추가로 필요한 데이터는 BeautifulSoup 을 사용하여 정적 크롤링을 하였습니다.
- RESTful API 를 제공하며, thymeleaf 를 통한 정적 리소스를 제공합니다.
- JPA 를 활용하여 RDS 데이터를 사용합니다.
- Spring Security를 활용해 정해진 API에 대해서만 응답을 하여 안정성을 높였습니다.
- Exception Handler를 사용하여 Exception에 유연하게 대처하였습니다.
- 통합테스트를 통해 서비스의 안정성을 높였습니다.
- 현재 시간을 기준으로 최근 인기 급상승 중인 뉴스의 간단한 정보를 제공합니다.
- 선택한 카테고리들 중 원하는 수만큼의 기사를 랜덤하게 제공합니다.
- EC2 인스턴스
- Docker를 활용하여 Python 스크립트(크롤링)와 Spring Boot 컨테이너를 실행합니다.
- RDS
- MySQL을 이용하며 보안그룹을 통해 EC2 인스턴스와만 통신하여 데이터 안전성을 높였습니다.
- Route 53
- 사용자의 인터넷 트래픽을 적합한 인프라 자원으로 라우팅합니다.
- CloudFront & ACM
- CloudFront를 통해 클라이언트로부터의 모든 요청을 HTTPS로 리다이렉트하도록 설정하여 보안을 강화하였습니다.
- 원본 인스턴스와 HTTP 통신을 하여 네트워크 오버헤드를 줄이고, 서버의 리소스 사용을 최적화 하였습니다.
필요 파일
/crawling/config/config.json
{
"naver_api" : {
"X-Naver-Client-Id" : "네이버 오픈 API ID",
"X-Naver-Client-Secret" : "네이버 오픈 API Secret Key"
},
"mysql" : {
"user_id" : "User Id",
"user_password" : "User PW",
"host" : "endPoint",
"table" : "테이블명"
},
"ranking_site" : {
"url" : "실시간 인기 검색어 제공 사이트"
},
"request_header" : {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
}
}
/newsHabit/build/libs
newsHabit-0.0.1-SNAPSHOT.jar 빌드 파일 필요
/docker-compose.yml
version: '3'
services:
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_DATABASE: 'DataBase'
MYSQL_USER: 'User Id'
MYSQL_PASSWORD: 'User PW'
MYSQL_ROOT_PASSWORD: 'root PW'
TZ: 'Asia/Seoul'
MYSQL_CHARSET: utf8mb4
MYSQL_COLLATION: utf8mb4_unicode_ci
ports:
- "3306:3306"
volumes:
- db-data:/var/lib/mysql
- ./my.cnf:/etc/mysql/conf.d/custom.cnf
spring-app:
build:
context: ./newsHabit
dockerfile: dockerfile
restart:
on-failure
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/news_habit?useUnicode=true&characterEncoding=utf8
SPRING_DATASOURCE_USERNAME: "User Id"
SPRING_DATASOURCE_PASSWORD: "User PW"
TZ: "Asia/Seoul"
depends_on:
- mysql
python-app:
build:
context: ./crawling
dockerfile: Dockerfile
environment:
TZ: "Asia/Seoul"
depends_on:
- mysql
volumes:
db-data: