본문 바로가기

분류 전체보기209

개발자를 화나게 하는 슈슈규슈ㅠ슈규슉... CORS 😡 python server와 node server를 프론트에게 넘기고 평화롭게 한숨을 돌리던 그때.. 뜨헉.. 그것이 왔다.. CORS..! 🤦‍♀️ 🥺 FE: 정윤님..! CORS 에러요..!! 🥲 BE (나): 네엥 ㅠㅠ 잠시만용!!! 나를 화나게 하는 CORS는 대체 어떤거일까!? 어떻게 해결할 수 있을까! 지금부터 알아보자! 🤔 ✔️ SOP (Same Origin Policy) 다른 출처의 리소스를 사용하는 것에 제한하는 보안 방식. SOP로 다른 출처의 리소스를 제한한다면..! 다른 출처의 리소스를 가져와야할 때는 어떻게 해야할까? . . . CORS 이다!!! 1. CORS 란 Cross-Origin Resource Sharing, 다른 출처의 자원을 공유하는 것 ✔️ CORS 접근제어 시나리오.. 2022. 6. 25.
[AI] 자연어처리, konlpy 설치 현재 AI 웹서비스를 진행하고 있다. 우리 서비스의 메인 기능은 자신의 증상을 문장으로 작성하면 영양제 추천을 해주는 서비스이다. 이때, 형태소 분석을 위해서 사용하는 모듈이 konlpy 인데 이 친구 참.. 설치가 쉽게 안된다. 스쳐지나간 오류 지옥 ㅎ.. 해결하면 다음 에러가 나타나고... 0. KoNLPy 한국어 정보처리를 위한 파이썬 패키지이다. 명사 뿐 아니라 모든 품사의 형태소를 알아내려면 morphs라는 명령을 사용한다. konlpy 내 클래스는 Java 기반으로 JDK 설치가 필요하다. 1. JAVA 설치 설치 사이트 https://www.oracle.com/java/technologies/downloads/ 현재 운영체제에 맞게 설치하면 된다. 2. 환경변수 설정 환경변수를 설정해야 JA.. 2022. 6. 23.
[💊Pill my rhythm] 16~17일 차 회고 📖 2022년 06월 21일 ~ 6월 22일 ✔️ 오늘 내가 한 일 Flask 서버 구축 Flask 서버에서 DB 조회 (모델 결과로 영양제 정보 조회) Schedule 삭제 구현 로그인 했을 땐 영양제 추천 결과 DB 저장 (flask에서 jwt 구현) 💡 TIL ( Today I Learned ) [ Python 가상환경 ] 인공지능 모델은 python 언어로 작성되기 때문에 모델 결과를 얻기 위해 Flask 서버를 구축했다. Flask로 서버 개발은 처음이었지만 재밌게 했다. python으로 개발하면서 가상환경을 처음 세팅해봤는데 중간에 버전이 맞지 않는 등 오류를 겪으면서 가상환경의 중요성을 깨닫게 되었다. ✔️ 가상환경이란 가상환경이란 현재 설치된 파이썬 환경과 다른 독립된 환경이다. ✔️ 왜 .. 2022. 6. 22.
[TypeScript+Express] Redis로 Refresh Token 관리 0. 개요 이전 프로젝트에서는 MongoDB를 사용하면서 Refresh Token을 DB에 저장했다. 이번에는 Redis를 연결하여 구현을 해보자. 지난 포스팅에서 JWT에 대한 개념을 올렸기 때문에 이번에는 Redis에 초점을 맞춰서 작성하도록 하겠다. 👉 [Node.js+Express] Refresh Token 구현 1. 사용 이유 [ 왜 Refresh Token을 저장해야할까 ] Access Token은 서버에 따로 저장해 둘 필요가 없지만, Refresh Token의 경우 서버의 stroage에 따로 저장해서 이후 검증에 활용해야 한다. 검증을 위해 서버는 Refresh Token을 별도로 저장하고 있어야 하며, Refresh Token을 이용한다는 것은 추가적인 I/O 작업이 필요하다는 의미이며.. 2022. 6. 21.
파이썬 가상 환경(virtualenv)과 Flask 서버 구축, pip freeze vs pipreqs 파이썬을 사용하여 프로젝트를 진행할 때엔 가상 환경을 구축한 뒤 개발을 권장하고 있다. 가상 환경을 구축하여 프로젝트를 하는 이유는 프로젝트 마다 라이브러리의 버전이 다를 수 있기 때문에 프로젝트 내에 버전을 일치시켜 독립적으로 개발하기 위해서이다. 1. 설치 $ pip install virtualenv 2. 프로젝트 폴더 생성 $ virtualenv "프로젝트폴더명" 나는 프로젝트 이름을 app 으로 했다. 이렇게 폴더가 생성된다. 3. 가상환경 시작 위에서 생성한 app 폴더로 cd app 해서 다음 명령어를 실행한다. 그러면 가상환경이 시작된다. 가상환경 명이 (app) 처럼 뜬다면 정상적으로 실행된 것이다. $ source ./Scripts/activate 이제 여기서 원하는 패키지를 설치하면 된.. 2022. 6. 18.
[인공지능 웹 서비스 프로젝트] 13~15일 차 회고 📖 2022년 06월 16일 ~ 6월 18일 ✔️ 오늘 내가 한 일 (16일) 로그아웃 API (redis에 refresh token 삭제) (16일) /user/current 현재 유저 API (16일) 데일리 영양제 조회 API (17일) 영양제 DB 데이터셋 넣기 (17일) schedule 전체 조회 API 리팩토링 + 버그 Fix (17일) Daily 영양제 삭제 API 구현 (17일) 북마크 전체 조회 API (17일) 북마크 생성 API (18일) 북마크 명세 작성하기 (18일) flask app 연동 (구현중) 💡 TIL ( Today I Learned ) [ error middleware ] 새로 만든 함수로 statusCode와 errorMessage를 함께 보내주는 코드를 작성했다. 👉.. 2022. 6. 18.
[TypeScript + Express] Error handling error middleware를 구현해보자! 1. Express Error handling middleware error.status로 error를 던질 때 상태코드도 설정할 수 있도록 구현했다. import { Request, Response, NextFunction } from "express"; import { HttpException } from "../utils/error-util"; function errorMiddleware(error: HttpException, req: Request, res: Response, next: NextFunction) { console.log("\x1b[33m%s\x1b[0m", error); const status = error.status || 500; r.. 2022. 6. 17.
[인공지능 웹 서비스 프로젝트] 11~12일 차 회고 📖 2022년 06월 14일 ~ 6월 15일 ✔️ 오늘 내가 한 일 (14일) 1주 차 코드 리뷰 반영 (refactoring) (14일) schedule 조회 API (weekly로 수정) (14일) daily supplement 생성 API (15일) refresh token + redis 구현 (15일) error middleware 수정 swagger 명세 💡 TIL ( Today I Learned ) [ 타입스크립트 Enums ] TypeScript: Handbook - Enums (typescriptlang.org) Handbook - Enums How TypeScript enums work www.typescriptlang.org [ catch(error) 에서 error message 사용.. 2022. 6. 16.
[Error: TS(2339)] TypeScript에서 catch(error) 에서 error message 사용하기 💡문제 상황 JavaScript에서 catch 문에서는 error.message를 쓰는 경우가 많았다. TypeScript에서도 JS와 같이 코드를 작성하니 다음과 같은 오류가 생겼다. TypeScript는 error의 타입을 unknown을 기본값으로 갖는다. 그래서 catch 절 error 변수에 Error 타입을 넣어보았다. 하지만 뚜둥! 다음과 같은 오류가 생겼다. catch 문에서 발생하는 에러가 Error 객체가 아닌 에러일 수도 있기 때문에 Error 타입을 지정해줄 수 없다. 따라서 error가 Error 객체라면 error.message를 반환하고 다른 객체라면 error 자체를 stringify 해서 반환하자. 💡 해결 방법 catch문에 사용할 error util 함수를 만들었다. e.. 2022. 6. 15.
[#1] TypeScript + Express에서 Sequelize 시작하기 0. 개요 시퀄라이즈는 node.js ORM이다. Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server를 지원한다. 3차 웹 프로젝트에서 MySQL DB를 사용하기 위해서 Sequelize를 사용해보자! 1. 설치 yarn add sequelize sequelize-cli mysql2 sequelize: RDB와 매핑되도록 해주는 ORM 패키지 sequelize-cli: commandline for sequelize mysql2 : mysql과 연결을 위해 필요한 패키지 2. 초기 설정 ✔️ sequelize init sequelize 명령어 확인 -h 옵션으로 명령어를 확인할 수 있다. npx sequelize -h 아래 명령어를 입력하면 초기 폴더 구조가 .. 2022. 6. 14.
hard delete(물리삭제)와 soft delete(논리삭제), sequelize에서 구현 1. hard delete (물리삭제) : 직접 데이터를 삭제하는 방법이다. 삭제한 데이터가 추후에 조회할 필요가 없을 때 사용하는 방식이다. 2. soft delete (논리삭제) : 데이터를 삭제하지 않고 삭제 여부를 확인하는 칼럼에 값을 넣는 방식이다. 현업에서는 user 데이터는 soft delete를 한다고 한다. 👩‍💻 sequelize에서 구현 이제 sequelize에서 User 테이블에 soft delete, hard delete 하는 방법을 알아보자. 👉 공식 문서 1) Paranoid 옵션 sequelize는 모델을 정의할 때 deletedAt이라는 칼럼을 추가하는 옵션을 제공한다. paranoid: true 로 하면 자동으로 deletedAt 칼럼이 생긴다. 나는 칼럼명을 스네이크 표.. 2022. 6. 13.
[인공지능 웹 서비스 프로젝트] 8~10일 차 회고 ✔️ 📖 2022년 06월 09일 ~ 6월 11일 ✔️ 오늘 내가 한 일 (9일) User Validation 코드 추가 (9일) User 회원 탈퇴 기능 구현 (9일) ERD 바탕으로 모든 모델 (테이블) 생성. (9일) 테이블 간 관계 설정 (10일) 전체 스케줄 조회 (스케줄 테이블 정보 + 체크리스트 테이블 + 하루 영양제 테이블) (10일) 폴더 구조 리팩토링 (router, controller 파일 분리) (11일) 영양제 데이터 + 네이버 쇼핑 API swagger 명세 💡 TIL ( Today I Learned ) [ 타입스크립트 타입 에러 ] JWT 토큰에서 유저 정보를 얻는 과정에서 다음과 같은 오류를 해결했다! 휴! 따로 포스팅으로 정리해두었다. 👉 [Error: TS(2339)] Expr.. 2022. 6. 11.
[디자인 패턴] #1. 싱글톤 패턴 (singleton pattern) 0. 개요 기존 Model 코드에서는 다음과 같은 패턴으로 코드를 짰다. class CocktailModel { static findCocktail = async ({ name }) => { const findCocktail = await Cocktail.findOne({ name: name }); return findCocktail; }; static getIncludedCocktail = async (query) => { const cocktailList = await Cocktail.find({ name: { $regex: query }, }); return cocktailList; }; static modify = async (filter, cocktail) => { const { originNa.. 2022. 6. 10.
[Error: TS(2339)] Express Request 확장하기 😥 문제 상황 1. Token 검증 Middleware 작성 토큰 검증 코드를 작성하면서 req.currentUserId로 decoded한 값을 할당하려던 중 js 프로젝트에서는 오류가 없었던 코드가 ts에서 오류가 생겼다. // ./src/middlewares/loginRequired.ts ... try { if (!process.env.JWT_SECRET_KEY) { throw new Error("JWT_SECRET_KEY가 존재하지 않습니다."); } const secretKey: string = process.env.JWT_SECRET_KEY; const jwtDecoded: any = jwt.verify(userToken, secretKey); const userId = jwtDecoded.us.. 2022. 6. 9.
[인공지능 웹 서비스 프로젝트] 6~7일 차 회고 📖 2022년 06월 07일 ~ 6월 08일 ✔️ 오늘 내가 한 일 (6일) eslint, prettier 설정 (6일) User 모델 생성 (6일) 기획 변경, 카카오톡 알림 -> 웹 푸시 알람으로 수정 (7일) User MVP (자체 회원가입) TypeScript 공부 💡 TIL ( Today I Learned ) [ prettier + eslint 설정하기 ] eslint에서도 rules로 컨벤션을 설정할 수 있어 충돌이 생길 수 있다. 지난 프로젝트에서 eslint를 사용하지 못했는데 이번에는 적용했다! 자세한 설정 방법은 따로 게시글을 작성하겠다! module.exports = { parser: "@typescript-eslint/parser", parserOptions: { project: ".. 2022. 6. 8.
반응형