전체보기 (286) 썸네일형 리스트형 손가락 오르가니스트 앱 링크 : finger-organist.netlify.app 문제 제기 성당에서 미사 중 사용하는 공식 악기는 오르간이다. 4성부의 소리를 연주해서 사람들이 멜로디를 쉽게 따라부를 수 있도록 해준다. 피아노와 마찬가지로 건반 악기이기 때문에 피아노 연주자가 봉사하는 경우가 많다. 그러나 시골 성당에서는 피아노 연주자를 구하는 것도 쉽지 않아 무반주로 성가를 부를 때가 많다. 다른 봉사들과는 달리 악기 연주는 하루 아침에 배울 수 있는 게 아니라 더 그렇다. 이에 대한 해결방법으로 손가락 오르가니스트라는 앱을 기획했다. 오르간 연주는 익숙하지 않은 악보를 읽고 네 손가락으로 정확한 건반을 눌러야하기 때문에 어렵다. 만약 박자에 맞춰서 손가락 터치로만 연주를 할 수 있다면 박치가 아닌 이상 누구나 오르간 .. 익스프레스의 각 라우트에 자동으로 예외처리를 해주는 모듈 클라이언트의 요청을 처리해주지 못하거나 예외적인 상황이 발생해 서버가 죽는 경우가 생길 수 있다. 사람들이 안 쓰는 앱이야 상관 없지만 인스타와 같은 앱의 서버가 멈춘다면 막대한 손해가 발생한다. 이를 막기 위해서 쉽게 떠올릴 수 있는 게 try, catch 문이다. try로 감싼 코드가 실행되다가 오류나 예외적인 상황이 발생하면 catch로 빠져 이에 따른 대처를 할 수 있게 된다. 그러나 아래의 코드가 더 들어가 지저분해진다는 단점이 있다. try { } catch (ex) { } 더군다나 모든 라우트에 이를 적용해야 한다면 중복해서 지저분한 코드를 사용하는 꼴이 된다. 신기하게도 라우트에 따라오는 콜백 함수에 try, catch 문을 자동으로 감싸주는 모듈이 있다고 한다. express-async-.. JSON Web Token이란? 노드에서의 사용 예제 JSON Web Token, 줄여서 jwt는 서버에서 사용자를 식별할 수 있는 정보를 담아 클라이언트에 내려줄 때 쓰는 토큰이다. 서버가 한 번 인증한 사용자에게 카드키를 준 거라고 생각하면 쉽다. 토큰을 받은 클라이언트는 다음에 따로 인증을 하지 않아도 토큰을 이용해 로그인한 상태로 웹에 접근할 수 있다. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 참고 : https://jwt.io/ jwt는 세 부분으로 나뉜다. 빨간색 부분은 헤더로 어떤 알고리즘이 적용됐는지 등의 정.. bcrypt의 작동원리와 노드에서 사용하는 방법 1. 간단한 원리 bcrypt를 사용하면 매번 솔트가 달라지기 때문에 해시 역시도 달라지고 데이터베이스에 특정한 해시를 저장하더라도 보안에 문제가 되지 않는다. 해시가 그때그때마다 달라져 해시를 이용해 비밀번호를 찾아내기 어렵기 때문이다. 그럼 데이터베이스의 해시가 달라지는데 어떻게 비밀번호가 일치하는지 확인할 수 있을까? bcrypt는 단순히 사용자가 입력한 비밀번호를 해싱해 데이터베이스에 저장된 해시와 비교하는 방식으로 돌아가지 않는다. 대신 사용자가 입력한 비밀번호와 데이터베이스에 저장된 해시 둘에, 어떤 해싱(로직?)을 적용해서 비교한다고 한다. 이것이 가능한 이유는 저장된 해시 앞부분에 솔트 정보가 들어 있고 이를 추론해서 사용자가 입력한 비밀번호의 해시와 비교할 수 있기 때문인 것 같다. (자.. 회원 가입시 복잡한 패스워드만 등록 가능하게 해주는 노드 모듈 - joi 대부분 웹에서는 보안을 위해 비밀번호를 복잡하게 설정하라고 권한다. 다음 모듈을 쓰면 이를 손쉽게 설정할 수 있다. joi.dev mongoose에서 잘못된 id가 들어왔을 때 에러 핸들링 if (!mongoose.Types.ObjectId.isValid(req.body.userId)) { return res.status(400).send('유효한 유저 아이디가 아닙니다.'); } mongoose collection의 관계 설정 몽고디비는 관계 설정을 두 가지 방법으로 할 수 있다. 레퍼런스 방식과 임베디드 방식이 있다. 레퍼런스 방식을 사용하면 서브 객체에서 주 객체를 참조하기 때문에 주 객체의 값 하나를 바꾸더라도 모두에게 적용된다는 장점이 있다. 대신 데이터를 검색할 때 참조하는 객체를 찾아서 가져와야 하니 느리다는 단점이 있다. 임베디드 방식은 주 객체 안에 서브 객체를 담는다. 레퍼런스 방식과 달리 주 객체 안에 서브 객체의 데이터가 다 있기 때문에 별다른 검색 쿼리 필요없이 값을 금방 찾을 수 있다는 장점이 있다. 다만 데이터를 수정할 때에 주 객체 안에 있는 서브 객체의 값을 모두 수정해야 하는데 중간에 오류가 생겨 다른 게 업데이트 되지 않을 수 있다는 단점이 있다. 임베디드 방식에서 서브 객체에 필요한 값만 담는.. mongoose의 유용한 schema type option const schema = new mongoose.Schema({ isOnSale: Boolean, product: { type: String, required: true, lowercase: true // 소문자로 바꿔준다. 반대로 uppercase를 사용할 수도 있다. }, price: { type: Number, required: function() { return this.isOnSale; }, // isOnSale이 true일 때만 값을 꼭 넣어야 한다. min: 100, max: 1000000, get: value => Math.round(value), // 데이터를 보여줄 때 반올림한다. set: value => Math.round(value) // 데이터를 넣을 때 반올림한다. } }); 이전 1 ··· 15 16 17 18 19 20 21 ··· 36 다음