요기약(2)
metaphor: 요기약(1)에서 돌아온...ver.2
해커톤 이후 변동사항 : 약국 별 약 정보를 얻기 힘들어 이를 삭제하고 나이/통증/질환 등에 따른 병 예측 및 가까운 위치의 약국을 보여줄 수 있는 서비스로 방향을 틀기로 함
결과 페이지에서 연동하지 못했던 우리가 만든 데이터분석 모델을 연결시도
데이터 분석한 모델과 연결하기 위해서 'huggingface' 를 사용함.
huggingface(허깅 페이스)는 인공지능/딥러닝/기계학습 모델을 업로드하여 저장하고 이를 api 형태로 불러와서 사용할 수있게 해주는 오픈 소스 커뮤니티임
프론트와 백엔드에서 이 모델에 req.body로 사용자에게 받은 정보들을 전달해야하는데, 이를 데이터베이스나 쿠키 등에 저장하지 않고 전달만하고 있어서 세션을 이용하여 저장하기로함.
sessionStorage : 세션 동안에만 데이터 저장 ( 브라우저 탭을 닫으면 disappear )
이는 클라이언트측(브라우저)에서 동작하는 API임. 따라서, 서버사이트 javascript(Node.js)에서는 직접 사용이 불가함. 하지만, 서버에서 서버 세션으로 저장도 가능하긴함.. 하지만...난 실패했지..
백엔드에서 세션을 저장한다고 하면 express-session 미들웨어의 사용이 필요함. 이때, 아래와 같은 세션에 대한 설정을 해줘야함.
○ secret : 세션 IP 쿠키에 서명하는 데 사용되는 비밀 키 → 세션 데이터 암호화를 위해 필요
○ resave : 'false' → 세션이 수정되지 않았을 때 세션 저장소에 다시 저장하지 않음
○ saveUninitialized : 'true' → 초기화되지 않은 세션 저장소에 저장함 (= 새로운 세션을 만들 때마다 저장)
○ secure: 'true' → https 를 사용할 때 필요
또한, req.session은 express session 미들웨어에 의해 생성되는 현재 요청과 연결된 고유한 세션 객체
하지만...나는 서버단에서의 세션 생성에 실패해서 클라이언트 쪽에서 세션을 생성함. 이 경우 위의 설정이 필요없음. 브라우저에서 기본으로 다 제공해주기 때문.
클라이언트에서 세션 저장 및 세션 데이터 불러오기
# 세션 저장하기
sessionStorage.setItem('key', 'value');
# 세션 데이터 불러오기
JSON.parse(sessionStorage.getItem('key이름'));
하지만, 이렇게만하면 결과창에서 다시 홈으로 갔을 때 사용자가 다시 약을 찾으려고 할 경우 sessionClear이 안되므로 이 방법에 대해서 다시 고민이 필요함.
child_process 모듈을 사용하여 python 스크립트 실행
import {spawn} from 'child_process';
Python 스크립트가 Node.js 프로세스의 자식 프로세스로 실행됨
flask 를 이용하여 간단한 파이썬 api 서버 구축 가능.
파이썬 스크립트를 실행하여 동작하는 것인데, Python 스크립트는 JSON 형식의 입력을 받아 JSON 형식의 출력을 제공해야함.
node.js 서버 시작 시 자동으로 python 서버가 실행되도록 함
let pythonServer;
function startPythonServer() {
pythonServer = spawn('python', ['path/to/your/flask_server.py']);
pythonServer.stdout.on('data', (data) => {
console.log(`Python server output: ${data}`);
});
pythonServer.stderr.on('data', (data) => {
console.error(`Python server error: ${data}`);
});
pythonServer.on('close', (code) => {
console.log(`Python server exited with code ${code}`);
});
}
// Node.js 서버 시작 시 Python 서버 실행
startPythonServer();
// Node.js 서버 종료 시 Python 서버도 종료
process.on('exit', () => {
if (pythonServer) {
pythonServer.kill();
}
});
이제 node.js 서버 실행시 파이썬 서버 동작까지 완료하였고 모델 연결도 얼추 완료해간다.. 모델 수정이랑 프론트 결과페이지 연결 수정하면...곧 완성할 듯! 조금만 더 파이팅!