Skip to content

Commit 05fbacb

Browse files
authored
Merge pull request #131 from imaginer-dev/dev
๋ฐฐํฌ ํ…Œ์ŠคํŠธ
2 parents b9666c6 + 998009c commit 05fbacb

File tree

86 files changed

+10319
-8100
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+10319
-8100
lines changed

โ€Ž.eslintrc.cjsโ€Ž

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ module.exports = {
88
'plugin:@tanstack/eslint-plugin-query/recommended',
99
'prettier',
1010
'plugin:storybook/recommended',
11-
'plugin:tailwindcss/recommended',
1211
],
1312
ignorePatterns: ['dist', '.eslintrc.cjs', 'vite.config.ts'],
1413
parser: '@typescript-eslint/parser',
1514
plugins: ['react', 'react-refresh'],
15+
rules: {
16+
'tailwindcss/no-custom-classname': 'off',
17+
'@typescript-eslint/no-explicit-any': 'off',
18+
'@typescript-eslint/explicit-module-boundary-types': 'off',
19+
},
1620
};

โ€Ž.gitignoreโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ dist-ssr
2323
*.sln
2424
*.sw?
2525

26-
*storybook.log
26+
.env
27+
28+
*storybook.log

โ€Ž.prettierrc.cjsโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ module.exports = {
77
trailingComma: 'all', // ๋ชจ๋“  ์š”์†Œ์— ์‰ผํ‘œ(,)๋ฅผ ๋ถ™์ž„
88
printWidth: 120, // ํ•œ ์ค„์— 120์นธ๊นŒ์ง€๋งŒ ์‚ฌ์šฉ
99
arrowParens: 'always', // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ์ธ์ž๊ฐ€ ํ•˜๋‚˜์—ฌ๋„ ๊ด„ํ˜ธ๋ฅผ ๋„ฃ๋„๋ก
10+
plugins: ['prettier-plugin-tailwindcss'],
1011
};

โ€Ž.storybook/main.tsโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const config: StorybookConfig = {
99
'@chromatic-com/storybook',
1010
'@storybook/addon-interactions',
1111
],
12+
1213
framework: {
1314
name: '@storybook/react-vite',
1415
options: {},

โ€Ž.storybook/preview.tsโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Preview } from '@storybook/react';
2+
import '../src/styles/index.css';
23

34
const preview: Preview = {
45
parameters: {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ์— ๋Œ€ํ•œ ํšŒ๊ณ  - ๊น€๋„์˜
2+
3+
๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ Strategy ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•ด์„œ
4+
๋А์Šจํ•œ ์˜์กด์„ฑ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
5+
๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ํฌ๊ฒŒ ์ ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์—†์–ด์„œ ํŒ€์›๋ผ๋ฆฌ ์ƒ์˜ํ•˜๊ณ  ๊ณ ๋ฏผํ•ด์„œ ๊ฐ™์ด ์—ด์‹ฌํžˆ ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ์„ ํฌ๊ฒŒ ๋А๋ผ๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ ํšŒ๊ณ 
2+
3+
๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜์ธ `isValidEmail` ํ•จ์ˆ˜์™€ `isValidPassword` ํ•จ์ˆ˜์— `Strategy` ๋ฅผ ์ ์šฉ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
4+
์˜์กด์„ฑ์ด ๊ฐ•ํ•œ ํ•จ์ˆ˜๋“ค์€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ์ด ์ „๋žต์„ ์ ์šฉํ•˜๋ฉฐ ์ข€ ๋” ์œ ์—ฐํ•˜๊ณ  ๋‹ค์–‘ํ•œ `validation`์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
5+
6+
์‚ฌ์‹ค ์–ด๋–ค ๋ถ€๋ถ„์— ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ฐ์ฒด ์ง€ํ–ฅ์— ํ•ด๋‹นํ•˜๋Š” ํŒจํ„ด์ธ๊ฑฐ ๊ฐ™์•„ ํ•จ์ˆ˜ํ˜•์ธ ๋ฆฌ์•กํŠธ์— ์ ์šฉํ•  ์ผ์ด ์žˆ๋‚˜? ํ•˜๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
7+
์ด๋ฒˆ ๊ธฐํšŒ๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ํ•จ์ˆ˜ํ˜•์˜ ์ฝ”๋“œ๋งŒ์ด ์•„๋‹Œ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„ ๋˜ํ•œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„๊ฐ€ ๊ฐ€์ ธ๋‹ค ์ฃผ๋Š” ์ด์ ์„ ๋ชธ์†Œ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## strategy ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด๋ฉด์„œ ๋А๋‚€์ 
2+
3+
- ์ „๋žต ํŒจํ„ด์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ํŒจํ„ด์˜ ์œ ์šฉ์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
4+
- ๋‹ค์–‘ํ•˜๊ฒŒ ๋ณ€ํ™” ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ interface ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
5+
- ์•ž์œผ๋กœ email, password ๊ฒ€์ฆ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค.
6+
- ํ•œํŽธ์œผ๋กœ๋Š” ์•ž์œผ๋กœ email, password ๋ณ€๊ฒฝ์ด ์žˆ์„๊นŒ. ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ๋„ ๋“ค์—ˆ๋‹ค.
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)