디자인 패턴 - 전략 패턴 / 옵저버 패턴

ROCKBELL·2022년 11월 8일
0

CS 전공지식

목록 보기
2/18

전략 패턴

전략 패턴(strategy pattern)은 정책 패턴(policy patter)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 낳고 전략이라고 부르는 캡슐화한 알고리즘 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴 입니다

Passport의 전략 패턴

전략 패턴을 사용한 대표적인 예시로는 passport 라이브러리가 있습니다
passport는 Node.js 에서 사용하는 인증모듈 미들웨어 입니다
이 라이브러리는 여러가지 전략을 기반으로 인증을 가능하게 만듭니다

  • passport-local (id, password)
  • OAuth (페이스북, 네이버 등등)
const passport = require('passport');
const { Strategy : LocalStrategy } = require(passport-local); // 구조분해할당
const { User } = require('./models'); // User DB Model 

passport.use(
	new LocalStrategy(
    	function(username, password, done) {
        	User.findOne({
            	username : username,
            }, {
            	function(err, user) {
                	if(err) {
                    	rturn done(err);
                    }
                    // 1. 해당하는 사용자가 없을 경우
                    if(!user) {
                    	return done(null, false, {
                        	message: '존재하지 않는 사용자 입니다'
                        })
                    }
                    // 2. 비밀번호가 틀릴 경우
                    const validPassword = bcrypt.compare(password, user.password);
                    if(!validPassword) {
                    	return done(null, false, {
                        	message: '비밀번호가 올바르지 않습니다'
                        })
                    }
                    
                    // 3. 사용자가 존재하고, 비밀번호가 일치하면 
                    return done(null, user);
                }
            })
        }
    )
)
passport.authenticate("local", (err, user, info) => {
	// local 인증 전략 로직 수행 후
    
    if(err) {
    	console.log(err);
    }
    
    if(info) {
    	return res.status(401).send(info.message);
    }
    
    // 로그인 로직 수행
    ...
})

옵저버 패턴

옵저버 패턴(Observer pattern)은 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴 입니다

  • 주체와 객체가 합쳐진 형태도 있다 (예시 - 트위터)

프록시객체를 이용한 옵저버 패턴

proxy 객체는 기본적인 동작을 가로챌 수 있는 객체를 뜻합니다
자바스크립트에서 proxy 객체는 targethandler 매개변수가 있습니다

  • target : 프록시할 대상
  • handler : target 동작을 가로채서 정의할 동작들이 정해져 있는 함수
const handler = {
    // handler.get(target, prop, receiver) 메서드
    // target 의 속성과 함수에 대한 접근을 가로 챕니다
	get: function(target, name) {
    	return name === 'name' ? `${target.a} ${target.b}` : target[name]
    }
}

const p = new Proxy({ a : 'bongbong', b: 'rockbell'}, handler );

console.log(p.name); // output : `bongbong rockbell`
profile
luv it

0개의 댓글