관리 메뉴

Jin's Dev Story

[SpringBoot] Design Pattern λ³Έλ¬Έ

Web & Android/SpringBoot

[SpringBoot] Design Pattern

woojin._. 2023. 8. 14. 23:42

πŸ’‘ μΌμ’…μ˜ 섀계 기법이며, 섀계 방법이닀.

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

각 λͺ¨λ“ˆμ˜ μ„ΈλΆ„ν™”λœ μ—­ν• μ΄λ‚˜ λͺ¨λ“ˆλ“€ κ°„μ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ 같은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μˆ˜μ€€μ˜ 세뢀적인 κ΅¬ν˜„ λ°©μ•ˆμ„ 섀계할 λ•Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ „ν˜•μ μΈ ν•΄κ²° 방식 λ˜λŠ” 예제

GoF(Gang of Four) λ””μžμΈ νŒ¨ν„΄ : μœ ν˜•μ— 따라 생성 νŒ¨ν„΄ 5개, ꡬ쑰 νŒ¨ν„΄ 7개, ν–‰μœ„ νŒ¨ν„΄ 11개 총 23개의 νŒ¨ν„΄μœΌλ‘œ κ΅¬μ„±λœλ‹€.

λͺ©μ 

  • SW μž¬μ‚¬μš©μ„±, ν˜Έν™˜μ„±, μœ μ§€ λ³΄μˆ˜μ„±μ„ 보μž₯

νŠΉμ§•

  • λ””μžμΈ νŒ¨ν„΄μ€ μ•„μ΄λ””μ–΄μž„, νŠΉμ •ν•œ κ΅¬ν˜„μ΄ μ•„λ‹˜
  • 문제 ν•΄κ²° 예방

μž₯점

  • ꡬ쑰 νŒŒμ•… 용이
  • μž¬μ‚¬μš©μ„ 톡해 개발 μ‹œκ°„κ³Ό λΉ„μš©μ΄ μ ˆμ•½λ¨
  • μ›ν™œν•œ μ˜μ‚¬μ†Œν†΅ κ°€λŠ₯
  • 섀계 λ³€κ²½ μš”μ²­μ— λŒ€ν•œ μœ μ—°ν•œ λŒ€μ²˜

단점

  • 객체지ν–₯을 기반으둜 ν•œ 섀계와 κ΅¬ν˜„μ„ λ‹€λ£¨λ―€λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ—λŠ” μ ν•©ν•˜μ§€ μ•ŠμŒ
  • 초기 투자 λΉ„μš© λΆ€λ‹΄

 

[생성 νŒ¨ν„΄(Creational Pattern)]

객체의 생성과 κ΄€λ ¨λœ νŒ¨ν„΄μœΌλ‘œ, 객체의 생성과 μ°Έμ‘° 과정을 μΊ‘μŠν™”ν•˜μ—¬ 객체가 μƒμ„±λ˜κ±°λ‚˜ λ³€κ²½λ˜μ–΄λ„ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰에 영ν–₯을 크게 받지 μ•Šλ„λ‘ ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ— μœ μ—°μ„±μ„ λ†’μ—¬ μ€€λ‹€.

ex) DBConnection을 κ΄€λ¦¬ν•˜λŠ” Instanceλ₯Ό ν•˜λ‚˜λ§Œ λ§Œλ“€ 수 μžˆλ„λ‘ μ œν•œν•˜μ—¬, λΆˆν•„μš”ν•œ 연결을 λ§‰μŒ

  • Abstract Factory(좔상 νŒ©ν† λ¦¬)
  • Builder(λΉŒλ”)
  • Factory Method(νŒ©ν† λ¦¬ λ©”μ†Œλ“œ)
  • Prototype(ν”„λ‘œν† νƒ€μž…)
  • Singleton(싱글톀)
    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ, μ–΄λ–€ ν΄λž˜μŠ€κ°€ 졜초 ν•œ 번만 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄λ‹Ή λ©”λͺ¨λ¦¬μ— μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄
    • πŸ’‘ μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•  λ•Œ, λ˜‘κ°™μ€ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  기쑴의 μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμš©ν•˜λŠ” 것
    • μƒμ„±μžκ°€ μ—¬λŸ¬λ²ˆ ν˜ΈμΆœλ˜λ„, μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” κ°μ²΄λŠ” ν•˜λ‚˜μ΄λ©° 졜초둜 μƒμ„±λœ 이후에 호좜된 μƒμ„±μžλŠ” 이미 μƒμ„±ν•œ 객체λ₯Ό λ°˜ν™˜μ‹œν‚€λ„λ‘ λ§Œλ“œλŠ” 것
    • (javaμ—μ„œλŠ” μƒμ„±μžλ₯Ό private으둜 μ„ μ–Έν•΄ λ‹€λ₯Έ κ³³μ—μ„œ μƒμ„±ν•˜μ§€ λͺ»ν•˜λ„둝 λ§Œλ“€κ³ , getInstance() λ©”μ†Œλ“œλ₯Ό 톡해 λ°›μ•„μ„œ μ‚¬μš©ν•˜λ„λ‘ κ΅¬ν˜„

μž₯점

  • λ¨Όμ €, 객체λ₯Ό 생성할 λ•Œλ§ˆλ‹€ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήλ°›μ•„μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ ν•œλ²ˆμ˜ newλ₯Ό 톡해 객체λ₯Ό μƒμ„±ν•œλ‹€λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό 방지할 수 있음

[ꡬ쑰 νŒ¨ν„΄(Structural Pattern)]

ν΄λž˜μŠ€λ‚˜ 객체듀을 μ‘°ν•©ν•˜μ—¬ 더 큰 ꡬ쑰둜 λ§Œλ“€ 수 있게 ν•΄μ£ΌλŠ” νŒ¨ν„΄

ex) 2개의 μΈν„°νŽ˜μ΄μŠ€κ°€ μ„œλ‘œ ν˜Έν™˜μ΄ λ˜μ§€ μ•Šμ„ λ•Œ, λ‘˜μ„ μ—°κ²°ν•΄μ£ΌκΈ° μœ„ν•΄μ„œ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ μ—°κ²° μ‹œν‚¬ 수 μžˆλ„λ‘ 함

  • Adapter(μ–΄λŒ‘ν„°)클래슀λ₯Ό λ°”λ‘œ μ‚¬μš©ν•  수 μ—†λŠ” κ²½μš°κ°€ 있음 (λ‹€λ₯Έ κ³³μ—μ„œ κ°œλ°œν–ˆλ‹€κ±°λ‚˜, μˆ˜μ •ν•  수 없을 λ•Œ) μ€‘κ°„μ—μ„œ λ³€ν™˜ 역할을 ν•΄μ£ΌλŠ” ν΄λž˜μŠ€κ°€ ν•„μš” → μ–΄λŒ‘ν„° νŒ¨ν„΄
    • μ‚¬μš© 방법 : μƒμ†
    • ν˜Έν™˜λ˜μ§€ μ•Šμ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ κ·ΈλŒ€λ‘œ ν™œμš© κ°€λŠ₯
    • ν–₯ν›„ μΈν„°νŽ˜μ΄μŠ€κ°€ λ°”λ€Œλ”λΌλ„, λ³€κ²½ 내역은 μ–΄λŒ‘ν„°μ— μΊ‘μŠν™” λ˜λ―€λ‘œ ν΄λΌμ΄μ–ΈνŠΈ λ°”λ€” ν•„μš”X

[클래슀 λ‹€μ΄μ–΄κ·Έλž¨]

μ•„μ΄ν°μ˜ 이어폰을 μƒκ°ν•΄λ³΄μž
κ°€μž₯ ν”ν•œ 이어폰 μž­μ„ 아이폰에 μ‚¬μš©ν•˜λ €λ©΄, 잭 μžμ²΄κ°€ λ§žμ§€ μ•ŠλŠ”λ‹€.
λ”°λΌμ„œ μš°λ¦¬λŠ” μ–΄λŒ‘ν„°λ₯Ό λ”°λ‘œ κ΅¬λ§€ν•΄μ„œ μ—°κ²°ν•΄μ•Ό 이런 이어폰듀을 μ‚¬μš©ν•  수 μžˆλ‹€
⇒ μ–΄λŒ‘ν„°λŠ” ν•„μš”λ‘œ ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ λ°”κΏ”μ£ΌλŠ” μ—­ν• 

 

μ½”λ“œλ‘œ μ–΄λŒ‘ν„° νŒ¨ν„΄ μ΄ν•΄ν•˜κΈ°

μ˜€λ¦¬μ™€ μΉ λ©΄μ‘° μΈν„°νŽ˜μ΄μŠ€ 생성
λ§Œμ•½ 였리 객체가 λΆ€μ‘±ν•΄μ„œ μΉ λ©΄μ‘° 객체λ₯Ό λŒ€μ‹  μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λ©΄?
두 κ°μ²΄λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ λ‹€λ₯΄λ―€λ‘œ, λ°”λ‘œ μΉ λ©΄μ‘° 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 λΆˆκ°€λŠ₯함
λ”°λΌμ„œ μΉ λ©΄μ‘° μ–΄λŒ‘ν„°λ₯Ό μƒμ„±ν•΄μ„œ ν™œμš©ν•΄μ•Ό ν•œλ‹€

  • μ½”λ“œ
    - Duck.java
        package AdapterPattern;
        
        public interface Duck {
        	public void quack();
        	public void fly();
        }
  • Turkey.java
        package AdapterPattern;
        
        public interface Turkey {
        	public void gobble();
        	public void fly();
        }
        ```
        
        - **WildTurkey.java**
        
        ```java
        package AdapterPattern;
        
        public class WildTurkey implements Turkey {
        
        	@Override
        	public void gobble() {
        		System.out.println("Gobble gobble");
        	}
        
        	@Override
        	public void fly() {
        		System.out.println("I'm flying a short distance");
        	}
        }
  • TurkeyAdapter.java
        package AdapterPattern;
        
        public class TurkeyAdapter implements Duck {
        
        	Turkey turkey;
        
        	public TurkeyAdapter(Turkey turkey) {
        		this.turkey = turkey;
        	}
        
        	@Override
        	public void quack() {
        		turkey.gobble();
        	}
        
        	@Override
        	public void fly() {
        		turkey.fly();
        	}
        
        }
  • DuckTest.java
        package AdapterPattern;
        
        public class DuckTest {
        
        	public static void main(String[] args) {
        
        		MallardDuck duck = new MallardDuck();
        		WildTurkey turkey = new WildTurkey();
        		Duck turkeyAdapter = new TurkeyAdapter(turkey);
        
        		System.out.println("The turkey says...");
        		turkey.gobble();
        		turkey.fly();
        
        		System.out.println("The Duck says...");
        		testDuck(duck);
        
        		System.out.println("The TurkeyAdapter says...");
        		testDuck(turkeyAdapter);
        
        	}
        
        	public static void testDuck(Duck duck) {
        
        		duck.quack();
        		duck.fly();
        
        	}
        }
  • Bridge(λΈŒλ¦¬μ§€)
  • Composite(μ»΄ν¬μ§€νŠΈ)
  • Decorator(λ°μ½”λ ˆμ΄ν„°)
  • Facade(νΌμ‹Έλ“œ)
  • Flyweight(ν”ŒλΌμ΄μ›¨μ΄νŠΈ)
  • Proxy(ν”„λ‘μ‹œ)

[ν–‰μœ„ νŒ¨ν„΄(Behavioral Pattern)]

ν΄λž˜μŠ€λ‚˜ 객체듀이 μ„œλ‘œ μƒν˜Έ μž‘μš©ν•˜λŠ” λ°©λ²•μ΄λ‚˜ μ±…μž„ λΆ„λ°° 방법을 μ •μ˜ν•˜λŠ” νŒ¨ν„΄

ex) ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” ν•¨μˆ˜ 및 μ•Œκ³ λ¦¬μ¦˜λ“€μ„ 미리 μ„ μ–Έν•˜μ—¬, 상속 μ‹œ 이λ₯Ό ν•„μˆ˜λ‘œ κ΅¬ν˜„ν•˜λ„λ‘ 함

  • Chain of responsibility(μ±…μž„ 연쇄)
  • Command(μ»€λ§¨λ“œ)
  • Interpreter(인터프리터)
  • Iterator(반볡자)
  • Mediator(μ€‘μž¬μž)
  • Memento(λ©”λ©˜ν† )
  • Observer(μ˜΅μ„œλ²„)
  • State(μƒνƒœ)
  • Strategy(μ „λž΅)
  • Template Method(ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ)
  • Visitor(방문자)

'Web & Android > SpringBoot' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[SpringBoot] Thymeleaf - λ‚ μ§œ λ³€ν™˜  (0) 2023.08.17
[SpringBoot] WAS와 WS  (0) 2023.08.15
[SpringBoot] AOP(Aspect Oriented Programming)  (0) 2023.08.12
[SpringBoot] OOP(Object Oriented Programming)  (0) 2023.08.12
[SpringBoot] IoC &DI  (0) 2023.08.12