Skip to content

Commit 3abaa2c

Browse files
authored
Merge pull request #125 from imaginer-dev/121----strategy-pattern
docs: ์œ ํšจ์„ฑ๊ฒ€์ฆ ๋””์ž์ธํŒจํ„ด mdํŒŒ์ผ ์—…๋กœ๋“œ
2 parents 611906a + 7027dc1 commit 3abaa2c

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
## Strategy Pattern(์ „๋žตํŒจํ„ด) ํšŒ๊ณ 
2+
3+
- **๊ตฌํ˜„์ „**
4+
์ดˆ๊ธฐ์— ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ–ˆ์ง€๋งŒ, ๋‹ค์–‘ํ•œ ๊ฒ€์ฆ ๋กœ์ง์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
5+
ํŠนํžˆ ์ฝ”๋“œ ์ค‘๋ณต๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์— ์–ด๋ ค์›€์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
6+
7+
- **1์ฐจ ๊ตฌํ˜„**
8+
์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„์—์„œ๋Š” 'ValidationStrategy' ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์„ ์บก์Аํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ๊ฒ€์ฆ ๋กœ์ง์„ ๋…๋ฆฝ๋œ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜์—ฌ,
9+
ํ•„์š”์— ๋”ฐ๋ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ „๋žต์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ฒ€์ฆ ๋กœ์ง์„ ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์œผ๋‚˜, ์—ฌ์ „ํžˆ
10+
์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ์„ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ๋˜ ๊ฐœ์„ ์ ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
11+
12+
- **2์ฐจ ๊ตฌํ˜„**
13+
๋‘ ๋ฒˆ์งธ ๊ตฌํ˜„์—์„œ๋Š” ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ์„ ๋ชจ๋‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋„๋ก 'ValidationStrategy'์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.
14+
๋˜ํ•œ 'LooseValidation'์™€ 'StrongValidation' ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
15+
16+
๋””์ž์ธ ํŒจํ„ด์„ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ์ฒ˜์Œ ๋„์ž…ํ•˜๋ฉด์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋””์ž์ธ ํŒจํ„ด์„ ์ฃผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋ ต๊ณ  ๋ณต์žกํ•  ๊ฒƒ ๊ฐ™์€ ์ƒ๊ฐ์„ ๋งŽ์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.
17+
ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด๋‹ˆ, ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ์˜€๊ณ  ์˜คํžˆ๋ ค ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ํ›จ์”ฌ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
18+
์šฐํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์ด ์•„์ง์€ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๋Œ€๋กœ ์ž˜ ์ž‘๋™๋˜์–ด์ง€์ง€๋งŒ, ๋งŒ์•ฝ ํšŒ์›๊ฐ€์ž…์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋‚˜ ์ผ์ •๊ด€๋ฆฌ ๋“ฑ๋ก์ด๋‚˜ ํ”„๋กœํ•„ ์ˆ˜์ • ๋“ฑ์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ฒŒ ๋“ค์–ด๊ฐˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์–ด ์ง‘๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ๋ ์ง€ ์•„์ง ๊ณ ๋ฏผ์ด์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์ „๋žตํŒจํ„ด ๋„์ž…์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ•œ๋ฐ ๋ชจ์•„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
## ๋ชฉ์ 
2+
3+
Validation Strategy ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์„ค๊ณ„ : ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
4+
(Strategy Pattern(์ „๋žตํŒจํ„ด) : ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ์บก์Аํ™”ํ•˜์—ฌ ๋…๋ฆฝ์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ)
5+
6+
## ๋Œ€์ƒ
7+
8+
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ํŒŒ์ผ
9+
10+
### `๋กœ๊ทธ์ธ ํผ`
11+
12+
- **๋””์ž์ธ ํŒจํ„ด ์œ ํ˜•**
13+
- Strategy Pattern(์ „๋žตํŒจํ„ด)
14+
- **์‹œ๋‚˜๋ฆฌ์˜ค**
15+
16+
- ์ด๋ฉ”์ผ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—, ํŠน์ •ํ•œ ์กฐ๊ฑด์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ
17+
(LooseValidation, StrongValidation)
18+
19+
```
20+
classDiagram
21+
class ValidationStrategy {
22+
+emailValidate(input: string) bool
23+
+passwordValidate(input: string) bool
24+
}
25+
class LooseValidation {
26+
+emailValidate(input: string) bool
27+
+passwordValidate(input: string) bool
28+
}
29+
class StrongValidation {
30+
+emailValidate(input: string) bool
31+
+passwordValidate(input: string) bool
32+
}
33+
class ValidateProcessor {
34+
-ValidationStrategy validator
35+
+ValidateProcessor(validator)
36+
+setValidator(validator)
37+
+isValidEmail(email: string) bool
38+
+isValidPassword(password: string) bool
39+
}
40+
41+
ValidationStrategy <|-- LooseValidation : implements
42+
ValidationStrategy <|-- StrongValidation : implements
43+
ValidateProcessor o-- ValidationStrategy : uses
44+
45+
LooseValidation ..> ValidateProcessor : uses
46+
StrongValidation ..> ValidateProcessor : uses
47+
```
48+
49+
- **์ „๋žต ํŒจํ„ด ๊ตฌํ˜„ ๊ฒฝ๋กœ**
50+
51+
- 1. ์ „๋žต ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ : ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋Š” #validator๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ boolean ๊ฐ’์œผ๋กœ ์œ ํšจ์„ฑ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
52+
- 2. ๊ตฌ์ฒด์ ์ธ ์ „๋žต ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ : ๊ฐ ํด๋ž˜์Šค๋Š” ValidationStrategy ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ฒ€์ฆ ๋กœ์ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
53+
์ด ํด๋ž˜์Šค๋“ค์€ ๊ฐ๊ฐ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ ๋กœ์ง์„ ์บก์Аํ™”ํ•˜๋ฉฐ, validate ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
54+
์ด ๋ฐฉ์‹์€ ๊ฒ€์ฆ ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฒ€์ฆ ๋กœ์ง์œผ๋กœ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •์ฑ…์ด ๋ณ€๊ฒฝ๋˜์–ด ๊ฒ€์ฆ ๋กœ์ง์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹นํ•˜๋Š” LooseValidation ํด๋ž˜์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
55+
- 3. ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํŠน์ • ์กฐ๊ฑด ์ถ”๊ฐ€ StrongValidation (์˜ˆ: ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ์ˆซ์ž, ํ•˜๋‚˜์˜ ๋Œ€๋ฌธ์ž ๋ฐ ํŠน์ˆ˜ ๋ฌธ์ž ํฌํ•จ)์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ „๋žต.
56+
57+
- **์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ–ˆ๋Š”์ง€**
58+
59+
- ์œ ์—ฐ์„ฑ ๋ถ€์กฑ: ํ•˜๋‚˜์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž๊ฒŒ ์šฐ์—ฐํ•˜๊ฒŒ ์กฐ์ •๋˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ (ex ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ์„ฑ์€ ๋А์Šจํ•œ ์œ ํšจ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํšŒ์›๊ฐ€์ž… ์œ ํšจ์„ฑ์€ ๋А์Šจํ•œ ์œ ํšจ์„ฑ์— ๋ณด์•ˆ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ํŠน์ • ์กฐ๊ฑด ์ถ”๊ฐ€)
60+
- ์ฝ”๋“œ ์ค‘๋ณต : ๋น„์Šทํ•œ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ๋ถ€๋ถ„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด ์ฝ”๋“œ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ
61+
- ๋‚ฎ์€ ํ™•์žฅ์„ฑ : ์ƒˆ๋กœ์šด ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋กœ์ง์„ ์ˆ˜์ •ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ.
62+
63+
- **์™œ ํ•ด๋‹น ๋””์ž์ธ ํŒจํ„ด์„ ์„ ํƒํ–ˆ๋Š”์ง€**
64+
- Observer : ์ด๋ฒคํŠธ ๋ฐœ์ƒ์— ๋”ฐ๋ฅธ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์˜ ๋ฐ˜์‘์„ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜์–ด์ง€๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ์ž์ฒด์˜ ์œ ํšจ์„ฑ ํŒ๋‹จ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜์–ด์กŒ์Šต๋‹ˆ๋‹ค.
65+
- Singleton : ์ „์—ญ์—์„œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๋ณด์žฅํ•˜๋Š” ํŒจํ„ด์ด๋ฏ€๋กœ ์ œํ•œ์ ์ด์—ฌ์„œ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
66+
- Factory Method์™€ Abstract Factory : ๊ฐ์ฒด ์ƒ์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜ ํŒจํ„ด์œผ๋กœ, ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋ณด๋‹ค๋Š” ๋กœ์ง์˜ ๊ต์ฒด์™€ ์‹คํ–‰์— ๋” ์–ด์šธ๋ฆด ๊ฒƒ ๊ฐ™์•„์„œ ์ œ์™ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
67+
- ์œ„์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŒจํ„ด๋“ค ์ค‘์— ์ „๋žต ํŒจํ„ด์€ ์œ ํšจ์„ฑ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ํ™•์žฅ์„ฑ์— ๋” ์–ด์šธ๋ฆฌ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ์„œ ํ•ด๋‹น ํŒจํ„ด์„ ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
68+
69+
- **์ฝ”๋“œ**
70+
71+
- ๊ตฌํ˜„ ์ „
72+
73+
```
74+
export const isValidEmail = (email: string): boolean => {
75+
const regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
76+
return regex.test(email);
77+
};
78+
79+
export const isValidPassword = (password: string) => {
80+
return password.length >= 6;
81+
};
82+
83+
```
84+
85+
- 1์ฐจ ๊ตฌํ˜„
86+
87+
```
88+
export interface ValidationStrategy {
89+
validate(input: string): boolean;
90+
}
91+
92+
export class isValidEmail implements ValidationStrategy {
93+
validate(email: string): boolean {
94+
return /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/.test(email);
95+
}
96+
}
97+
98+
export class isValidPassword implements ValidationStrategy {
99+
validate(password: string): boolean {
100+
return password.length >= 6;
101+
}
102+
}
103+
104+
export class isValidPasswordComplex implements ValidationStrategy {
105+
validate(password: string): boolean {
106+
const regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/;
107+
return regex.test(password);
108+
}
109+
}
110+
```
111+
112+
- 2์ฐจ ๊ตฌํ˜„
113+
114+
```
115+
export interface ValidationStrategy {
116+
emailValidate(input: string): boolean;
117+
passwordValidate(input: string): boolean;
118+
}
119+
120+
export class LooseValidation implements ValidationStrategy {
121+
emailValidate(email: string): boolean {
122+
return /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/.test(email);
123+
}
124+
passwordValidate(input: string): boolean {
125+
return input.length >= 6;
126+
}
127+
}
128+
129+
export class StrongValidation implements ValidationStrategy {
130+
emailValidate(password: string): boolean {
131+
return password.length >= 6;
132+
}
133+
passwordValidate(input: string): boolean {
134+
const regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/;
135+
return regex.test(input);
136+
}
137+
}
138+
139+
export class ValidateProcessor {
140+
#validator: ValidationStrategy;
141+
constructor(validator: ValidationStrategy) {
142+
this.#validator = validator;
143+
}
144+
145+
setValidator(validator: ValidationStrategy) {
146+
this.#validator = validator;
147+
}
148+
149+
isValidEmail(email: string) {
150+
return this.#validator.emailValidate(email);
151+
}
152+
153+
isValidPassword(password: string) {
154+
return this.#validator.passwordValidate(password);
155+
}
156+
}
157+
```

0 commit comments

Comments
ย (0)