전략 패턴

이강용·2024년 3월 6일
0

CS

목록 보기
22/109
post-thumbnail

전략 패턴(Strategy Pattern)이란?

  • 알고리즘의 집합을 정의하고 각각을 캡슐화하여 그것들이 상호 교환 가능하게 만드는 것이다.
    즉, 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있게 해준다.
  • 전략 패턴을 사용하면 특정한 컨텍스트(context)내에서 요구되는 작업을 실행하기 위해 필요한 알고리즘 또는 전략을 런타임에 선택할 수 있다.
  • 정책 패턴(Policy Pattern)이라고도 한다.

전략 패턴 예시(로그인)

  • 각기 다른 전략(Local Strategy, Google, Kakao)으로 로그인을 하는 행위(Context)를 쉽게 교환 가능하게 만드는 것

전략 패턴이 들어있는 자바스크립트 라이브러리

passport

  • passport는 Node.js에서 인증 모듈을 구현할 때 사용하는 미들웨어 라이브러리로 여러가지 전략을 기반으로 인증을 할 수 있게 해준다. 서비스 내의 회원가입된 아이디와 비밀번호를 기반으로 인증하는 Local Strategy, Kakao, Google, Naver 등 다른 서비스를 기반으로 인증하는 OAuth2 전략 등을 지원한다.

facebook 전략

passport.use(new FacebookStrategy({
  clientID: process.env['FACEBOOK_CLIENT_ID'],
  clientSecret: process.env['FACEBOOK_CLIENT_SECRET'],
  callbackURL: '/oauth2/redirect/facebook',
  state: true
}, function verify(accessToken, refreshToken, profile, cb) {
  db.get('SELECT * FROM federated_credentials WHERE provider = ? AND subject = ?', [
    'https://www.facebook.com',
    profile.id
  ], function(err, row) {
    if (err) { return cb(err); }
    if (!row) {
      db.run('INSERT INTO users (name) VALUES (?)', [
        profile.displayName
      ], function(err) {
        if (err) { return cb(err); }

        var id = this.lastID;
        db.run('INSERT INTO federated_credentials (user_id, provider, subject) VALUES (?, ?, ?)', [
          id,
          'https://www.facebook.com',
          profile.id
        ], function(err) {
          if (err) { return cb(err); }
          var user = {
            id: id,
            name: profile.displayName
          };
          return cb(null, user);
        });
      });
    } else {
      db.get('SELECT * FROM users WHERE id = ?', [ row.user_id ], function(err, row) {
        if (err) { return cb(err); }
        if (!row) { return cb(null, false); }
        return cb(null, row);
      });
    }
  });
}));

Local Strategy

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));
  • Local 전략은 다른 OAuth2 전략과 다르게 해당 DB에 회원 정보가 들어있기때문에 사용자 이름과 비밀번호를 검증하여 회원 정보가 일치하는지 여부를 확인하고 그 결과에 따라 사용자 인증을 수행하는 과정을 구현한 것

java로 결제시스템 구현

package programmers;

import java.util.ArrayList;
import java.util.List;

interface PaymentStrategy {
	public void pay(int amount); 
}
class KAKAOCardStrategy implements PaymentStrategy { 
	private String name;
	private String cardNumber; 
	private String cvv;
	private String dateOfExpiry;
	
	public KAKAOCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
		this.name=nm; this.cardNumber=ccNum; this.cvv=cvv; this.dateOfExpiry=expiryDate;
	}
	@Override
	public void pay(int amount) {
		System.out.println(amount +" paid using KAKAOCard.");
	}
}

class LUNACardStrategy implements PaymentStrategy { 
	private String emailId;
	private String password;
	
	public LUNACardStrategy(String email, String pwd){ this.emailId=email;
		this.password=pwd;
	}
	@Override
	public void pay(int amount) {
		System.out.println(amount + " paid using LUNACard.");
	} 
}


class Item {
	private String name;
	private int price;
	public Item(String name, int cost) {
		this.name = name;
		this.price = cost;
	}
	
	public String getName() {
		return name;
	}
	
	public int getPrice() {
		return price;
	}
}

class ShoppingCart {
	List<Item> items;
	
	public ShoppingCart() {
		this.items = new ArrayList<>();
	}
	
	public void addItem(Item item) {
		this.items.add(item);
	}
	public void removeItem(Item item) {
		this.items.remove(item);
	}
	
	public int calculateTotal() {
		int sum = 0;
		for(Item item : items) {
			sum += item.getPrice();
		}
		
		return sum;
	}
	
	
	public void pay(PaymentStrategy paymentMethod) {
		int amount = calculateTotal();
		paymentMethod.pay(amount);
	}
}



public class Payment {
	
	public static void main(String[] args) {
		ShoppingCart cart = new ShoppingCart();
		
		Item A = new Item("leesfactA",100);
		Item B = new Item("leesfactB",300);
		
		cart.addItem(A);
		cart.addItem(B);
		
		cart.pay(new LUNACardStrategy("leesfact@example.com", "pukubababo"));
		cart.pay(new KAKAOCardStrategy("Lee KangYong","123456789","123","12/01"));
		
	}

}
profile
HW + SW = 1

0개의 댓글