Book

[ 면접을 μœ„ν•œ cs 전곡지식 λ…ΈνŠΈ 정리 ] 1. λ””μžμΈ νŒ¨ν„΄κ³Ό ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ : λ””μžμΈ νŒ¨ν„΄

PYT 2024. 4. 9. 17:33
λ°˜μ‘ν˜•

(좜처 : https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95)

λ””μžμΈ νŒ¨ν„΄μ΄λž€ ?

 

ν”„λ‘œκ·Έλž¨μ„ 섀계할 λ•Œ λ°œμƒν–ˆλ˜ λ¬Έμ œμ λ“€μ„ 객체 κ°„μ˜ μƒν˜Έ 관계 등을 μ΄μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ„λ‘ ν•˜λ‚˜μ˜ 'κ·œμ•½'ν˜•νƒœλ‘œ λ§Œλ“€μ–΄ 놓은 것을 의미

 

* λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν”„λ ˆμž„μ›Œν¬

 

1) 라이브러리

  • κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” νŠΉμ •ν•œ κΈ°λŠ₯듀을 λͺ¨λ“ˆν™”ν•œ 것, 폴더λͺ…μ΄λ‚˜ 파일λͺ…에 λŒ€ν•œ κ·œμΉ™μ΄ μ—†κ³  ν”„λ ˆμž„μ›Œν¬μ— λΉ„ν•΄ μžμœ λ‘­λ‹€.
  • 무언가λ₯Ό 자λ₯Ό λ•Œ '도ꡬ'인 'κ°€μœ„'λ₯Ό μ‚¬μš©ν•΄μ„œ 'λ‚΄'κ°€ 직접 μ»¨νŠΈλ‘€ν•˜μ—¬ 자λ₯΄λŠ” 것과 λΉ„μŠ·ν•˜λ‹€.

2) ν”„λ ˆμž„μ›Œν¬

  • κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” νŠΉμ •ν•œ κΈ°λŠ₯듀을 λͺ¨λ“ˆν™”ν•œ 것, 폴더λͺ…μ΄λ‚˜ 파일λͺ…에 λŒ€ν•œ κ·œμΉ™μ΄ 있으며 λΌμ΄λΈŒλŸ¬λ¦¬μ— λΉ„ν•΄ μ—„κ²©ν•˜λ‹€.
  • λ‹€λ₯Έ 곳으둜 이동할 λ•Œ '도ꡬ'인 λΉ„ν–‰κΈ°λ₯Ό 타고 μ΄λ™ν•˜μ§€λ§Œ 'λΉ„ν–‰κΈ°'κ°€ μ»¨νŠΈλ‘€ν•˜κ³  λ‚˜λŠ” κ°€λ§Œνžˆ μžˆμ–΄μ•Όν•˜λŠ” 것과 λΉ„μŠ·ν•˜λ‹€.

     

1.1 λ””μžμΈ νŒ¨ν„΄

1.1.1 싱글톀 νŒ¨ν„΄
1.1.2 νŒ©ν† λ¦¬ νŒ¨ν„΄
1.1.3 μ „λž΅ νŒ¨ν„΄
1.1.4 μ˜΅μ €λ²„ νŒ¨ν„΄
1.1.5 ν”„λ‘μ‹œ νŒ¨ν„΄κ³Ό ν”„λ‘μ‹œ μ„œλ²„
1.1.6 μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄
1.1.7 λ…ΈμΆœλͺ¨λ“ˆ νŒ¨ν„΄
1.1.8 MVC νŒ¨ν„΄
1.1.9 MVP νŒ¨ν„΄
1.1.10 MVVM νŒ¨ν„΄

1.1 λ””μžμΈ νŒ¨ν„΄

 

1.1.1 싱글톀 νŒ¨ν„΄ (singletone pattern)

 

  • 싱글톀 νŒ¨ν„΄μ˜ μ •μ˜
  • ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— 였직 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ κ°€μ§€λŠ” νŒ¨ν„΄μœΌλ‘œ, 보톡 λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° λͺ¨λ“ˆμ— 많이 μ‚¬μš©ν•œλ‹€.
  • 싱글톀 νŒ¨ν„΄μ˜ μž₯점
  • ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ 놓고 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ κ³΅μœ ν•˜λ©° μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ λ“œλŠ” λΉ„μš©μ΄ 쀄어든닀.
  • 싱글톀 νŒ¨ν„΄μ˜ 단점
  • μ˜μ‘΄μ„±μ΄ λ†’μ•„μ§„λ‹€.
  • TDD(Test Driven Development)λ₯Ό ν•  λ•Œ 걸림돌이 λœλ‹€. λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” ν…ŒμŠ€νŠΈκ°€ μ„œλ‘œ 독립적이어야 ν•˜κ³  ν…ŒμŠ€νŠΈμ˜ μ‹€ν–‰λ°©ν–₯이 μ–΄λ””λ“  κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ 싱글톀 νŒ¨ν„΄μ€ 미리 μƒμ„±λœ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 기반으둜 κ΅¬ν˜„ν•˜λŠ” νŒ¨ν„΄μ΄κΈ° λ•Œλ¬Έμ— 각 ν…ŒμŠ€νŠΈλ§ˆλ‹€ 독립적인 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κΈ°κ°€ μ–΄λ ΅λ‹€.
  • λͺ¨λ“ˆκ°„μ˜ 결합을 κ°•ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€. πŸ‘‰ μ˜μ‘΄μ„± μ£Όμž…μœΌλ‘œ λͺ¨λ“ˆκ°„μ˜ 결합을 λŠμŠ¨ν•˜κ²Œ λ§Œλ“€μ–΄ ν•΄κ²° κ°€λŠ₯
  • μ˜μ‘΄μ„± μ£Όμž…

    μ˜μ‘΄μ„±μ΄λž€ 쒅속성이라고도 ν•˜λ©°, μ½”λ“œμ—μ„œ 두 λͺ¨λ“ˆ(클래슀) κ°„μ˜ μ—°κ²° ν˜Ήμ€ 관계λ₯Ό λ§ν•œλ‹€.
    메인 λͺ¨λ“ˆ(main module)이 직접 ν•˜μœ„λͺ¨λ“ˆμ— λŒ€ν•΄ μ˜μ‘΄μ„±μ„ μ£ΌκΈ°λ³΄λ‹€λŠ” 쀑간에 μ˜μ‘΄μ„± μ£Όμž…μž(dependency injector)κ°€ 이 뢀뢄을 κ°€λ‘œμ±„ 메인 λͺ¨λ“ˆμ΄ κ°„μ ‘μ μœΌλ‘œ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” 방식이닀.
    이λ₯Ό 톡해 메인 λͺ¨λ“ˆ(μƒμœ„λͺ¨λ“ˆ)은 ν•˜μœ„ λͺ¨λ“ˆμ— λŒ€ν•œ μ˜μ‘΄μ„±μ΄ λ–¨μ–΄μ§€κ²Œ 되며 이것을 'λ””μ»€ν”Œλ§μ΄ λœλ‹€'라고도 ν•œλ‹€.
  • μ˜μ‘΄μ„± μ£Όμž…μ˜ μž₯점
    λͺ¨λ“ˆλ“€μ„ μ‰½κ²Œ ꡐ체할 수 μžˆλŠ” ꡬ쑰가 λ˜μ–΄ ν…ŒμŠ€νŒ…ν•˜κΈ° 쉽고 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜κΈ°λ„ μˆ˜μ›”ν•˜λ‹€.
    κ΅¬ν˜„ν•  λ•Œ 좔상화 λ ˆμ΄μ–΄λ₯Ό λ„£κ³  이λ₯Ό 기반으둜 κ΅¬ν˜„μ²΄λ₯Ό λ„£μ–΄ μ£ΌκΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ˜μ‘΄μ„± λ°©ν–₯이 μΌκ΄€λ˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ μΆ”λ‘ ν•  수 있으며 λͺ¨λ“ˆ κ°„μ˜ 관계듀이 쑰금 더 λͺ…ν™•ν•΄μ§„λ‹€.

  • μ˜μ‘΄μ„± μ£Όμž…μ˜ 단점
    λͺ¨λ“ˆλ“€μ΄ λ”μš±λ” λΆ„λ¦¬λ˜λ―€λ‘œ 클래슀 μˆ˜κ°€ λŠ˜μ–΄λ‚˜ λ³΅μž‘μ„±μ΄ 증가될 수 있으며 μ•½κ°„μ˜ λŸ°νƒ€μž„ νŒ¨λ„ν‹°κ°€ 생기기도 ν•œλ‹€.
  • μ˜μ‘΄μ„± μ£Όμž… 원칙
    μƒμœ„ λͺ¨λ“ˆμ€ ν•˜μœ„ λͺ¨λ“ˆμ—μ„œ μ–΄λ– ν•œ 것도 κ°€μ Έμ˜€μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.
    λ‘˜ λ‹€ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•˜λ©°, 이 λ•Œ μΆ”μƒν™”λŠ” μ„ΈλΆ€ 사항에 μ˜μ‘΄ν•˜μ§€ 말아야 ν•œλ‹€.
  • 싱글톀 μ‚¬μš© μ˜ˆμ‹œ
    Node.jsμ—μ„œ MongoDB λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ—°κ²°ν•  λ•Œ μ“°λŠ” mongoose λͺ¨λ“ˆμ—μ„œ λ³Ό 수 μžˆλ‹€.
class Singleton {
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
}

public class Main {
        public static void main(String[] args) {

            Singleton a = Singleton.getInstance();
            Singleton b = Singleton.getInstance();

            System.out.println(a.hashCode());
            System.out.println(b.hashCode());

            if (a == b) {
                System.out.println(true);
            }
        }
}


/*
1523554304
1523554304
true
*/

 

 

1.1.2 νŒ©ν† λ¦¬ νŒ¨ν„΄ (factory pattern)

  • νŒ©ν† λ¦¬ νŒ¨ν„΄μ˜ μ •μ˜
  • 객체λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ 객체 생성 뢀뢄을 λ–Όμ–΄λ‚΄ μΆ”μƒν™”ν•œ νŒ¨ν„΄μ΄μž 상속 관계에 μžˆλŠ” 두 ν΄λž˜μŠ€μ—μ„œ μƒμœ„ ν΄λž˜μŠ€κ°€ μ€‘μš”ν•œ λΌˆλŒ€λ₯Ό κ²°μ •ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 객체 생성에 κ΄€ν•œ ꡬ체적인 λ‚΄μš©μ„ κ²°μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.
  • νŒ©ν† λ¦¬ νŒ¨ν„΄μ˜ μž₯점
  • μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ ν΄λž˜μŠ€κ°€ λΆ„λ¦¬λ˜κΈ° λ•Œλ¬Έμ— λŠμŠ¨ν•œ 결합을 κ°€μ§€λ©° μƒμœ„ ν΄λž˜μŠ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 생성 방식에 λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— 더 λ§Žμ€ μœ μ—°μ„±μ„ κ°–κ²Œ λœλ‹€.
  • 객체 생성 둜직이 λ”°λ‘œ λ–Όμ–΄μ Έ 있기 λ•Œλ¬Έμ— μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ν•˜λ”λΌλ„ ν•œ 곳만 κ³ μΉ  수 μžˆκ²Œλ˜μ–΄ μœ μ§€ λ³΄μˆ˜μ„±μ΄ μ¦κ°€λœλ‹€.
abstract class Coffee {
    public abstract int getPrice();

    @Override
    public String toString() {
        return "Hi this coffee is " + this.getPrice();
    }
}

class CoffeeFactory {
    public static Coffee getCoffee(String type, int price) {
    	// Enum λ˜λŠ” Map을 μ΄μš©ν•˜μ—¬ if문을 μ“°μ§€ μ•Šκ³  λ§€ν•‘ν•˜μ—¬ ν•  μˆ˜λ„ 있음
        if ("Latte".equalsIgnoreCase(type)) return new Latte(price);
        else if ("Americano".equalsIgnoreCase(type)) return new Americano(price);
        else {
            return new DefaultCoffee();
        }
    }
}

class DefaultCoffee extends Coffee {
    private int price;

    public DefaultCoffee() {
        this.price = -1;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}

class Latte extends Coffee {
    private int price;

    public Latte(int price) {
        this.price = price;
    }

    @Override
    public int getPrice() {
        return this.price;
    }    
}

class Americano extends Coffee {
    private int price;

    public Americano(int price) {
        this.price = price;
    }

    @Override
    public int getPrice() {
        return this.price;
    }    
}

public class Main {
        public static void main(String[] args) {

            Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
            Coffee ame = CoffeeFactory.getCoffee("Americano", 3000);    
            
            System.out.println("Factory latte ::" + latte);
            System.out.println("Factory ame ::" + ame);
        }
}

 

 

1.1.3 μ „λž΅ νŒ¨ν„΄ (sttrategy pattern) 

  • μ „λž΅ νŒ¨ν„΄μ˜ μ •μ˜
  • 객체의 ν–‰μœ„λ₯Ό λ°”κΎΈκ³  싢은 경우 직접 μˆ˜μ •ν•˜μ§€ μ•Šκ³  μ „λž΅μ΄λΌκ³  λΆ€λ₯΄λŠ” 'μΊ‘μŠν™”ν•œ μ•Œκ³ λ¦¬μ¦˜'을 μ»¨ν…μŠ€νŠΈ μ•ˆμ—μ„œ λ°”κΏ”μ£Όλ©΄μ„œ μƒν˜Έ ꡐ체가 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” νŒ¨ν„΄μ΄λ‹€.
  • μ •μ±… νŒ¨ν„΄ (policy pattern) 이라고도 ν•œλ‹€.
  • μ „λž΅ νŒ¨ν„΄ μ‚¬μš© μ˜ˆμ‹œ
  • 결제 μ‹œ 카카였페이, λ„€μ΄λ²„νŽ˜μ΄ 등을 μ‚¬μš©ν•˜λ“―μ΄ κ²°μ œλ°©μ‹μ˜ μ „λž΅λ§Œ λ°”κΏ”μ„œ κ²°μ œν•˜λŠ” 것을 μ˜ˆμ‹œλ‘œ λ“€ 수 있으며, μ•„λž˜λŠ” μ‡Όν•‘μΉ΄λ“œμ— μ•„μ΄ν…œμ„ 담에 LUNACard λ˜λŠ” KAKAOCard λΌλŠ” 두 개의 μ „λž΅μœΌλ‘œ κ²°μ œν•˜λŠ” μžλ°” μ˜ˆμ‹œ μ½”λ“œμ΄λ‹€.
import java.text.DecimalFormat;
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<Item>();
    }
    
    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 HelloWorld{
    public static void main(String []args){
        ShoppingCart cart = new ShoppingCart();
        
        Item A = new Item("kundolA",100);
        Item B = new Item("kundolB",300);
        
        cart.addItem(A);
        cart.addItem(B);
        
        // pay by LUNACard
        cart.pay(new LUNACardStrategy("kundol@example.com", "pukubababo"));
        // pay by KAKAOBank
        cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789", "123", "12/01"));
    }
}
/*
400 paid using LUNACard.
400 paid using KAKAOCard.
*/
  • μ „λž΅ νŒ¨ν„΄ μ‚¬μš© μ˜ˆμ‹œ

    passport  : Node.jsμ—μ„œ 인증 λͺ¨λ“ˆμ„ κ΅¬ν˜„ν•  λ•Œ μ“°λŠ” 미듀웨어 라이브러리둜 페이슀뢁, 넀이버 λ“± μ—¬λŸ¬κ°€μ§€ μ „λž΅μ„ 기반으둜 인증할 수 μžˆλŠ” μ „λž΅νŒ¨ν„΄μ„ μ΄μš©ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.

 

1.1.4 μ˜΅μ €λ²„ νŒ¨ν„΄ (observer pattern)

  • μ˜΅μ €λ²„ νŒ¨ν„΄μ˜ μ •μ˜
  • 주체가 μ–΄λ–€ 객체(subject)의 μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λ‹€κ°€ μƒνƒœλ³€ν™”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ λ©”μ„œλ“œ 등을 톡해 μ˜΅μ €λ²„ λͺ©λ‘μ— μžˆλŠ” μ˜΅μ €λ²„λ“€μ—κ²Œ λ³€ν™”λ₯Ό μ•Œλ €μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
  • μ£Όμ²΄λž€ 객체의 μƒνƒœ λ³€ν™”λ₯Ό 보고 μžˆλŠ” κ΄€μ°°μžμ΄λ©°, μ˜΅μ €λ²„λ“€μ΄λž€ 이 객체의 μƒνƒœ 변화에 따라 μ „λ‹¬λ˜λŠ” λ©”μ„œλ“œ 등을 기반으둜 'μΆ”κ°€ λ³€ν™” 사항'이 μƒκΈ°λŠ” 객체듀을 μ˜λ―Έν•œλ‹€.
  • 주체와 객체λ₯Ό λ”°λ‘œ 두지 μ•Šκ³  μƒνƒœκ°€ λ³€κ²½λ˜λŠ” 객체λ₯Ό 기반으둜 κ΅¬μ„±ν•˜κΈ°λ„ ν•œλ‹€.
  • μ˜΅μ €λ²„ νŒ¨ν„΄ μ‚¬μš© μ˜ˆμ‹œ
  • νŠΈμœ„ν„°
    μ–΄λ–€ μ‚¬λžŒμ΄ 주체λ₯Ό νŒ”λ‘œμš° ν–ˆμ„ 경우 주체가 ν¬μŠ€νŒ…μ„ 올렀 μƒνƒœλ³€ν™”κ°€ 생기면 νŒ”λ‘œμ›Œμ—κ²Œ μ•ŒλžŒμ΄ κ°€λŠ” ν˜•μ‹μ΄λ‹€.
  • 주둜 이벀트 기반 μ‹œμŠ€ν…œμ— μ‚¬μš©ν•˜λ©°, 주체라고 λ³Ό 수 μžˆλŠ” λͺ¨λΈμ—μ„œ λ³€κ²½ 사항이 생겨 update() λ©”μ†Œλ“œλ‘œ μ˜΅μ €λ²„μΈ 뷰에 μ•Œλ €μ£Όκ³  이λ₯Ό 기반으둜 컨트둀러 등이 μž‘λ™ν•˜λŠ” λ°©μ‹μœΌλ‘œ MVC νŒ¨ν„΄μ—λ„ μ‚¬μš©λœλ‹€.
import java.util.ArrayList;
import java.util.List;

interface Subject {
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObservers();
    public Object getUpdate(Observer obj);
}

interface Observer {
    public void update(); 
}

class Topic implements Subject {
    private List<Observer> observers;
    private String message; 

    public Topic() {
        this.observers = new ArrayList<>();
        this.message = "";
    }

    @Override
    public void register(Observer obj) {
        if (!observers.contains(obj)) observers.add(obj); 
    }

    @Override
    public void unregister(Observer obj) {
        observers.remove(obj); 
    }

    @Override
    public void notifyObservers() {   
        this.observers.forEach(Observer::update); 
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    } 
    
    public void postMessage(String msg) {
        System.out.println("Message sended to Topic: " + msg);
        this.message = msg; 
        notifyObservers();
    }
}

class TopicSubscriber implements Observer {
    private String name;
    private Subject topic;

    public TopicSubscriber(String name, Subject topic) {
        this.name = name;
        this.topic = topic;
    }

    @Override
    public void update() {
        String msg = (String) topic.getUpdate(this); 
        System.out.println(name + ":: got message >> " + msg); 
    } 
}

public class HelloWorld { 
    public static void main(String[] args) {
        Topic topic = new Topic(); 
        Observer a = new TopicSubscriber("a", topic);
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);
        topic.register(a);
        topic.register(b);
        topic.register(c); 
   
        topic.postMessage("amumu is op champion!!"); 
    }
}
/*
Message sended to Topic: amumu is op champion!!
a:: got message >> amumu is op champion!!
b:: got message >> amumu is op champion!!
c:: got message >> amumu is op champion!!
*/

 

1.1.5 ν”„λ‘μ‹œ νŒ¨ν„΄(proxy pattern)κ³Ό ν”„λ‘μ‹œ μ„œλ²„(proxy server)

  • ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ μ •μ˜
  • ν”„λ‘μ‹œ νŒ¨ν„΄μ€ λŒ€μƒ 객체(subject)에 μ ‘κ·Όν•˜κΈ° μ „ κ·Έ 접근에 λŒ€ν•œ 흐름을 κ°€λ‘œμ±„ λŒ€μƒ 객체 μ•žλ‹¨μ˜ μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
  • 이λ₯Ό 톡해 객체의 속성, λ³€ν™˜ 등을 λ³΄μ™„ν•˜λ©° λ³΄μ•ˆ, 데이터 검증, 캐싱, λ‘œκΉ…μ— μ‚¬μš©ν•œλ‹€.

    * ν”„λ‘μ‹œ μ„œλ²„μ—μ„œμ˜ 캐싱
    μΊμ‹œ μ•ˆμ— 정보λ₯Ό 담아두고 μΊμ‹œ μ•ˆμ— μžˆλŠ” 정보λ₯Ό μš”κ΅¬ν•˜λŠ” μš”μ²­μ— λŒ€ν•΄ λ‹€μ‹œ 멀리 μžˆλŠ” μ›κ²©μ„œλ²„μ— μš”μ²­ν•˜μ§€ μ•Šκ³  μΊμ‹œ μ•ˆμ— μžˆλŠ” 데이터λ₯Ό ν™œμš©ν•˜λŠ” 것을 λ§ν•œλ‹€. λΆˆν•„μš”ν•˜κ²Œ 외뢀와 μ—°κ²°ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νŠΈλž˜ν”½μ„ 쀄일 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.
  • ν”„λ‘μ‹œ μ„œλ²„μ˜ μ •μ˜
  • ν”„λ‘μ‹œ μ„œλ²„λŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μžμ‹ μ„ 톡해 λ‹€λ₯Έ λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€μ— κ°„μ ‘μ μœΌλ‘œ 접속할 수 있게 ν•΄μ£ΌλŠ” 컴퓨터 μ‹œμŠ€ν…œμ΄λ‚˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ 가리킨닀.

  • ν”„λ‘μ‹œ μ„œλ²„μ˜ μ‚¬μš© μ˜ˆμ‹œ

    1. nginx

    nginxλŠ” 비동기 이벀트 기반의 ꡬ쑰와 λ‹€μˆ˜μ˜ 연결을 효과적으둜 처리 κ°€λŠ₯ν•œ μ›Ή μ„œλ²„μ΄λ©°, 주둜 Node.js μ„œλ²„ μ•žλ‹¨μ˜ ν”„λ‘μ‹œ μ„œλ²„λ‘œ ν™œμš©λœλ‹€. Node.js μ„œλ²„λ₯Ό ꡬ좕할 λ•Œ μ•žλ‹¨μ— nginxλ₯Ό λ‘κ²Œ 되면 읡λͺ… μ‚¬μš©μžμ˜ 직접적인 μ„œλ²„λ‘œμ˜ 접근을 μ°¨λ‹¨ν•˜κ³  간접적인 단계λ₯Ό ν•œλ‹¨κ³„ 더 거침으둜써 λ³΄μ•ˆμ„±μ΄ 더 κ°•ν™”λœλ‹€.

    2. CloudFlare
    CloudFlareλŠ” μ „ μ„Έκ³„μ μœΌλ‘œ λΆ„μ‚°λœ μ„œλ²„κ°€ 있고 이λ₯Ό 톡해 μ–΄λ– ν•œ μ‹œμŠ€ν…œμ˜ μ½˜ν…μΈ  전달을 λΉ λ₯΄κ²Œ ν•  수 μžˆλŠ” CDN(*Contetn Delivery Network, 각 μ‚¬μš©μžκ°€ 인터넷에 μ ‘μ†ν•˜λŠ” κ³³κ³Ό κ°€κΉŒμš΄ κ³³μ—μ„œ μ½˜ν…μΈ λ₯Ό 캐싱 λ˜λŠ” λ°°ν¬ν•˜λŠ” μ„œλ²„ λ„€νŠΈμ›Œν¬, 이λ₯Ό 톡해 μ‚¬μš©μžκ°€ μ›Ή μ„œλ²„λ‘œλΆ€ν„° μ½˜ν…μΈ λ₯Ό λ‹€μš΄λ‘œλ“œν•˜λŠ” μ‹œκ°„μ„ 쀄일 수 있음)μ„œλΉ„μŠ€μ΄λ‹€.
    λ˜ν•œ CloudFlareλ₯Ό 톡해 λˆ„λ¦΄ 수 μžˆλŠ” λ‹€λ₯Έ 이점도 μžˆλ‹€.

    1) DDOS 곡격 λ°©μ–΄
    DDOS 곡격은 짧은 κΈ°κ°„ λ™μ•ˆ λ„€νŠΈμ›Œν¬μ— λ§Žμ€ μš”μ²­μ„ 보내 λ„€νŠΈμ›Œν¬λ₯Ό λ§ˆλΉ„μ‹œμΌœ μ›Ή μ‚¬μ΄νŠΈμ˜ κ°€μš©μ„±μ„ λ°©ν•΄ν•˜λŠ” 사이버 μœ ν˜•μ΄λ‹€.
    CloudFlareλŠ” μ˜μ‹¬μŠ€λŸ¬μš΄ νŠΈλž˜ν”½(μ‚¬μš©μžκ°€ μ•„λ‹Œ μ‹œμŠ€ν…œμ„ 톡해 μ˜€λŠ” νŠΈλž˜ν”½)을 μžλ™μœΌλ‘œ μ°¨λ‹¨ν•œλ‹€.
    2) HTTPS ꡬ좕
    μ„œλ²„μ—μ„œ HTTPSλ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈμ¦μ„œλ₯Ό 기반으둜 ꡬ좕할 μˆ˜λ„ μžˆμœΌλ‚˜, CloudFlareλ₯Ό μ‚¬μš©ν•˜λ©΄ λ³„λ„μ˜ μΈμ¦μ„œ μ„€μΉ˜ 없이 μ’€ 더 μ†μ‰½κ²Œ ꡬ좕할 수 μžˆλ‹€.

    3. CORS와 ν”„λ‘ νŠΈμ—”λ“œμ˜ ν”„λ‘μ‹œ μ„œλ²„

    CORS(Cross-Origin Resource Sharing)λŠ” μ„œλ²„κ°€ μ›Ή λΈŒλΌμš°μ €μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό λ‘œλ“œν•  λ•Œ λ‹€λ₯Έ μ˜€λ¦¬μ§„(*ν”„λ‘œν† μ½œκ³Ό 호슀트 이름, 포트의 μ‘°ν•©, 예λ₯Όλ“€μ–΄ https://kundo.com:12010/test의 μ£Όμ†Œμ—μ„œ μ˜€λ¦¬μ§„μ€ https://kundo.com:12010μž„)을 톡해 λ‘œλ“œν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” HTTP 헀더 기반 λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€.

    ν”„λ‘ νŠΈμ—”λ“œ 개발 μ‹œ ν”„λ‘ νŠΈμ—”λ“œ μ„œλ²„λ₯Ό λ§Œλ“€μ–΄μ„œ λ°±μ—”λ“œ μ„œλ²„μ™€ 톡신할 λ•Œ 주둜 CORS μ—λŸ¬λ₯Ό λ§Œλ‚˜λŠ”λ° 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό λ§Œλ“€κΈ°λ„ ν•œλ‹€. 예λ₯Ό λ“€μ–΄ ν”„λ‘ νŠΈ μ„œλ²„μ—μ„œ μš”μ²­λ˜λŠ” μ˜€λ¦¬μ§„μ„ 본인 PC IP인 127.0.0.1:12010 (루프백 IP)둜 λ³€κ²½ν•˜μ—¬ DNSλ₯Ό 타지 μ•Šκ³  λ°”λ‘œ 본인 PC둜 μ—°κ²°λ˜κ²Œ ν•˜λŠ” 것이닀.

1.1.6 μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄ (itterator pattern)

 

  • μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄μ˜ μ •μ˜
  • μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄μ€ μ΄ν„°λ ˆμ΄ν„°(iterator)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¬λ ‰μ…˜(collection)의 μš”μ†Œλ“€μ— μ ‘κ·Όν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
  • μˆœνšŒν•  수 μžˆλŠ” μ—¬λŸ¬ κ°€μ§€ μžλ£Œν˜•μ˜ κ΅¬μ‘°μ™€λŠ” 상관없이 μ΄ν„°λ ˆμ΄ν„°λΌλŠ” ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ μˆœνšŒκ°€ κ°€λŠ₯ν•˜λ‹€.

 

1.1.7 λ…ΈμΆœλͺ¨λ“ˆ νŒ¨ν„΄ (revealing module pattern)

 

  • λ…ΈμΆœλͺ¨λ“ˆ νŒ¨ν„΄μ˜ μ •μ˜
  • λ…ΈμΆœλͺ¨λ“ˆ νŒ¨ν„΄μ€ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(*ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μžλ§ˆμž λ°”λ‘œ 호좜 ν•˜λŠ” ν•¨μˆ˜, μ΄ˆκΈ°ν™” μ½”λ“œλ‚˜ 라이브러리 λ‚΄ μ „μ—­ λ³€μˆ˜μ˜ 좩돌 λ°©μ§€ 등에 μ‚¬μš©)λ₯Ό 톡해 private, public κ³Ό 같은 μ ‘κ·Ό μ œμ–΄μžλ₯Ό λ§Œλ“œλŠ” νŒ¨ν„΄μ„ λ§ν•œλ‹€.

1.1.8 MVC νŒ¨ν„΄

 

  • MVC νŒ¨ν„΄μ˜ μ •μ˜
  • λͺ¨λΈ(Model), λ·°(View), 컨트둀러(Controller)둜 이루어진 λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 
  • MVC νŒ¨ν„΄μ˜ μž₯점
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ성 μš”μ†Œλ₯Ό μ„Έ κ°€μ§€ μ—­ν• λ‘œ κ΅¬λΆ„ν•˜μ—¬ 개발 ν”„λ‘œμ„ΈμŠ€μ—μ„œ 각각의 ꡬ성 μš”μ†Œμ—λ§Œ μ§‘μ€‘ν•΄μ„œ κ°œλ°œν•  수 있으며, μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성이 μš©μ΄ν•˜λ‹€.
  • MVC νŒ¨ν„΄μ˜ λ‹¨μ 
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ λͺ¨λΈκ³Ό 뷰의 관계가 λ³΅μž‘ν•΄μ§„λ‹€.
  • MVC
  • λͺ¨λΈ(Model)
    μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 데이터인 λ°μ΄ν„°λ² μ΄μŠ€, μƒμˆ˜, λ³€μˆ˜ 등을 λœ»ν•œλ‹€.
  • λ·°(View)
    inputbox, checkbox, textarea λ“± μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ μš”μ†Œλ₯Ό λ‚˜νƒ€λ‚΄λ©° λͺ¨λΈμ„ 기반으둜 μ‚¬μš©μžκ°€ λ³Ό 수 μžˆλŠ” 화면을 λœ»ν•œλ‹€.
  • 컨트둀러(Controller)
    ν•˜λ‚˜ μ΄μƒμ˜ λͺ¨λΈκ³Ό ν•˜λ‚˜ μ΄μƒμ˜ λ·°λ₯Ό μž‡λŠ” 닀리 역할을 ν•˜λ©° 이벀트 λ“± 메인 λ‘œμ§μ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
    λͺ¨λΈκ³Ό 뷰의 생λͺ…주기도 κ΄€λ¦¬ν•˜λ©° λͺ¨λΈμ΄λ‚˜ 뷰의 λ³€κ²½ 톡지λ₯Ό λ°›μœΌλ©΄ 각각의 ꡬ성 μš”μ†Œμ— ν•΄λ‹Ή λ‚΄μš©μ— λŒ€ν•΄ μ•Œλ €μ€€λ‹€.
  • MVC νŒ¨ν„΄μ˜ μ‚¬μš© μ˜ˆμ‹œ
  • λ¦¬μ•‘νŠΈ (React.js)
    λ¦¬μ•‘νŠΈλŠ” μœ μ € μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ 라이브러리둜, '가상 DOM'을 톡해 μ‹€μ œ DOM을 μ‘°μž‘ν•˜λŠ” 것을 μΆ”μƒν™”ν•΄μ„œ μ„±λŠ₯을 λ†’μ˜€λ‹€.

 

1.1.9 MVP νŒ¨ν„΄

  • MVPνŒ¨ν„΄μ˜ μ •μ˜
  • MVCνŒ¨ν„΄μœΌλ‘œλΆ€ν„° νŒŒμƒλ˜μ—ˆμœΌλ©° MVC의 C에 ν•΄λ‹Ήν•˜λŠ” μ»¨νŠΈλ‘€λŸ¬κ°€ ν”„λ ˆμ  ν„°(presenter)둜 ꡐ체된 νŒ¨ν„΄μ΄λ‹€.
  • 뷰와 ν”„λ ˆμ  ν„°λŠ” 1:1관계이기 λ•Œλ¬Έμ— MVC νŒ¨ν„΄λ³΄λ‹€ 더 κ°•ν•œ 결합을 μ§€λ‹Œ λ””μžμΈ νŒ¨ν„΄μ΄λ‹€

1.1.9 MVVM νŒ¨ν„΄

 

  • MVVMνŒ¨ν„΄μ˜ μ •μ˜
  • MVC의 C에 ν•΄λ‹Ήν•˜λŠ” μ»¨νŠΈλ‘€λŸ¬κ°€ λ·°λͺ¨λΈ(view model)둜 바뀐 νŒ¨ν„΄μ΄λ‹€.
  • λ·°λͺ¨λΈμ€ λ·°λ₯Ό 더 μΆ”μƒν™”ν•œ 계측이며, MVVM νŒ¨ν„΄μ€ MVC νŒ¨ν„΄κ³ΌλŠ” λ‹€λ₯΄κ²Œ μ»€λ§¨λ“œμ™€ 데이터 바인딩을 κ°€μ§€λŠ” νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€. 뷰와 λ·°λͺ¨λΈ μ‚¬μ΄μ˜ μ–‘λ°©ν–₯ 데이터 바인딩을 μ§€μ›ν•˜λ©° UIλ₯Ό λ³„λ„μ˜ μ½”λ“œ μˆ˜μ • 없이 μž¬μ‚¬μš©ν•  수 있고 λ‹¨μœ„ ν…ŒμŠ€νŒ…μ΄ μ‰½λ‹€λŠ” μž₯점이 μžˆλ‹€.
  • MVVM νŒ¨ν„΄μ˜ μ‚¬μš© μ˜ˆμ‹œ
  • λ·° (View.js)
    ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  κ°’ λŒ€μž…λ§ŒμœΌλ‘œλ„ λ³€μˆ˜κ°€ λ³€κ²½λ˜λ©° μ–‘λ°©ν–₯ 바인딩, html을 ν† λŒ€λ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό ꡬ좕할 수 μžˆλ‹€λŠ” 것이 νŠΉμ§•μ΄λ‹€.
λ°˜μ‘ν˜•