-
[ λ©΄μ μ μν cs μ 곡μ§μ λ ΈνΈ μ 리 ] 1. λμμΈ ν¨ν΄κ³Ό νλ‘κ·Έλλ° ν¨λ¬λ€μ : λμμΈ ν¨ν΄Book 2024. 4. 9. 17:33λ°μν
λμμΈ ν¨ν΄μ΄λ ?
νλ‘κ·Έλ¨μ μ€κ³ν λ λ°μνλ λ¬Έμ μ λ€μ κ°μ²΄ κ°μ μνΈ κ΄κ³ λ±μ μ΄μ©νμ¬ ν΄κ²°ν μ μλλ‘ νλμ 'κ·μ½'ννλ‘ λ§λ€μ΄ λμ κ²μ μλ―Έ
* λΌμ΄λΈλ¬λ¦¬μ νλ μμν¬
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μ ν λλ‘ μ»΄ν¬λνΈλ₯Ό ꡬμΆν μ μλ€λ κ²μ΄ νΉμ§μ΄λ€.
λ°μν'Book' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ