본 프로젝트는 캡스톤디자인 수업을 위해 제작하는 프로젝트입니다.
캡스톤디자인 2 주제 및 의의
공공 데이터를 이용하여 의약품 관련 오픈 데이터를 활용하여, 사용자의 증상에 따라 적합한 정보만을 필터링하여 필요한 약품 및 동시 복용의 가능 여부 정보를 제공
요즘 현대 사회에서 접할 수 있는 의약품은 점점 많아지고 있습니다.
이를테면, 편의점 및 약국에서 구매할 수 있는 상비약의 종류도 다양해졌고 처방받고 복용하는 약도 많아졌습니다.
이런 의약품을 섭취할 때, 같이 먹으면 안 되는 약도 있는데 보통의 경우 그냥 먹거나 검색을 하고 복용합니다.
문제는 함께 섭취하는 의약품에 대한 정보는 유명한 의약품에 한정되어 있습니다. 이런 경우 의약품은 보다 전문적인 분야라서 일반 사람들이 쉽게 알 수 없기 때문에 블로그 등 정보의 양도 적고 결국에 검색의 시간이 길어지게 됩니다.
저희는 이런 문제점을 파악하고 신뢰적인 공공 데이터 포털에서 제공하는 데이터를 가지고 서비스를 기획했습니다.
사용 기술 및 해결 방안
1. 어떤 걸 목적으로 프로젝트를 진행하는가?
먼저 프론트엔드는 리액트 네이티브를 이용해서 크로스 플랫폼 앱으로 제작하고, 서버는 Nest.js 와 Spring boot 두 개의 프레임워크를 사용해 제작합니다.
자바스크립트 기반인 Nest.js 프레임워크를 사용하는 이유는 비교적 API 데이터 필터 및 패칭이 쉽기 때문에 주로 외부 데이터를 필터링 및 패칭 하는 역할로 사용하고, 스프링 서버는 필요한 API들을 관리하고 제공하는 서버로 기용할 생각입니다.
서버 분산 및 인프라 쪽에 힘을 주어서, 서버 두 개를 기용 했을 때의 속도와 서버를 하나를 사용했을 때의 속도 차이는 얼마나 나는지 측정할 예정입니다. 인프라 환경은 어떤 걸 기준으로 정하고 프로젝트를 진행하는지에 대해서는 일반적인 기업의 기술 스택을 참고했고, 구조도 참고했습니다.
단순 프로젝트 주제는 참고용 아이디어 구현 서비스라고 보시면 되고, 서버 두 개를 사용해서 얼마나 더 효율적으로 분산 처리가 되는지가 핵심이라고 보시면 될 것 같습니다.
2. 기술 스택
Frontend
- React Native
Backend
- Nest.js
- Spring boot, JUnit5 Test, JPA
DevOps
- MySQL
- Redis
- Docker, Docker-compose
- AWS EC2, S3, Load balancer, Route53
- netlify
- NginX, Tomcat
Etc
- Git
3. 서버 기초 작업
1. 먼저 EC2 인스턴스에, Docker 를 이용해서 Nest 서버와 Spring 서버는 띄워놨고, NginX로 포트 포워딩이 되는지 확인했습니다.
2. Docker와 Docker-compose를 이용해서 build, MySQL 과 Redis 환경을 구축했습니다. (스프링 서버)
version: '3.8'
services:
mysqldb:
image: mysql
restart: always
environment:
MYSQL_DATABASE: capstone
MYSQL_ROOT_PASSWORD: "root"
ports:
- 3306:3306
redis:
image: redis
ports:
- 6379:6379
backend:
build: .
restart: always
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/capstone
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "root"
ports:
- 8080:8080
depends_on:
- mysqldb
- redis
2-1. Docker-compose 를 이용하여 NginX, Nest.js 서버 환경을 구축했습니다. (Nest.js 서버)
version: '3.9'
services:
nginx:
image: nginx:latest
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- nest
nest:
build: .
ports:
- '3000:3000'
~
3. 테이블 설계
5. Nest.js 서버 작업 (데이터 필터링)
Nest.js 에서 공공 데이터를 필터링했을 때의 예시입니다.
UD_DOC_ID에서 url로 정보를 주는 방식으로 되어 있어서, 한 번 더 크롤링을 해야 하는 이슈가 생겼습니다.
이슈를 해결하기 위해서, Html parser 또는 크롤링을 이용하여 리턴으로 오는 url 데이터를 필터링을 할 예정입니다.
6. React Native (메인 페이지 개발 및 통신을 위한 목업 데이터 구축)
회원가입 및 로그인 페이지 구현을 했습니다.
스프링 서버에서 정규표현식으로 회원가입 데이터를 받아놨기 때문에, 리액트 네이티브 서버에서도 패스워드 부분은 [특수문자, 영문, 숫자 포함 10글자 이상]의 조건을 맞춰야 진행이 됩니다.