ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 면접을 μœ„ν•œ cs 전곡지식 λ…ΈνŠΈ 정리 ] 1. λ””μžμΈ νŒ¨ν„΄κ³Ό ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ : λ””μžμΈ νŒ¨ν„΄
    Book 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을 ν† λŒ€λ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό ꡬ좕할 수 μžˆλ‹€λŠ” 것이 νŠΉμ§•μ΄λ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.