본문 바로가기

nodejs

(5)
sentry 주요 기능 설명 Sentry란? Sentry는 실시간으로 로그를 모니터링할 수 있도록 도와주는 서비스입니다. 에러 로깅과 모니터링을 동시에 할 수 있으며, 에러가 발생했을 때 slack이나 gmail로 받아볼 수 있습니다. Sentry 기능 오류 상세정보 확인 💡 클라이언트 기기, 아이피, 브라우저, 버전 등을 알 수 있으며, 소스코드 어느 부분에서 에러가 발생했는지도 알 수 있습니다. 💡 클라이언트 요청 프로퍼티 데이터와 헤더 데이터도 확인이 가능합니다. 일반 로그도 기록 💡 일반 로그를 기록할 수 있지만 월 트랜잭션(무료 : 10,000건, 유료 : 100,000건) 제한이 있어 사실상 로그 전체를 기록하는 것은 무리가 있을 것 같습니다. 유저별 이벤트 발생 이력 💡 에러의 발생 횟수와 발생 시간을 한눈에 볼 수 있..
Node.js 보안 모듈 (helmet, hpp) Node.js 서버의 취약점들을 보완해주는 모듈입니다. 이 모듈을 사용한다해서 모든 취약점을 방어해주는 것은 아니므로 주기적인 점검은 필요합니다. 사용법은 간단합니다. 우선 npm 설치를 진행합니다. $ npm i helmet hpp 코드는 개발 환경에서는 굳이 사용하지 않아도 되니 운영 환경에서만 사용하는 걸로 작성해줍니다. if(process.env.NODE_ENV === "production"){ app.use(helmet()); app.use(hpp()); //HTTP Parameter pollution을 방어 } helmet 🚧 Helmet을 이용하면 HTTP 헤더를 적절히 설정하여 몇 가지 잘 알려진 웹 취약성으로부터 앱을 보호할 수 있습니다. 사실 Helmet은 보안 관련 HTTP 헤더를 설..
[Node.js] express-ajv Json 스키마 유효성 검증 회원가입 API를 호출했을 때 닉네임, 아이디, 패스워드가 필수로 클라이언트에서 보내줘야 한다 했을 때 단순하게 if,else를 사용하여 체크를 할 수 있긴 하지만 항목이 많아진다면 코드가 더러워지는 문제가 있다. 이때 스키마 유효성 검사인 ajv를 사용한다면 좀 더 깔끔하게 유효성 검사를 할 수가 있다. 설치 npm install ajv ajv-errors 소스코드 파일 : ajv.middleware.js body, query, params, file 메서드를 각각 구현을 해줬고 전달받은 스키마와 요청 값을 비교하여 틀릴 시 error 메시지를 반환하도록 하였는데 웬만하면 예외처리를 하는 게 좋다. //파일명 : ajv.middleware.js const Ajv = require('ajv'); cons..
[Node.js] express i18n 다국어 사용방법 백엔드에서 i18n 라이브러리르 사용하여 국제화 작업을 할 수 있는 방법을 소개 하겠습니다. i18n은 언어(ko, en..) 별로 설정이 가능하며 sprintf 스타일 표현식도 지원을 하고 있습니다. 현재 node.js에서 가장 많이 사용하고 있는 라이브러리로 사용법도 굉장히 간단합니다. 클라이언트에서 사용하는 언어에 따라 응답 메시지를 보내주는 코드를 구현해보겠습니다. 설치 npm install i18n --save 설정 /** i18n 옵션 설정 */ i18n.configure({ locales:['ko','en'], //사용언어 설정 / 'de' 나 'ja' , 'fr' 등등 추가 가능 directory: __dirname + '/locales', // 사용언어에 대한 템플릿폴더 생성위치, def..
[Node.js] Sequelize Create 메서드에서 특정 레코드만 반환 Sequelize에서 Create 메서드 사용 시 전체 레코드 반환이 아니라 필요한 레코드만 반환이 필요할 때 아래 코드처럼에서 모델 정의에서 hooks 옵션을 추가해준다. sequelize.define( 'User', { id: { type: DataType.UUID, defaultValue: Sequelize.UUIDV4, primaryKey: true }, username: { type: DataType.STRING, allowNull: false }, password: { type: DataType.STRING, allowNull: false } }, { hooks: { afterCreate: (record) => { delete record.dataValues.password; }, afterU..