해당 글은 Node.js 교과서의 내용을 요약, 정리한 글입니다
항상 package.json을 제일 먼저 생성해야 한다.
이후에 sequelize를 설치한다.
템플릿 파일을 넣을 views 폴더, 라우터를 넣을 routes 폴더, 정적 파일을 넣을 public폴더가 필요하다.
대부분의 프로젝트는 이 구조를 벗어나지 않는다.
그 후 HTML 페이지를 만든다.
예시에서는 넌적스 문법을 사용하였다.
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init({
email: {
type: Sequelize.STRING(40),
allowNull: true,
unique: true,
},
nick: {
type: Sequelize.STRING(15),
allowNull: false,
},
password: {
type: Sequelize.STRING(100),
allowNull: true,
},
provider: {
type: Sequelize.STRING(10),
allowNull: false,
defaultValue: 'local',
},
snsId: {
type: Sequelize.STRING(30),
allowNull: true,
},
}, {
sequelize,
timestamps: true,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: true,
charset: 'utf8',
collate: 'utf8_general_ci',
});
}
static associate(db) {
db.User.hasMany(db.Post);
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow',
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Followings',
through: 'Follow',
});
}
};
MySQL과 시퀄라이즈로 데이터 베이스를 설정한다.
provider 속성은 SNS 로그인한 경우, local : 로컬 로그인, kakao : 카카오 로그인 으로 저장해서 구분한다. 테이블 옵션으로 timestamps, paranoid 가 true 이므로 createdAt, updatedAt, deletedAt 컬럼도 생성된다.
게시글 등록자 아이디를 담은 컬럼은 나중에 관계를 설정할 때, 시퀄라이즈가 알아서 생성한다.
해시태그 모델을 따로 두는 이유는 나중에 태그로 검색하기 위함이다.
passport 모듈은 이름처럼 우리의 서비스를 사용할 수 있게 해주는 여권 같은 역할을 한다. 이것을 사용하면 기존의 SNS 서비스 계정으로 로그인 하는 것을 해결할 수 있다.
// Passport 관련 패키지 설치
$ npm i passport passport-local passport-kakao bcrypt
module.exports = () => {
//로그인시 실행
//req.session(세션) 객체에 어떤 데이터를 저장할지 정하는 메서드
//사용자 정보 객체를 세션에 아이디로 저장
passport.serializeUser((user, done) => {
// done( 첫 번째 인수, 두 번째 인수)
// 첫 번째 인수 :: 에러 발생시 사용
// 두 번째 인수 :: 저장하고 싶은 데이터
done(null, user.id);
});
// 세션에 저장한 아이디를 통해 사용자 정보 객체를 불러오는 것
// 매요청시 실행. passport.sesseion 미들웨어가 이 메서드 호출한다.
// serializeUser의 done 의 두번째 인수가 이 메서드의 매개변수가 된다.
// 여기서는 사용자 id
passport.deserializeUser((id, done) => {
User.findOne({ where: { id } })
.then(user => done(null, user))
.catch(err => done(err));
});
local();
kakao();
};
Passport는 로그인시의 동작을 전략(strategy)라는 용어로 표현한다.
로컬 로그인이란 다른 SNS 서비스를 통해서 로그인하지 않고 자체적으로 회원가입 후 로그인하는 것을 의미한다.
Passport에서 이를 구현하려면 passport-local 모듈이 필요한데 이미 설치했으므로 로컬 로그인 전략만 세우면된다.
카카오 로그인이란 로그인 인증 과정을 카카오에 맡기는 것을 뜻한다. SNS 로그인의 특징은 회원가입 절차가 따로 없다는 것이다. 대신에 SNS 로그인 전략은 로컬 로그인 전략보다 다소 복잡하다.
passport-kakao 모듈로부터 Strategy 생성자를 불러와 전략을 구현한다.
GET /auth/kakao로 접근하면 카카오 로그인 과정이 시작되고 로그인 후 성공 여부 결과를 GET /auth/kakao/callback으로 받는다.
-> 로컬 로그인과 다른점은 passport.authenticate 메서드에 콜백 함수를 제공하지 않는 것이다. 카카오 로그인은 로그인 성공시 내부적으로 req.login을 호출하기 때문이다.