Backend Wiki - 100-hours-a-week/KTB4-4th-wiki GitHub Wiki
| ๊ธฐ๊ฐ | ์ฃผ์ ์์ |
|---|---|
| MM/DD ~ | ์์ ๋ด์ฉ ์์ฑ |
์์
- EditorConfig ์ค์
| ์ค์ ํญ๋ชฉ | ๊ฐ | ์ค๋ช |
|---|---|---|
| charset | utf-8 | |
| end_of_line | lf | |
| indent_style | space | |
| insert_final_newline | true | |
| trim_trailing_whitespace | true | |
| max_line_length | 120 |
์์
| ํญ๋ชฉ | ๊ท์น |
|---|---|
| ํด๋์ค๋ช | |
| ๋ณ์๋ช ๋ฐ ๋ฉ์๋๋ช | |
| ์์๋ช | |
| ํจํค์ง๋ช | |
| ํญ ์ฌ์ฉ | |
| ์ค ๋ฐ๊ฟ | |
| ์ต๋ ๋ผ์ธ ๊ธธ์ด | |
| ์ ์ด๋ฌธ ๋ธ๋ก {} | |
| ์ฐ์ฐ์ ๋ฐฐ์น | |
| import ์์ | |
| ์ฃผ์ ์คํ์ผ |
์์
** ์ปค๋ฐ ๋ฉ์์ง๋ type: message ํ์์ ๋ฐ๋ฅด๋ฉฐ, ์๋์ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค. **
์ ๋ชฉ ๊ท์น
- ์ ๋ชฉ์ ๋ค์ ๋์๋ฌธ์ ์คํ์ผ ์ค ํ๋๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค:
- sentence-case
- start-case
- pascal-case
- upper-case
- lower-case
- ์ ๋ชฉ ๋์ ๋ง์นจํ(.)๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ์ ๋ชฉ์ ์ต์ 5์ ์ด์์ด์ด์ผ ํฉ๋๋ค.
- ์ ์ฒด ํค๋๋ 72์๋ฅผ ์ด๊ณผํ์ง ์์์ผ ํฉ๋๋ค.
| ํ์ | ์ค๋ช |
|---|---|
| build | |
| chore | |
| content | |
| docs | |
| feat | |
| fix | |
| refactor | |
| style | |
| test | |
| deploy |
type: ์ ๋ชฉ (#์ด์๋ฒํธ)
๋ณธ๋ฌธ (์ ํ ์ฌํญ)
์์
feat: ๊ธฐ๋ฅ ์์ฝ (#์ด์๋ฒํธ)
๊ธฐ๋ฅ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
์ถ๊ฐ
์์
- PR ์ ๋ชฉ์ ์ปค๋ฐ ๋ฉ์์ง์ ๋์ผํ ํ์์ ์ ์งํฉ๋๋ค.
- ํ ๋ฒ์ PR์ ํ๋์ ๋ชฉ์ ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น ํ ๋ณํฉ์ ์ํํฉ๋๋ค.
์ด ์ปจ๋ฒค์ ์ ์ค์ํ์ฌ ํ์ ์ฝ๋ ํ์ง์ ์ ์งํ๊ณ ์ํํ ํ์ ์ ์งํํฉ์๋ค!
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ฌ์ฉ์ |
| ์ค๋ช | Kakao OAuth 2.0์ ํตํด ๊ฐ์ ํ ์ฌ์ฉ์์ ์๋ณ ์ ๋ณด, ๊ธฐ๋ณธ ํ๋กํ ๋ฐ ์๋น์ค ์ด์ฉ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์ธ๋ถ ์ธ์ฆ ์๋ณ์์ ์๋น์ค ๋ด๋ถ ์ฌ์ฉ์ ID๋ฅผ ์ฐ๊ฒฐํ๊ณ , ํ๋กํ/์จ๋ณด๋ฉ/๊ณ์ ์ํ/๋ง์ง๋ง ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค. ์๋น์ค ๋ด ์ฌ์ฉ์ ๊ด๋ จ ๋ฐ์ดํฐ์ ๊ธฐ์ค ์ํฐํฐ ์ญํ ์ ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
auth_sessions, push_subscriptions, calendar_connections์ 1:N, user_taste_profiles์ 1:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.์ถ์ฒ/ํด๋ฆญ/ํผ๋๋ฐฑ ํ ์ด๋ธ์ ํตํด products์ ์ฐ๊ฒฐ๋๋ค. |
| PK | id |
| FK | ์์ |
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
external_id |
BIGINT |
NULL |
- |
nickname |
VARCHAR(50) |
NOT NULL |
- |
profile_image_url |
VARCHAR(2048) |
NULL |
- |
gender |
ENUM('MALE', 'FEMALE') |
NOT NULL |
- |
birth_date |
DATE |
NULL |
- |
is_onboarding_complete |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
status |
VARCHAR(30) |
NOT NULL; DEFAULT 'ONBOARDING' |
- |
blocked_at |
DATETIME(6) |
NULL |
- |
last_login_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์๋น์ค ๋ด๋ถ ์ฌ์ฉ์ ์๋ณ์ | ์ฌ์ฉ์ ์ฆ๊ฐ์ ๋ค๋ฅธ ํ
์ด๋ธ์ ๊ณตํต ์ฐธ์กฐ๋ฅผ ๊ณ ๋ คํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
external_id |
OAuth ์ ๊ณต์๊ฐ ๋ฐ๊ธํ ์ธ๋ถ ์ฌ์ฉ์ ์๋ณ์ | ํ์ฌ Kakao ์๋ณ์๊ฐ ์ซ์๋ผ๋ ์ ์ ์ ๋ฐ๋ผ BIGINT๋ฅผ ์ฌ์ฉํ๋ค. ์์ฒด ๋ก๊ทธ์ธ ์ฌ์ฉ์๋ NULL์ผ ์ ์๋ค. |
nickname |
์๋น์ค์์ ์ฌ์ฉํ๋ ๋๋ค์ | ๊ฐ๋ณ ๊ธธ์ด ๋ฌธ์์ด์ด๋ฉฐ ์๋น์ค ์ ์ฑ ์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
profile_image_url |
OAuth ํ๋กํ ์ด๋ฏธ์ง URL | ๊ธด ์ธ๋ถ URL์ ์์ฉํ๊ธฐ ์ํด ์ต๋ 2,048์๋ฅผ ํ์ฉํ๋ค. |
gender |
์ฌ์ฉ์ ์ฑ๋ณ | ํ์ฌ ํ์ฉ๋๋ ๊ฐ์ด ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก DB์์ ์ ํจ๊ฐ์ ์ ํํ๋ค. |
birth_date |
์๋ ์์ผ | ์๊ฐ ์ ๋ณด๊ฐ ํ์ํ์ง ์์ ๋ ์ง ๊ฐ์ด๋ฏ๋ก DATE๋ฅผ ์ฌ์ฉํ๋ค. |
is_onboarding_complete |
์จ๋ณด๋ฉ ์๋ฃ ์ฌ๋ถ | ์ฐธยท๊ฑฐ์ง ๋ ์ํ๋ฅผ ํํํ๋ฏ๋ก BOOLEAN์ ์ฌ์ฉํ๋ค. |
status |
๊ฐ์ ์งํ, ์ ์ ์ด์ฉ, ์ฐจ๋จ ๋ฑ ์ฌ์ฉ์ ์ํ | ํฅํ ์ํ๊ฐ ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด ENUM ๋์ VARCHAR๋ฅผ ์ฌ์ฉํ๋ค. ํ์ฉ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ
์ผ๋ก ๊ด๋ฆฌํ๋ค. |
blocked_at |
๊ณ์ ์ฐจ๋จ ์๊ฐ | ์๋น์ค ์๊ฐ ์ ์ฑ
์ ๋ง์ถฐ ๋ ์ง์ ์๊ฐ์ ํจ๊ป ์ ์ฅํ๋ฉฐ, ์ฐจ๋จ๋์ง ์์ ๊ฒฝ์ฐ NULL์ด๋ค. |
last_login_at |
๋ง์ง๋ง ๋ก๊ทธ์ธ ์๊ฐ | ์ฌ์ฉ์ ํ๋ ๋ฐ ๋ณด์ ํ์ธ์ ํ์ํ ๋ง์ง๋ง ๋ก๊ทธ์ธ ์์ ์ ์ ์ฅํ๋ค. |
created_at |
๋ ์ฝ๋ ์์ฑ ์๊ฐ | ์์ฑ ์๊ฐ์ ์๋ ๊ธฐ๋กํ๊ณ ๋ค๋ฅธ ์๊ฐ ์ปฌ๋ผ๊ณผ ์ ๋ฐ๋๋ฅผ ํต์ผํ๋ค. |
updated_at |
๋ ์ฝ๋ ์ต์ข ์์ ์๊ฐ | ์ฌ์ฉ์ ์ ๋ณด์ ๋ง์ง๋ง ๋ณ๊ฒฝ ์์ ์ ์ ์ฅํ๋ค. |
deleted_at |
์ฌ์ฉ์ ํํด ์๊ฐ | ์ฐ๊ด ๋ฐ์ดํฐ์ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ํํด ์ํ๋ฅผ ํํํ๊ธฐ ์ํด ๋ ผ๋ฆฌ ์ญ์ ์๊ฐ์ ์ ์ฅํ๋ค. |
ํ์ฌ๋ Kakao OAuth 2.0๋ง ์ง์ํ์ง๋ง ํฅํ ์์ฒด ๋ก๊ทธ์ธ์ด๋ ๋ค๋ฅธ OAuth ๊ณต๊ธ์๊ฐ ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ์ธ๋ถ ์๋ณ์ ์ปฌ๋ผ์ kakao_id๊ฐ ์๋ external_id๋ก ์ ์ํ๋ค. ์์ฒด ๊ฐ์
์ฌ์ฉ์๋ ์ธ๋ถ ์๋ณ์๊ฐ ์์ ์ ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ค. ์ธ๋ถ ์๋ณ์์ ๋ณ๋๋ก ๋ด๋ถ PK์ธ id๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ ๊ณต๊ธ์์ ์๋ณ์ ์ ์ฑ
์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ค๋ฅธ ์
๋ฌด ํ
์ด๋ธ์ ์ฐธ์กฐ ๊ด๊ณ๊ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๋ค.
์ฌ์ฉ์ ๊ธฐ๋ณธ ์ ๋ณด๋ง users์ ์ ์ฅํ๊ณ ์ธ์ฆ ์ธ์
, ํธ์ ๊ตฌ๋
, ์บ๋ฆฐ๋ ์ฐ๊ฒฐ, ์ทจํฅ ํ๋กํ์ ๋ณ๋ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๋ค. ์ด๋ฅผ ํตํด ๊ธฐ๋ฅ๋ณ ๋ฐ์ดํฐ์ ์๋ช
์ฃผ๊ธฐ์ ์ ๊ทผ ๊ถํ์ ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์ฌ๋ฌ ๋ก๊ทธ์ธ ๋ฐฉ์์ ๋์์ ์ง์ํ๊ฒ ๋๋ฉด provider, provider_user_id, user_id๋ฅผ ๊ด๋ฆฌํ๋ ๋ณ๋ ์ธ๋ถ ์ธ์ฆ ๊ณ์ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ํ๋์ ์ฌ์ฉ์๊ฐ Kakao์ ์์ฒด ๊ณ์ ๋ฑ ์ฌ๋ฌ ์ธ์ฆ ์๋จ์ ์ฐ๊ฒฐํ ์ ์๋ค.
ํ์ฌ status์ is_onboarding_complete๊ฐ ๋ชจ๋ ์จ๋ณด๋ฉ ์ํ์ ๊ด์ฌํ ์ ์์ผ๋ฏ๋ก ๊ฐ ์ปฌ๋ผ์ ์ฑ
์์ ๋ช
ํํ ํด์ผ ํ๋ค. ์จ๋ณด๋ฉ ๋จ๊ณ๊ฐ ๋ณต์กํด์ง๋ฉด ๋ณ๋์ ์งํ ์ํ ๋๋ ๋จ๊ณ๋ณ ์ด๋ ฅ ํ
์ด๋ธ๋ก ํ์ฅํ ์ ์๋ค. ํด์ธ ์ฌ์ฉ์๋ฅผ ์ง์ํ๊ฒ ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์
๊ณผ DB์ ๊ธฐ์ค ์๊ฐ์ UTC๋ก ํต์ผํ๊ณ ํ๋ฉด์์ ์ฌ์ฉ์ ์๊ฐ๋๋ก ๋ณํํ๋ ๋ฐฉ์์ ๊ฒํ ํ๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ๋ก๊ทธ์ธ ์ธ์ฆ ์ธ์ |
| ์ค๋ช | JWT ์ธ์ฆ์์ Refresh Token๊ณผ ๊ธฐ๊ธฐ๋ณ ๋ก๊ทธ์ธ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํ
์ด๋ธ์ด๋ค. Access JWT ์๋ฌธ์ ์ ์ฅํ์ง ์๋๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | API ์์ฒญ์ Access JWT์ ์๋ช
๊ณผ ๋ง๋ฃ ์๊ฐ์ ์ด์ฉํด ๋ฌด์ํ๋ก ์ธ์ฆํ๊ณ , ํ ํฐ ๊ฐฑ์ ยท๋ก๊ทธ์์ยทํ์ ํํดยท๋ณด์ ์กฐ์น๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด ํ ์ด๋ธ์์ Refresh Token๊ณผ ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ธํ๋ค. |
| ์ฃผ์ ๊ด๊ณ | ์ฌ๋ฌ ๋ก๊ทธ์ธ ์ธ์
์ด ํ๋์ ์ฌ์ฉ์๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก users์ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.์ฌ์ฉ์ ํ ๋ช ์ด ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ๋ ๋ฆฝ์ ์ธ ๋ก๊ทธ์ธ ์ธ์ ์ ์ ์งํ ์ ์๋ค. |
| PK | id |
| FK |
user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
refresh_token_hash |
BINARY(32) |
NOT NULL; UNIQUE |
UK |
device_name |
VARCHAR(100) |
NULL |
- |
ip_address |
VARBINARY(16) |
NULL |
- |
refresh_expires_at |
DATETIME(6) |
NOT NULL |
- |
last_used_at |
DATETIME(6) |
NULL |
- |
revoked_at |
DATETIME(6) |
NULL |
- |
revoke_reason |
ENUM('LOGOUT', 'WITHDRAWN', 'SECURITY', 'EXPIRED') |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
๊ธฐ๊ธฐ๋ณ ๋ก๊ทธ์ธ ์ธ์ ์๋ณ์ | ์ฌ์ฉ์๋ณ ๋ค์ค ๋ก๊ทธ์ธ ์ธ์
์ ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. Refresh JWT์ ์ธ์ ์๋ณ ํด๋ ์์ผ๋ก ํ์ฉํ ์ ์๋ค. |
user_id |
์ธ์ ์์ ์ฌ์ฉ์ | ํ๋์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ์ธ์ ์ ๊ฐ์ง ์ ์๋๋ก ์ฌ์ฉ์ FK๋ฅผ ๋ณ๋๋ก ๋๋ค. |
refresh_token_hash |
ํ์ฌ ์ ํจํ Refresh Token์ SHA-256 ํด์ | ํ ํฐ ์๋ฌธ์ ์ ์ฅํ์ง ์์ผ๋ฉฐ, 32๋ฐ์ดํธ ํด์๋ฅผ ๊ณ ์ ๊ธธ์ด ๋ฐ์ด๋๋ฆฌ๋ก ์ ์ฅํ๋ค. |
device_name |
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ๊ธฐ๊ธฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ํ์ ์ด๋ฆ | ๋ธ๋ผ์ฐ์ ๋๋ ๊ธฐ๊ธฐ ์ด๋ฆ์ ๊ฐ๋ณ ๊ธธ์ด๋ฅผ ์์ฉํ๋ค. |
ip_address |
์ธ์ ์์ฑ ๋๋ ๋ง์ง๋ง ์ฌ์ฉ IP ์ฃผ์ | IPv4์ IPv6๋ฅผ ๋ชจ๋ ์ ์ฅํ ์ ์๋๋ก ์ต๋ 16๋ฐ์ดํธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. |
refresh_expires_at |
Refresh Token์ ์ ๋ ๋ง๋ฃ ์๊ฐ | ๋ง๋ฃ ์ฌ๋ถ์ ์ ๋ฆฌ ๋์ ์ธ์ ์ ์กฐํํ ์ ์๋๋ก ๋ณ๋ ์๊ฐ์ ์ ์ฅํ๋ค. |
last_used_at |
Refresh Token์ด ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ์๊ฐ | ์ฅ๊ธฐ๊ฐ ์ฌ์ฉํ์ง ์์ ์ธ์ ๋ง๋ฃ์ ์ด์ ์ฌ์ฉ ํ์ง์ ํ์ฉํ๋ค. |
revoked_at |
๋ก๊ทธ์์ ๋๋ ๋ณด์ ์กฐ์น๋ก ์ธ์ ์ด ํ๊ธฐ๋ ์๊ฐ | ํ์ฑ ์ธ์
์ NULL์ด๋ฉฐ ๊ฐ์ด ์กด์ฌํ๋ฉด ๋ ์ด์ ํ ํฐ ๊ฐฑ์ ์ ํ์ฉํ์ง ์๋๋ค. |
revoke_reason |
์ธ์ ํ๊ธฐ ์ฌ์ | ํ์ฌ ํ์ํ ํ๊ธฐ ์ฌ์ ๋ฅผ ์ ํํ์ฌ ์ผ๊ด๋ ์ํ๋ฅผ ์ ์งํ๋ค. Refresh Token ํ์ ์ ์ธ์ ํ๊ธฐ๊ฐ ์๋๋ฏ๋ก ROTATED๋ฅผ ์ ์ธํ๋ค. |
created_at |
๋ก๊ทธ์ธ ์ธ์ ์์ฑ ์๊ฐ | ๋ก๊ทธ์ธ ๋ฐ์ ์์ ์ ์๋ ๊ธฐ๋กํ๋ค. |
updated_at |
์ธ์ ์ ๋ณด ์ต์ข ์์ ์๊ฐ | ํ ํฐ ํ์ , ๋ง์ง๋ง ์ฌ์ฉ ์๊ฐ ๋ฐ ํ๊ธฐ ์ํ ๋ณ๊ฒฝ ์์ ์ ์ถ์ ํ๋ค. |
Access JWT๋ง ์ฌ์ฉํ ์์ ํ ๋ฌด์ํ ๊ตฌ์กฐ์์๋ ๋ฐ๊ธ๋ ํ ํฐ์ ๋ง๋ฃ ์ ์ ๊ฐ์ ๋ก ๋ฌดํจํํ๊ธฐ ์ด๋ ต๋ค. ๋ณธ ์๋น์ค์๋ ์ต๋ช ์ฑํ ์ ๊ณ ์ ํ์ ํํด ๊ธฐ๋ฅ์ด ์๊ณ , ํํด ๋๋ ๋ณด์ ์กฐ์น ์ ๋ค๋ฅธ ๊ธฐ๊ธฐ์ ๋ก๊ทธ์ธ๋ ์ข ๋ฃํด์ผ ํ๋ฏ๋ก Access JWT๋ ๋ฌด์ํ๋ก ๊ฒ์ฆํ๋ Refresh Token๊ณผ ๋ก๊ทธ์ธ ์ํ๋ DB์์ ๊ด๋ฆฌํ๋ ํผํฉ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Refresh Token์ ์๋ฌธ ๋์ ํด์๋ฅผ ์ ์ฅํ๋ค. Refresh JWT์๋ ์ธ์
์๋ณ์์ธ auth_session_id๋ฅผ ํฌํจํ๊ณ , ํ ํฐ ๊ฐฑ์ ์ ์๋ช
๊ฒ์ฆ ํ ํด๋น ์ธ์
์ ํ์ฌ ํด์์ ๋น๊ตํ๋ค. ์ ์ ๊ฐฑ์ ์ ์ Refresh Token์ ๋ฐ๊ธํ๊ณ refresh_token_hash๋ฅผ ๊ต์ฒดํ๋ค. ๋ก๊ทธ์์์ด๋ ํ์ ํํด ์ revoked_at์ ์ค์ ํ์ฌ ์ดํ ๊ฐฑ์ ์ ์ฐจ๋จํ๋ค.
Refresh Token ํ์ ์ด๋ ฅ๊ณผ ํ์ทจ ํ ํฐ ์ฌ์ฌ์ฉ ๋ด์ญ์ ์ฅ๊ธฐ๊ฐ ๊ฐ์ฌํด์ผ ํ๋ค๋ฉด ๊ฐ๋ณ ํ ํฐ์ ์ ์ฅํ๋ refresh_tokens ํ
์ด๋ธ์ ๋ณ๋๋ก ๋ ์ ์๋ค. ์ฌ์ฉ์๋ณ ํ์ฑ ์ธ์
์กฐํ๋ฅผ ์ํด (user_id, revoked_at), ๋ง๋ฃ ์ธ์
์ ๋ฆฌ๋ฅผ ์ํด refresh_expires_at ์ธ๋ฑ์ค๋ฅผ ๊ฒํ ํ๋ค.
๊ธฐ๊ธฐ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ๊ฐํ๋๋ฉด ์์ ์ ์ธ ๊ธฐ๊ธฐ ์๋ณ์ ์ํ device_id, ํ๋ซํผ ๊ตฌ๋ถ์ ์ํ platform, ๋ง์ง๋ง ์ฌ์ฉ IP๋ฅผ ๋ณ๋๋ก ๊ธฐ๋กํ๋ last_ip_address ๋ฑ์ ์ถ๊ฐํ ์ ์๋ค. Access JWT๋ฅผ ์ฆ์ ๋ฌดํจํํด์ผ ํ๋ ์ ์ฑ
์ด ์๊ธฐ๋ฉด ์งง์ ๋ง๋ฃ ์๊ฐ๊ณผ ํจ๊ป ์ธ์
์ํ ์กฐํ ๋๋ jti ์ฐจ๋จ ๋ชฉ๋ก์ ์ฌ์ฉํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ํธ์ ๊ตฌ๋ |
| ์ค๋ช | PWA์ Web Push API๋ฅผ ํตํด ์ฌ์ฉ์์ ๊ฐ๋ณ ๊ธฐ๊ธฐ์ ์๋ฆผ์ ๋ฐ์กํ๊ธฐ ์ํ ๊ตฌ๋ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์๋ฆผ ์ด๋ฒคํธ ๋ฐ์ ์ ์ฌ์ฉ์์ ํ์ฑ ๊ตฌ๋
์ ์กฐํํด ๋ชจ๋ ๋ฑ๋ก ๊ธฐ๊ธฐ๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์กํ๋ค. ํ์ด์ง๊ฐ ์ด๋ ค ์์ผ๋ฉด React๊ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๋ ์ข ๋ฃ ์ํ์์๋ Service Worker๊ฐ ์๋ฆผ์ ์ฒ๋ฆฌํ๋ค. |
| ์ฃผ์ ๊ด๊ณ | ์ฌ๋ฌ ๊ธฐ๊ธฐ ๊ตฌ๋
์ด ํ๋์ ์ฌ์ฉ์๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก users์ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค. |
| PK | id |
| FK |
user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
registration_id |
BIGINT |
NOT NULL |
- |
status |
ENUM('ACTIVE', 'REVOKED') |
NOT NULL; DEFAULT 'ACTIVE' |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
ํธ์ ๊ตฌ๋ ์๋ณ์ | ์ฌ์ฉ์๋ณ ๋ค์ค ๊ธฐ๊ธฐ ๊ตฌ๋ ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. |
user_id |
๊ตฌ๋ ์์ ์ฌ์ฉ์ | ์ฌ์ฉ์๋ณ ํ์ฑ ๊ตฌ๋ ์ ์กฐํํ๊ธฐ ์ํ ์ฐธ์กฐ ํค๋ค. |
registration_id |
๋ณ๋๋ก ๊ด๋ฆฌ๋๋ Web Push ๋ฑ๋ก ์ ๋ณด์ ์๋ณ์ | ์ซ์ํ ๋ด๋ถ ๋ฑ๋ก ID๋ฅผ ์ฐธ์กฐํ๋ค๋ ์ ์ ์ ํ์ ์ด๋ค. ์ค์ ๊ตฌ๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์ฅํ๋ค๋ฉด ์๋ ํ์ฅ ๊ตฌ์กฐ๊ฐ ํ์ํ๋ค. |
status |
ํธ์ ๊ตฌ๋ ์ ํ์ฑ ๋๋ ํ๊ธฐ ์ํ | ํ์ฉ ์ํ๊ฐ ๋ช
ํํ ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก ENUM์ผ๋ก ๋ฌด๊ฒฐ์ฑ์ ๊ด๋ฆฌํ๋ค. |
created_at |
๊ตฌ๋ ์์ฑ ์๊ฐ | ๊ธฐ๊ธฐ ๋ฑ๋ก ์์ ์ ์๋ ๊ธฐ๋กํ๋ค. |
updated_at |
๊ตฌ๋ ์ ๋ณด ์ต์ข ์์ ์๊ฐ | ์ํ ๋๋ ๊ตฌ๋ ์ ๋ณด์ ๋ณ๊ฒฝ ์์ ์ ์ ์ฅํ๋ค. |
deleted_at |
๊ตฌ๋ ๋ ผ๋ฆฌ ์ญ์ ์๊ฐ | ๊ตฌ๋ ์ด๋ ฅ์ ์ ์งํ๋ฉด์ ๋ฐ์ก ๋์์์ ์ ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
ํ ์ฌ์ฉ์๊ฐ ์ค๋งํธํฐ, ํ๋ธ๋ฆฟ, PC ๋ฑ ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์์ ๊ตฌ๋
์ 1:N ๊ด๊ณ๋ก ๋ถ๋ฆฌํ๋ค. ๋ฐฑ์๋๋ ACTIVE ์ํ์ธ ๊ตฌ๋
๋ง ์กฐํํ์ฌ ๋ฐ์กํ๊ณ , ๋ง๋ฃ๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ๊ถํ์ ์ฒ ํํ ๊ตฌ๋
์ REVOKED๋ก ์ ํํ๋ค.
Web Push API์ ๊ตฌ๋
๊ฐ์ฒด๋ฅผ DB์ ์ง์ ์ ์ฅํ๋ค๋ฉด registration_id๋ง์ผ๋ก๋ ๋ถ์กฑํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ endpoint, p256dh_key, auth_key, expiration_time, user_agent ๋ฑ์ ๋ณ๋ ์ปฌ๋ผ ๋๋ ๊ตฌ๋
์์ธ ํ
์ด๋ธ๋ก ๊ด๋ฆฌํด์ผ ํ๋ค. ๋์ผ ๊ตฌ๋
์ ์ค๋ณต ์ ์ฅ์ ๋ฐฉ์งํ๊ธฐ ์ํด endpoint ๋๋ ๋ฑ๋ก ์ ๋ณด์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ๋ ์ ์๋ค.
ํธ์ ๊ณต๊ธ์๊ฐ ์ถ๊ฐ๋๋ฉด provider, platform์ ์ถ๊ฐํ๊ณ , ๋ฐ๋ณต ๋ฐ์ก ์คํจ ํ์์ ๋ง์ง๋ง ์ฑ๊ณตยท์คํจ ์๊ฐ์ ์ ์ฅํ์ฌ ์๋ ํ๊ธฐ ์ ์ฑ
์ ์ ์ฉํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ธ๋ถ ์บ๋ฆฐ๋ ์ฐ๊ฒฐ |
| ์ค๋ช | ์ฌ์ฉ์์ ์ธ๋ถ ์บ๋ฆฐ๋ ์ฐ๋ ์ํ์ ์ฐ๊ฒฐยทํด์ ์๊ฐ์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์ธ๋ถ ์บ๋ฆฐ๋์์ ์์ง๋ ์ผ์ ์ ์ด๋ฒคํธ์ ์๋ฆผ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋๋ก ์ฌ์ฉ์๋ณ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ ๊ณตํ๋ค. |
| ์ฃผ์ ๊ด๊ณ | ์ฌ๋ฌ ์บ๋ฆฐ๋ ์ฐ๊ฒฐ์ด ํ๋์ ์ฌ์ฉ์๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก users์ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.์ฌ์ฉ์๋ ์บ๋ฆฐ๋๋ฅผ ์ฐ๊ฒฐํ์ง ์๊ฑฐ๋ ์ฌ๋ฌ ์บ๋ฆฐ๋ ์ฐ๊ฒฐ์ ๊ฐ์ง ์ ์๋ค. |
| PK | id |
| FK |
user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
status |
ENUM('CONNECTED', 'DISCONNECTED', 'REAUTH_REQUIRED') |
NOT NULL; DEFAULT 'DISCONNECTED' |
- |
connected_at |
DATETIME(6) |
NULL |
- |
disconnected_at |
DATETIME(6) |
NULL |
- |
updated_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์บ๋ฆฐ๋ ์ฐ๊ฒฐ ์๋ณ์ | ์ฌ์ฉ์๋ณ ์ฌ๋ฌ ์บ๋ฆฐ๋ ์ฐ๊ฒฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. |
user_id |
์บ๋ฆฐ๋๋ฅผ ์ฐ๊ฒฐํ ์ฌ์ฉ์ | ํ๋์ ์ฌ์ฉ์์๊ฒ ์ฌ๋ฌ ์ฐ๊ฒฐ์ ํ์ฉํ๊ธฐ ์ํด PK๊ฐ ์๋ FK๋ก ์ฌ์ฉํ๋ค. |
status |
์ฐ๊ฒฐ๋จ, ์ฐ๊ฒฐ ํด์ , ์ฌ์ธ์ฆ ํ์ ์ํ | ํ์ฉ ์ํ๊ฐ ์ ํด์ ธ ์์ผ๋ฏ๋ก ENUM์ผ๋ก ์ ํจ๊ฐ์ ์ ํํ๋ค. |
connected_at |
์ธ๋ถ ์บ๋ฆฐ๋๊ฐ ์ฐ๊ฒฐ๋ ์๊ฐ | ์ฐ๊ฒฐ ์ ์ด๊ฑฐ๋ ์ฐ๊ฒฐ ์ด๋ ฅ์ด ์์ผ๋ฉด NULL์ด๋ค. |
disconnected_at |
์ธ๋ถ ์บ๋ฆฐ๋ ์ฐ๊ฒฐ์ด ํด์ ๋ ์๊ฐ | ์ฐ๊ฒฐ ์ํ๋ผ๋ฉด NULL์ด๊ณ ์ฐ๊ฒฐ ํด์ ์ ์๊ฐ์ ๊ธฐ๋กํ๋ค. |
updated_at |
์ฐ๊ฒฐ ์ ๋ณด ์ต์ข ์์ ์๊ฐ | ์ฐ๊ฒฐ ์ํ๋ ์ธ์ฆ ์ํ์ ๋ณ๊ฒฝ ์์ ์ ๊ด๋ฆฌํ๋ค. |
ํ์ฌ ๊ธฐํ์ Kakao ํก์บ๋ฆฐ๋ ๋จ์ผ ์ฐ๊ฒฐ์ ์ค์ฌ์ผ๋ก ํ์ง๋ง, ํฅํ Google Calendar ๋ฑ ์ฌ๋ฌ ์ธ๋ถ ์บ๋ฆฐ๋์์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด ์ฌ์ฉ์๋น ํ๋์ ํ์ผ๋ก ์ ํํ์ง ์์๋ค. user_id ๋์ ๋ณ๋ id๋ฅผ PK๋ก ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์บ๋ฆฐ๋ ์ฐ๊ฒฐ์ 1:N ๊ตฌ์กฐ๋ก ํ์ฅํ๋ค.
๋ค์ค ์บ๋ฆฐ๋ ์ฐ๊ฒฐ์ ์ค์ ๋ก ๊ตฌ๋ถํ๋ ค๋ฉด provider, external_account_id, calendar_id, created_at ์ปฌ๋ผ์ด ์ถ๊ฐ๋ก ํ์ํ๋ค. ๋์ผ ์ธ๋ถ ๊ณ์ ์ ์ค๋ณต ์ฐ๊ฒฐ์ ๋ฐฉ์งํ๋ ค๋ฉด (user_id, provider, external_account_id)์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ ์ฉํ ์ ์๋ค.
OAuth Access Token์ด๋ Refresh Token์ ์ ์ฅํด์ผ ํ๋ค๋ฉด ํ์ฌ ์ํ ํ
์ด๋ธ์ ํ๋ฌธ์ผ๋ก ์ถ๊ฐํ์ง ์๊ณ ์ํธํ๋ ๋ณ๋ ์ธ์ฆ ์ ๋ณด ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๋ค. ๋๊ธฐํ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด last_synced_at, sync_cursor, sync_error ๋ฑ์ ์ถ๊ฐํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ฌ์ฉ์ ์ทจํฅ ํ๋กํ |
| ์ค๋ช | AI ๋ํ ๋ถ์ ๊ฒฐ๊ณผ์ ์ฌ์ฉ์๊ฐ ์จ๋ณด๋ฉ์์ ์ง์ ์ ํํ ์ทจํฅยท๊ด์ฌ์ฌยท์ ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ๊ฐ์ธ ์ํ ์ถ์ฒ๊ณผ ์ ๋ฌผ ์ถ์ฒ์์ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ์ต์ ์ทจํฅ ์ ๋ณด๋ฅผ ํตํฉํด ์ ๊ณตํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
user_id๊ฐ PK์ด์ FK์ด๋ฏ๋ก users์ 1:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.AI ๋ํ ๋ฐ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๊ฐฑ์ ๋๊ณ ์ถ์ฒ ํ ์ด๋ธ ์์ฑ์ ํ์ฉ๋๋ค. |
| PK | user_id |
| FK |
user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
user_id |
BIGINT |
NOT NULL |
PK, FK โ users.id
|
recent_tastes |
JSON |
NOT NULL |
- |
recent_interests |
JSON |
NOT NULL |
- |
ai_summary |
TEXT |
NOT NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
selected_tastes |
JSON |
NULL; ์ต๋ 5๊ฐ |
- |
food_restrictions |
JSON |
NULL |
- |
unwanted_product |
JSON |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
user_id |
์ทจํฅ ํ๋กํ ์์ ์ฌ์ฉ์ | ์ฌ์ฉ์๋น ํ๋์ ์ต์ ํ๋กํ๋ง ์ ์งํ๊ธฐ ์ํด PK์ FK๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค. |
recent_tastes |
AI๊ฐ ์ต๊ทผ ๋ํ์์ ๋ถ์ํ ์ทจํฅ ํค์๋์ ๊ด๋ จ ๋ฐ์ดํฐ | ๋ถ์ ๊ฒฐ๊ณผ์ ํญ๋ชฉ ์์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋ณ์ ์ด๋ฏ๋ก JSON์ ์ฌ์ฉํ๋ค. |
recent_interests |
AI๊ฐ ๋ถ์ํ ์ต๊ทผ ๊ด์ฌ์ฌ | ๊ด์ฌ์ฌ ๋ชฉ๋ก๊ณผ ๋ถ๊ฐ ์ ๋ณด๊ฐ ์ ๋์ ์ด๋ฏ๋ก JSON์ ์ฌ์ฉํ๋ค. |
ai_summary |
AI๊ฐ ์์ฑํ ์ฌ์ฉ์ ์ทจํฅ ์์ฝ | ๋ถ์ ๊ฒฐ๊ณผ์ ๋ฌธ์ฅ ๊ธธ์ด๊ฐ ์ผ์ ํ์ง ์์ผ๋ฏ๋ก TEXT๋ฅผ ์ฌ์ฉํ๋ค. |
created_at |
์ทจํฅ ํ๋กํ ์์ฑ ์๊ฐ | ์ต์ด ์์ฑ ์์ ์ ์๋ ๊ธฐ๋กํ๋ค. |
updated_at |
์ทจํฅ ํ๋กํ ์ต์ข ๊ฐฑ์ ์๊ฐ | ์ต์ AI ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์๋ ์์ ์ ํ์ธํ๋ค. |
selected_tastes |
์ฌ์ฉ์๊ฐ ์จ๋ณด๋ฉ์์ ์ง์ ์ ํํ ์ทจํฅ ํค์๋ | ์ ํ ํญ๋ชฉ์ ์กฐํฉ์ด ๊ฐ๋ณ์ ์ด๋ฏ๋ก JSON์ ์ฌ์ฉํ๋ค. ์ต๋ ๊ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ฒ์ฆํ๋ค. |
food_restrictions |
์๋ ๋ฅด๊ธฐ, ์๋จ ๋ฑ ์์ ๊ด๋ จ ์ ํ ํค์๋ | ๋ณต์์ ๊ฐ๋ณ ํญ๋ชฉ์ ์ ์ฅํ๊ธฐ ์ํด JSON์ ์ฌ์ฉํ๋ค. |
unwanted_product |
์ฌ์ฉ์๊ฐ ์ถ์ฒ๋ฐ๊ณ ์ถ์ง ์์ ์ํ ๋๋ ์กฐ๊ฑด | ์ ์ธ ๋์์ ์ข
๋ฅ์ ๊ฐ์๊ฐ ๊ฐ๋ณ์ ์ด๋ฏ๋ก JSON์ ์ฌ์ฉํ๋ค. |
์ฌ์ฉ์ ํ ๋ช
์ ๊ฐ์ฅ ์ต์ ์ํ์ ์ทจํฅ ํ๋กํ ํ๋๋ฅผ ๊ฐ์ง๋ฏ๋ก user_id๋ฅผ PK๋ก ์ฌ์ฉํ๋ค. ๋ถ์ ๊ฒฐ๊ณผ์ ์จ๋ณด๋ฉ ์ ํ์ง๋ ๊ตฌ์กฐ์ ๊ธธ์ด๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ JSON์ผ๋ก ์ ์ฅํ๋ฉฐ, ์์ ํ AI ์์ฝ์ ๊ฐ๋ณ ๊ธธ์ด๋ฅผ ๊ณ ๋ คํด TEXT๋ก ์ ์ฅํ๋ค.
์ด ๋ฐ์ดํฐ๋ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋๋ฏ๋ก ํ์ ํํด ์ ๊ด๋ จ ํ์ ํ๋ ๋๋ฆฌํธํ๋ ์ ์ฑ
์ ์ ์ฉํ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋๋ฉ์ธ ํ
์ด๋ธ๊ณผ ๋ฌ๋ฆฌ deleted_at์ ๋์ง ์์๋ค.
์ทจํฅ ํค์๋๋ณ ๊ฒ์, ํต๊ณ, ๊ฐ์ค์น ๊ณ์ฐ์ด ์ค์ํด์ง๋ฉด JSON ๋ฐ์ดํฐ๋ฅผ ์ทจํฅ ์ฝ๋ ๋ฐ ์ฌ์ฉ์-์ทจํฅ ์ฐ๊ฒฐ ํ
์ด๋ธ๋ก ์ ๊ทํํ ์ ์๋ค. JSON ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋๋นํด schema_version ๋๋ ๋ถ์ ๋ชจ๋ธ ๋ฒ์ ์ ์ถ๊ฐํ ์ ์๋ค.
์ทจํฅ ๋ณํ ์ด๋ ฅ์ด ํ์ํ๋ฉด ํ์ฌ ํ ์ด๋ธ์ ์ต์ ์ํ๋ง ์ ์งํ๊ณ , ๋ณ๋์ ํ๋กํ ์ค๋ ์ท ๋๋ ๋ถ์ ์ด๋ ฅ ํ ์ด๋ธ์ ์ถ๊ฐํ๋ค. ์์ ์ ํ ์ ๋ณด๋ ๋ฏผ๊ฐ ์ ๋ณด๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์ ๊ทผ ๊ถํ, ์ํธํ ๋ฐ ๋ณด์กด ๊ธฐ๊ฐ ์ ์ฑ ์ ๋ณ๋๋ก ์ ์ํ๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ํ |
| ์ค๋ช | ํฌ๋กค๋ง ๋๋ ์ธ๋ถ API๋ฅผ ํตํด ์์งํ ์ถ์ฒ ๋์ ์ํ์ ๊ธฐ๋ณธ ์ ๋ณด, ๊ฐ๊ฒฉ, ํ๋งค์ฒ ๋ฐ ๊ตฌ๋งค ๋งํฌ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ๊ฐ์ธ ์ถ์ฒ, ์ ๋ฌผ ์ถ์ฒ, ํด๋ฆญ, ํผ๋๋ฐฑ ๋ฐ ์ต๋ช ์ง๋ฌธ ๊ธฐ๋ฅ์์ ๊ณตํต์ผ๋ก ์ฐธ์กฐํ๋ ์ํ ๊ธฐ์ค ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
personal_recommendations, gift_recommendations, product_clicks,product_feedbacks, anonymous_rooms์ 1:N ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค. |
| PK | id |
| FK | ์์ |
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
external_id |
VARCHAR(255) |
NULL |
- |
name |
VARCHAR(300) |
NOT NULL |
- |
category |
VARCHAR(100) |
NULL |
- |
description |
TEXT |
NULL |
- |
price |
DECIMAL(12, 2) |
NULL |
- |
image_url |
VARCHAR(2048) |
NULL |
- |
seller_name |
VARCHAR(200) |
NULL |
- |
purchase_url |
VARCHAR(2048) |
NULL |
- |
status |
ENUM('ACTIVE', 'SOLD_OUT', 'UNAVAILABLE') |
NOT NULL; DEFAULT 'ACTIVE' |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์๋น์ค ๋ด๋ถ ์ํ ์๋ณ์ | ์ธ๋ถ ๋ฐ์ดํฐ ์ถ์ฒ์ ๋ ๋ฆฝ๋ ์ฐธ์กฐ ๊ธฐ์ค์ ์ ๊ณตํ๊ณ ์ํ ์ฆ๊ฐ๋ฅผ ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
external_id |
์ธ๋ถ API๊ฐ ์ ๊ณตํ ์ํ ์๋ณ์ | ๊ณต๊ธ์๋ณ ์๋ณ์ ํ์์ด ๋ค๋ฅผ ์ ์์ด ๋ฌธ์์ด์ ์ฌ์ฉํ๋ค. ํฌ๋กค๋ง ์ํ์ ์ธ๋ถ ID๊ฐ ์์ด NULL์ผ ์ ์๋ค. |
name |
์ํ๋ช | ๋น๊ต์ ๊ธด ์ธ๋ถ ์ํ๋ช ์ ์์ฉํ๋๋ก ์ต๋ ๊ธธ์ด๋ฅผ ์ค์ ํ๋ค. |
category |
์ํ ์นดํ ๊ณ ๋ฆฌ | ์ธ๋ถ ์์ง ๋ฐ์ดํฐ์ ๊ฐ๋ณ์ ์ธ ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ ์์ฉํ๋ค. |
description |
์ํ ์์ธ ์ค๋ช | ์ค๋ช
๊ธธ์ด๊ฐ ์ผ์ ํ์ง ์์ผ๋ฏ๋ก TEXT๋ฅผ ์ฌ์ฉํ๋ค. |
price |
์ํ ํ๋งค ๊ฐ๊ฒฉ | ๋ถ๋์์์ ์ค์ฐจ ์์ด ๊ธ์ก์ ์ ์ฅํ๊ธฐ ์ํด DECIMAL์ ์ฌ์ฉํ๋ค. |
image_url |
์ํ ์ด๋ฏธ์ง URL | ๊ธด ์ธ๋ถ URL์ ์์ฉํ๋ค. |
seller_name |
ํ๋งค์ฒ ๋๋ ํ๋งค์ ์ด๋ฆ | ํ๋งค์ฒ๋ช ์ ๊ฐ๋ณ ๊ธธ์ด๋ฅผ ์์ฉํ๋ค. |
purchase_url |
์ํ ๊ตฌ๋งค ํ์ด์ง URL | ์ธ๋ถ ๊ตฌ๋งค ๋งํฌ์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ณ ๋ คํ๋ค. |
status |
ํ๋งค ๊ฐ๋ฅ, ํ์ , ๊ตฌ๋งค ํ์ด์ง ์ด์ฉ ๋ถ๊ฐ ์ํ | ์ํ ์ถ๊ฐ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ณ ๊ฐ์ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํ๋ฏ๋ก ENUM์ ์ฌ์ฉํ๋ค. |
created_at |
์ํ ๋ ์ฝ๋ ์์ฑ ์๊ฐ | ์ํ์ด ์ต์ด ์์ง๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
updated_at |
์ํ ์ ๋ณด ์ต์ข ๊ฐฑ์ ์๊ฐ | ์ฌ๊ณ , ๊ฐ๊ฒฉ, URL ๋ฑ ์ธ๋ถ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ๊ฐฑ์ ๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
deleted_at |
์ํ ๋ ผ๋ฆฌ ์ญ์ ์๊ฐ | ๊ณผ๊ฑฐ ์ถ์ฒยทํด๋ฆญยทํผ๋๋ฐฑ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ์ ๊ท ๋ ธ์ถ์์ ์ ์ธํ๋ค. |
์ํ ๋ฐ์ดํฐ๋ API ๋๋ ํฌ๋กค๋ง์ผ๋ก ์์ง๋ ์ ์์ผ๋ฏ๋ก ์ธ๋ถ ์๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ํ์ฉํ๋ค. ๋ด๋ถ PK์ธ id๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๊ณต๊ธ์ฒ์ ID ๋ณ๊ฒฝ์ด๋ ์์ง ๋ฐฉ์ ๋ณ๊ฒฝ์ด ์ถ์ฒยทํด๋ฆญยทํผ๋๋ฐฑ ๊ด๊ณ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํ๋ค.
์ํ ์ํ๋ ๊ตฌ๋งค URL ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ์ ์ฌ๊ณ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ACTIVE, SOLD_OUT, UNAVAILABLE๋ก ์ ํํ๋ค. ํ์ฌ ์ํ ์ข
๋ฅ์ ๋ณ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค๊ณ ํ๋จํ์ฌ DB์์ ENUM์ผ๋ก ๋ฌด๊ฒฐ์ฑ์ ๊ด๋ฆฌํ๋ค.
์ฌ๋ฌ API ๋๋ ์ผํ๋ชฐ์์ ๊ฐ์ ์ธ๋ถ ID๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก source_type ๋๋ provider_id๋ฅผ ์ถ๊ฐํ๊ณ (provider_id, external_id)์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ ์ฉํ ์ ์๋ค. external_id IS NULL๋ง์ผ๋ก ํฌ๋กค๋ง ์ํ์ ๊ตฌ๋ถํ๊ธฐ๋ณด๋ค ๋ฐ์ดํฐ ์ถ์ฒ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ฅํ๋ ํธ์ด ํ์ฅ์ ์ ๋ฆฌํ๋ค.
๋ค์ค ํตํ๋ฅผ ์ง์ํ๋ฉด currency_code๋ฅผ ์ถ๊ฐํ๊ณ , ๊ฐ๊ฒฉ ๋ณ๋ ๋ถ์์ด ํ์ํ๋ฉด ๋ณ๋ ๊ฐ๊ฒฉ ์ด๋ ฅ ํ
์ด๋ธ์ ๋๋ค. ์นดํ
๊ณ ๋ฆฌ ๊ณ์ธต, ๋ค์ค ์ด๋ฏธ์ง, ์ฌ๋ฌ ํ๋งค์ฒ๋ฅผ ์ง์ํ๊ฒ ๋๋ฉด ๊ฐ๊ฐ ๋ณ๋ ํ
์ด๋ธ๋ก ์ ๊ทํํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ๊ฐ์ธ ์ํ ์ถ์ฒ |
| ์ค๋ช | AI ๋ํ๋ฅผ ํตํด ๋ถ์ํ ์ฌ์ฉ์์ ํ์ฌ ํ์์ ์ ํฉํ ์ํ ์ถ์ฒ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์ ๋ฌผ๋ณด๋ค๋ ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌ๋งคํด ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ํ์ ์ ์์ ์ถ์ฒ ์ฌ์ ๋ฅผ ์ ๊ณตํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users์ products ์ฌ์ด์ ์ฐ๊ฒฐ ํ
์ด๋ธ๋ก ๊ฐ๊ฐ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฌ์ฉ์์ ์ํ์ N:M ๊ด๊ณ๋ฅผ ํํํ๋ค. |
| PK | (user_id, product_id) |
| FK |
user_id โ users.id, product_id โ products.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
user_id |
BIGINT |
NOT NULL |
PK(1), FK โ users.id
|
product_id |
BIGINT |
NOT NULL |
PK(2), FK โ products.id
|
score |
DECIMAL(8, 6) |
NOT NULL |
- |
reason |
VARCHAR(500) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
user_id |
์ถ์ฒ์ ๋ฐ๋ ์ฌ์ฉ์ | ์ฌ์ฉ์ ์ค์ฌ ์กฐํ์ ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํด ๋ณตํฉ PK์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ผ๋ก ์ฌ์ฉํ๋ค. |
product_id |
์ถ์ฒ๋ ์ํ | ๋์ผ ์ฌ์ฉ์์๊ฒ ๊ฐ์ ์ํ์ด ์ค๋ณต ์ ์ฅ๋์ง ์๋๋ก ๋ณตํฉ PK์ ํฌํจํ๋ค. |
score |
์ฌ์ฉ์์ ์ํ ๊ฐ ์ถ์ฒ ์ ํฉ๋ ์ ์ | ์ ๋ ฌ ๊ฒฐ๊ณผ์ ์ ๋ฐ๋์ ์ฌํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ณ ์ ์์์ ์ ์ฌ์ฉํ๋ค. |
reason |
์ํ ์ถ์ฒ ์ฌ์ | ์ฌ์ฉ์์๊ฒ ๋ ธ์ถํ๊ฑฐ๋ ์ถ์ฒ ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๋ ์งง์ ์ค๋ช ์ ์ ์ฅํ๋ค. |
created_at |
์ถ์ฒ ๊ฒฐ๊ณผ ์์ฑ ์๊ฐ | ์ถ์ฒ์ด ์ต์ด ์์ฑ๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
updated_at |
์ถ์ฒ ๊ฒฐ๊ณผ ์ต์ข ๊ฐฑ์ ์๊ฐ | ์ ์ ๋๋ ์ถ์ฒ ์ฌ์ ๊ฐ ๊ฐฑ์ ๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
๋์ผํ ์ํ์ด ๊ฐ์ธ ์ถ์ฒ๊ณผ ์ ๋ฌผ ์ถ์ฒ์ ๋ชจ๋ ํฌํจ๋ ์ ์์ง๋ง ์ถ์ฒ ๋ชฉ์ ๊ณผ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ์ค๋ช
์ด ๋ค๋ฅด๋ฏ๋ก ๋ ํ
์ด๋ธ์ ๋ถ๋ฆฌํ๋ค. user_id์ product_id๋ฅผ ๋ณตํฉ PK๋ก ์ฌ์ฉํ์ฌ ๋์ผ ์ฌ์ฉ์-์ํ ์กฐํฉ์ ์ค๋ณต์ ๋ฐฉ์งํ๊ณ , ์ฌ์ฉ์๋ณ ์ถ์ฒ ๋ชฉ๋ก์ ํจ๊ป ์กฐํํ๋ ํจํด์ ๋ง์ท๋ค.
๋๋ฆฌํค์ ๋ณตํฉ UK ์กฐํฉ๋ณด๋ค JPA ๋ณตํฉํค ๊ตฌํ์ด ๋ณต์กํด์ง๋ ๋จ์ ์ด ์์ง๋ง, ์ถ์ฒ ๊ฒฐ๊ณผ๋ ์ฌ์ฉ์์ ์ํ ์กฐํฉ ์์ฒด๊ฐ ์๋ณ์์ด๋ฉฐ ์ฝ๊ธฐ ์ค์ฌ ๋ฐ์ดํฐ๋ผ๋ ์ ์ ๊ณ ๋ คํด ๋ณตํฉ PK๋ฅผ ์ ํํ๋ค.
ํ์ฌ ๊ตฌ์กฐ๋ ์ฌ์ฉ์๋ณ ์ต์ ์ถ์ฒ ๊ฒฐ๊ณผ์ ์ ํฉํ๋ค. ์ถ์ฒ ์ด๋ ฅ, ๋ชจ๋ธ ๋น๊ต, A/B ํ
์คํธ๊ฐ ํ์ํด์ง๋ฉด recommendation_batch_id, model_version, generated_at, expires_at์ ์ถ๊ฐํ๊ฑฐ๋ ์ถ์ฒ ์คํ ๋จ์ ํ
์ด๋ธ์ ๋ถ๋ฆฌํ ์ ์๋ค.
์ฌ์ฉ์๋ณ ์์ ์ถ์ฒ์ ๋น ๋ฅด๊ฒ ์กฐํํ๋ ค๋ฉด (user_id, score) ์ธ๋ฑ์ค๋ฅผ ๊ฒํ ํ๊ณ , ์ ์ ๋ฒ์๊ฐ ์ ํด์ ธ ์๋ค๋ฉด CHECK ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ ๋ฌผ ์ํ ์ถ์ฒ |
| ์ค๋ช | ์ฌ์ฉ์์ ์ทจํฅ์ ๋ฐํ์ผ๋ก ํด๋น ์ฌ์ฉ์๊ฐ ์ ๋ฌผ๋ก ๋ฐ๊ณ ์ถ์ด ํ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ํ ์ถ์ฒ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์น๊ตฌ๊ฐ ์ ๋ฌผ์ ์ ํํ ๋ ์ถ์ฒ ์ ์, ์ถ์ฒ ์ฌ์ ๋ฐ ์ทจํฅ ํค์๋๋ฅผ ์ ๊ณตํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users์ products ์ฌ์ด์ ์ฐ๊ฒฐ ํ
์ด๋ธ๋ก ๊ฐ๊ฐ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฌ์ฉ์์ ์ํ์ N:M ๊ด๊ณ๋ฅผ ํํํ๋ค. |
| PK | (user_id, product_id) |
| FK |
user_id โ users.id, product_id โ products.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
user_id |
BIGINT |
NOT NULL |
PK(1), FK โ users.id
|
product_id |
BIGINT |
NOT NULL |
PK(2), FK โ products.id
|
score |
DECIMAL(8, 6) |
NOT NULL |
- |
reason |
VARCHAR(500) |
NULL |
- |
taste_keywords |
JSON |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
user_id |
์ ๋ฌผ ์ถ์ฒ์ ๋์ ์ฌ์ฉ์ | ์ฌ์ฉ์๋ณ ์ ๋ฌผ ์ถ์ฒ ์กฐํ์ ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํด ๋ณตํฉ PK์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ผ๋ก ์ฌ์ฉํ๋ค. |
product_id |
์ ๋ฌผ๋ก ์ถ์ฒ๋ ์ํ | ๋์ผ ๋์ ์ฌ์ฉ์์๊ฒ ๊ฐ์ ์ํ์ด ์ค๋ณต ์ ์ฅ๋์ง ์๋๋ก ๋ณตํฉ PK์ ํฌํจํ๋ค. |
score |
์ทจํฅ๊ณผ ์ํ ๊ฐ ์ ๋ฌผ ์ ํฉ๋ ์ ์ | ์ ๋ฐํ ์ถ์ฒ ์์๋ฅผ ์ฌํํ๊ธฐ ์ํด ๊ณ ์ ์์์ ์ ์ฌ์ฉํ๋ค. |
reason |
ํด๋น ์ํ์ ์ ๋ฌผ๋ก ์ถ์ฒํ ์ฌ์ | ์ถ์ฒ ๊ฒฐ๊ณผ์ ์ค๋ช ๊ฐ๋ฅ์ฑ์ ์ํด ์งง์ ์์ ํ ๋ด์ฉ์ ์ ์ฅํ๋ค. |
taste_keywords |
์ถ์ฒ์ ํ์ฉ๋ ์ฌ์ฉ์ ์ทจํฅ ํค์๋ | ํค์๋ ๊ฐ์์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋ณ์ ์ด๋ฏ๋ก JSON์ ์ฌ์ฉํ๋ค. |
created_at |
์ถ์ฒ ๊ฒฐ๊ณผ ์์ฑ ์๊ฐ | ์ถ์ฒ์ด ์ต์ด ์์ฑ๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
updated_at |
์ถ์ฒ ๊ฒฐ๊ณผ ์ต์ข ๊ฐฑ์ ์๊ฐ | ์ ์, ์ฌ์ ๋๋ ํค์๋๊ฐ ๊ฐฑ์ ๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
๊ฐ์ธ ์ถ์ฒ์ ์ฌ์ฉ์๊ฐ ์ง์ ํ์๋ก ํ ์ํ์, ์ ๋ฌผ ์ถ์ฒ์ ๋ค๋ฅธ ์ฌ๋์ด ์ ๋ฌผํ๊ธฐ ์ ํฉํ ์ํ์ ํํํ๋ค. ๋ ๋ฒ์ฃผ์ ๊ฒฝ๊ณ๊ฐ ์์ ํ ๋ฐฐํ์ ์ด์ง ์์ ๊ฐ์ ์ํ์ด ์์ชฝ์ ์กด์ฌํ ์ ์์ง๋ง, ์ถ์ฒ ๋ชฉ์ ๊ณผ ๋ ธ์ถ ๋งฅ๋ฝ์ด ๋ค๋ฅด๋ฏ๋ก ๋ณ๋ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํ๋ค.
user_id์ product_id๋ฅผ ๋ณตํฉ PK๋ก ์ฌ์ฉํ์ฌ ๋์ผ ๋์ ์ฌ์ฉ์-์ํ ์กฐํฉ์ ์ค๋ณต์ ๋ฐฉ์งํ๊ณ , ์ฌ์ฉ์๋ณ ์ถ์ฒ ๋ชฉ๋ก ์กฐํ์ ๋ง๋ ํค ์์๋ฅผ ์ฌ์ฉํ๋ค. taste_keywords๋ฅผ ํจ๊ป ์ ์ฅํ์ฌ ์ถ์ฒ ๊ทผ๊ฑฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ์ค๋ช
ํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ ์ ์๋๋ก ํ๋ค.
์์ผ, ๊ธฐ๋
์ผ ๋ฑ ์ถ์ฒ ์ํฉ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ฉด event_id ๋๋ recommendation_context๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ถ์ฒ ์์ฒญ์์ ๋ฐ๋ผ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด requester_user_id์ recipient_user_id๋ฅผ ๊ตฌ๋ถํด์ผ ํ๋ค.
์ถ์ฒ ๋ชจ๋ธ ์ด๋ ฅ๊ณผ A/B ํ
์คํธ๊ฐ ํ์ํ๋ฉด ์ถ์ฒ ์คํ ๋จ์, ๋ชจ๋ธ ๋ฒ์ ๋ฐ ๋ง๋ฃ ์๊ฐ์ ๊ด๋ฆฌํ๋ ๋ณ๋ ํ
์ด๋ธ๋ก ํ์ฅํ ์ ์๋ค. ํค์๋๋ณ ๊ฒ์์ด ์ค์ํด์ง๋ฉด taste_keywords๋ฅผ ์ ๊ทํํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ํ ํด๋ฆญ ๋ฐ ๊ตฌ๋งค ํ์ ํ์ธ |
| ์ค๋ช | ์ฌ์ฉ์๊ฐ ์ถ์ฒ ์ํ์ ๊ตฌ๋งค ๋งํฌ๋ฅผ ํด๋ฆญํ ์ด๋ ฅ๊ณผ ์ผ์ ๊ธฐ๊ฐ ์ดํ ์ค์ ๊ตฌ๋งค ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์ถ์ฒ ์ํ ํด๋ฆญ ํ 7์ผ์ด ์ง๋๋ฉด ๊ตฌ๋งค ์ฌ๋ถ๋ฅผ ์ง๋ฌธํ๊ณ , ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์ถ์ฒ ๋ฐ AI ํ์ต ๋ฐ์ดํฐ๋ก ์ ๊ณตํ๋ค. |
| ์ฃผ์ ๊ด๊ณ | ์ฌ๋ฌ ํด๋ฆญ ๋ ์ฝ๋๊ฐ ํ๋์ ์ฌ์ฉ์์ ์ํ์ ๊ฐ๊ฐ ์ฐธ์กฐํ๋ฏ๋ก users, products์ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค. |
| PK | id |
| FK |
user_id โ users.id, product_id โ products.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
product_id |
BIGINT |
NOT NULL |
FK โ products.id
|
recommendation_type |
ENUM('SELF', 'FRIEND') |
NOT NULL |
- |
clicked_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
follow_up_at |
DATETIME(6) |
NOT NULL; clicked_at + 7์ผ |
- |
follow_up_status |
ENUM('PENDING', 'ASKED', 'ANSWERED') |
NOT NULL; DEFAULT 'PENDING' |
- |
purchase_status |
ENUM('NOT_SELECTED', 'PURCHASED', 'NOT_PURCHASED') |
NOT NULL; DEFAULT 'NOT_SELECTED' |
- |
answered_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์ํ ํด๋ฆญ ๋ฐ ํ์ ํ์ธ ๋ ์ฝ๋ ์๋ณ์ | ์ฌ์ฉ์์ ์ํ ์กฐํฉ์ ์ํ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. |
user_id |
๊ตฌ๋งค ๋งํฌ๋ฅผ ํด๋ฆญํ ์ฌ์ฉ์ | ์ฌ์ฉ์๋ณ ํด๋ฆญ ๋ฐ ํ์ ์ง๋ฌธ ๋์์ ์กฐํํ๋ค. |
product_id |
ํด๋ฆญ๋ ์ํ | ์ํ๋ณ ํด๋ฆญ๊ณผ ๊ตฌ๋งค ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ค. |
recommendation_type |
๋ณธ์ธ ๊ตฌ๋งค ์ถ์ฒ ๋๋ ์น๊ตฌ ์ ๋ฌผ ์ถ์ฒ ๊ตฌ๋ถ | ํด๋ฆญ ๊ฒฝ๋ก๊ฐ ๋ ์ข
๋ฅ๋ก ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก ENUM์ ์ฌ์ฉํ๋ค. |
clicked_at |
๊ฐ์ฅ ์ต๊ทผ ๊ตฌ๋งค ๋งํฌ ํด๋ฆญ ์๊ฐ | ํ์ ์ง๋ฌธ ๊ธฐ์ค ์๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค. ๋๊ธฐ ์ค ์ฌํด๋ฆญํ๋ฉด ์ต์ ์๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค. |
follow_up_at |
๊ตฌ๋งค ์ฌ๋ถ ์ง๋ฌธ ์์ ์๊ฐ | ๋ฐฐ์น ์์ ์ด ์ง๋ฌธ ๋์์ ์ง์ ์กฐํํ ์ ์๋๋ก ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ค. |
follow_up_status |
์ง๋ฌธ ๋๊ธฐ, ์ง๋ฌธ ์๋ฃ, ์๋ต ์๋ฃ ์ํ | ์ ํด์ง ํ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ DB์์ ์ ํํ๋ค. |
purchase_status |
๋ฏธ์๋ต, ๊ตฌ๋งคํจ, ๊ตฌ๋งคํ์ง ์์ ์ํ | ๊ตฌ๋งค ์ฌ๋ถ์ ์์ง ์ ํํ์ง ์์ ์ํ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๋ค. |
answered_at |
์ฌ์ฉ์๊ฐ ๊ตฌ๋งค ์ฌ๋ถ์ ์๋ตํ ์๊ฐ | ์๋ต ์ ์๋ NULL์ด๊ณ ์๋ต ์๋ฃ ์ ๊ธฐ๋กํ๋ค. |
created_at |
๋ ์ฝ๋ ์์ฑ ์๊ฐ | ์ต์ด ํด๋ฆญ ๊ธฐ๋ฐ ๋ ์ฝ๋ ์์ฑ ์์ ์ ๊ธฐ๋กํ๋ค. |
updated_at |
๋ ์ฝ๋ ์ต์ข ๊ฐฑ์ ์๊ฐ | ์ฌํด๋ฆญ, ์ง๋ฌธ ๋๋ ์๋ต ์ํ์ ๋ณ๊ฒฝ ์์ ์ ๊ธฐ๋กํ๋ค. |
deleted_at |
๋ ์ฝ๋ ๋ ผ๋ฆฌ ์ญ์ ์๊ฐ | ๋ถ์ ๋ฐ์ดํฐ์ ์ด๋ ฅ์ ์ ์งํ๋ฉด์ ์ ๋ฌด ์กฐํ์์ ์ ์ธํ๋ค. |
์ฌ์ฉ์๊ฐ ์ํ ๊ตฌ๋งค ๋งํฌ๋ฅผ ํด๋ฆญํ ๋ค ์ค์ ๊ตฌ๋งค๋ก ์ด์ด์ก๋์ง ํ์ธํ๊ธฐ ์ํด ํด๋ฆญ ์๊ฐ๊ณผ ํ์ ์ง๋ฌธ ์ํ๋ฅผ ํ ํ
์ด๋ธ์์ ๊ด๋ฆฌํ๋ค. ํด๋ฆญ ๋ชฉ์ ์ ๋ณธ์ธ ๊ตฌ๋งค์ ์น๊ตฌ ์ ๋ฌผ ๋ ์ข
๋ฅ๋ก ํ์ ๋๋ฏ๋ก recommendation_type์ ENUM์ผ๋ก ์ ์ํ๋ค.
asked_at์ ๋ณ๋๋ก ๋์ง ์์๋ค. ์ง๋ฌธ ์์ ์๊ฐ์ธ follow_up_at๊ณผ ํ์ฌ ์ฒ๋ฆฌ ๋จ๊ณ์ธ follow_up_status๋ฅผ ํตํด ์ง๋ฌธ ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ ์ง๋ฌธ ๋๊ธฐ ์ค ๊ฐ์ ์ํ์ ๋ค์ ํด๋ฆญํ๋ฉด clicked_at๊ณผ follow_up_at์ ์ต์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ์ฌ ๋ง์ง๋ง ๊ด์ฌ ์์ ์ ๊ธฐ์ค์ผ๋ก 7์ผ์ ๋ค์ ๊ณ์ฐํ๋ค.
ํ์ฌ ์ฌํด๋ฆญ ๊ฐฑ์ ์ ์ฑ ์ ์์ ์ ์ผ๋ก ์ ์ฉํ๋ ค๋ฉด ์ด๋ค ํ์ ๊ฐฑ์ ํ ์ง ๊ฒฐ์ ํ๋ ์ฌ์ฉ์-์ํ-์ถ์ฒ์ ํ ๊ธฐ์ค์ด ํ์ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ํธ๋์ญ์ ์ผ๋ก ์ ์ดํ๊ฑฐ๋ ํ์ฑ ํ์ ๋ ์ฝ๋๋ฅผ ์๋ณํ๋ ๋ณ๋ ํค ๋ฐ ์ ๋ํฌ ์ ์ฑ ์ ๊ฒํ ํ ์ ์๋ค.
ํ์ ์ง๋ฌธ ๋ฐฐ์น ์กฐํ๋ฅผ ์ํด (follow_up_status, follow_up_at) ์ธ๋ฑ์ค๊ฐ ํ์ํ๋ค. ํด๋ฆญ ๋ฐ์ดํฐ๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ๋ฉด ํด๋ฆญ ์๋ณธ ์ด๋ฒคํธ์ ํ์ ๊ตฌ๋งค ํ์ธ ์ํ๋ฅผ ๋ถ๋ฆฌํ๊ณ , clicked_at ๊ธฐ์ค ํํฐ์
๋ ๋๋ ์์นด์ด๋น์ ์ ์ฉํ ์ ์๋ค. ์ถ์ฒ ์ฑ๊ณผ ๋ถ์์ ์ํด recommendation_batch_id, source_screen, campaign_id ๋ฑ์ ์ถ๊ฐํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ํ ํผ๋๋ฐฑ |
| ์ค๋ช | ํน์ ์ํ์ ๋ํ ์ฌ์ฉ์์ ๊ธ์ ยท๋ถ์ ํ๊ฐ์ ๋ถ์ ์ฌ์ ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ด๋ค. |
| ๊ธฐ๋ฅ์ ์ญํ | ์ฌ์ฉ์๋ณ ์ํ ์ ํธ ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ดํ ์ถ์ฒ ๊ฒฐ๊ณผ ๋ฐ AI ํ์ต ๋ฐ์ดํฐ์ ํ์ฉํ๋ค. |
| ์ฃผ์ ๊ด๊ณ | ์ฌ๋ฌ ํผ๋๋ฐฑ์ด ํ๋์ ์ฌ์ฉ์์ ์ํ์ ๊ฐ๊ฐ ์ฐธ์กฐํ๋ฏ๋ก users, products์ N:1 ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.(user_id, product_id) UK๋ฅผ ํตํด ์ฌ์ฉ์ ํ ๋ช
์ด ์ํ ํ๋์ ํ๋์ ํ์ฌ ํผ๋๋ฐฑ๋ง ๊ฐ์ง๋๋ก ์ ํํ๋ค. |
| PK | id |
| FK |
user_id โ users.id, product_id โ products.id
|
| UK | (user_id, product_id) โ README ์ค๊ณ ์๋์ด๋ฉฐ ์ค์ DDL์ ์ถ๊ฐ ํ์ |
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NOT NULL; product_id์ ๋ณตํฉ UNIQUE |
FK โ users.id
|
product_id |
BIGINT |
NOT NULL; user_id์ ๋ณตํฉ UNIQUE |
FK โ products.id
|
feedback_type |
ENUM('POSITIVE', 'NEGATIVE') |
NOT NULL |
- |
dislike_reason |
VARCHAR(500) |
NULL |
- |
is_anonymous |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์ํ ํผ๋๋ฐฑ ์๋ณ์ | JPA์์ ๋ณตํฉํค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ ์ฐ๊ธฐ ์ค์ฌ ํ ์ด๋ธ์ ํ์ ๋จ์ํ๊ฒ ์๋ณํ๊ธฐ ์ํด ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. |
user_id |
ํผ๋๋ฐฑ ์์ฑ ์ฌ์ฉ์ | ์ฌ์ฉ์-์ํ ์กฐํฉ์ ์ ์ผ์ฑ์ ๋ณด์ฅํ๋ฉด์ ์ฌ์ฉ์ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค. |
product_id |
ํผ๋๋ฐฑ ๋์ ์ํ | ์ฌ์ฉ์-์ํ ์กฐํฉ์ ์ ์ผ์ฑ์ ๋ณด์ฅํ๋ฉด์ ์ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค. |
feedback_type |
์ํ์ ๋ํ ๊ธ์ ๋๋ ๋ถ์ ํ๊ฐ | ํ์ฉ ์ํ๊ฐ ๋ ์ข
๋ฅ๋ก ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก ENUM์ ์ฌ์ฉํ๋ค. |
dislike_reason |
๋ถ์ ํ๊ฐ ์ฌ์ | ๋ถ์ ํผ๋๋ฐฑ์์๋ง ์ ํ์ ์ผ๋ก ์
๋ ฅํ๋ฏ๋ก NULL์ ํ์ฉํ๋ค. |
is_anonymous |
ํผ๋๋ฐฑ ํ์ ์ ์์ฑ์ ์ต๋ช ์ฒ๋ฆฌ ์ฌ๋ถ | ์ต๋ช ์ฌ๋ถ๋ฅผ ์ฐธยท๊ฑฐ์ง์ผ๋ก ํํํ๋ค. |
created_at |
ํผ๋๋ฐฑ ์์ฑ ์๊ฐ | ํผ๋๋ฐฑ์ด ์ต์ด ๋ฑ๋ก๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
updated_at |
ํผ๋๋ฐฑ ์ต์ข ์์ ์๊ฐ | ํ๊ฐ๋ ๋ถ์ ์ฌ์ ๊ฐ ์์ ๋ ์์ ์ ๊ธฐ๋กํ๋ค. |
deleted_at |
ํผ๋๋ฐฑ ๋ ผ๋ฆฌ ์ญ์ ์๊ฐ | ํผ๋๋ฐฑ ์ด๋ ฅ์ ๋ณด์กดํ๋ฉด์ ์ผ๋ฐ ์กฐํ์์ ์ ์ธํ๋ค. |
์ฌ์ฉ์ ํ ๋ช
์ด ํน์ ์ํ์ ๋ํด ํ๋์ ํ์ฌ ํ๊ฐ๋ง ๊ฐ์ง๋๋ก (user_id, product_id) ๋ณตํฉ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ๋ค. ์ฒ์์๋ ๋ ์ปฌ๋ผ์ ๋ณตํฉ PK๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ์ผ๋, ์ด ํ
์ด๋ธ์ ์ถ์ฒ ๊ฒฐ๊ณผ๋ณด๋ค ์ฐ๊ธฐ์ ์์ ์ด ์ค์ฌ์ด๊ณ JPA ๋ณตํฉํค ๊ตฌํ ๋ณต์ก๋์ ๋นํด ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค์ ์ด์ ์ด ํฌ์ง ์๋ค๊ณ ํ๋จํ์ฌ ๋๋ฆฌํค id๋ฅผ PK๋ก ์ฌ์ฉํ๋ค.
๊ธ์ ๊ณผ ๋ถ์ ๋ ์ํ๋ง ์กด์ฌํ๋ฏ๋ก feedback_type์ ENUM์ผ๋ก ์ ํํ๋ค. dislike_reason์ ๋ถ์ ํ๊ฐ์ผ ๋๋ง ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์ ํ๊ฐ์ผ๋ก ๋๋ฉฐ, ํด๋น ์กฐ๊ฑด์ ์ ํ๋ฆฌ์ผ์ด์
๊ฒ์ฆ ๋๋ CHECK ์ ์ฝ์กฐ๊ฑด์ผ๋ก ๋ณด์ํ ์ ์๋ค.
ํ๊ฐ ์์ค์ด ์ธ๋ถํ๋๋ฉด ๋ณ์ ์ด๋ ์ ์ ์ปฌ๋ผ์ ์ถ๊ฐํ ์ ์๋ค. ๋ถ์ ์ฌ์ ๊ฐ ํ์คํ๋๊ฑฐ๋ ๋ณต์ ์ ํ์ด ํ์ํด์ง๋ฉด ์ฌ์ ์ฝ๋ ํ ์ด๋ธ๊ณผ ํผ๋๋ฐฑ-์ฌ์ ์ฐ๊ฒฐ ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํ ์ ์๋ค.
๋
ผ๋ฆฌ ์ญ์ ๋ ํ๋ (user_id, product_id) ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ ์ ํ๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ํ์ ๋ค์ ํผ๋๋ฐฑ์ ๋จ๊ธธ ๋ ๊ธฐ์กด ํ์ ๋ณต๊ตฌยท๊ฐฑ์ ํ ์ง, ํผ๋๋ฐฑ ์ด๋ ฅ์ ๋ณ๋ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ ์ง ์ ์ฑ
์ ์ ํด์ผ ํ๋ค. ์ถ์ฒ ๋ชจ๋ธ ํ์ต ์ ์ต๋ช
์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ๋ด๋ถ ์ฌ์ฉ์ ID๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ๊ฐ์ธ์ ๋ณด ๋ฐ ๋์ ์ ์ฑ
๋ ํจ๊ป ์ ์ํด์ผ ํ๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ฌ์ฉ์ ์ฝ๊ด ๋์ |
| ์ค๋ช | ์ฌ์ฉ์๋ณ ์ฝ๊ด ๋ฐ ๊ฐ์ธ์ ๋ณดยทAI ํ์ฉ ๋ฑ์ ๋์ ์ํ์ ์ ์ฉ๋ ์ ์ฑ ๋ฒ์ , ๋์ ๋ฐ ์ฒ ํ ์์ ์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ฌ์ฉ์๊ฐ ์ด๋ค ๋์ ํญ๋ชฉ์ ๋ํด ์ด๋ค ์ ์ฑ ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ๋์ํ๋์ง ๊ด๋ฆฌํ๋ฉฐ, ๋์ ์ฒ ํ ์ฌ๋ถ ๋ฐ ์์ ์ ์ถ์ ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N user_consents, consent_types 1 : N user_consents
|
| PK | user_id |
| FK |
user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
user_id |
BIGINT |
NOT NULL |
PK, FK โ users.id
|
consent_id |
BIGINT |
NOT NULL |
PK, FK โ consent_types_id
|
policy_version |
VARCHAR(50) |
NOT NULL |
- |
agreed_at |
DATETIME(6) |
NULL |
- |
withdrawn_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
user_id |
์ฝ๊ด์ ๋์ํ ์ฌ์ฉ์์ ์๋ณ์ |
users.id์ ๋์ผํ ํ์
์ ์ฌ์ฉํ์ฌ FK ๊ด๊ณ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๋ค. |
consent_id |
์ฌ์ฉ์๊ฐ ๋์ํ๊ฑฐ๋ ๋์ํ์ง ์์ ํญ๋ชฉ์ ์๋ณ์ | ๋์ ์ข
๋ฅ๋ฅผ ๋ฌธ์์ด์ด๋ ENUM์ผ๋ก ์ง์ ์ ์ฅํ์ง ์๊ณ consent_types์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ์ฌ ๋์ ํญ๋ชฉ์ ์ถ๊ฐยท์์ ์ ๋์ํ๋ค. |
policy_version |
ํด๋น ๋์๊ฐ ์ด๋ฃจ์ด์ง ๋น์ ์ ์ฉ๋ ์ฝ๊ด ๋๋ ์ ์ฑ ์ ๋ฒ์ | ์ ์ฑ
๋ฒ์ ์ ์ซ์๋ฟ ์๋๋ผ v1.0, 2026-09-01 ๋ฑ ๋ค์ํ ํํ์ ์ฌ์ฉํ ์ ์์ด ๋ฌธ์์ด ํ์
์ผ๋ก ์ ์ฅํ๋ค. |
agreed_at |
์ฌ์ฉ์๊ฐ ํด๋น ์ ์ฑ ์ ๋์ํ ์๊ฐ | ๋์ํ์ง ์์ ์ํ๋ฅผ ํํํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ฉฐ, ๋ง์ดํฌ๋ก์ด ๋จ์๊น์ง ๊ธฐ๋กํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
withdrawn_at |
์ฌ์ฉ์๊ฐ ๊ธฐ์กด ๋์๋ฅผ ์ฒ ํํ ์๊ฐ | ์์ง ์ฒ ํํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ํํํ๊ธฐ ์ํด NULL์ ํ์ฉํ๋ค. |
created_at |
์ฌ์ฉ์ ๋์ ๋ ์ฝ๋๊ฐ ์ต์ด ์์ฑ๋ ์๊ฐ | ์ฌ์ฉ์ ๋์ ๋ ์ฝ๋๊ฐ ์ต์ด ์์ฑ๋ ์๊ฐ |
updated_at |
์ฌ์ฉ์ ๋์ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์๊ฐ | ์ฌ์ฉ์ ๋์ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์๊ฐ |
deleted_at |
๋์ ์ ๋ณด๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ ์๊ฐ | ๋์ ์ ๋ณด๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ ์๊ฐ |
user_consents๋ ์ฌ์ฉ์์ ๋์ ํญ๋ชฉ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฐ๊ฒฐ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ์๋ค. ํ๋์ ์ฌ์ฉ์๋ ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ฐฉ์นจ, AI ํ์ฉ ๋์, ๋ง์ผํ
์์ ๋์ ๋ฑ ์ฌ๋ฌ ์ข
๋ฅ์ ๋์ ํญ๋ชฉ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๋์ผํ ๋์ ํญ๋ชฉ ์ญ์ ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ์ ์ฉ๋๋ฏ๋ก users์ consent_types ์ฌ์ด์ ๊ด๊ณ๋ฅผ user_consents๊ฐ ์ฐ๊ฒฐํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ์๋ค.
์๋ก์ด ๋์ ํญ๋ชฉ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๊ธฐ์กด ํญ๋ชฉ์ ์ด๋ฆ, ์ค๋ช
, ํ์ ์ฌ๋ถ, ํ์ฑ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด ๋์ ์ข
๋ฅ๋ฅผ ENUM์ด๋ VARCHAR๋ก user_consents ํ
์ด๋ธ์ ์ง์ ์ ์ฅํ์ง ์๊ณ ๋ณ๋์ consent_types ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ์๋ค.
โ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ํ ์ด๋ธ ์คํค๋ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ณ๊ฒฝํ์ง ์๊ณ ๋์ ์ข ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
๊ธฐ๋ณธํค๋ ๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ์ถ๊ฐํ์ง ์๊ณ (user_id, consent_id) ๋ณตํฉ ๊ธฐ๋ณธํค๋ก ๊ตฌ์ฑํ์๋ค. ์ด ํ
์ด๋ธ์์ ํ๋์ ๋ ์ฝ๋๋ ๋ณธ์ง์ ์ผ๋ก ํน์ ์ฌ์ฉ์๊ฐ ํน์ ๋์ ํญ๋ชฉ์ ๋ํด ๊ฐ์ง๊ณ ์๋ ๋์ ์ํ๋ฅผ ์๋ฏธํ๋ฏ๋ก ๋ ์ปฌ๋ผ์ ์กฐํฉ ์์ฒด๊ฐ ๋น์ฆ๋์ค์ ์ผ๋ก ์์ฐ์ค๋ฌ์ด ์๋ณ์๊ฐ ๋๋ค. ๋ํ ๋์ผํ ์ฌ์ฉ์์ ๋์ผํ ๋์ ํญ๋ชฉ์ ์กฐํฉ์ด ์ค๋ณต ์์ฑ๋๋ ๊ฒ์ PK ์ ์ฝ์กฐ๊ฑด๋ง์ผ๋ก ๋ฐฉ์งํ ์ ์๋ค.
ํ์ฌ ํ ์ด๋ธ์ ๋ค๋ฅธ ํ ์ด๋ธ์์ ์ฐธ์กฐํ์ง ์๊ณ , ์ฌ์ฉ์์ ๋์ ํญ๋ชฉ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํํํ๋ ์ฐ๊ฒฐ ํ ์ด๋ธ์ด๋ผ ๋ณ๋ ๋๋ฆฌํค๋ฅผ ์ถ๊ฐํด ์ป๋ ์ด๋์ด ํฌ์ง ์๋ค๊ณ ํ๋จํ์ฌ ๋ณตํฉ ๊ธฐ๋ณธํค๋ฅผ ์ฌ์ฉํ์๋ค.
โ ORM ๋ณตํฉํค ๊ตฌ์ฑ ์ํ ์ถ๊ฐ ์์ ํ์
ํ์ฌ ๊ตฌ์กฐ์์๋ ์๋ก์ด ๋์ ์ข
๋ฅ๊ฐ ํ์ํ ๊ฒฝ์ฐ user_consents์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ consent_types ํ
์ด๋ธ์ ์๋ก์ด ๋์ ํญ๋ชฉ์ ์ถ๊ฐํ์ฌ ํ์ฅํ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ์ธ์ ๋ณด ์์งยท์ด์ฉ ๋์, AI ๋ฐ์ดํฐ ํ์ฉ ๋์, ์น๊ตฌ ์ทจํฅ ๊ณต์ ๋์, ๋ง์ผํ
์์ ๋์ ์ธ์ ์๋ก์ด ์ ์ฑ
์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์๋ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉ์ ๋๋ ๋์ ํญ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ์กฐํํ๋ ์์ฒญ์ด ์ฆ๊ฐํ๋๋ผ๋ ๋ณตํฉ PK์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ธ user_id๋ฅผ ํ์ฉํ์ฌ ํน์ ์ฌ์ฉ์์ ์ ์ฒด ๋์ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์๋ค. ๋ฐ๋๋ก ํน์ consent_id์ ๋์ํ ์ ์ฒด ์ฌ์ฉ์๋ฅผ ์กฐํํ๋ ํจํด์ด ๋น๋ฒํด์ง๋ ๊ฒฝ์ฐ consent_id ๋จ๋
๋ณด์กฐ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉํฅ์ผ๋ก ํ์ฅํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์๋ฆผ ์ข ๋ฅ |
| ์ค๋ช | ์๋น์ค์์ ์ฌ์ฉํ๋ ์๋ฆผ ์ข ๋ฅ์ ์ฌ์ฉ์ ์ค์ ๊ฐ๋ฅ ์ฌ๋ถ, ํ์ฑํ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ง์คํฐ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์๋ฆผ ์ข ๋ฅ๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๊ณ , ์ค์ ์์ฑ๋ ์๋ฆผ๊ณผ ์ฌ์ฉ์๋ณ ์๋ฆผ ์ค์ ์์ ๋์ผํ ์๋ฆผ ์ข ๋ฅ๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
notification_types 1 : N notifications, notification_types 1 : N user_notification_settings
|
| PK | id |
| FK | ์์ |
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
type |
VARCHAR(30) |
NOT NULL |
UK |
name |
VARCHAR(50) |
NOT NULL |
- |
is_configurable |
BOOLEAN |
NOT NULL; DEFAULT TRUE |
- |
is_activated |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
updated_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์๋ฆผ ์ข ๋ฅ๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ค๋ฅธ ํ
์ด๋ธ์์ FK๋ก ์ฐธ์กฐํ๊ธฐ ์ํ ๋๋ฆฌํค์ด๋ฉฐ, ํฅํ ์๋ฆผ ์ข
๋ฅ ์ฆ๊ฐ์ ์ถฉ๋ถํ ๋ฒ์๋ฅผ ํ๋ณดํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
type |
์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฆผ ์ข ๋ฅ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ฝ๋ |
CHAT, EVENT, FRIEND_JOIN ๋ฑ ์ฌ๋์ด ์ฝ์ ์ ์๊ณ ์ฝ๋ ๋ ๋ฒจ์์ ํ์ฉ ๊ฐ๋ฅํ ๋ฌธ์์ด ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด VARCHAR๋ฅผ ์ฌ์ฉํ๋ค. |
name |
์ฌ์ฉ์ ๋๋ ๊ด๋ฆฌ์ ํ๋ฉด์์ ์ฌ์ฉํ ์๋ฆผ ์ข ๋ฅ์ ์ด๋ฆ | ์๋ฆผ ์ข
๋ฅ์ ํ์๋ช
์ ์ ์ฅํ๋ฉฐ ๊ธธ์ด๊ฐ ์ ํ์ ์ธ ๋ฌธ์์ด ๋ฐ์ดํฐ์ด๋ฏ๋ก VARCHAR(50)์ ์ฌ์ฉํ๋ค. |
is_configurable |
์ฌ์ฉ์๊ฐ ํด๋น ์๋ฆผ์ ์์ ์ฌ๋ถ๋ฅผ ์ง์ ์ค์ ํ ์ ์๋์ง ์ฌ๋ถ | ์ค์ ๊ฐ๋ฅ/๋ถ๊ฐ๋ฅ์ ๋ ์ํ๋ง ํ์ํ๋ฏ๋ก BOOLEAN์ ์ฌ์ฉํ๋ค. |
is_activated |
ํด๋น ์๋ฆผ ์ข ๋ฅ๊ฐ ํ์ฌ ์๋น์ค์์ ํ์ฑํ๋์ด ์๋์ง ์ฌ๋ถ | ์๋ฆผ ์ข
๋ฅ์ ํ์ฑ/๋นํ์ฑ ๋ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด BOOLEAN์ ์ฌ์ฉํ๋ค. |
created_at |
์๋ฆผ ์ข ๋ฅ๊ฐ ์ต์ด ๋ฑ๋ก๋ ์๊ฐ | ์์ฑ ์์ ์ ์๋์ผ๋ก ๊ธฐ๋กํ๊ณ ์๋น์ค์ ์๊ฐ ์ปฌ๋ผ ๊ท์น๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
deleted_at |
์๋ฆผ ์ข ๋ฅ๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ๊ธฐ์กด ์๋ฆผ ๋ฐ์ดํฐ์์ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ ์งํ๋ฉด์ ์ฌ์ฉํ์ง ์๋ ์๋ฆผ ์ข ๋ฅ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
updated_at |
์๋ฆผ ์ข ๋ฅ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ์๊ฐ | ์์ ๋์ง ์์ ์ด๊ธฐ ์ํ๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ค. |
notification_types๋ ์๋น์ค์์ ์ฌ์ฉํ๋ ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ณ๋์ ํ
์ด๋ธ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ถ๋ฆฌํ์๋ค. ์๋ฆผ ์ข
๋ฅ๋ ์ค์ ์๋ฆผ์ ์ ์ฅํ๋ notifications์ ์ฌ์ฉ์์ ์๋ฆผ ์์ ์ค์ ์ ์ ์ฅํ๋ user_notification_settings์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ฏ๋ก, ๊ฐ ํ
์ด๋ธ์์ ์๋ฆผ ์ข
๋ฅ๋ฅผ ENUM์ด๋ VARCHAR๋ก ์ค๋ณต ๊ด๋ฆฌํ ๊ฒฝ์ฐ ์๋ฆผ ์ข
๋ฅ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ ๋ณ๊ฒฝ ์ง์ ์ด ๋ค์คํ ๋๋ค.
๋ฐ๋ผ์ ์๋ฆผ ์ข
๋ฅ๋ฅผ notification_types์์ ์ค์ ๊ด๋ฆฌํ๊ณ ๋ค๋ฅธ ํ
์ด๋ธ์์๋ notification_type_id๋ฅผ ํตํด ์ฐธ์กฐํ๋๋ก ์ค๊ณํ์๋ค. ์ด๋ฅผ ํตํด ์๋ก์ด ์๋ฆผ ์ข
๋ฅ ์ถ๊ฐ ์ notification_types์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ ์ ์์ผ๋ฉฐ, ์๋ฆผ ์ด๋ฆ์ด๋ ์ค์ ๊ฐ๋ฅ ์ฌ๋ถ์ ๊ฐ์ ์์ฑ ์ญ์ ํ๋์ ๊ด๋ฆฌ ์ง์ ์์ ๋ณ๊ฒฝํ ์ ์๋ค.
notifications์ user_notification_settings์์๋ ์๋ฆผ ์ข
๋ฅ์ ์ธ๋ถ ์ ๋ณด ์์ฒด๋ณด๋ค ํด๋น ์๋ฆผ ์ข
๋ฅ๋ฅผ ์๋ณํ๋ ๊ฒ์ด ์ค์ํ๋ฏ๋ก ์ซ์ํ ์๋ณ์๋ฅผ FK๋ก ์ฌ์ฉํ๋ ๊ตฌ์กฐ๊ฐ ์ ํฉํ๋ค. notifications์์๋ notification_type_id๊ฐ notification_types.id๋ฅผ ์ฐธ์กฐํ๋ฉฐ, user_notification_settings ์ญ์ ๋์ผํ ์๋ฆผ ์ข
๋ฅ ์๋ณ์๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ์๋ฆผ๊ณผ ์ฌ์ฉ์ ์ค์ ๊ฐ ๋์ผํ ๋ถ๋ฅ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
code๋ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์์ ์๋ฆผ ์ข
๋ฅ๋ฅผ ์๋ณํ๋ ๊ฐ์ด๋ฏ๋ก ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ฑ๋ก๋์ง ์๋๋ก UNIQUE ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.
์๋ก์ด ์๋ฆผ ์ข
๋ฅ๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ notifications๋ user_notification_settings์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ notification_types์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๊ธฐ์กด ์ฑํ
, ์ด๋ฒคํธ, ์น๊ตฌ ๊ฐ์
์๋ฆผ ์ธ์ ์ ๋ฌผ ์ถ์ฒ, ์์คํ
๊ณต์ง ๋ฑ์ ์๋ฆผ์ด ์ถ๊ฐ ๋๋๋ผ๋ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์๋ค.
์๋ฆผ ์ข
๋ฅ๋ณ ์ ์ฑ
์ด ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ notification_types์ ์ถ๊ฐ ์์ฑ์ ํ์ฅํ ์ ์๋ค. ์๋ฅผ ๋ค์ด default_enabled๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ ๊ธฐ๋ณธ๊ฐ์ ์ข
๋ฅ๋ณ๋ก ๊ด๋ฆฌํ๊ฑฐ๋, category, priority, delivery_channel ๋ฑ์ ์์ฑ์ ์ถ๊ฐํ์ฌ ์๋ฆผ ๋ถ๋ฅ์ ์ ๋ฌ ์ ์ฑ
์ ๊ด๋ฆฌํ ์ ์๋ค.
ํฅํ ํ๋์ ์๋ฆผ ์ข
๋ฅ๊ฐ Push, Email, SMS ๋ฑ ์ฌ๋ฌ ์ ๋ฌ ์ฑ๋์ ์ง์ํ๊ณ ์ฌ์ฉ์๋ณ๋ก ์ฑ๋๋ง๋ค ์์ ์ฌ๋ถ๋ฅผ ์ค์ ํด์ผ ํ๋ค๋ฉด ๋ณ๋์ notification_channels ํ
์ด๋ธ์ ์ถ๊ฐํ๊ณ , notification_types์ ์ฑ๋ ๊ฐ ๊ด๊ณ๋ฅผ ๋ณ๋์ ์ฐ๊ฒฐ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ฌ์ฉ์ ์๋ฆผ ์ค์ |
| ์ค๋ช | ์ฌ์ฉ์๋ณ ์๋ฆผ ์ข ๋ฅ์ ๋ํ ์์ ํ์ฑํ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ฌ์ฉ์๊ฐ ๊ฐ ์๋ฆผ ์ข ๋ฅ๋ณ๋ก ์๋ฆผ ์์ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์๋๋ก ํ๋ฉฐ, ์๋ฆผ ๋ฐ์ก ์ ํด๋น ์ฌ์ฉ์์ ์ค์ ๊ฐ์ ์กฐํํ์ฌ ๋ฐ์ก ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ฐ ์ฌ์ฉํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N user_notification_settings, notification_types 1 : N user_notification_settings
|
| PK | (user_id, notification_type_id) |
| FK |
user_id โ users.id, notification_type_id โ notification_types.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
user_id |
BIGINT |
NOT NULL |
PK, FK โ users.id
|
notification_type_id |
BIGINT |
NOT NULL |
PK, FK โ notification_types.id
|
is_enabled |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
user_id |
์๋ฆผ ์ค์ ์ ๋ณด์ ํ ์ฌ์ฉ์์ ์๋ณ์ |
users.id์ ๋์ผํ ํ์
์ ์ฌ์ฉํ์ฌ FK ๊ด๊ณ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๋ค. |
notification_type_id |
์ฌ์ฉ์๊ฐ ์์ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์๋ฆผ ์ข ๋ฅ์ ์๋ณ์ | ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ฌธ์์ด์ด๋ ENUM์ผ๋ก ์ง์ ์ ์ฅํ์ง ์๊ณ notification_types์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ์ฌ ์๋ฆผ ์ข
๋ฅ ๋ณ๊ฒฝ ๋ฐ ํ์ฅ์ ๋์ํ๋ค. |
is_enabled |
ํด๋น ์๋ฆผ ์ข ๋ฅ์ ๋ํด ์ฌ์ฉ์๊ฐ ์๋ฆผ ์์ ์ ํ์ฉํ๋์ง ์ฌ๋ถ | ์์ ํ์ฉ/๋นํ์ฉ์ ๋ ์ํ๋ง ํ์ํ๋ฏ๋ก BOOLEAN์ ์ฌ์ฉํ๋ค. |
created_at |
์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ด ์ต์ด ์์ฑ๋ ์๊ฐ | ์์ฑ ์์ ์ ์๋ ๊ธฐ๋กํ๊ณ ๋ค๋ฅธ ์๊ฐ ์ปฌ๋ผ๊ณผ ํ์
๋ฐ ์ ๋ฐ๋๋ฅผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ด ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์๊ฐ | ์ค์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ง ์์ ์ด๊ธฐ ์ํ์ ์์ ๋ ์ํ๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ค. |
deleted_at |
์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ญ์ ์์ด ๋นํ์ฑ ๋๋ ์ญ์ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
user_notification_settings๋ ์ฌ์ฉ์์ ์๋ฆผ ์ข
๋ฅ ๊ฐ์ ์ค์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฐ๊ฒฐ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ์๋ค. ํ๋์ ์ฌ์ฉ์๋ ์ฑํ
, ์ด๋ฒคํธ, ์น๊ตฌ ๊ฐ์
๋ฑ ์ฌ๋ฌ ์ข
๋ฅ์ ์๋ฆผ ์ค์ ์ ๊ฐ์ง ์ ์๊ณ , ํ๋์ ์๋ฆผ ์ข
๋ฅ ์ญ์ ์ฌ๋ฌ ์ฌ์ฉ์์ ์ค์ ๋์์ผ๋ก ์ฌ์ฉ๋๋ฏ๋ก users์ notification_types ์ฌ์ด์ N:M ๊ด๊ณ๋ฅผ user_notification_settings๊ฐ ์ฐ๊ฒฐํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ์๋ค.
๊ธฐ๋ณธํค๋ ๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ๋์ง ์๊ณ (user_id, notification_type_id) ๋ณตํฉ ๊ธฐ๋ณธํค๋ก ๊ตฌ์ฑํ์๋ค.
ํ ์ฌ์ฉ์๊ฐ ๋์ผํ ์๋ฆผ ์ข
๋ฅ์ ๋ํด ๋ ๊ฐ ์ด์์ ์ค์ ๊ฐ์ ๊ฐ์ง๋ ๊ฒ์ ๋น์ฆ๋์ค์ ์ผ๋ก ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก (user_id, notification_type_id) ์กฐํฉ์ PK๋ก ์ฌ์ฉํด ๋์ผํ ์ฌ์ฉ์-์๋ฆผ ์ข
๋ฅ ์กฐํฉ์ ์ค๋ณต ์์ฑ์ DB ์์ค์์ ๋ฐฉ์งํ๋๋ก ํ์๋ค.
๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋์ผํ ์ฌ์ฉ์์ ๋์ผํ ์๋ฆผ ์ข
๋ฅ์ ๋ํ ์ค๋ณต ์ค์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด (user_id, notification_type_id)์ UNIQUE ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํด์ผ ํ๋ค. ๋ฐ๋ผ์ ํ์ฌ์ฒ๋ผ ๋จ์ํ ์ฐ๊ฒฐ ๊ด๊ณ์ ์ค์ ๊ฐ๋ง ๊ด๋ฆฌํ๋ ํ
์ด๋ธ์์๋ ๋ณ๋์ ๋๋ฆฌํค๋ฅผ ์ถ๊ฐํ์ ๊ฒฝ์ฐ ๊ฐ์ ธ๊ฐ ์ ์๋ ์ด์ ์ด ํฌ์ง ์๋ค๊ณ ํ๋จํด ๋ณตํฉ ๊ธฐ๋ณธํค๋ฅผ ์ฌ์ฉํ์๋ค.
๋ค๋ง JPA ๋ฑ์ ORM์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ณตํฉํค๋ฅผ ํํํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ๋งคํ์ด ํ์ํ๋ค.
โ ๋จ์ผ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ ์ํฐํฐ๋ณด๋ค ๊ตฌํ ๋ฐ ํ ์คํธ๊ฐ ๋ค์ ๋ณต์กํด์ง ์ ์๋ค๋ ํธ๋ ์ด๋์คํ๊ฐ ์กด์ฌํ๋ค.
์๋ก์ด ์๋ฆผ ์ข
๋ฅ๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ user_notification_settings ํ
์ด๋ธ์ ์ปฌ๋ผ์ด๋ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ notification_types์ ์๋ก์ด ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ฑ๋กํ ๋ค ์ฌ์ฉ์๋ณ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์๋ค.
ํ์ฌ๋ ์๋ฆผ ์ข
๋ฅ๋ณ ํ์ฑํ ์ฌ๋ถ๋ง is_enabled ํ๋๋ก ๊ด๋ฆฌํ์ง๋ง, ํฅํ Push, Email, SMS, ์นด์นด์คํก ๋ฑ ์ฌ๋ฌ ์๋ฆผ ์ ๋ฌ ์ฑ๋์ ์ฌ์ฉ์๊ฐ ๊ฐ๊ฐ ์ค์ ํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ๋ฐ์ํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ notification_channels์ ๊ฐ์ ๋ณ๋์ ์ฑ๋ ํ
์ด๋ธ์ ์ถ๊ฐํ๊ณ (user_id, notification_type_id, channel_id) ๋จ์๋ก ์ค์ ์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ํ์ฅํ ์ ์๋ค.
ํ์ฌ ๋ณตํฉ PK์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ด user_id์ด๋ฏ๋ก ํน์ ์ฌ์ฉ์์ ์ ์ฒด ์๋ฆผ ์ค์ ์ ์กฐํํ๋ ํจํด์์๋ PK ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ง์ดํ์ด์ง๋ ์๋ฆผ ์ค์ ํ๋ฉด์์ ํน์ ์ฌ์ฉ์์ ๋ชจ๋ ์๋ฆผ ์ค์ ์ ์กฐํํ๋ ์ฃผ์ ํจํด์ ์ ํฉํ๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์น๊ตฌ ๊ด๊ณ |
| ์ค๋ช | ์๋น์ค ์ฌ์ฉ์ ๊ฐ์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ฌ์ฉ์ ๊ด์ ์์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ํน์ ์ฌ์ฉ์๊ฐ ๋ฑ๋กํ ์น๊ตฌ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์น๊ตฌ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ฌ๋ถ ๋ฐ ์น๊ตฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์ด๋ฒคํธยท์ถ์ฒ ๋ฑ์ ๊ธฐ๋ฅ์์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์๋ณํ ์ ์๋๋ก ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N friends (owner_user_id ๊ธฐ์ค),users 1 : N friends (friend_user_id ๊ธฐ์ค), friends 1 : N events
|
| PK | id |
| FK |
owner_user_id โ users.id, friend_user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
owner_user_id |
BIGINT |
NOT NULL |
FK โ users.id , UK |
friend_user_id |
BIGINT |
NOT NULL |
FK โ users.id ,UK |
is_favorite |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์น๊ตฌ ๊ด๊ณ๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ์น๊ตฌ ๊ด๊ณ ์์ฒด๋ฅผ ๋ค๋ฅธ ํ
์ด๋ธ์์ ๋
๋ฆฝ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋๋ก ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ค๋ฅธ ์ฃผ์ ์๋ณ์์ ํ์
์ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
owner_user_id |
์น๊ตฌ ๊ด๊ณ๋ฅผ ์์ ํ๋ ์ฌ์ฉ์์ ์๋ณ์ |
users.id๋ฅผ ์ฐธ์กฐํ๋ FK์ด๋ฏ๋ก ๋์ผํ BIGINT ํ์
์ ์ฌ์ฉํ๋ค. |
friend_user_id |
owner_user_id ์ฌ์ฉ์๊ฐ ์น๊ตฌ๋ก ๋ฑ๋กํ ์ฌ์ฉ์์ ์๋ณ์ |
users.id๋ฅผ ์ฐธ์กฐํ๋ FK์ด๋ฏ๋ก ๋์ผํ BIGINT ํ์
์ ์ฌ์ฉํ๋ค. |
is_favorite |
ํด๋น ์น๊ตฌ๋ฅผ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ก ์ง์ ํ๋์ง ์ฌ๋ถ | ์ฆ๊ฒจ์ฐพ๊ธฐ/์ผ๋ฐ์ ๋ ๊ฐ์ง ์ํ๋ง ํ์ํ๋ฏ๋ก BOOLEAN์ ์ฌ์ฉํ๋ฉฐ, ์น๊ตฌ ๋ฑ๋ก ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ฐ ์น๊ตฌ๊ฐ ๋๋๋ก FALSE๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ค. |
friends๋ ์ฌ์ฉ์ ๊ฐ์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด users์ ๋ณ๋์ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ์๋ค. ํ๋์ ์ฌ์ฉ์๋ ์ฌ๋ฌ ์ฌ์ฉ์๋ฅผ ์น๊ตฌ๋ก ๋ฑ๋กํ ์ ์๊ณ , ํ๋์ ์ฌ์ฉ์ ์ญ์ ์ฌ๋ฌ ์ฌ์ฉ์์ ์น๊ตฌ๋ก ๋ฑ๋ก๋ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ๊ฐ ์๊ธฐ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ๋ณ๋์ ๊ด๊ณ ํ
์ด๋ธ์ ํตํด ํํํ์๋ค.
๊ธฐ๋ณธํค๋ id ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์น๊ตฌ ๊ด๊ณ ์์ฒด๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ๋
๋ฆฝ์ ์ผ๋ก ์ฐธ์กฐ๋๋ ๋์์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.id ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํ
์ด๋ธ์์๋ friend_id ํ๋๋ง์ผ๋ก ํน์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฏ๋ก ์น๊ตฌ๋ฅผ ๋์์ผ๋ก ์ด๋ฒคํธ, ์ ๋ฌผ ์ถ์ฒ, ์๋ฆผ ๋ฑ์ ๊ฒฝ์ฐ ๊ด๊ณ ์๋ณ์๋ฅผ ํ๋์ ๊ฐ์ผ๋ก ์ ๋ฌํ๊ณ ์ฐธ์กฐํ ์ ์๋ค.
(owner_user_id, friend_user_id)์ ๋ณตํฉ UNIQUE ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ์ค๋ณต ์น๊ตฌ ๊ด๊ณ๋ฅผ DB ์์ค์์ ๋ฐฉ์งํ๋ค.
๋์ผํ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ์ฌ์ฉ์์ ์น๊ตฌ๋ก ๋ฑ๋ก๋์ด ์๋๋ผ๋ ๊ฐ ์ฌ์ฉ์๊ฐ ํด๋น ์น๊ตฌ๋ฅผ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ก ์ง์ ํ๋์ง๋ ์๋ก ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ is_favorite๋ ์น๊ตฌ ๊ด๊ณ์ ์ข
์๋๋ ์ฌ์ฉ์๋ณ ์์ฑ์ด๋ฏ๋ก users๊ฐ ์๋ friends์ ์ ์ฅํ์๋ค.
์น๊ตฌ ๊ด๊ณ์ ์ถ๊ฐ์ ์ธ ์ฌ์ฉ์๋ณ ์ค์ ์ด ํ์ํด์ง ๊ฒฝ์ฐ friends ํ
์ด๋ธ์ ์์ฑ์ ์ถ๊ฐํ์ฌ ํ์ฅํ ์ ์๋ค.
ํ์ฌ id๋ฅผ ๋
๋ฆฝ์ ์ธ ์๋ณ์๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํฅํ events๋ฟ ์๋๋ผ ์น๊ตฌ ๊ธฐ๋ฐ ์ ๋ฌผ ์ถ์ฒ, ์น๊ตฌ๋ณ ์ทจํฅ ์ ๋ณด, ์๋ฆผ ๋ฑ์ ๋ค๋ฅธ ํ
์ด๋ธ์์๋ friend_id ํ๋๋ฅผ ํตํด ํน์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ๋ฐ๋ผ์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ ๋๋ฉ์ธ์ด ์ฆ๊ฐํ๋๋ผ๋ ๋ณตํฉ FK๋ฅผ ์ฌ๋ฌ ํ
์ด๋ธ์ ๋ฐ๋ณตํด์ ๊ตฌ์ฑํ์ง ์๊ณ ๊ด๊ณ๋ฅผ ํ์ฅํ ์ ์๋ค.
ํน์ ์ฌ์ฉ์์ ์น๊ตฌ ๋ชฉ๋ก ์กฐํ๊ฐ ์ฃผ์ ์กฐํ ํจํด์ด๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ ๊ฒฝ์ฐ owner_user_id๋ฅผ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋ค.
์ฆ๊ฒจ์ฐพ๊ธฐ ์น๊ตฌ ์กฐํ๊ฐ ๋น๋ฒํ๋ค๋ฉด (owner_user_id, is_favorite) ํํ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ด๋ฒคํธ |
| ์ค๋ช | ์ฌ์ฉ์ ๋๋ ์น๊ตฌ์ ๊ด๋ จ๋ ์์ผ, ๊ธฐ๋ ์ผ, ์ผ์ , ๊ณตํด์ผ ๋ฑ์ ์ด๋ฒคํธ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ฌ์ฉ์ ๋ฐ ์น๊ตฌ์ ๊ด๋ จ๋ ์ผ์ ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ฆผ ๋ฐ ์ ๋ฌผ ์ถ์ฒ ๋ฑ์ ๊ธฐ๋ฅ์์ ๊ธฐ์ค ๋ฐ์ดํฐ๋ก ํ์ฉํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N events, friends 1 : N events, events 1 : N notifications
|
| PK | id |
| FK |
user_id โ users.id, friend_id โ friends.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NULL |
FK โ users.id
|
friend_id |
BIGINT |
NULL |
FK โ friends.id
|
source_type |
VARCHAR(30) |
NOT NULL |
- |
event_type |
VARCHAR(30) |
NOT NULL |
- |
external_event_id |
VARCHAR(255) |
NULL |
- |
title |
VARCHAR(255) |
NOT NULL |
- |
event_date |
DATE |
NOT NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์ด๋ฒคํธ๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ์ด๋ฒคํธ๊ฐ ์๋ฆผ ๋ฑ ๋ค๋ฅธ ํ
์ด๋ธ์์ ๋
๋ฆฝ์ ์ผ๋ก ์ฐธ์กฐ๋๋ ์ํฐํฐ์ด๋ฏ๋ก ๋จ์ผ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด ์ฃผ์ ์๋ณ์ ํ์ ๊ณผ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
user_id |
์ด๋ฒคํธ์ ์ง์ ์ฐ๊ด๋ ์ฌ์ฉ์์ ์๋ณ์ | ์ฌ์ฉ์ ๋ณธ์ธ์ ์ผ์ ๋ฑ ์ฌ์ฉ์ ๊ธฐ๋ฐ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ์ฌ์ฉ์ ๋ณธ์ธ์๊ฒ ์ง์ ๊ท์๋๋ ๊ฒ์ ์๋๋ฏ๋ก NULL์ ํ์ฉํ๋ค. |
friend_id |
์ด๋ฒคํธ์ ์ฐ๊ด๋ ์น๊ตฌ ๊ด๊ณ์ ์๋ณ์ | ์น๊ตฌ ์์ผ์ด๋ ์น๊ตฌ ๊ด๋ จ ๊ธฐ๋
์ผ ๋ฑ ์น๊ตฌ ๊ธฐ์ค ์ด๋ฒคํธ๋ฅผ ์๋ณํ๊ธฐ ์ํด friends.id๋ฅผ ์ฐธ์กฐํ๋ค.์ฌ์ฉ์ ๋ณธ์ธ ์ด๋ฒคํธ์์๋ ํ์ํ์ง ์์ ์ ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ค. |
source_type |
์ด๋ฒคํธ๊ฐ ์์ฑ๋ ์ถ์ฒ๋ฅผ ๋ํ๋ด๋ ์ฝ๋ | ์ด๋ฒคํธ ์ถ์ฒ๊ฐ ์๋น์ค ์ด์ ๊ณผ์ ์์ ์ถ๊ฐยท๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก DB ENUM ๋์ VARCHAR์ ์ฝ๋ ๊ฐ์ ์ ์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ Enum ๋๋ ์์๋ก ๊ด๋ฆฌํ๋ค. |
event_type |
์ด๋ฒคํธ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ ์ฝ๋ | ์์ผ, ๊ธฐ๋
์ผ, ์ผ์ , ๊ณตํด์ผ ๋ฑ ์ด๋ฒคํธ ์ข
๋ฅ๊ฐ ํฅํ ํ์ฅ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ฌ DB ENUM ๋์ VARCHAR + ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ Enum ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ค. |
external_event_id |
์ธ๋ถ ์บ๋ฆฐ๋ ๋๋ ์ธ๋ถ ์๋น์ค์์ ์ด๋ฒคํธ๋ฅผ ์๋ณํ๊ธฐ ์ํ ID | ์ธ๋ถ ์๋น์ค๋ณ ์๋ณ์์ ํ์๊ณผ ๊ธธ์ด๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ณ ๊ธธ์ด ๋ฌธ์์ด ํ์
์ ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด๋ถ์์ ์ง์ ์์ฑ๋ ์ด๋ฒคํธ์๋ ํ์ํ์ง ์์ ์ ์์ด NULL์ ํ์ฉํ๋ค. |
title |
์ด๋ฒคํธ์ ์ ๋ชฉ | ์ผ์ ๋ฐ ์ด๋ฒคํธ ์ ๋ชฉ์ ๋น๊ต์ ๊ธธ์ด๊ฐ ์ ํ๋ ๋ฌธ์์ด ๋ฐ์ดํฐ์ด๋ฏ๋ก VARCHAR(255)๋ฅผ ์ฌ์ฉํ๋ค. |
event_date |
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๋ ์ง | ํ์ฌ ์ด๋ฒคํธ ๊ธฐ๋ฅ์์๋ ์๊ฐ๋ณด๋ค ๋ ์ง ์์ฒด๊ฐ ์ค์ํ๋ฏ๋ก ์๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ์ง ์๋ DATE ํ์
์ ์ฌ์ฉํ๋ค. |
created_at |
์ด๋ฒคํธ ๋ฐ์ดํฐ๊ฐ ์ต์ด ์์ฑ๋ ์๊ฐ | ์์ฑ ์์ ์ ์๋ ๊ธฐ๋กํ๊ณ ์๋น์ค์ ์๊ฐ ์ปฌ๋ผ ๊ท์น์ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
์ด๋ฒคํธ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ์๊ฐ | ์์ง ์์ ๋์ง ์์ ์ด๊ธฐ ์ํ๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ค. |
deleted_at |
์ด๋ฒคํธ๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ๊ธฐ์กด ์๋ฆผ ๋ฐ ์ธ๋ถ ์ฐ๋ ๋ฐ์ดํฐ์์ ๊ด๊ณ๋ฅผ ๋ณด์กดํ๋ฉด์ ์ด๋ฒคํธ๋ฅผ ๋นํ์ฑํํ ์ ์๋๋ก Soft Delete ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ค. |
events๋ ์ฌ์ฉ์ ๋ฐ ์น๊ตฌ์ ๊ด๋ จ๋ ์์ผ, ๊ธฐ๋
์ผ, ์ผ์ , ๊ณตํด์ผ ๋ฑ์ ์ด๋ฒคํธ๋ฅผ ํตํฉ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ
์ด๋ธ์ด๋ค. ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ ์ดํ ์๋ฆผ ์์ฑ์ด๋ ์ ๋ฌผ ์ถ์ฒ ๋ฑ์ ๊ธฐ๋ฅ์์ ๊ธฐ์ค ๋ฐ์ดํฐ๋ก ํ์ฉ๋ ์ ์์ผ๋ฏ๋ก ๋
๋ฆฝ์ ์ธ id๋ฅผ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉํ๋ค.
user_id์ friend_id๋ ์ด๋ฒคํธ์ ๋์ ๋๋ ๊ท์ ์ฃผ์ฒด๋ฅผ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ฌ์ฉ์ ๋ณธ์ธ์ ์ผ์ ์ user_id๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์น๊ตฌ์ ์์ผ์ด๋ ๊ธฐ๋
์ผ ๋ฑ ์น๊ตฌ ๊ด๊ณ์ ์ข
์๋ ์ด๋ฒคํธ๋ friend_id๋ฅผ ํตํด ๊ด๋ฆฌํ ์ ์๋๋ก ๊ตฌ์ฑํ์๋ค. ์ด๋ฒคํธ์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ ์ปฌ๋ผ ์ค ํ๋๋ง ํ์ํ ์ ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ค.
ํ์ฌ source_type๊ณผ event_type์ ๋ณ๋์ ๋ณต์กํ ๋ฉํ๋ฐ์ดํฐ๋ ๋น์ฆ๋์ค ์์ฑ์ ๊ฐ์ง๋ ๋
๋ฆฝ์ ์ธ ์ํฐํฐ๋ผ๊ธฐ๋ณด๋ค ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ก์ง์ ๊ตฌ๋ถํ๊ธฐ ์ํ ๋จ์ํ ๋ถ๋ฅ ์ฝ๋์ ์ฑ๊ฒฉ์ด ๊ฐํด ๋ณ๋ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ ๊ฒฝ์ฐ ๋จ์ํ ์ฝ๋ ๊ฐ ๊ด๋ฆฌ์ ๋นํด ํ
์ด๋ธ ๊ตฌ์กฐ์ ๊ตฌํ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๋ค๊ณ ํ๋จํ์๋ค.
๋ฐ๋ผ์ ํ์ฌ ์ค๊ณ์์๋ source_type๊ณผ event_type์ VARCHAR ์ปฌ๋ผ์ ์ ์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์ Enum์ผ๋ก ํ์ฉ ๊ฐ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ์ ํํ์๋ค.
external_event_id๋ ์ธ๋ถ ์บ๋ฆฐ๋ ๋ฑ ์ธ๋ถ ์๋น์ค์์ ์ ๊ณตํ๋ ์ด๋ฒคํธ์ ๋ด๋ถ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ธ๋ถ ์๋น์ค๋ง๋ค ID ํ์์ด ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ซ์ ํ์
์ผ๋ก ์ ํํ์ง ์๊ณ ๋ฌธ์์ด ํ์
์ ์ฌ์ฉํ๋ค.
์๋ก์ด ์ด๋ฒคํธ ์ถ์ฒ ๋๋ ์ด๋ฒคํธ ์ข ๋ฅ๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ DB ์คํค๋ง ๋ณ๊ฒฝ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ Enum์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์๋ค.
์ด ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ DB Migration์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฏ๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ ์์๋ ์๋์ ์ผ๋ก ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค. ์ ๊ท ์ด๋ฒคํธ ํ์ ์ ๋จผ์ ์ธ์ํ ์ ์๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ฐฐํฌํ ๋ค ํด๋น ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ ์์๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
์ด๋ฒคํธ ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ๊ณ ํน์ ์ฌ์ฉ์์ ์ผ์ ๋๋ ํน์ ๋ ์ง ๋ฒ์์ ์ด๋ฒคํธ ์กฐํ๊ฐ ๋น๋ฒํด์ง ๊ฒฝ์ฐ (user_id, event_date), (friend_id, event_date) ๋ฑ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ค์ ์กฐํ ํจํด๊ณผ ์คํ ๊ณํ์ ๊ธฐ์ค์ผ๋ก ์ถ๊ฐํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์๋ฆผ ์ข ๋ฅ |
| ์ค๋ช | ์๋น์ค์์ ์ฌ์ฉํ๋ ์๋ฆผ ์ ํ๊ณผ ๊ฐ ์๋ฆผ์ ์ค์ ๊ฐ๋ฅ ์ฌ๋ถ ๋ฐ ํ์ฑ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ง์คํฐ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์๋ฆผ ์ข ๋ฅ๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๊ณ , ์ค์ ์๋ฆผ ๋ฐ์ดํฐ์ ์ฌ์ฉ์๋ณ ์๋ฆผ ์ค์ ์์ ๋์ผํ ์๋ฆผ ์ ํ์ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
notification_types 1 : N notifications, notification_types 1 : N user_notification_settings
|
| PK | id |
| FK | ์์ |
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
type |
VARCHAR(30) |
NOT NULL |
UK |
name |
VARCHAR(50) |
NOT NULL |
- |
is_configurable |
BOOLEAN |
NOT NULL; DEFAULT TRUE |
- |
is_activated |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์๋ฆผ ์ข ๋ฅ๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ๋ค๋ฅธ ํ
์ด๋ธ์์ ์๋ฆผ ์ข
๋ฅ๋ฅผ ์์ ์ ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ์ํ ๋๋ฆฌํค๋ก ์ฌ์ฉํ๋ฉฐ, ์๋น์ค ๋ด ์ฃผ์ ์๋ณ์ ํ์
๊ณผ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
type |
์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฆผ ์ข ๋ฅ๋ฅผ ์๋ณํ๊ธฐ ์ํ ํ์ ์ฝ๋ | ์๋ฆผ ์ข
๋ฅ๋ ์ด์ ์ค ์ถ๊ฐยท๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก DB ENUM ๋์ VARCHAR๋ก ์ ์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ Enum์ผ๋ก ํ์ฉ ๊ฐ์ ๊ด๋ฆฌํ๋ค. |
name |
ํ๋ฉด ๋๋ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ์์ ํ์ํ ์๋ฆผ ์ข ๋ฅ์ ์ด๋ฆ | ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๋ช
์นญ์ ๋ด๋ถ ์๋ณ์ฉ ํ์
๊ณผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ฉฐ, ๋น๊ต์ ์งง์ ๋ฌธ์์ด์ด๋ฏ๋ก VARCHAR(50)์ ์ฌ์ฉํ๋ค. |
is_configurable |
์ฌ์ฉ์๊ฐ ํด๋น ์๋ฆผ์ ์์ ์ฌ๋ถ๋ฅผ ์ง์ ์ค์ ํ ์ ์๋์ง ์ฌ๋ถ | ์ฌ์ฉ์ ์ค์ ๊ฐ๋ฅ/๋ถ๊ฐ๋ฅ ๋ ์ํ๋ง ํ์ํ๋ฏ๋ก BOOLEAN์ ์ฌ์ฉํ๋ค.ํฅํ ํ์ ์๋ฆผ ์ ํ์ ์ง์ํ๊ธฐ ์ํด ๋ณ๋ ์ ์ฑ ์ปฌ๋ผ์ผ๋ก ๋ถ๋ฆฌํ๋ค. |
is_activated |
ํด๋น ์๋ฆผ ์ข ๋ฅ๊ฐ ํ์ฌ ์๋น์ค์์ ํ์ฑํ๋์ด ์๋์ง ์ฌ๋ถ | ํ์ฑ/๋นํ์ฑ ๋ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด BOOLEAN์ ์ฌ์ฉํ๋ฉฐ, ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ์ง ์๊ณ ์ด์ ์ํ๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ค. |
created_at |
์๋ฆผ ์ข ๋ฅ๊ฐ ์ต์ด ์์ฑ๋ ์๊ฐ | ์์ฑ ์์ ์ ์๋ ๊ธฐ๋กํ๊ณ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ๊ท์น๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
์๋ฆผ ์ข ๋ฅ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ์๊ฐ | ์์ ์ด๋ ฅ์ด ์๋ ์ด๊ธฐ ์ํ๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ค. |
deleted_at |
์๋ฆผ ์ข ๋ฅ๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ๊ธฐ์กด ์๋ฆผ ๋ฐ ์ฌ์ฉ์ ์ค์ ๋ฐ์ดํฐ์์ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ ์งํ๋ฉด์ ์ ๊ท ์ฌ์ฉ๋ง ์ค๋จํ ์ ์๋๋ก Soft Delete ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ค. |
notification_types๋ ์๋น์ค์์ ์ฌ์ฉ๋๋ ์๋ฆผ ์ข
๋ฅ๋ฅผ ํ๋์ ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ง์คํฐ ํ
์ด๋ธ์ด๋ค. ์๋ฆผ ์ข
๋ฅ๋ ์ค์ ๋ฐ์ก๋ ์๋ฆผ์ ์ ์ฅํ๋ notifications์ ์ฌ์ฉ์๋ณ ์๋ฆผ ์์ ์ค์ ์ ๊ด๋ฆฌํ๋ user_notification_settings์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ฏ๋ก, ๊ฐ ํ
์ด๋ธ์์ ํ๋์ ๊ธฐ์ค ํ
์ด๋ธ์ ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑํ๋ค.
์๋ฆผ ์ข ๋ฅ๋ ์๋น์ค ์ด์ ๊ณผ์ ์์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ฉด์ ํจ๊ป ์ฆ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ์ด๋ผ๊ณ ํ๋จํ๋ค.
๋ฐ๋ผ์ ์๋ฆผ ์ข
๋ฅ๋ DB ์คํค๋ง์ ๊ฐํ๊ฒ ๊ฒฐํฉ์ํค๊ธฐ๋ณด๋ค VARCHAR๋ก ์ ์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๋ Enum์ ํตํด ํ์ฉ๋๋ ๊ฐ์ ๊ด๋ฆฌํ๋๋ก ์ค๊ณํ๋ค.
notification_types๋ฅผ ๋ณ๋ ํ
์ด๋ธ๋ก ๋ ์ด์ ๋ ๋จ์ํ ์๋ฆผ ํ์
๋ฌธ์์ด๋ง ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ชฉ์ ์ด ์๋๋ค. ์๋ฆผ ์ข
๋ฅ๋ณ๋ก name, is_configurable, is_activated์ ๊ฐ์ ์ถ๊ฐ ์์ฑ์ ํจ๊ป ๊ด๋ฆฌํด์ผ ํ๋ฏ๋ก ์๋ฆผ ์ข
๋ฅ ์์ฒด๊ฐ ๋ณ๋์ ๊ด๋ฆฌ ๋์์ด๋ผ๊ณ ํ๋จํ๋ค.
is_configurable์ ํ์ฌ ์๋น์ค ๊ธฐํ์ ๋ชจ๋ ์๋ฆผ์ ๋ํด ์ฌ์ฉ์๊ฐ ์์ ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ ๊ธฐ๋ฅ์ด ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋์ง๋ง, ํฅํ ํ์ ์๋ฆผ์ด ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ์ฌ์ ์ ๋ถ๋ฆฌํ ์ปฌ๋ผ์ด๋ค.
๊ธฐ๋ณธํค๋ id ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. type์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๊ฐ์ผ๋ก ํฅํ ๋ช
์นญ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ, ์ด๋ฅผ PK๋ก ์ฌ์ฉํ๋ฉด ํด๋น ๊ฐ์ ์ฐธ์กฐํ๋ ๋ชจ๋ FK์ ์ํฅ์ ์ค ์ ์๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ BIGINT id๋ฅผ ๊ด๊ณ ์๋ณ์๋ก ์ฌ์ฉํ๊ณ type์ ๋น์ฆ๋์ค ์๋ณ ์ฝ๋๋ก ๋ณ๋๋ก ๊ด๋ฆฌํ๋ค.
์๋ก์ด ์๋ฆผ ์ข
๋ฅ๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ notifications ๋๋ user_notification_settings์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ notification_types์ ์๋ก์ด ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์๋ค. ์๋ฆผ ์ข
๋ฅ๋ฅผ ์๋ณํ๋ type ์ญ์ DB ENUM์ด ์๋๋ฏ๋ก ์๋ก์ด ์ฝ๋ ์ถ๊ฐ๋ก ์ธํ ํ
์ด๋ธ DDL ๋ณ๊ฒฝ์ด ํ์ํ์ง ์๋๋ค.
ํฅํ ํ์ ์๋ฆผ์ด ์ถ๊ฐ๋๋ฉด is_configurable = FALSE๋ก ์ค์ ํ์ฌ ์ฌ์ฉ์ ์๋ฆผ ์ค์ ํ๋ฉด์์ ์ ์ธํ๊ฑฐ๋ ๋นํ์ฑํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์ค์ ๊ฐ๋ฅ ์ฌ๋ถ์ ์ค์ ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์๋ฆผ ์ ์ฑ
์ด ๋ ๋ณต์กํด์ง ๊ฒฝ์ฐ notification_types์ ์๋ฆผ ์ฐ์ ์์, ๊ธฐ๋ณธ ํ์ฑํ ์ฌ๋ถ, ํ์ ์นดํ
๊ณ ๋ฆฌ ๋ฑ์ ์์ฑ์ ์ถ๊ฐํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ฌ์ฉ์ ์๋ฆผ ์ค์ |
| ์ค๋ช | ์ฌ์ฉ์๋ณ๋ก ๊ฐ ์๋ฆผ ์ข ๋ฅ์ ์์ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ฌ์ฉ์๊ฐ ์๋ฆผ ์ข ๋ฅ๋ณ๋ก ์์ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์๋๋ก ํ๋ฉฐ, ์๋ฆผ ์์ฑ ๋๋ ๋ฐ์ก ์ ํด๋น ์ฌ์ฉ์์ ์ค์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N user_notification_settings, notification_types 1 : N user_notification_settings
|
| PK | (user_id, notification_type_id) |
| FK |
user_id โ users.id, notification_type_id โ notification_types.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
user_id |
BIGINT |
NOT NULL |
PK, FK โ users.id
|
notification_type_id |
BIGINT |
NOT NULL |
PK, FK โ notification_types.id
|
is_enabled |
BOOLEAN |
NOT NULL; DEFAULT FALSE |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
user_id |
์๋ฆผ ์ค์ ์ ๋์์ด ๋๋ ์ฌ์ฉ์ ์๋ณ์ |
users.id๋ฅผ ์ฐธ์กฐํ๋ FK์ด๋ฏ๋ก ๋์ผํ BIGINT ํ์
์ ์ฌ์ฉํ๋ค. |
notification_type_id |
์ฌ์ฉ์๊ฐ ์ค์ ํ ์๋ฆผ ์ข ๋ฅ์ ์๋ณ์ |
notification_types.id๋ฅผ ์ฐธ์กฐํ๋ FK์ด๋ฏ๋ก ๋์ผํ BIGINT ํ์
์ ์ฌ์ฉํ๋ค. |
is_enabled |
ํด๋น ์๋ฆผ ์ข ๋ฅ์ ๋ํด ์ฌ์ฉ์๊ฐ ์์ ์ ํ์ฉํ๋์ง ์ฌ๋ถ | ์์ /๋ฏธ์์ ๋ ์ํ๋ง ํ์ํ๋ฏ๋ก BOOLEAN์ ์ฌ์ฉํ๋ค. |
created_at |
์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ด ์ต์ด ์์ฑ๋ ์๊ฐ | ์์ฑ ์์ ์ ์๋ ๊ธฐ๋กํ๊ณ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ๊ท์น๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ด ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์๊ฐ | ์ค์ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ์๋ ์ด๊ธฐ ์ํ๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ค. |
deleted_at |
์ฌ์ฉ์ ์๋ฆผ ์ค์ ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ์ค์ ์ด๋ ฅ์ ๋ณด์กดํ๊ฑฐ๋ ๋ณต๊ตฌ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ฌ Soft Delete ์ฉ๋๋ก ์ฌ์ฉํ๋ค. |
user_notification_settings๋ ์ฌ์ฉ์์ ์๋ฆผ ์ข
๋ฅ ์ฌ์ด์ ์ค์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฐ๊ฒฐ ํ
์ด๋ธ์ด๋ค. ํ๋์ ์ฌ์ฉ์๋ ์ฌ๋ฌ ์๋ฆผ ์ข
๋ฅ์ ๋ํ ์ค์ ์ ๊ฐ์ง ์ ์๊ณ , ํ๋์ ์๋ฆผ ์ข
๋ฅ ์ญ์ ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ์ ์ฉ๋ ์ ์์ผ๋ฏ๋ก users์ notification_types ์ฌ์ด์ N : M ๊ด๊ณ๋ฅผ ํด๋น ํ
์ด๋ธ์ ํตํด ํํํ๋ค.
์ด ํ
์ด๋ธ์ ํ๋์ ํ์ ํน์ ์ฌ์ฉ์๊ฐ ํน์ ์๋ฆผ ์ข
๋ฅ์ ๋ํด ๊ฐ์ง๊ณ ์๋ ์์ ์ค์ ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ (user_id, notification_type_id) ์กฐํฉ ์์ฒด๊ฐ ํ๋์ ๋ ์ฝ๋๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์๋ณํ ์ ์๋ ๋น์ฆ๋์ค ํค๊ฐ ๋๋ค.
๋ณตํฉ ๊ธฐ๋ณธํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ MySQL InnoDB์ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค ์ญ์ (user_id, notification_type_id) ์์๋ก ๊ตฌ์ฑ๋๋ค. ๋ฐ๋ผ์ ํน์ ์ฌ์ฉ์์ ์ ์ฒด ์๋ฆผ ์ค์ ์ ์กฐํํ๋ ์ฃผ์ ํจํด์์๋ user_id๊ฐ PK์ ์ ๋ ์ปฌ๋ผ์ด๋ฏ๋ก ๋ณ๋์ user_id ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๊ธฐ๋ณธํค ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋ค
ํฅํ ์๋ฆผ ์ค์ ์ Push ์์ ์ฌ๋ถ ์ด์ธ์ ์ถ๊ฐ ์์ฑ์ด ํ์ํด์ง ๊ฒฝ์ฐ ํด๋น ์ฌ์ฉ์-์๋ฆผ ์ข
๋ฅ ๊ด๊ณ์ ์ข
์๋๋ ์ปฌ๋ผ์ ์ถ๊ฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์๋ฆผ ์์ ์๊ฐ๋, ๋ฐฉํด ๊ธ์ง ์๊ฐ, ์๋ฆผ ๋น๋ ๋ฑ์ ์ค์ ์ด ํ์ํด์ง๋ค๋ฉด user_notification_settings์ ๊ด๋ จ ์์ฑ์ ์ถ๊ฐํ์ฌ ํ์ฅํ ์ ์๋ค.
ํฅํ user_notification_settings์ ๊ฐ๋ณ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํ
์ด๋ธ์์ ์ง์ ์ฐธ์กฐํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ๋ฐ์ํ๊ฑฐ๋, ํ ์ฌ์ฉ์์ ์๋ฆผ ์ข
๋ฅ ์กฐํฉ์ ์ฌ๋ฌ ๊ฐ์ ๋
๋ฆฝ์ ์ธ ์ค์ ๋ ์ฝ๋๊ฐ ์กด์ฌํด์ผ ํ๋ค๋ฉด ํ์ฌ ๋ณตํฉ PK ๊ตฌ์กฐ๋ฅผ ์ฌ๊ฒํ ํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ๋๋ฆฌํค id๋ฅผ ์ถ๊ฐํ๊ณ (user_id, notification_type_id) ๋๋ ํ์ฅ๋ ๋น์ฆ๋์ค ํค์ UNIQUE ์ ์ฝ์กฐ๊ฑด์ ๋๋ ๊ตฌ์กฐ๊ฐ ๋ ์ ํฉํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์๋ฆผ ์ด๋ฒคํธ |
| ์ค๋ช | ์๋น์ค ๋ด ํน์ ํ์๋ ์ด๋ฒคํธ๋ก ์ธํด ๋ฐ์ํ ์๋ฆผ์ ์์ธ ์ ๋ณด์ ๊ณตํต ์๋ฆผ ๋ด์ฉ์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์๋ฆผ ์ข ๋ฅ, ์๋ฆผ์ ๋ฐ์์ํจ ์ฌ์ฉ์, ๊ด๋ จ ๋ฆฌ์์ค ๋ฐ ์ฌ์ฉ์์๊ฒ ํ์ํ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์ ์ฅํ๊ณ , ํ๋์ ์๋ฆผ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ์ฌ์ฉ์์ ์ค์ ์๋ฆผ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐํ ์ ์๋๋ก ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
notification_types 1 : N notification_events, |
users 1 : N notification_events (actor_user_id ๊ธฐ์ค), |
|
notification_events 1 : N notifications
|
|
| PK | id |
| FK |
notification_type_id โ notification_types.id, |
actor_user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
notification_type_id |
BIGINT |
NOT NULL |
FK โ notification_types.id
|
actor_user_id |
BIGINT |
NULL |
FK โ users.id
|
resource_type |
VARCHAR(30) |
NULL |
- |
resource_id |
BIGINT |
NULL |
- |
title |
VARCHAR(255) |
NOT NULL |
- |
content |
VARCHAR(500) |
NOT NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์๋ฆผ ์ด๋ฒคํธ๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ํ๋์ ์๋ฆผ ์ด๋ฒคํธ๋ก ์ฌ๋ฌ ์์ ์์ ์๋ฆผ์ด ์์ฑ๋ ์ ์๊ณ , notifications์์ ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ณตํต์ผ๋ก ์ฐธ์กฐํด์ผ ํ๋ฏ๋ก ๋
๋ฆฝ์ ์ธ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด ์ฃผ์ ์๋ณ์์ ํ์
์ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
notification_type_id |
๋ฐ์ํ ์๋ฆผ์ ์ข ๋ฅ๋ฅผ ์๋ณํ๋ ๊ฐ | ์๋ฆผ ์ข
๋ฅ๋ฅผ ๋ฌธ์์ด๋ก ์ง์ ์ ์ฅํ์ง ์๊ณ notification_types์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ์ฌ ์๋ฆผ ์ข
๋ฅ์ ์ด๋ฆ, ์ค์ ๊ฐ๋ฅ ์ฌ๋ถ, ํ์ฑ ์ํ ๋ฑ์ ์ค์์์ ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ค. |
actor_user_id |
์๋ฆผ ๋ฐ์์ ์์ธ์ด ๋ ์ฌ์ฉ์ ์๋ณ์ | ์น๊ตฌ ๊ฐ์
, ์ต๋ช
๋ฉ์์ง ๋ฑ ํน์ ์ฌ์ฉ์์ ํ์๋ก ๋ฐ์ํ ์๋ฆผ์ ํ์์๋ฅผ ์๋ณํ๊ธฐ ์ํด users.id๋ฅผ ์ฐธ์กฐํ๋ค. ์์คํ
์๋ฆผ์ฒ๋ผ ํน์ ํ์์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ NULL์ ํ์ฉํ๋ค. |
resource_type |
์๋ฆผ๊ณผ ๊ด๋ จ๋ ์๋ณธ ๋ฆฌ์์ค์ ์ข ๋ฅ | ํ๋์ ์๋ฆผ ์ด๋ฒคํธ ํ
์ด๋ธ์์ ์ต๋ช
๋ํ๋ฐฉ, ์ผ์ , ์ฌ์ฉ์ ๋ฑ ์ฌ๋ฌ ์ข
๋ฅ์ ๋ฆฌ์์ค๋ฅผ ํํํ ์ ์๋๋ก ๋ฆฌ์์ค ์ข
๋ฅ๋ฅผ ๋ฌธ์์ด๋ก ์ ์ฅํ๋ค. ์๋ก์ด ๋ฆฌ์์ค ์ข
๋ฅ ์ถ๊ฐ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด DB ENUM ๋์ VARCHAR๋ฅผ ์ฌ์ฉํ๋ค. |
resource_id |
์๋ฆผ๊ณผ ๊ด๋ จ๋ ์๋ณธ ๋ฆฌ์์ค์ ์๋ณ์ |
resource_type์์ ์ง์ ํ ๋ฆฌ์์ค์ ์๋ณ์๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ์ ํํ์ ๋ ๊ด๋ จ ํ๋ฉด์ด๋ ๋ฐ์ดํฐ๋ก ์ด๋ํ๋ ๋ฐ ํ์ฉํ ์ ์๋ค. ๋ฆฌ์์ค๊ฐ ํ์ํ์ง ์์ ์๋ฆผ์ ๊ณ ๋ คํด NULL์ ํ์ฉํ๋ค. |
title |
์ฌ์ฉ์์๊ฒ ํ์ํ ์๋ฆผ ์ ๋ชฉ | ์๋ฆผ ์์ฑ ๋น์์ ์ ๋ชฉ์ ๊ทธ๋๋ก ๋ณด์กดํ๊ณ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋๋ก ๋ณ๋์ ๋ฌธ์์ด ์ปฌ๋ผ์ผ๋ก ์ ์ฅํ๋ค. |
content |
์ฌ์ฉ์์๊ฒ ํ์ํ ์๋ฆผ ๋ด์ฉ | ์๋ฆผ์ ๊ฐ๋จํ ์ค๋ช
์ ์ ์ฅํ๋ฉฐ ํ์ฌ ์๋น์ค์์ ์๋ฆผ ๋ณธ๋ฌธ์ ์ต๋ ๊ธธ์ด๊ฐ ์ ํ์ ์ธ ์งง์ ๋ฌธ์์ด์ด๋ผ๋ ์ ์ ๊ณ ๋ คํด VARCHAR(500)์ ์ฌ์ฉํ๋ค. |
created_at |
์๋ฆผ ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ์๊ฐ | ์ค์ ์๋ฆผ์ ๋ฐ์ ์์ ์ ๊ธฐ๋กํ๊ณ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ๊ท์น๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
์๋ฆผ ์ด๋ฒคํธ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ์๊ฐ | ์ ๋ชฉ, ๋ด์ฉ ๋๋ ๊ด๋ จ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์ต์ข ์์ ์์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
deleted_at |
์๋ฆผ ์ด๋ฒคํธ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ ์๊ฐ | ์ด๋ฏธ ์์ฑ๋ notifications์์ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ ์งํ๋ฉด์ ํด๋น ์ด๋ฒคํธ๋ฅผ ์ ๊ท ์ฒ๋ฆฌ ๋์์์ ์ ์ธํ ์ ์๋๋ก Soft Delete ์ฉ๋๋ก ์ฌ์ฉํ๋ค. |
notification_events๋ ์๋ฆผ์ ๋ฐ์ ์์ธ ๋ฐ ๊ณตํต ์ ๋ณด์ ์ค์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๋ ๊ฐ๋ณ ์๋ฆผ ์ํ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด ๊ตฌ์ฑํ์๋ค.
๊ธฐ์กด์ฒ๋ผ notifications ํ
์ด๋ธ์์ ์๋ฆผ ์ข
๋ฅ, ๋ฐ์ ์ฌ์ฉ์, ์๋ณธ ์ด๋ฒคํธ, ์ ๋ชฉ ๋ฐ ๋ด์ฉ์ ๋ชจ๋ ์ง์ ๊ด๋ฆฌํ๋ฉด ๋์ผํ ์ด๋ฒคํธ๋ก ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ด ์์ฑ๋๋ ๊ฒฝ์ฐ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์์ ์ ์๋งํผ ๋ฐ๋ณต ์ ์ฅ๋ ์ ์๋ค.
๋ฐ๋ผ์ ์๋ฆผ์ ๋ฐ์ ์์ธ๊ณผ ๊ณตํต ์ ๋ณด๋ notification_events์ ํ ๋ฒ ์ ์ฅํ๊ณ , ์ค์ ์์ ์๋ณ ์๋ฆผ์ notifications์์ notification_event_id๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑํ์๋ค.
์๋ฆผ ์ข
๋ฅ๋ notification_type_id๋ฅผ ํตํด notification_types๋ฅผ ์ฐธ์กฐํ๋ค. ์ด๋ฅผ ํตํด ์ฑํ
, ์ด๋ฒคํธ, ์น๊ตฌ ๊ฐ์
๋ฑ ์๋ฆผ ์ข
๋ฅ๊ฐ ์ถ๊ฐ๋๋๋ผ๋ notification_events์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ง์คํฐ ๋ฐ์ดํฐ ์ถ๊ฐ๋ฅผ ํตํด ํ์ฅํ ์ ์๋ค.
resource_type๊ณผ resource_id๋ ์ฌ๋ฌ ์ข
๋ฅ์ ์๋ณธ ๋ฆฌ์์ค๋ฅผ ํ๋์ ๊ตฌ์กฐ๋ก ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
resource_type = 'ANONYMOUS_ROOM'
resource_id = 100
resource_type = 'EVENT'
resource_id = 200
resource_type = 'USER'
resource_id = 300
์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฆผ ์ข
๋ฅ๋ง๋ค anonymous_room_id, event_id, friend_id์ ๊ฐ์ Nullable FK ์ปฌ๋ผ์ ๊ณ์ ์ถ๊ฐํ์ง ์๊ณ ์๋ก์ด ๋ฆฌ์์ค ์ข
๋ฅ๋ฅผ ์์ฉํ ์ ์๋ค.
๋ค๋ง resource_type, resource_id ์กฐํฉ์ ์ค์ DB FK๊ฐ ์๋ ๋
ผ๋ฆฌ์ ์ธ ์ฐธ์กฐ ๊ด๊ณ์ด๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฆฌ์์ค๊ฐ ์ค์ ์กด์ฌํ๋์ง์ ๋ํ ๋ฌด๊ฒฐ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์ ๊ฒ์ฆํด์ผ ํ๋ค๋ ํธ๋ ์ด๋์คํ๊ฐ ์๋ค.
์๋ฆผ์ด ์ฐธ์กฐํ ์ ์๋ ์๋ณธ ๋ฆฌ์์ค ์ข
๋ฅ๊ฐ ์ฆ๊ฐํ๋๋ผ๋ resource_type, resource_id ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก์ด FK ์ปฌ๋ผ์ ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์๋ค.
๋ฐ๋ฉด ๋ฆฌ์์ค๋ณ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํด์ง๊ฑฐ๋ ํน์ ๋ฆฌ์์ค์ ์ถ๊ฐ ์์ฑ์ ์๋ฆผ ์ด๋ฒคํธ์์ ์ง์ ์ฌ์ฉํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์ปค์ง ๊ฒฝ์ฐ ์๋ฆผ ์ ํ๋ณ ์์ธ ํ ์ด๋ธ์ ๋ถ๋ฆฌํ๊ฑฐ๋ ๋ณ๋์ ์๋ฆผ ๋ฆฌ์์ค ๋งคํ ํ ์ด๋ธ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์๋ค.
์๋ฆผ ์ด๋ฒคํธ๊ฐ ๋๋์ผ๋ก ์ฆ๊ฐํ ๊ฒฝ์ฐ ์๋ฆผ ์ข
๋ฅ๋ณ ์กฐํ๋ฅผ ์ํด (notification_type_id, created_at), ํน์ ์ฌ์ฉ์์ ์ํด ๋ฐ์ํ ์ด๋ฒคํธ ์กฐํ๋ฅผ ์ํด (actor_user_id, created_at) ๋ฑ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ค์ ์กฐํ ํจํด๊ณผ ์คํ ๊ณํ์ ๋ฐ๋ผ ๊ฒํ ํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์๋ฆผ |
| ์ค๋ช | ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๋ ์ค์ ์๋ฆผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ด๋ฒคํธ, ์ฌ์ฉ์ ํ๋, ์ต๋ช ๋ํ ๋ฑ ์๋น์ค ๋ด ๋ค์ํ ํ์๋ก ์ธํด ์์ฑ๋ ์๋ฆผ์ ์์ ์ ๊ธฐ์ค์ผ๋ก ์ ์ฅํ๊ณ , ์๋ฆผ ์ข ๋ฅยท์ฝ์ ์ฌ๋ถยท์ ํจ๊ธฐ๊ฐ ๋ฑ์ ๊ด๋ฆฌํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
events 1 : N notifications, users 1 : N notifications (sender_user_id ๊ธฐ์ค),users 1 : N notifications (receiver_user_id ๊ธฐ์ค),anonymous_rooms 1 : N notifications, notification_types 1 : N notifications
|
| PK | id |
| FK |
event_id โ events.id, sender_user_id โ users.id,receiver_user_id โ users.id, anonymous_room_id โ anonymous_rooms.id,notification_type_id โ notification_types.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
event_id |
BIGINT |
NULL |
FK โ events.id
|
sender_user_id |
BIGINT |
NULL |
FK โ users.id
|
receiver_user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
anonymous_room_id |
BIGINT |
NULL |
FK โ anonymous_rooms.id
|
notification_type_id |
BIGINT |
NOT NULL |
FK โ notification_types.id
|
title |
VARCHAR(255) |
NOT NULL |
- |
content |
VARCHAR(500) |
NULL |
- |
read_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
expires_at |
DATETIME(6) |
NOT NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์๋ฆผ์ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ๊ฐ ์๋ฆผ์ ๋
๋ฆฝ์ ์ธ ๋ฐ์ดํฐ๋ก ์์ฑ๋๊ณ ์กฐํยท์ฝ์ ์ฒ๋ฆฌ ๋ฑ์ ๋์์ด ๋๋ฏ๋ก ๋จ์ผ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด ์ฃผ์ ์๋ณ์ ํ์ ๊ณผ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
event_id |
ํด๋น ์๋ฆผ์ ๋ฐ์์ํจ ์ด๋ฒคํธ์ ์๋ณ์ | ์์ผ, ๊ธฐ๋
์ผ, ์ผ์ ๋ฑ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ฆผ์ ์๋ณธ ์ด๋ฒคํธ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๋ชจ๋ ์๋ฆผ์ด ์ด๋ฒคํธ์์ ๋ฐ์ํ๋ ๊ฒ์ ์๋๋ฏ๋ก NULL์ ํ์ฉํ๋ค. |
sender_user_id |
์๋ฆผ์ ๋ฐ์์ํจ ์ฌ์ฉ์ ๋๋ ๋ฐ์ ์ฌ์ฉ์์ ์๋ณ์ | ์น๊ตฌ ๊ฐ์
, ์ฝ ์ฐ๋ฅด๊ธฐ, ๋ฉ์์ง ๋ฑ ์ฌ์ฉ์ ํ๋์ ์ํด ์์ฑ๋๋ ์๋ฆผ์์ ๋ฐ์ ์๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์์คํ ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ฆผ์์๋ ๋ฐ์ ์ฌ์ฉ์๊ฐ ์์ ์ ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ค. |
receiver_user_id |
์๋ฆผ์ ์์ ํ๋ ์ฌ์ฉ์์ ์๋ณ์ | ๋ชจ๋ ์๋ฆผ์ ํน์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๋ฏ๋ก ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ฉฐ users.id๋ฅผ ์ฐธ์กฐํ๋ค. |
anonymous_room_id |
์ต๋ช ๋ํ์ ๊ด๋ จ๋ ์๋ฆผ์ ๋ํ๋ฐฉ ์๋ณ์ | ์ต๋ช
์ง๋ฌธ์ด๋ ๋ต๋ณ ๋ฑ ์ต๋ช
๋ํ์์ ๋ฐ์ํ ์๋ฆผ์ ํด๋น ๋ํ๋ฐฉ๊ณผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, ์ผ๋ฐ ์๋ฆผ์์๋ ํ์ํ์ง ์์ NULL์ ํ์ฉํ๋ค. |
notification_type_id |
์๋ฆผ์ ์ข ๋ฅ๋ฅผ ์๋ณํ๋ ์๋ณ์ | ์๋ฆผ ์ข
๋ฅ ์์ฒด์ ์์ฑ๊ณผ ์ ์ฑ
์ notification_types์์ ๊ด๋ฆฌํ๊ณ , ์ค์ ์๋ฆผ์์๋ ํด๋น ๋ง์คํฐ ๋ฐ์ดํฐ์ ์๋ณ์๋ง ์ฐธ์กฐํ๋๋ก ํ๋ค. |
title |
์๋ฆผ ๋ชฉ๋ก์ ํ์๋๋ ์ ๋ชฉ | ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๋น๊ต์ ์งง์ ๋ฌธ์์ด์ด๋ฏ๋ก VARCHAR(255)๋ฅผ ์ฌ์ฉํ๋ค. |
content |
์๋ฆผ์ ๊ฐ๋จํ ์์ธ ๋ด์ฉ | ์๋ฆผ ๋ชฉ๋ก์์ ์ ๋ชฉ๊ณผ ํจ๊ป ํ์ํ ๋ณด์กฐ ์ค๋ช
์ ์ ์ฅํ๋ฉฐ, ์งง์ ์๋ด ๋ฌธ๊ตฌ ์์ค์ผ๋ก ์ ํํ๊ธฐ ์ํด VARCHAR(500)์ ์ฌ์ฉํ๋ค.๋ด์ฉ์ด ํ์ ์๋ ์ ํ์ ๊ณ ๋ คํ์ฌ NULL์ ํ์ฉํ๋ค. |
read_at |
์ฌ์ฉ์๊ฐ ํด๋น ์๋ฆผ์ ์ฝ์ ์๊ฐ |
NULL์ด๋ฉด ์ฝ์ง ์์ ์๋ฆผ, ๊ฐ์ด ์กด์ฌํ๋ฉด ์ฝ์ ์๋ฆผ์ผ๋ก ํ๋จํ ์ ์์ผ๋ฉฐ ์ฝ์ ์ ํํ ์์ ๊น์ง ํจ๊ป ์ ์ฅํ ์ ์๋ค. |
created_at |
์๋ฆผ์ด ์์ฑ๋ ์๊ฐ | ์๋ฆผ ๋ชฉ๋ก์ ์ต์ ์ ์ ๋ ฌ ๋ฐ ์์ฑ ์์ ๊ธฐ๋ก์ ์ฌ์ฉํ๋ฉฐ, ์๋น์ค ๋ด ์๊ฐ ํ์
๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
expires_at |
ํด๋น ์๋ฆผ์ ์ ํจ๊ธฐ๊ฐ์ด ์ข ๋ฃ๋๋ ์๊ฐ | ์ผ์ ๊ธฐ๊ฐ ์ดํ ๋ ธ์ถ ๋๋ ์ฒ๋ฆฌ ๋์์์ ์ ์ธํด์ผ ํ๋ ์๋ฆผ์ ๋ง๋ฃ ์์ ์ ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
notifications๋ ์ค์ ์ฌ์ฉ์์๊ฒ ์์ฑ๋ ๊ฐ๋ณ ์๋ฆผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ
์ด๋ธ์ด๋ค. ํ๋์ ์๋ฆผ ์ข
๋ฅ์์ ์ฌ๋ฌ ๊ฐ์ ์ค์ ์๋ฆผ์ด ์์ฑ๋ ์ ์์ผ๋ฏ๋ก notification_types์ ๋ถ๋ฆฌํ๊ณ notification_type_id๋ฅผ ํตํด ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑํ๋ค.
๊ธฐ๋ณธํค๋ id ๋จ์ผ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ์๋ค. notifications์ ๊ฐ ํ์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๋ ํ๋์ ๋
๋ฆฝ์ ์ธ ์๋ฆผ์ ์๋ฏธํ๋ฉฐ, ๋์ผํ ์ด๋ฒคํธ๋ ๋์ผํ ์ฌ์ฉ์ ๊ฐ ํ์์์๋ ์ฌ๋ฌ ์๋ฆผ์ด ์์ฑ๋ ์ ์๋ค. ๋ฐ๋ผ์ receiver_user_id, notification_type_id ๋ฑ์ ์กฐํฉ๋ง์ผ๋ก๋ ๊ฐ ์๋ฆผ์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์์ผ๋ฉฐ ๋
๋ฆฝ์ ์ธ ์๋ณ์๊ฐ ํ์ํ๋ค.
๋ํ ์๋ฆผ ์ฝ์ ์ฒ๋ฆฌ์ ์๋ฆผ ์์ธ ์กฐํ ๋ฑ์ API์์ ํน์ ์๋ฆผ ํ ๊ฑด์ ์ง์ ์๋ณํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก ๋จ์ผ id๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ ๊ฒฝ๋ก ๋ฐ ORM ๋งคํ์ ๋จ์ํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ค.
event_id, sender_user_id, anonymous_room_id๋ ๋ชจ๋ NULL์ ํ์ฉํ๋ค. ์ด๋ ํ๋์ ์๋ฆผ์ด ๋ชจ๋ ์๋ณธ ์ํฐํฐ๋ฅผ ๋์์ ํ์๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฒคํธ ์๋ฆผ์ event_id๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ฌ์ฉ์ ํ๋ ๊ธฐ๋ฐ ์๋ฆผ์ sender_user_id๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ต๋ช
๋ํ ๊ด๋ จ ์๋ฆผ์ anonymous_room_id๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
receiver_user_id๋ NOT NULL๋ก ๊ตฌ์ฑํ์๋ค. ์๋ฆผ์ ์ต์ข
์ ์ผ๋ก ํน์ ์ฌ์ฉ์์ ์๋ฆผ ๋ชฉ๋ก์ ๋
ธ์ถ๋๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก ์ด๋ค ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ๋ฐ๋์ง ๋ฐ๋์ ์๋ณํ ์ ์์ด์ผ ํ๋ค.
์๋ฆผ ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ ๊ฒฝ์ฐ ์ฌ์ฉ์์ ์๋ฆผ ๋ชฉ๋ก ์กฐํ๊ฐ ์ฃผ์ ์กฐํ ํจํด์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก (receiver_user_id, created_at) ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ฒํ ํ ์ ์๋ค.
์ฝ์ง ์์ ์๋ฆผ ์กฐํ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ receiver_user_id, read_at, created_at์ ํ์ฉํ๋ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ค์ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ๊ธฐ์ค์ผ๋ก ๊ฒํ ํ ์ ์๋ค.
expires_at ๊ธฐ์ค์ผ๋ก ๋ง๋ฃ ์๋ฆผ์ ์ ๋ฆฌํ๋ ๋ฐฐ์น ์์
์ด ์ํ๋๋ ๊ฒฝ์ฐ ๋ง๋ฃ ๋ฐ์ดํฐ ํ์ ์ฑ๋ฅ์ ์ํด expires_at ์ธ๋ฑ์ค ์ถ๊ฐ๋ฅผ ๊ฒํ ํ ์ ์๋ค.
์๋ฆผ ์์ฑ์ ์ค๋ณต ๋ฐฉ์ง๊ฐ ํ์ํ ๊ฒฝ์ฐ ์๋ณธ ์ด๋ฒคํธ์ ์๋ณ์์ ์๋ฆผ ์ข
๋ฅ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ณ๋์ deduplication_key๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์๋ ๊ฒํ ํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ต๋ช ๋ํ๋ฐฉ |
| ์ค๋ช | ํน์ ์ํ์ ๋ํด ์ง๋ฌธ์์ ์์ ์๊ฐ ์ต๋ช ์ผ๋ก ๋ํํ ์ ์๋ ๋ํ๋ฐฉ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ต๋ช ์ง๋ฌธ ๊ธฐ๋ฅ์์ ๋ํ์ ์ฐธ์ฌ์์ ๋์ ์ํ์ ์ฐ๊ฒฐํ๊ณ , ์ต๋ช ๋ฉ์์ง ๋ฐ ๊ด๋ จ ์๋ฆผ์ด ๋์ผํ ๋ํ ๋จ์๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
products 1 : N anonymous_rooms, users 1 : N anonymous_rooms (questioner_user_id ๊ธฐ์ค),users 1 : N anonymous_rooms (recipient_user_id ๊ธฐ์ค),anonymous_rooms 1 : N anonymous_messages, anonymous_rooms 1 : N notifications
|
| PK | id |
| FK |
product_id โ products.id, questioner_user_id โ users.id, recipient_user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
product_id |
BIGINT |
NOT NULL |
FK โ products.id , UK |
questioner_user_id |
BIGINT |
NOT NULL |
FK โ users.id , UK |
recipient_user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
opened_at |
DATETIME(6) |
NULL |
- |
expires_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์ต๋ช ๋ํ๋ฐฉ์ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ์ต๋ช
๋ํ๋ฐฉ ์์ฒด๊ฐ ๋ฉ์์ง์ ์๋ฆผ ๋ฑ ๋ค๋ฅธ ํ
์ด๋ธ์์ ๋
๋ฆฝ์ ์ผ๋ก ์ฐธ์กฐ๋๋ ์ํฐํฐ์ด๋ฏ๋ก ๋จ์ผ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด ์ฃผ์ ์๋ณ์ ํ์ ๊ณผ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
product_id |
์ต๋ช ์ง๋ฌธ์ ๋์์ด ๋๋ ์ํ ์๋ณ์ | ์ต๋ช
๋ํ๊ฐ ํน์ ์ํ์ ๋ํ ์ง๋ฌธ์ ์ค์ฌ์ผ๋ก ์์ฑ๋๋ฏ๋ก ํด๋น ์ํ์ ์๋ณํ๊ธฐ ์ํด products.id๋ฅผ ์ฐธ์กฐํ๋ค. |
questioner_user_id |
์ต๋ช ์ง๋ฌธ์ ์์ํ ์ฌ์ฉ์์ ์๋ณ์ | ์ง๋ฌธ์์ ์ค์ ์๋ณ ์ ๋ณด๋ ์๋น์ค ๋ด๋ถ์์ ๋ฉ์์ง ์ฒ๋ฆฌ ๋ฐ ๊ถํ ๊ฒ์ฆ์ ์ํด ํ์ํ๋ฏ๋ก users.id๋ฅผ ์ฐธ์กฐํ๋ค. |
recipient_user_id |
์ต๋ช ์ง๋ฌธ์ ์ ๋ฌ๋ฐ๋ ์ฌ์ฉ์์ ์๋ณ์ | ์ง๋ฌธ์ ์์ ํ๊ณ ๋ต๋ณํ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํด users.id๋ฅผ ์ฐธ์กฐํ๋ค. |
created_at |
์ต๋ช ๋ํ๋ฐฉ์ด ์์ฑ๋ ์๊ฐ | ๋ํ๋ฐฉ ์์ฑ ์์ ์ ๊ธฐ๋กํ๊ณ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ๊ท์น๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
opened_at |
์์ ์๊ฐ ์ต๋ช ๋ํ๋ฐฉ์ ์ต์ด๋ก ํ์ธํ ์๊ฐ | ์์ง ๋ํ๋ฐฉ์ ํ์ธํ์ง ์์ ์ํ์ ํ์ธํ ์ํ๋ฅผ ๊ตฌ๋ถํ๋ฉด์ ์ต์ด ํ์ธ ์์ ๋ ํจ๊ป ๊ธฐ๋กํ ์ ์๋๋ก NULL์ ํ์ฉํ๋ค. |
expires_at |
์ต๋ช ๋ํ๋ฐฉ์ ์ ํจ๊ธฐ๊ฐ์ด ์ข ๋ฃ๋๋ ์๊ฐ | ์ต๋ช
์ง๋ฌธ์ ์ด์ฉ ๊ฐ๋ฅ ๊ธฐ๊ฐ์ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, ๋ง๋ฃ ์ ์ฑ
์ด ์ ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ NULL์ ํ์ฉํ๋ค. |
ํ๋์ ๋ํ๋ฐฉ์๋ ์ฌ๋ฌ ๊ฐ์ anonymous_messages๊ฐ ์กด์ฌํ ์ ์์ผ๋ฉฐ, ์ต๋ช
์ง๋ฌธ ๋๋ ๋ต๋ณ์ผ๋ก ๋ฐ์ํ ์๋ฆผ ์ญ์ ํน์ ์ต๋ช
๋ํ๋ฐฉ๊ณผ ์ฐ๊ฒฐ๋์ด์ผ ํ๋ฏ๋ก ๋ฉ์์ง ๋ฐ์ดํฐ์ ๋ณ๋๋ก ๋ํ๋ฐฉ ์์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ธฐ๋ณธํค๋ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์ง๋ฌธ์, ์์ ์, ์ํ์ ์กฐํฉ๋ง์ผ๋ก๋ ์ด๋ค ๊ด๊ณ์ ๋ํ์ธ์ง ํํํ ์ ์์ง๋ง, ๋์ผํ ์ง๋ฌธ์๊ฐ ๋์ผํ ์ฌ์ฉ์์๊ฒ ๋์ผํ ์ํ์ ๋์์ผ๋ก ์๋ก ๋ค๋ฅธ ์์ ์ ์ฌ๋ฌ ์ต๋ช ๋ํ๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ํด๋น ์ปฌ๋ผ๋ค์ ์กฐํฉ์ ํ๋์ ๋ํ๋ฐฉ์ ์ ์ผํ๊ฒ ์๋ณํ๋ ์์ฐํค๋ก ์ฌ์ฉํ๊ธฐ์๋ ์ ํฉํ์ง ์๋ค.
ํ์ฌ ๊ตฌ์กฐ์์๋ anonymous_messages.room_id์ notifications.anonymous_room_id๊ฐ anonymous_rooms.id๋ฅผ ์ฐธ์กฐํ๋ค. ๋ฐ๋ผ์ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ฉด room_id ๋๋ anonymous_room_id ํ๋๋ง์ผ๋ก ํน์ ๋ํ๋ฐฉ์ ์ฐธ์กฐํ ์ ์๋ค.
questioner_user_id์ recipient_user_id๋ ๋ชจ๋ users.id๋ฅผ ์ฐธ์กฐํ๋ค. ์ต๋ช
์ฑ์ DB์์ ์ง๋ฌธ์์ ์ ์์ ์ ๊ฑฐํ๋ ๋ฐฉ์์ด ์๋๋ผ ์์ ์์๊ฒ ์ง๋ฌธ์์ ์ค์ ์๋ณ ์ ๋ณด๋ฅผ ๋
ธ์ถํ์ง ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ
์ผ๋ก ๋ณด์ฅํ๋ค.
opened_at์ ์ต์ด ํ์ธ ์๊ฐ ์์ฒด๋ฅผ ์ ์ฅํ๋ค. NULL์ธ ๊ฒฝ์ฐ ์์ง ํ์ธํ์ง ์์ ์ํ๋ก ํ๋จํ ์ ์๊ณ , ๊ฐ์ด ์กด์ฌํ๋ฉด ํ์ธ ์ฌ๋ถ๋ฟ ์๋๋ผ ์ธ์ ๋ํ๋ฐฉ์ ํ์ธํ๋์ง๊น์ง ํจ๊ป ํ์
ํ ์ ์์ผ๋ฏ๋ก ์ค๋ณต ์ํ ์ปฌ๋ผ์ ์ถ๊ฐํ ํ์๊ฐ ์๋ค.
expires_at์ ์ต๋ช
์ง๋ฌธ์ ์ ํจ๊ธฐ๊ฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๋ํ๋ฐฉ์ ์์ฑํ ๋ ์ ํจ๊ธฐ๊ฐ ์ ์ฑ
์ ๋ฐ๋ผ ๋ง๋ฃ ์๊ฐ์ ๊ณ์ฐํ์ฌ ์ ์ฅํ๋ฉด ์กฐํ ์ ํ์ฌ ์๊ฐ๊ณผ ๋น๊ตํด ํ์ฑํ๋ ๋ํ๋ฐฉ๋ง ๋
ธ์ถํ ์ ์๋ค.
ํฅํ ์ต๋ช
๋ํ๋ฐฉ ์์ฒด์ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํด์ง ๊ฒฝ์ฐ status ์ปฌ๋ผ์ ์ถ๊ฐํ์ฌ ACTIVE, EXPIRED, CLOSED, BLOCKED ๋ฑ์ ์ํ๋ฅผ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค. ํ์ฌ๋ expires_at ๋ฑ์ ์๊ฐ ์ ๋ณด๋ฅผ ํตํด ์ํ๋ฅผ ํ๋จํ ์ ์์ผ๋ฏ๋ก ๋ณ๋์ ์ํ ์ปฌ๋ผ์ด ๋ฐ๋์ ํ์ํ์ง๋ ์๋ค.
๋ํ๋ฐฉ์ด ๋ง๋ฃ๋๋๋ผ๋ ๊ธฐ์กด ๋ฉ์์ง๋ ์๋ฆผ ๊ธฐ๋ก์ ์ ์งํด์ผ ํ๋ค๋ฉด ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ํ๋ฐฉ์ ์ญ์ ํ์ง ์๊ณ expires_at์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ์์๊ฒ๋ง ๋
ธ์ถ๋์ง ์๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ํฅํ ๋ช
์์ ์ธ ์ญ์ ๊ธฐ๋ฅ๊น์ง ํ์ํ ๊ฒฝ์ฐ deleted_at์ ์ถ๊ฐํ์ฌ Soft Delete ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ ์ ์๋ค.
์ต๋ช
๋ํ๋ฐฉ ๋ชฉ๋ก ์กฐํ๊ฐ ์ฆ๊ฐํ๋ฉด ์ฌ์ฉ์ ์ญํ ์ ๋ฐ๋ผ questioner_user_id ๋๋ recipient_user_id๋ฅผ ๊ธฐ์ค์ผ๋ก ์กฐํํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ ์ค์ ์กฐํ ํจํด์ ๋ฐ๋ผ (questioner_user_id, created_at) ๋๋ (recipient_user_id, created_at) ๋ณตํฉ ์ธ๋ฑ์ค ์ถ๊ฐ๋ฅผ ๊ฒํ ํ ์ ์๋ค.
๋ง๋ฃ๋ ๋ํ๋ฐฉ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํํ๊ฑฐ๋ ๋ฐฐ์น ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ expires_at ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ฌ ๋ง๋ฃ ๋์ ํ์ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ต๋ช ๋ฉ์์ง |
| ์ค๋ช | ์ต๋ช ๋ํ๋ฐฉ์์ ์ง๋ฌธ์์ ์์ ์๊ฐ ์ฃผ๊ณ ๋ฐ์ ๊ฐ๋ณ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ต๋ช
๋ํ๋ฐฉ๋ณ ๋ฉ์์ง ๋ด์ฉ์ ์๊ฐ ์์๋๋ก ์ ์ฅํ๊ณ , ๋ฉ์์ง ์์ฑ์ยท์ฝ์ ์ฌ๋ถ ๋ฑ์ ๊ด๋ฆฌํ๋ค. ํฅํ ๋ฉ์์ง ๋จ์ ์ ๊ณ ๋ฐ ๊ด๋ฆฌ ๊ธฐ๋ฅ์์ ๊ฐ๋ณ ๋ฉ์์ง๋ฅผ ์๋ณํ ์ ์๋๋ก ํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
anonymous_rooms 1 : N anonymous_messages, users 1 : N anonymous_messages
|
| PK | id |
| FK |
room_id โ anonymous_rooms.id, user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
VARCHAR(255) |
NOT NULL |
PK |
room_id |
BIGINT |
NOT NULL |
FK โ anonymous_rooms.id
|
user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
content |
VARCHAR(1000) |
NOT NULL |
- |
read_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
๊ฐ๋ณ ์ต๋ช ๋ฉ์์ง๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ๋ฉ์์ง๋ฅผ ๋ํ๋ฐฉ ๋ด๋ถ์ ์์๋ง์ผ๋ก ์๋ณํ์ง ์๊ณ ๋
๋ฆฝ์ ์ธ ์ํฐํฐ๋ก ์๋ณํ๊ธฐ ์ํ ๋๋ฆฌํค์ด๋ค. ํฅํ ๋ฉ์์ง ๋จ์ ์ ๊ณ ยท์ ์ฌยท์กฐํ ๋ฑ์ ๊ธฐ๋ฅ์์ ํน์ ๋ฉ์์ง๋ฅผ ์ง์ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ค. |
room_id |
๋ฉ์์ง๊ฐ ์ํ ์ต๋ช ๋ํ๋ฐฉ์ ์๋ณ์ | ํ๋์ ์ต๋ช
๋ํ๋ฐฉ์ ์ฌ๋ฌ ๋ฉ์์ง๊ฐ ํฌํจ๋๋ฏ๋ก ๊ฐ ๋ฉ์์ง๊ฐ ์ด๋ค ๋ํ์ ์ํ๋์ง ์๋ณํ๊ธฐ ์ํด anonymous_rooms.id๋ฅผ ์ฐธ์กฐํ๋ค. |
user_id |
๋ฉ์์ง๋ฅผ ์์ฑํ ์ฌ์ฉ์์ ์๋ณ์ | ๋ฉ์์ง ์์ฑ ๊ถํ ๊ฒ์ฆ ๋ฐ ์ง๋ฌธ์ยท์์ ์ ๊ตฌ๋ถ์ ์ํด ์ค์ ์์ฑ์์ ์ฌ์ฉ์ ์๋ณ์๋ฅผ ์ ์ฅํ๋ค. |
content |
์ฌ์ฉ์๊ฐ ์ ์กํ ๋ฉ์์ง์ ๋ณธ๋ฌธ | ์ต๋ช
๋ํ ๋ฉ์์ง๋ ์ผ์ ๊ธธ์ด ์ดํ์ ๋ฌธ์์ด๋ก ์ ํํ ์ ์์ผ๋ฏ๋ก VARCHAR(1000)์ ์ฌ์ฉํ๋ค. |
read_at |
์๋ ์ฌ์ฉ์๊ฐ ๋ฉ์์ง๋ฅผ ์ฝ์ ์๊ฐ |
NULL ์ฌ๋ถ๋ฅผ ํตํด ์ฝ์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ฉด์ ์ค์ ์ฝ์ ์์ ๋ ํจ๊ป ๊ธฐ๋กํ ์ ์๋๋ก ํ๋ค. |
created_at |
๋ฉ์์ง๊ฐ ์์ฑ๋ ์๊ฐ | ๋ํ ๋ฉ์์ง๋ฅผ ์๊ฐ ์์๋๋ก ์กฐํํ๊ณ ์ ์ก ์์ ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ํ์ ๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
๋ฉ์์ง๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ์๊ฐ | ํฅํ ๋ฉ์์ง ์์ ๊ธฐ๋ฅ ๋๋ ๊ด๋ฆฌ ์์
์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ์์ ์ ๊ธฐ๋กํ ์ ์๋๋ก ํ๋ฉฐ, ์์ ๋์ง ์์ ์ด๊ธฐ ์ํ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด NULL์ ํ์ฉํ๋ค. |
deleted_at |
๋ฉ์์ง๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ๋ฉ์์ง ์ญ์ ํ์๋ ์ ๊ณ ยท์ด์ ์ด๋ ฅ ๋ฑ์ ํ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋๋ก Soft Delete ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ค. |
ํ๋์ ์ต๋ช ๋ํ๋ฐฉ์์๋ ์ง๋ฌธ์์ ์์ ์๊ฐ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ผ๋ฏ๋ก ๋ํ๋ฐฉ ์ ๋ณด์ ์ค์ ๋ฉ์์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ์ฌ 1 : N ๊ด๊ณ๋ก ๊ตฌ์ฑํ์๋ค.
๊ธฐ๋ณธํค๋ ๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ์๋ค.
ํ์ฌ ์๋น์ค ๊ธฐํ์์๋ ์ ๊ณ ๊ธฐ๋ฅ์ด ๊ฐ๋ณ ๋ฉ์์ง๊ฐ ์๋ ์ต๋ช ๋ํ๋ฐฉ ๋จ์๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ํ์ฌ ์๊ตฌ์ฌํญ๋ง ๊ณ ๋ คํ๋ฉด ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ํ ์ด๋ธ์์ ์ง์ ์ฐธ์กฐํ ํ์๊ฐ ํฌ์ง ์๋ค. ํ์ง๋ง ์๋น์ค ์ด์ ๊ณผ์ ์์ ํน์ ๋ฉ์์ง๋ง์ ์ ๊ณ ํ๊ฑฐ๋ ์ ์ฌํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์๋ค.
ํฅํ ์ ๊ณ ๊ธฐ๋ฅ์ด ํ์ฌ์ ๋ํ๋ฐฉ ๋จ์์์ ๋ฉ์์ง ๋จ์๊น์ง ํ์ฅ๋ ๊ฒฝ์ฐ anonymous_messages.id๋ฅผ ์ ๊ณ ๋์์ ์๋ณ์๋ก ํ์ฉํ ์ ์๋ค. ํ์ฌ๋ถํฐ ๋ฉ์์ง๋ณ๋๋ฆฌํค๋ฅผ ๋ถ์ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ํ
์ด๋ธ์ PK ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ๊ณ ํ
์ด๋ธ๊ณผ FK ๊ด๊ณ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
์ต๋ช
๋ํ์ ๋ฉ์์ง ์๊ฐ ์ฆ๊ฐํ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ฃผ์ํ ์กฐํ ํจํด์ ํน์ ๋ํ๋ฐฉ์ ๋ฉ์์ง๋ฅผ ์๊ฐ ์์๋ก ์กฐํํ๋ ํํ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ (room_id, created_at) ๋ณตํฉ ์ธ๋ฑ์ค ์ถ๊ฐ๋ฅผ ๊ฒํ ํ ์ ์๋ค.
๋์ผํ created_at์ ๊ฐ์ง๋ ๋ฉ์์ง๊ฐ ์กด์ฌํ ๊ฐ๋ฅ์ฑ๊น์ง ๊ณ ๋ คํ์ฌ ์์ ์ ์ธ ์ ๋ ฌ ๋๋ ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์
์ด ํ์ํ๋ค๋ฉด (room_id, created_at, id) ํํ์ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๊ณ created_at๊ณผ id๋ฅผ ํจ๊ป ์ปค์๋ก ์ฌ์ฉํ๋ ๋ฐฉ์๋ ๊ฒํ ํ ์ ์๋ค.
ํฅํ ๋ฉ์์ง ์ ์ก ์ฌ์๋๋ก ์ธํ ์ค๋ณต ๋ฉ์์ง ์์ฑ์ ๋ฐฉ์งํด์ผ ํ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ์์ ์์ฑํ client_message_id๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ UNIQUE ์ ์ฝ์กฐ๊ฑด์ ์ ์ฉํ๋ ๋ฐฉ์๋ ๊ณ ๋ คํ ์ ์๋ค. ์ด๋ ์๋ฒ๊ฐ ๋์ผ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ์ ๋ฌ๋ฐ๋๋ผ๋ ๋์ผ ๋ฉ์์ง๊ฐ ์ค๋ณต ์ ์ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ฉ๋๋ก ํ์ฉํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ ๊ณ |
| ์ค๋ช | ์ต๋ช ๋ํ์์ ๋ฐ์ํ ์ฌ์ฉ์ ์ ๊ณ ๋ด์ญ๊ณผ ์ ๊ณ ์ฒ๋ฆฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ ๊ณ ์, ์ ๊ณ ๋์ ์ฌ์ฉ์, ์ ๊ณ ๋์ ๋ํ๋ฐฉ๊ณผ ์ ๊ณ ์ฌ์ ๋ฅผ ์ ์ฅํ๊ณ ์ด์์์ ์ ๊ณ ์ฒ๋ฆฌ ์ํ ๋ฐ ์น์ธ ์์ ์ ๊ด๋ฆฌํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N reports (reporter_user_id ๊ธฐ์ค),users 1 : N reports (reported_user_id ๊ธฐ์ค), anonymous_rooms 1 : N reports
|
| PK | id |
| FK |
reporter_user_id โ users.id, reported_user_id โ users.id, room_id โ anonymous_rooms.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
reporter_user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
reported_user_id |
BIGINT |
NOT NULL |
FK โ users.id UK |
room_id |
BIGINT |
NOT NULL |
FK โ anonymous_rooms.id UK |
type |
VARCHAR(30) |
NOT NULL |
|
reason |
VARCHAR(500) |
NULL |
- |
status |
ENUM('PENDING', 'APPROVED', 'REJECTED') |
NOT NULL; DEFAULT 'PENDING' |
- |
approved_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
์ ๊ณ ๋ด์ญ์ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ๋์ผํ ์ฌ์ฉ์๋ ๋ํ๋ฐฉ์์ ์ฌ๋ฌ ์ ๊ณ ๊ฐ ๋ฐ์ํ ์ ์๊ณ ๊ฐ๋ณ ์ ๊ณ ๊ฑด์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ฏ๋ก ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. |
reporter_user_id |
์ ๊ณ ๋ฅผ ์์ฒญํ ์ฌ์ฉ์ ์๋ณ์ | ์ ๊ณ ์ฃผ์ฒด๋ฅผ ์๋ณํ๊ณ ์ค๋ณต ์ ๊ณ ๊ฒ์ฆ ๋ฐ ์ด์ ์ฒ๋ฆฌ์ ํ์ฉํ๊ธฐ ์ํด users.id๋ฅผ ์ฐธ์กฐํ๋ค. |
reported_user_id |
์ ๊ณ ๋์ ์ฌ์ฉ์์ ์๋ณ์ | ์ ๊ณ ๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ณ ์ ๊ณ ๋์ ๋ฐ ์ ์ฌ ํ๋จ ๋ฑ์ ํ์ฉํ๊ธฐ ์ํด users.id๋ฅผ ์ฐธ์กฐํ๋ค. |
room_id |
์ ๊ณ ๋์์ด ๋๋ ์ต๋ช ๋ํ๋ฐฉ ์๋ณ์ | ํ์ฌ ์๋น์ค์์๋ ๊ฐ๋ณ ๋ฉ์์ง๊ฐ ์๋ ๋ํ๋ฐฉ ๋จ์๋ก ์ ๊ณ ํ๋ฏ๋ก anonymous_rooms.id๋ฅผ ์ฐธ์กฐํ๋ค. |
type |
์ ๊ณ ์ ํ | ์ ๊ณ ์ ํ์ ์๋น์ค ์ด์ ๊ณผ์ ์์ ์ถ๊ฐยท๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก DB ENUM ๋์ VARCHAR(30)์ผ๋ก ์ ์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ Enum์ผ๋ก ํ์ฉ ๊ฐ์ ๊ด๋ฆฌํ๋ค. |
reason |
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ๊ณ ์์ธ ์ฌ์ | ์ ํํ๋ ์ ๊ณ ์ ํ ์ธ์ ์ถ๊ฐ ์ค๋ช
์ด ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ฌธ์์ด๋ก ์ ์ฅํ๋ฉฐ, ์ ํ ์
๋ ฅ์ ๊ณ ๋ คํด NULL์ ํ์ฉํ๋ค. |
status |
์ ๊ณ ์ฒ๋ฆฌ ์ํ | ์ ๊ณ ์ฒ๋ฆฌ ํ๋ฆ์ ๊ตฌ์ฑํ๋ ์ํ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ณ ํ์ฉ๋์ง ์์ ์ํ๊ฐ ์ ์ฅ๋์ง ์๋๋ก DB ์์ค์์ ๊ฐ์ ํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ์ฌ ENUM์ผ๋ก ๊ตฌ์ฑํ๋ค. |
approved_at |
์ ๊ณ ๊ฐ ์น์ธ๋ ์๊ฐ | ์น์ธ๋์ง ์์ ์ ๊ณ ์์๋ ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ฉฐ, ์น์ธ ์ฌ๋ถ๋ฟ ์๋๋ผ ์ค์ ์น์ธ ์์ ๊น์ง ๊ธฐ๋กํ๋ค. |
created_at |
์ ๊ณ ๊ฐ ์ ์๋ ์๊ฐ | ์ ๊ณ ์์ฑ ์์ ์ ๊ธฐ๋กํ๊ณ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ํ์
์ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
ํ๋์ ๋ํ๋ฐฉ์ด๋ ๋์ผํ ์ฌ์ฉ์์ ๋ํด ์ฌ๋ฌ ๋ฒ์ ์ ๊ณ ๊ฐ ๋ฐ์ํ ์ ์๊ณ ๊ฐ๊ฐ์ ์ ๊ณ ๋ ๋
๋ฆฝ์ ์ธ ์ฒ๋ฆฌ ์ํ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉํ์๋ค.
ํ์ฌ ์ ๊ณ ๊ธฐ๋ฅ์ ๊ฐ๋ณ ๋ฉ์์ง๊ฐ ์๋๋ผ ์ต๋ช
๋ํ๋ฐฉ ๋จ์๋ก ์ ๊ณ ํ๋ ๊ตฌ์กฐ์ด๋ฏ๋ก room_id๋ฅผ ํตํด anonymous_rooms๋ฅผ ์ฐธ์กฐํ๋ค. ์ ๊ณ ์ฒ๋ฆฌ ๊ณผ์ ์์๋ ์ ๊ณ ๋ฅผ ์์ฒญํ ์ฌ์ฉ์์ ์ ๊ณ ๋์ ์ฌ์ฉ์๋ฅผ ๋ชจ๋ ์๋ณํด์ผ ํ๋ฏ๋ก reporter_user_id, reported_user_id๋ฅผ ๊ฐ๊ฐ ๋ณ๋์ FK๋ก ๊ตฌ์ฑํ์๋ค. ํ์ฌ DDL์์๋ ๋ ์ฌ์ฉ์ FK์ anonymous_rooms FK๊ฐ ์ ์๋์ด ์๋ค.
type๊ณผ status๋ ๋ชจ๋ ์ ํ๋ ๋ฌธ์์ด ๊ฐ์ด๋ผ๋ ์ ์์๋ ์ ์ฌํ์ง๋ง, ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ๊ณผ ๋น์ฆ๋์ค ์๋ฏธ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ค.
์ ๊ณ ์ ํ์ ์ด์ํ๊ฒฝ ํ์ฅ์ฑ ๊ณ ๋ คํด DB ENUM์ผ๋ก ๊ณ ์ ํ์ง ์๊ณ VARCHAR(30)์ผ๋ก ์ ์ฅํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๋ Enum์์ ํ์ฉ๋๋ ๊ฐ์ ๊ด๋ฆฌํ๋๋ก ๊ตฌ์ฑํ๋ค.
status๋ ์ ๊ณ ์ ํ๊ณผ ๋ฌ๋ฆฌ ์ ๊ณ ์ฒ๋ฆฌ ํ๋ก์ธ์ค ์์ฒด๋ฅผ ๋ํ๋ธ๋ค. ํ์ฌ DDL์์๋ PENDING, APPROVED, REJECTED ์ธ ์ํ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ ๊ณ ๊ฐ ์ ์๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก PENDING ์ํ๋ก ์์ฑ๋๋ค.
ํฅํ ์๋ก์ด ์ ๊ณ ์ ํ์ด ์ถ๊ฐ๋๋๋ผ๋ type์ด VARCHAR(30)์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก DB ENUM ๋ณ๊ฒฝ ์์ด ์ ํ๋ฆฌ์ผ์ด์
Enum์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ์ฌ ๋์ํ ์ ์๋ค.
์ ๊ณ ์ ํ๋ณ ์ด๋ฆ์ด๋ ์ค๋ช
, ์ ๊ณ ์ ์ฑ
, ์๋ ์ ์ฌ ๊ธฐ์ค ๋ฑ ์ถ๊ฐ์ ์ธ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์ํด์ง๋ ๊ฒฝ์ฐ์๋ ํ์ฌ ์ฝ๋ Enum ๊ด๋ฆฌ ๋ฐฉ์์ ์ ์งํ๊ธฐ๋ณด๋ค report_types์ ๊ฐ์ ๋ง์คํฐ ํ
์ด๋ธ์ ๋ณ๋๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ ๊ฒํ ํ ์ ์๋ค.
ํ์ฌ๋ ๋ํ๋ฐฉ ๋จ์ ์ ๊ณ ๋ง ์ง์ํ์ง๋ง ํฅํ ํน์ ๋ฉ์์ง๋ฅผ ์ ๊ณ ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ ์์ anonymous_messages์ ๋ถ์ฌํ ๋๋ฆฌํค๋ฅผ ํ์ฉํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ anonymous_message_id๋ฅผ ์ถ๊ฐํ์ฌ ํน์ ๋ฉ์์ง๋ฅผ ์ง์ ์ฐธ์กฐํ๊ฑฐ๋ ์ ๊ณ ๋์์ ๋ชจ๋ธ๋ง ๋ฐฉ์ ์์ฒด๋ฅผ ์ฌ๊ฒํ ํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | AI ๋ํ๋ฐฉ |
| ์ค๋ช | ์ฌ์ฉ์์ AI๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ํ๋ฅผ ํ๋์ ๋ํ ๋จ์๋ก ๊ด๋ฆฌํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | ์ฌ์ฉ์๋ณ AI ๋ํ ์ธ์ ์ ์์ฑํ๊ณ ๋ํ ์ํ์ ์๋ฌธ ์ญ์ ์์ ์์ ์ ๊ด๋ฆฌํ๋ฉฐ, AI ๋ฉ์์ง์ ์ทจํฅ ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ ๋ํ๋ฐฉ ๋จ์๋ก ์ฐ๊ฒฐํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
users 1 : N ai_chat_rooms, ai_chat_rooms 1 : N ai_messages, ai_chat_rooms 1 : 1 taste_analyses
|
| PK | id |
| FK |
user_id โ users.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
user_id |
BIGINT |
NOT NULL |
FK โ users.id
|
status |
ENUM('ACTIVE', 'ANALYZING', 'COMPLETED') |
NOT NULL; DEFAULT 'ACTIVE' |
- |
purge_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
deleted_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
AI ๋ํ๋ฐฉ์ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ํ๋์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ AI ๋ํ๋ฅผ ์์ฑํ ์ ์๊ณ ๋ฉ์์ง์ ์ทจํฅ ๋ถ์์์ ํน์ ๋ํ๋ฐฉ์ ์ฐธ์กฐํด์ผ ํ๋ฏ๋ก ๋ ๋ฆฝ์ ์ธ ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. |
user_id |
AI ๋ํ๋ฅผ ์งํํ๋ ์ฌ์ฉ์ ์๋ณ์ | ์ด๋ค ์ฌ์ฉ์์ AI ๋ํ์ธ์ง ์๋ณํ๊ธฐ ์ํด users.id๋ฅผ ์ฐธ์กฐํ๋ค. |
status |
AI ๋ํ๋ฐฉ์ ํ์ฌ ์งํ ์ํ | ๋ํ ์งํ ์ํ๊ฐ ACTIVE โ ANALYZING โ COMPLETED์ ๊ฐ์ด ์ ํ๋ ์ํ ์งํฉ์ผ๋ก ๊ด๋ฆฌ๋๋ฏ๋ก DB ENUM์ ํตํด ํ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ์ ํํ๋ค. |
purge_at |
AI ๋ํ ์๋ฌธ์ ์ญ์ ํ ์์ ์๊ฐ | ๋ํ ์๋ฌธ ๋ณด๊ด ์ ์ฑ
์ ๋ฐ๋ผ ์ญ์ ์์ ์์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ญ์ ์์ ์์ ์ด ์์ง ๊ฒฐ์ ๋์ง ์์ ์ํ๋ฅผ ๊ณ ๋ คํ์ฌ NULL์ ํ์ฉํ๋ค. |
created_at |
AI ๋ํ๋ฐฉ์ด ์์ฑ๋ ์๊ฐ | ๋ํ ์์ฑ ์์ ์ ๊ธฐ๋กํ๊ณ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ ํ์
๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
AI ๋ํ๋ฐฉ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ์๊ฐ | ์ํ ๋ณ๊ฒฝ์ด๋ ์๋ฌธ ์ญ์ ์์ ์์ ๋ณ๊ฒฝ ๋ฑ์ ์์ ์์ ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
deleted_at |
AI ๋ํ๋ฐฉ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ ์๊ฐ | ๋ํ๋ฐฉ์ ์ฆ์ ๋ฌผ๋ฆฌ ์ญ์ ํ์ง ์๊ณ ํ์ ์ ๋ณต๊ตฌ ๋๋ ์ด์ ๊ธฐ๋ก์ ์ ์งํ ์ ์๋๋ก Soft Delete ์ฉ๋๋ก ์ฌ์ฉํ๋ค. |
ํ๋์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ฒ AI์ ๋ํ๋ฅผ ์์ํ ์ ์์ผ๋ฏ๋ก user_id ์์ฒด๋ฅผ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๊ฐ์ ๋ํ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์๋ณํ ์ ์๋๋ก ๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ์๋ค.
AI ๋ํ๋ฐฉ์ ๋จ์ํ ์ฌ์ฉ์์ AI ์ฌ์ด์ ์ฐ๊ฒฐ ๊ด๊ณ๋ง์ ๋ํ๋ด๋ ํ
์ด๋ธ์ด ์๋๋ผ ๋ํ ์ํ, ์์ฑ ์์ , ์๋ฌธ ์ญ์ ์์ ์์ ๋ฑ ์์ฒด์ ์ธ ์๋ช
์ฃผ๊ธฐ์ ์ํ๋ฅผ ๊ฐ์ง๋ ์ํฐํฐ์ด๋ค. ๋ฐ๋ผ์ (user_id, ...)์ ๊ฐ์ ์์ฐํค๋ฅผ ๊ตฌ์ฑํ๊ธฐ๋ณด๋ค ๋
๋ฆฝ์ ์ธ id๋ฅผ ํตํด ๋ํ๋ฐฉ ์์ฒด๋ฅผ ์๋ณํ๋๋ก ๊ตฌ์ฑํ์๋ค.
์ทจํฅ ๋ถ์์ ๊ฒฝ์ฐ ๊ฐ๋ณ ๋ฉ์์ง๊ฐ ์๋๋ผ ํ๋์ AI ๋ํ๋ฐฉ์ ๊ธฐ์ค์ผ๋ก ์ํ๋๋ฏ๋ก taste_analyses.room_id๊ฐ ai_chat_rooms.id๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑํ์๋ค. ํ์ฌ taste_analyses๋ room_id ์์ฒด๋ฅผ PK๋ก ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋์ AI ๋ํ๋ฐฉ์ ํ๋์ ์ทจํฅ ๋ถ์ ๋ฐ์ดํฐ๋ง ์กด์ฌํ๋ ๊ตฌ์กฐ์ด๋ค.
user_id๋ ๋ํ๋ฐฉ์ ์์ ์๋ฅผ ๋ํ๋ธ๋ค. ํ๋์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ํ๋ฐฉ์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก users์ ai_chat_rooms๋ 1 : N ๊ด๊ณ๋ก ๊ตฌ์ฑํ์๋ค. ํ์ฌ DDL์์๋ user_id๊ฐ users.id๋ฅผ FK๋ก ์ฐธ์กฐํ๋ค.
๋ํ๋ฐฉ ์ ๋ชฉ์ด๋ ๋ง์ง๋ง ๋ฉ์์ง ์๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ title, last_message_at ๋ฑ์ ์ปฌ๋ผ ์ถ๊ฐ๋ฅผ ๊ฒํ ํ ์ ์๋ค. ํนํ AI ๋ํ ๋ชฉ๋ก ํ๋ฉด์ด ์ถ๊ฐ๋์ด ์ต๊ทผ ๋ํ๋ฐฉ์ ์์ฃผ ์กฐํํ๊ฒ ๋๋ค๋ฉด last_message_at์ ๋ณ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์กฐํ ์๋ง๋ค ai_messages์์ MAX(created_at)์ ๊ณ์ฐํ๋ ๊ฒ๋ณด๋ค ํจ์จ์ ์ผ ์ ์๋ค.
๋ํ ์๋ฌธ ์ญ์ ์ ์ฑ
์ด ์ค์ ์ด์์ ์ ์ฉ๋๋ ๊ฒฝ์ฐ purge_at์ ๊ธฐ์ค์ผ๋ก ์ญ์ ๋์ ๋ํ๋ฐฉ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํํ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก purge_at ์ธ๋ฑ์ค ์ถ๊ฐ๋ฅผ ๊ฒํ ํ ์ ์๋ค.
ํฅํ AI ๋ํ ์ํ๊ฐ ACTIVE, ANALYZING, COMPLETED ์ด์ธ์๋ FAILED, CANCELLED, EXPIRED ๋ฑ์ผ๋ก ์์ฃผ ํ์ฅ๋๊ณ ๋ฐฐํฌ ๊ณผ์ ์์ ์ํ ๋ณ๊ฒฝ์ด ๋น๋ฒํด์ง๋ค๋ฉด DB ENUM ์ ์ง ์ฌ๋ถ๋ฅผ ์ฌ๊ฒํ ํ ์ ์๋ค. ๊ทธ ์์ ์๋ VARCHAR(30) + ์ฝ๋ Enum ๋ฐฉ์์ด ์ด์ ์ ์ฐ์ฑ ์ธก๋ฉด์์ ๋ ์ ํฉํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | AI ๋ํ ๋ฉ์์ง |
| ์ค๋ช | ์ฌ์ฉ์์ AI๊ฐ ๋ํ๋ฐฉ์์ ์ฃผ๊ณ ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | AI ๋ํ๋ฐฉ์์ ๋ฐ์ํ ์ฌ์ฉ์ ๋ฉ์์ง์ AI ์๋ต์ ์ ์ฅํ๊ณ , ๋ฉ์์ง ๋ฐ์ ์ฃผ์ฒด์ ์์ฑ ์์ ์ ๊ธฐ์ค์ผ๋ก ๋ํ ๋ด์ญ์ ๊ด๋ฆฌํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
ai_chat_rooms 1 : N ai_messages
|
| PK | id |
| FK |
room_id โ ai_chat_rooms.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
id |
BIGINT |
NOT NULL |
PK |
room_id |
BIGINT |
NOT NULL |
FK โ ai_chat_rooms.id
|
sender_type |
ENUM('USER', 'AI') |
NOT NULL |
- |
content |
TEXT |
NOT NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
id |
๋ฉ์์ง๋ฅผ ์๋ณํ๋ ๊ณ ์ ์๋ณ์ | ํ๋์ ๋ํ๋ฐฉ์์ ์ฌ๋ฌ ๋ฉ์์ง๊ฐ ์์ฑ๋๊ณ ๊ฐ ๋ฉ์์ง๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์๋ณํด์ผ ํ๋ฏ๋ก ๋๋ฆฌํค๋ฅผ ์ฌ์ฉํ๋ค. ์๋น์ค ๋ด ์ฃผ์ ์๋ณ์ ํ์ ๊ณผ ํต์ผํ๊ธฐ ์ํด BIGINT๋ฅผ ์ฌ์ฉํ๋ค. |
room_id |
๋ฉ์์ง๊ฐ ํฌํจ๋ AI ๋ํ๋ฐฉ์ ์๋ณ์ | ํ๋์ ๋ํ๋ฐฉ์ ์ฌ๋ฌ ๋ฉ์์ง๊ฐ ์กด์ฌํ๋ 1:N ๊ด๊ณ๋ฅผ ํํํ๊ธฐ ์ํด ai_chat_rooms.id๋ฅผ ์ฐธ์กฐํ๋ค. |
sender_type |
๋ฉ์์ง๋ฅผ ์์ฑํ ์ฃผ์ฒด | ๋ฉ์์ง ๋ฐ์ ์ฃผ์ฒด๋ ์ฌ์ฉ์์ AI ๋ ์ข
๋ฅ๋ก ๋ช
ํํ๊ฒ ์ ํ๋๋ฉฐ ๊ฐ์ ๋ณ๊ฒฝ ๋ฐ ํ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ผ๋ฏ๋ก DB ENUM์ ์ฌ์ฉํ๋ค. |
content |
์ฌ์ฉ์ ๋๋ AI๊ฐ ์ ์กํ ๋ฉ์์ง ๋ด์ฉ | AI ์๋ต์ ๋ฉ์์ง ๊ธธ์ด๊ฐ ๊ฐ๋ณ์ ์ด๊ณ ๋น๊ต์ ๊ธด ํ
์คํธ๊ฐ ์ ์ฅ๋ ์ ์์ผ๋ฏ๋ก ๊ณ ์ ๋ ๊ธธ์ด๋ฅผ ์ง์ ํ๋ VARCHAR๋ณด๋ค TEXT๋ฅผ ์ฌ์ฉํ๋ค. |
created_at |
๋ฉ์์ง๊ฐ ์์ฑ๋ ์๊ฐ | ๋ํ ๋ฉ์์ง์ ์์ฑ ์์ ๊ธฐ๋ก ๋ฐ ๋ฉ์์ง ์์ ํ๋จ์ ์ฌ์ฉํ๋ฉฐ ์๋น์ค ๋ด ์๊ฐ ํ์
๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
ํ๋์ ai_chat_rooms์ ์ฌ๋ฌ ๊ฐ์ ๋ฉ์์ง๊ฐ ์์ฑ๋ ์ ์์ผ๋ฏ๋ก room_id๋ฅผ FK๋ก ๋์ด ai_chat_rooms์ 1:N ๊ด๊ณ๋ก ๊ตฌ์ฑํ์๋ค.
๊ฐ ๋ฉ์์ง๋ ๋
๋ฆฝ์ ์ผ๋ก ์๋ณ๋ ํ์๊ฐ ์์ผ๋ฏ๋ก id ๋๋ฆฌํค๋ฅผ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉํ์๋ค. (room_id, created_at) ๋ฑ์ ์กฐํฉ์ ํตํด ๋ฉ์์ง๋ฅผ ๊ตฌ๋ถํ ์๋ ์์ง๋ง ๋์ผ ์๊ฐ์ ์ฌ๋ฌ ๋ฉ์์ง๊ฐ ์์ฑ๋ ๊ฐ๋ฅ์ฑ์ ์์ ํ ๋ฐฐ์ ํ๊ธฐ ์ด๋ ต๊ณ , ํน์ ๋ฉ์์ง ์กฐํ ๋ฐ ํฅํ ๋ฉ์์ง ๋จ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๋จ์ผ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ฏ๋ก ๋ณ๋์ id๋ฅผ ์ฌ์ฉํ์๋ค.
๋ณ๋์ sender_user_id๋ฅผ ๋์ง ์์ ์ด์ ๋ AI ๋ํ๋ฐฉ์ ์ฌ์ฉ์๋ฅผ ai_chat_rooms๋ฅผ ํตํด ์๋ณํ ์ ์๊ณ , sender_type = 'USER'์ธ ๊ฒฝ์ฐ ํด๋น ๋ํ๋ฐฉ์ ์ฌ์ฉ์๊ฐ ๋ฐ์ ์๋ผ๋ ๊ด๊ณ๊ฐ ๋ช
ํํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ฌ์ฒ๋ผ ํ๋์ ์ฌ์ฉ์์ AI๊ฐ ๋ํํ๋ ๊ตฌ์กฐ์์๋ ๋ฉ์์ง๋ง๋ค ์ฌ์ฉ์ ID๋ฅผ ์ค๋ณต ์ ์ฅํ ํ์์ฑ์ด ๋ฎ๋ค.
๋๋ํ ๋ด ๋ฉ์์ง๊ฐ ์ฆ๊ฐํ ๊ฒฝ์ฐ ํน์ ๋ํ๋ฐฉ์ ๋ฉ์์ง๋ฅผ ์๊ฐ์์ผ๋ก ์กฐํํ๋ ๊ฒ์ด ์ฃผ์ ์กฐํ ํจํด์ด ๋๋ฏ๋ก (room_id, created_at, id) ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ฒํ ํ ์ ์๋ค. ํนํ ๋ฉ์์ง ๋ชฉ๋ก์ ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์
์ผ๋ก ์กฐํํ๋ ๊ฒฝ์ฐ created_at๊ณผ id๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ผํ ์์ฑ ์๊ฐ์ ๊ฐ์ง ๋ฉ์์ง์ ๋ํด์ ์กฐํ ์์๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค.
AI ์๋ต ์์ฑ ์คํจ๋ ์ฌ์์ฑ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ status, error_code, regenerated_from_message_id ๋ฑ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ฌ ๋ฉ์์ง ์์ฑ ์ํ ๋ฐ ๋ฉ์์ง ๊ฐ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ํ์ฅํ ์ ์๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ํ๊ธ ํ ์ด๋ธ๋ช | ์ทจํฅ ๋ถ์ |
| ์ค๋ช | AI ๋ํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์ฌ์ฉ์์ ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ์ ๋ถ์ ์งํ ์ํ๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ |
| ๊ธฐ๋ฅ์ ์ญํ | AI ๋ํ๋ฐฉ์์ ์ํ๋๋ ์ทจํฅ ๋ถ์์ ์งํ ์ํ, ์์ ๋ถ์ ๊ฒฐ๊ณผ ๋ฐ ์ฌ์ฉ์์ ๋ถ์ ๊ฒฐ๊ณผ ์น์ธ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ค. |
| ์ฃผ์ ๊ด๊ณ |
ai_chat_rooms 1 : 1 taste_analyses
|
| PK | room_id |
| FK |
room_id โ ai_chat_rooms.id
|
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | ์ ์ฝ์กฐ๊ฑด / ๊ธฐ๋ณธ๊ฐ | PK/FK |
|---|---|---|---|
room_id |
BIGINT |
NOT NULL |
PK, FK โ ai_chat_rooms.id
|
status |
ENUM('QUEUED', 'RUNNING', 'SUCCEEDED', 'FAILED') |
NOT NULL; DEFAULT 'QUEUED' |
- |
progress |
TINYINT |
NOT NULL; DEFAULT 0 |
- |
progress_message |
VARCHAR(255) |
NULL |
- |
candidate_result |
JSON |
NULL |
- |
decision |
ENUM('PENDING', 'ACCEPTED', 'REJECTED') |
NOT NULL; DEFAULT 'PENDING' |
- |
completed_at |
DATETIME(6) |
NULL |
- |
decided_at |
DATETIME(6) |
NULL |
- |
created_at |
DATETIME(6) |
NOT NULL; DEFAULT CURRENT_TIMESTAMP(6) |
- |
updated_at |
DATETIME(6) |
NULL |
- |
| ์ปฌ๋ผ๋ช | ์ปฌ๋ผ ์ค๋ช | ๋ฐ์ดํฐ ํ์ ์ ํ ๊ทผ๊ฑฐ |
|---|---|---|
room_id |
์ทจํฅ ๋ถ์์ด ์ํ๋ AI ๋ํ๋ฐฉ์ ์๋ณ์ | ํ๋์ AI ๋ํ๋ฐฉ์๋ ํ๋์ ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ๋ง ์กด์ฌํ๋ฏ๋ก ๋ณ๋์ ๋๋ฆฌํค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ถ๋ชจ ํ ์ด๋ธ์ PK๋ฅผ ๊ทธ๋๋ก PK ๋ฐ FK๋ก ์ฌ์ฉํ์ฌ 1:1 ๊ด๊ณ๋ฅผ ํํํ๋ค. |
status |
์ทจํฅ ๋ถ์ ์์ ์ ํ์ฌ ์งํ ์ํ | ๋ถ์ ์์
์ ์ํ๋ ๋๊ธฐ, ์คํ ์ค, ์ฑ๊ณต, ์คํจ๋ผ๋ ์ ํ๋ ์ํ ์ ์ด๋ฅผ ํํํ๋ฉฐ ์ด์ ์ค ์์์ ๊ฐ์ด ์ถ๊ฐ๋๋ ์ฑ๊ฒฉ์ด ์๋๋ฏ๋ก DB ENUM์ผ๋ก ํ์ฉ ๊ฐ์ ์ ํํ๋ค. |
progress |
์ทจํฅ ๋ถ์ ์งํ๋ฅ | ๋ถ์ ์งํ๋ฅ ์ 0~100 ์์ค์ ์์ ์ ์ ๊ฐ์ผ๋ก ํํํ๋ฏ๋ก TINYINT๋ฅผ ์ฌ์ฉํ๋ค. |
progress_message |
ํ์ฌ ๋ถ์ ์งํ ์ํ๋ฅผ ์ฌ์ฉ์์๊ฒ ์๋ดํ๊ธฐ ์ํ ๋ฉ์์ง | ์งํ ๋จ๊ณ์ ๋ฐ๋ฅธ ์งง์ ์๋ด ๋ฌธ๊ตฌ๋ฅผ ์ ์ฅํ๋ ์ฉ๋์ด๋ฏ๋ก VARCHAR(255)๋ฅผ ์ฌ์ฉํ๋ฉฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด NULL์ ํ์ฉํ๋ค. |
candidate_result |
์ฌ์ฉ์ ์น์ธ ์ ์์ฑ๋ ์์ ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ | ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ๋ ์ ํธ ํญ๋ชฉ, ๋น์ ํธ ํญ๋ชฉ, ๊ด์ฌ์ฌ ๋ฑ ์ฌ๋ฌ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์ ์์ด ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฒฐ๊ณผ๋ก ์ ์ฅํ ์ ์๋๋ก JSON์ ์ฌ์ฉํ๋ค. |
decision |
์์ฑ๋ ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ์ ๋ํ ์ฌ์ฉ์์ ๊ฒฐ์ ์ํ | ์ฌ์ฉ์์ ๊ฒฐ์ ์ ๋๊ธฐ, ์น์ธ, ๊ฑฐ์ ์ด๋ผ๋ ๋ช
ํํ๊ณ ์ ํ๋ ์ํ๋ง ๊ฐ์ง๋ฉฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ผ๋ฏ๋ก DB ENUM์ ์ฌ์ฉํ๋ค. |
completed_at |
์ทจํฅ ๋ถ์ ์์ ์ด ์๋ฃ๋ ์๊ฐ | ๋ถ์์ด ์๋ฃ๋๊ธฐ ์ ์๋ ์๋ฃ ์๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ฉฐ ์๋น์ค ๋ด ์๊ฐ ์ปฌ๋ผ๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
decided_at |
์ฌ์ฉ์๊ฐ ๋ถ์ ๊ฒฐ๊ณผ์ ๋ํด ์น์ธ ๋๋ ๊ฑฐ์ ์ ๊ฒฐ์ ํ ์๊ฐ | ์ฌ์ฉ์์ ๊ฒฐ์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ์ ์๋ ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฏ๋ก NULL์ ํ์ฉํ๋ค. |
created_at |
์ทจํฅ ๋ถ์ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋ ์๊ฐ | ๋ถ์ ์์
์ ์์ฑ ์์ ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ ์๋น์ค์ ์๊ฐ ํ์
๊ณผ ํต์ผํ๊ธฐ ์ํด DATETIME(6)์ ์ฌ์ฉํ๋ค. |
updated_at |
์ทจํฅ ๋ถ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ ๋ ์๊ฐ | ๋ถ์ ์งํ๋ฅ , ์ํ, ๋ถ์ ๊ฒฐ๊ณผ ๋ฐ ์ฌ์ฉ์ ๊ฒฐ์ ๋ฑ์ด ๋ณ๊ฒฝ๋ ์์ ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
taste_analyses๋ AI ๋ํ๋ฐฉ์ ๋ํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋๋ ์ทจํฅ ๋ถ์ ์์
๊ณผ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ํ
์ด๋ธ์ด๋ค. ๋ถ์ ์์
์ ์งํ ์ํ๋ฟ ์๋๋ผ ๋ถ์ ์๋ฃ ํ ์์ฑ๋ ์์ ๊ฒฐ๊ณผ์ ์ฌ์ฉ์์ ์น์ธ ์ฌ๋ถ๊น์ง ํ๋์ ๋ถ์ ์๋ช
์ฃผ๊ธฐ๋ก ๊ด๋ฆฌํ๋ค.
ํ๋์ ai_chat_rooms์ ๋ํด ํ๋์ ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ๋ง ์กด์ฌํ๋ ๊ฒ์ด ํ์ฌ ๋น์ฆ๋์ค ๊ท์น์ด๋ฏ๋ก room_id๋ฅผ taste_analyses์ ๊ธฐ๋ณธํค์ด์ ์ธ๋ํค๋ก ์ฌ์ฉํ์๋ค.
๋ณ๋์ id ๋๋ฆฌํค๋ฅผ ๋๋ ๊ฒฝ์ฐ์๋ ํ๋์ ๋ํ๋ฐฉ์ ํ๋์ ๋ถ์ ๊ฒฐ๊ณผ๋ง ์กด์ฌํ๋ค๋ ๊ท์น์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฒฐ๊ตญ room_id์ UNIQUE ์ ์ฝ์กฐ๊ฑด์ด ์ถ๊ฐ๋ก ํ์ํ๋ค. ๋ํ ํ์ฌ taste_analyses ์์ฒด๋ฅผ ๋ค๋ฅธ ํ
์ด๋ธ์์ ๋
๋ฆฝ์ ์ผ๋ก ์ฐธ์กฐํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์๋ณ์๋ฅผ ์ถ๊ฐํ์ ๊ฒฝ์ฐ ์ด๋์ด ํฌ์ง ์๋ค.
๋ฐ๋ผ์ ๋ถ๋ชจ์ธ ai_chat_rooms.id๋ฅผ ์์์ PK๋ก ๊ทธ๋๋ก ์ฌ์ฉํ๋ ์๋ณ ๊ด๊ณ๋ก ์ค๊ณํ์ฌ ai_chat_rooms์ taste_analyses์ ๊ด๊ณ๋ฅผ 1:1๋ก ๋ช
ํํ๊ฒ ํํํ์๋ค.
ํ์ฌ๋ ํ๋์ AI ๋ํ๋ฐฉ์ ํ๋์ ์ทจํฅ ๋ถ์ ๊ฒฐ๊ณผ๋ง ์กด์ฌํ๋ค๋ ๋น์ฆ๋์ค ๊ท์น์ ๊ธฐ์ค์ผ๋ก room_id๋ฅผ PK๋ก ์ฌ์ฉํ๊ณ ์๋ค.
ํฅํ ๋์ผํ ๋ํ๋ฐฉ์ ๋ํด ์ทจํฅ ๋ถ์์ ์ฌ๋ฌ ๋ฒ ์ฌ์ํํ๊ณ ๊ฐ๊ฐ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ ฅ์ผ๋ก ๋ณด์กดํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์๊ธด๋ค๋ฉด ํ์ฌ์ 1:1 ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ taste_analyses.id์ ๊ฐ์ ๋ณ๋์ ๋๋ฆฌํค๋ฅผ ์ถ๊ฐํ๊ณ room_id๋ฅผ ์ผ๋ฐ FK๋ก ๋ณ๊ฒฝํ์ฌ ai_chat_rooms 1 : N taste_analyses ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฒํ ํ ์ ์๋ค.
๋ถ์ ์ฌ์๋๊ฐ ๋จ์ํ ์คํจํ ์์
์ ๋ค์ ์คํํ๋ ์์ค์ด๊ณ ์ด์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋์ ์ด๋ ฅ์ผ๋ก ๋ณด์กดํ ํ์๊ฐ ์๋ค๋ฉด ํ์ฌ ๋ ์ฝ๋์ status, progress, candidate_result ๋ฑ์ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์๋ ์๋ค.
candidate_result ๋ด๋ถ ํน์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฒ์์ด๋ ์ง๊ณ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ ๊ฒฝ์ฐ JSON ๋ด๋ถ ๋ฐ์ดํฐ ์ค ์ฃผ์ ์กฐํ ๋์์ ๋ณ๋ ์ปฌ๋ผ ๋๋ ์ ๊ทํ๋ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๊ฒํ ํ ์ ์๋ค.
- [API ์ธ์ฆ ํ๋ฆ](API ์ธ์ฆ ํ๋ฆ ๋งํฌ)
- [API ์๋ต ๊ท๊ฒฉ](์๋ต ๊ท๊ฒฉ ๋งํฌ)
- [์๋ฌ ๋ฉ์ธ์ง ๋ชฉ๋ก](์๋ฌ ๋ชฉ๋ก ๋งํฌ)
๊ด๋ จ ๊ตฌ์ฑ ๋ฐ ํ์ดํ๋ผ์ธ ์ค๋ช ์์ฑ
์์
| ๋๊ตฌ | ์ญํ | ๋ชฉ์ |
|---|---|---|
| .editorconfig | ||
| Checkstyle | ||
| JaCoCo | ||
| Java Test Fixtures | ||
| SonarQube |