[SpringBoot] Design Pattern

2023. 8. 14. 23:42Β·Web & Android/SpringBoot

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

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

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

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
'Web & Android/SpringBoot' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [SpringBoot] Thymeleaf - λ‚ μ§œ λ³€ν™˜
  • [SpringBoot] WAS와 WS
  • [SpringBoot] AOP(Aspect Oriented Programming)
  • [SpringBoot] OOP(Object Oriented Programming)
woojin._.
woojin._.
μ—¬λŸ¬κ°€μ§€ κ°œλ°œμ„ 해보며 λ°œμƒν•˜λŠ” 이야기듀에 λŒ€ν•œ λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€:)
  • woojin._.
    Jin's Dev Story
    woojin._.
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (829)
      • Tools (25)
        • eGovFrame (3)
        • GeoServer (3)
        • QGIS (2)
        • LabelImg (2)
        • Git (6)
        • GitHub (1)
        • Eclipse (7)
        • Visual Studio (1)
      • Web & Android (121)
        • SpringBoot (37)
        • Three.js (2)
        • Spring Data JPA (9)
        • μŠ€ν”„λ§ λΆ€νŠΈ μ‡Όν•‘λͺ° ν”„λ‘œμ νŠΈ with JPA (25)
        • Thymeleaf (4)
        • Spring Security (15)
        • Flutter (29)
      • Programming Language (61)
        • JAVA (27)
        • JavaScript (14)
        • Dart (2)
        • Python (15)
        • PHP (3)
      • Database (43)
        • PostgreSQL (32)
        • MYSQL (7)
        • Oracle (3)
        • MSSQL (1)
      • SERVER (17)
        • TCP_IP (3)
        • λ¦¬λˆ…μŠ€ (7)
        • AWS (7)
      • Coding Test (445)
        • λ°±μ€€[JAVA] (108)
        • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€[JAVA] (260)
        • μ•Œκ³ λ¦¬μ¦˜ 고득점 Kit[JAVA] (3)
        • SQL 고득점 Kit[ORACLE] (74)
      • CS 지식 (49)
        • [자료ꡬ쑰] (14)
        • [λ„€νŠΈμ›Œν¬] (12)
        • [λ°μ΄ν„°λ² μ΄μŠ€] (10)
        • [μ•Œκ³ λ¦¬μ¦˜] (9)
        • [운영체제] (4)
      • 기타 (6)
      • 자격증 & 곡뢀 (62)
        • μ •λ³΄μ²˜λ¦¬κΈ°μ‚¬ (2)
        • SQLD (6)
        • λ„€νŠΈμ›Œν¬κ΄€λ¦¬μ‚¬ 2κΈ‰ (5)
        • λ¦¬λˆ…μŠ€λ§ˆμŠ€ν„° 1κΈ‰ (44)
        • λ¦¬λˆ…μŠ€λ§ˆμŠ€ν„° 2κΈ‰ (1)
        • ISTQB (3)
        • μ‹œμŠ€ν…œλ³΄μ•ˆ (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 인기 κΈ€

  • νƒœκ·Έ

    ν”ŒλŸ¬ν„°
    λ¦¬λˆ…μŠ€
    JPA
    springboot
    μžλ°”
    CS
    Spring Security
    CS지식
    μŠ€ν”„λ§
    Oracle
    Java
    λ¦¬λˆ…μŠ€λ§ˆμŠ€ν„°
    pcce 기좜문제
    python
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    λ°μ΄ν„°λ² μ΄μŠ€
    Flutter
    μŠ€ν”„λ§λΆ€νŠΈ
    spring
    Linux
    μŠ€ν”„λ§ λΆ€νŠΈ μ‡Όν•‘λͺ° ν”„λ‘œμ νŠΈ with JPA
    backjoon
    baekjoon
    μ‹œνλ¦¬ν‹°
    λ°±μ€€
    데이터
    postgresql
    DB
    programmers
    λ¦¬λˆ…μŠ€λ§ˆμŠ€ν„° 1κΈ‰
  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
woojin._.
[SpringBoot] Design Pattern
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”