0. ๋์์ธ ํจํด์ด๋?
ํ๋ก๊ทธ๋จ ์ค๊ณ ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ค์ ๊ฐ์ฒด ๊ฐ์ ์ํธ ๊ด๊ณ ๋ค์ ์ด์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋๋ก ํ๋์ ๊ท์ฝ ํํ๋ก ๋ง๋ค์ด ๋์ ๊ฒ
1. ์ฑ๊ธํค ํจํด Singleton Pattern
ํ๋์ ํด๋์ค์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ๊ฐ์ง๋ ํจํด.
๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋์ ๋ง์ด ์ฌ์ฉ๋๋ค.
ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด๋๊ณ , ๋ค๋ฅธ ๋ชจ๋๋ค์ด ๊ณต์ ํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋น์ฉ์ด ์ค์ด๋๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง ์์กด์ฑ์ด ๋ฎ์์ง๋ค๋ ๋จ์ ์ด ์๋ค.
class Singleton {
private static class singleInstanceHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
public class HelloWorld{
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);
}
}
}
์ฑ๊ธํค ํจํด์ ๋จ์
TDD
์ฑ๊ธํค ํจํด์ TDD(Test Driven Development)์ ๊ฑธ๋ฆผ๋์ด ๋๋ค.
TDD์ ๋จ์ ํ ์คํธ๋ ํ ์คํธ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ด์ฌ์ผ ํ๋๋ฐ, ์ฑ๊ธํค ํจํด์ ํ ์คํธ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
์์กด์ฑ
๋ํ ์ฑ๊ธํค ํจํด์ ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ์ ๊ฐํ๊ฒ ๋ง๋ ๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ฅผ ์์กด์ฑ ์ฃผ์ (DI)๋ฅผ ํตํด ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ๋ง๋ค์ด ํด๊ฒฐํ ์ ์๋ค.
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){
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 HelloWorld{
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);
}
}
3. ์ ๋ต ํจํด Strategy Pattern
๊ฐ์ฒด์ ํ์๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ง์ ์์ ํ์ง ์๊ณ , ์ ๋ต์ด๋ผ๊ณ ๋ถ๋ฅด๋ '์บก์ํํ ์๊ณ ๋ฆฌ์ฆ'์ ์ปจํ ์คํธ ๋ด์์ ๋ฐ๊ฟ์ฃผ๋ฉด์ ์ํธ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ํจํด์ด๋ค.
์๋ฅผ ๋ค์ด ํ ์๋น์ค์์ ๊ฒฐ์ ๋ฅผ ํ ๋, ์์ฒญํ ๊ฒฐ์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ '์ ๋ต'์ ๋ฐ๊ฟ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๊ตฌํํ๋ค.
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"));
}
}
PaymentStrategy๋ฅผ ์์ํ KAKAOCardStrategy, LUNACardStrategy๋ฅผ ํ์์ ๋ฐ๋ผ ์ ๋ต์ ๋ฐ๊พธ์ด์ ์ ๋ฌํ๊ฒ ๋๋ค.
4. ์ต์ ๋ฒ ํจํด Observer Pattern
์ฃผ์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ค๊ฐ, ์ํ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๋ฉ์๋ ๋ฑ์ ํตํด ์ต์ ๋ฒ ๋ชฉ๋ก์ ์๋ ์ต์ ๋ฒ๋ค์๊ฒ ๋ณํ๋ฅผ ์๋ ค์ฃผ๋ ๋์์ธ ํจํด.
์ฌ๊ธฐ์ ์ฃผ์ฒด๋, ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๋ณด๊ณ ์๋ '๊ด์ฐฐ์'์ด๋ค.
์ต์ ๋ฒ ํจํด์ ์์๋ก, ํธ์ํฐ๊ฐ ์๋ค.
์ฃผ์ฒด์ธ ์ฌ๋์ด ์ด๋ค ๊ฒ์๋ฌผ์ ๊ฒ์ํ๋ฉด, ํ๋ก์ฐํ๊ณ ์๋ ์ฌ๋๋ค(์ต์ ๋ฒ)์๊ฒ ์๋ ค์ค๋ค.
๋ํ, ์ต์ ๋ฒ ํจํด์ ์ฃผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์ ์ฌ์ฉ๋๋ฉฐ 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!!");
}
}
Topic์์๋ Observer๊ฐ์ฒด๋ค์ ๊ฐ์ง๊ณ ์๊ณ ,
topic์์ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๋ฉด ์ต์ ๋ฒ๋ค์๊ฒ ์๋ ค์ฃผ๊ฒ ๋๋ค.
์ด๋ฒคํธ ๊ธฐ๋ฐ(Event-Driven)๊ตฌ์กฐ์ ๊ฐ๋ค.
5. ํ๋ก์ ํจํด Proxy Patten
๋์ ๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ์ ๊ทธ ์ ๊ทผ์ ๋ํ ํ๋ฆ์ ๊ฐ๋ก์ฑ ํด๋น ์ ๊ทผ์ ํํฐ๋งํ๊ฑฐ๋ ์์ ํ๋ ๋ฑ์ ์ญํ ์ ํ๋ ๊ณ์ธต์ด ์๋ ๋์์ธ ํจํด.
๊ฐ์ฒด์ ์์ฑ, ๋ณํ ๋ฑ์ ๋ณด์ํ์ฌ ๋ณด์, ๋ฐ์ดํฐ ๊ฒ์ฆ, ์บ์ฑ, ๋ก๊น ์ ์ฌ์ฉํ๊ฒ ๋๊ฑฐ๋, ํ๋ก์ ์๋ฒ๋ก๋ ํ์ฉ๋๋ค.
ํ๋ก์ ์๋ฒ
์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ ํตํด ๋ค๋ฅธ ๋คํธ์ํฌ ์๋น์ค์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ์์คํ ์ด๋ ํ๋ก๊ทธ๋จ.
ํ๋ก์ ์๋ฒ๋ฅผ ํตํด DDoS ๊ณต๊ฒฉ, HTTPS๊ตฌ์ถ ๋ฑ์ ํ ์ ์๋ค.
6. ์ดํฐ๋ ์ดํฐ ํจํด Iterator Pattern
์ดํฐ๋ ์ดํฐ(Iterator)๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์ (Collection) ์์๋ค์ ์ ๊ทผํ๋ ๋์์ธ ํจํด
์ํํ ์ ์๋ ์ฌ๋ฌ ์๋ฃํ์ ๊ตฌ์กฐ์ ์๊ด์์ด ํ๋์ ์ธํฐํ์ด์ค๋ก ์ํ๊ฐ ๊ฐ๋ฅ.
import java.util.Iterator;
class SimpleCollection implements Iterable<String> {
private String[] items = {"A", "B", "C"};
@Override
public Iterator<String> iterator() {
return new SimpleIterator();
}
private class SimpleIterator implements Iterator<String> {
private int index = 0;
@Override
public boolean hasNext() {
return index < items.length;
}
@Override
public String next() {
return items[index++];
}
}
}
public class Main {
public static void main(String[] args) {
SimpleCollection collection = new SimpleCollection();
for (String item : collection) {
System.out.println(item);
}
}
}
7. MVC ํจํด
๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํธ๋กค๋ฌ(Controller)๋ก ์ด๋ฃจ์ด์ง ๋์์ธ ํจํด
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ฅผ ์ธ ๊ฐ์ง ์ญํ ๋ก ๊ตฌ๋ถํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์์ ์ง์คํ์ฌ ๊ฐ๋ฐํ ์ ์๋ค.
์ฅ์
์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ฉ์ดํจ.
๋จ์
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์๋ก ๋ชจ๋ธ๊ณผ ๋ทฐ์ ๊ด๊ณ๊ฐ ๋ณต์กํด์ง๋ค.
๋ชจ๋ธ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ปํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์์, ๋ณ์ ๋ฑ.
๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ ํ๋ฉด ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ๋ชจ๋ธ์ ์์ฑํ๊ฑฐ๋ ๊ฐฑ์ ํ๋ค.
๋ทฐ
์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์๋ฅผ ๋ํ๋ธ๋ค. inputbox, checkbox, texarea ๋ฑ.
๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ์ง ์์์ผ ํ๋ค.
์ปจํธ๋กค๋ฌ
ํ๋ ์ด์์ ๋ชจ๋ธ๊ณผ ํ๋ ์ด์์ ๋ทฐ๋ฅผ ์๋ ๋ค๋ฆฌ ์ญํ .
์ด๋ฒคํธ ๋ฑ ๋ฉ์ธ ๋ก์ง์ ๋ด๋นํ๋ค.
๋ํ, ๋ชจ๋ธ๊ณผ ๋ทฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
์คํ๋ง์์์ MVC ํจํด
์คํ๋ง ํ๋ ์์ํฌ๋ ๋ํ์ ์ธ MVCํจํด์ ์์ด๋ค.
ํนํ, Spring Web์์๋ ์ฌ๋ฌ ์ด๋ ธํ ์ด์ ์ ํตํด ํธ๋ฆฌํ๊ฒ ์์ฒญ์ ์ํธ์์ฉ์ด ๊ฐ๋ฅํ๋ค.
8. MVP ํจํด
MVPํจํด์ผ๋ก ํ์๋ ํจํด์ผ๋ก, ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ ์ ํฐ๋ก ๊ต์ฒด๋ ํจํด
View์ Presenter๋ 1:1 ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ MVCํจํด๋ณด๋ค ๋ ๊ฐํ ๊ฒฐํฉ์ ์ง๋ ๋์์ธ ํจํด์ด๋ค.
9. MVVM ํจํด
์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ ๋ชจ๋ธ (View Model)๋ก ๋ฐ๋ ํจํด์ด๋ค.
์ฌ๊ธฐ์ ๋ทฐ ๋ชจ๋ธ์ ๋ทฐ๋ฅผ ๋ ์ถ์ํํ ๊ณ์ธต์ด๋ฉฐ, MVMM ํจํด์ ์ปค๋งจ๋์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ฐ์ง๋ค๋๊ฒ ํน์ง์ด๋ค.
๋ทฐ์ ๋ทฐ ๋ชจ๋ธ ์ฌ์ด์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ง์ํ๋ฉฐ, UI๋ฅผ ๋ณ๋์ ์ฝ๋ ์์ ์์ด ์ฌ์ฌ์ฉํ ์ ์๊ณ ๋จ์ ํ ์คํ ์ด ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.