전략 패턴(strategy pattern)은 정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우, 행위 자체를 직접 수정하는 것이 아닌 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴입니다.
우리가 어떤 웹사이트에 회원가입하거나 로그인할 때, 카카오나 구글, 네이버 계정으로 로그인하는 경우와 해당 서비스에 등록된 회원 정보로 로그인하는 경우가 있는데, 로그인을 하는 행위(메서드)에 전략을 넘겨주는 방식으로 구현할 수 있겠습니다.
전략패턴을 활용한 자바스크립트 라이브러리에는 'passport'가 있습니다.
passport는 Node.js에서 인증 모듈을 구현할 때 사용하는 미들웨어 라이브러리로, 여러가지 '전략'을 기반으로 인증할 수 있게 합니다. 서비스 내의 회원가입된 아이디와 비밀번호를 기반으로 인증하는 LocalStrategy 전략과 카카오, 구글, 네이버 등 다른 서비스를 기반으로 인증하는 OAuth 전략 등을 지원합니다.
다음 코드처럼 '전략'만 바꾸어서 인증할 수 있습니다.
let passport = require('passport'), LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy((username, password, done) => {
User.findOne({username: username}, (err, user) => {
if(err) return done(err);
if(!user) return done(null, false, {message: 'Incorrect username'});
if(!user.validPassword(password)) return done(null, false, {message: 'Incorrect password'}
return done(null, user);
})
}))
passport.use(new LocalStrategy(...)... 처럼 passport.user()라는 메서드에 전략을 매개변수로 넣어서 로직을 수행하는 것을 확인할 수 있습니다.