JPA ์ธ๋ฑ์ค ์ถ๊ฐ๋ก ์กฐํ ์ฑ๋ฅ ๊ฐ์ ํ๊ธฐ
๋ชฉ์ฐจ
1. ์์ ๋ฐฐ๊ฒฝ
์ธ๋ฑ์ค๋ DB๊ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ ์ฒด ํ ์ด๋ธ์ ์ค์บํ์ง ์๊ณ , ๋น ๋ฅด๊ฒ ์ํ๋ ํ์ ์ฐพ์ ์ ์๋๋ก ๋์์ฃผ๋ ์๋ฃ๊ตฌ์กฐ๋ค.
WHERE ์กฐ๊ฑด์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์กฐํ ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ์ ํ๋ ์ ์๋ค. ๋ฆฌํฉํ ๋ง ๋จ๊ณ์์ ์ฟผ๋ฆฌ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ ์ค ์์ฃผ ์กฐํ๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ง ์์ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ , ์กฐํ ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค.
2. ์ ๊ฒ ๊ธฐ์ค
์ธ๋ฑ์ค ์ถ๊ฐ ๋์์ ์์ฃผ ์ฌ์ฉ๋๋ WHERE ์กฐ๊ฑด ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ ์ ํ๋ค.
| ํ ์ด๋ธ | ์ปฌ๋ผ | ์ด์ |
|---|---|---|
posts |
user_id |
๊ฒ์๋ฌผ ๋ชฉ๋ก ์กฐํ ์ ํญ์ WHERE ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค. |
posts |
reading_status |
๋
์ ์ํ๋ณ ํต๊ณ ์กฐํ ์ WHERE ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค. |
posts |
completed_date |
๊ธฐ๊ฐ๋ณ ํต๊ณ ์กฐํ ์ BETWEEN ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค. |
memos |
post_id |
ํน์ ๊ฒ์๋ฌผ์ ๋ฉ๋ชจ ๋ชฉ๋ก ์กฐํ ์ ํญ์ WHERE ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค. |
reminders |
user_id |
์ฌ์ฉ์๋ณ ๋ฆฌ๋ง์ธ๋ ์กฐํ ์ WHERE ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค. |
reminders |
reminder_time |
์ค์ผ์ค๋ฌ๊ฐ ๋งค๋ถ ์๋ฆผ ๋์์ ์กฐํํ ๋ WHERE ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค. |
3. ์ธ๋ฑ์ค ์ ์ฉ ์ ํ์ธ
๋จผ์ H2์ INFORMATION_SCHEMA.INDEXES๋ฅผ ์กฐํํด์ ํ์ฌ ํ
์ด๋ธ์ ์ด๋ค ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋์ง ํ์ธํ๋ค.
SELECT * FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = 'USERS';
H2์์ USERS ํ
์ด๋ธ์ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ํ์ธํ๊ธฐ ์ํ SQL์ด๋ค.

USERS ํ
์ด๋ธ ํ์ธ ๊ฒฐ๊ณผ, PK์ธ id์๋ง ์ธ๋ฑ์ค๊ฐ ์กํ ์๊ณ ๋ณ๋๋ก ์ถ๊ฐํ ์ธ๋ฑ์ค๋ ์๋ ์ํ์๋ค.
์ด์ด์ POSTS, MEMOS, REMINDERS ํ
์ด๋ธ๋ ๋์ผํ๊ฒ ํ์ธํ๋ค.
SELECT * FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = 'POSTS';
SELECT * FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = 'MEMOS';
SELECT * FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = 'REMINDERS';
POSTS, MEMOS, REMINDERS ํ
์ด๋ธ์ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ํ์ธํ๊ธฐ ์ํ SQL์ด๋ค.

์ธ ํ
์ด๋ธ ๋ชจ๋ PK ์ธ๋ฑ์ค๋ง ์กด์ฌํ๊ณ , WHERE ์กฐ๊ฑด์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์๋ ๋ณ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒ์ ํ์ธํ๋ค.
4. ์ ์ฉ ๋ด์ฉ
User ์ํฐํฐ
์ด๊ธฐ์๋ User ์ํฐํฐ์๋ง @Table์ indexes ์์ฑ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํด๋ ์ํ์๋ค.

User ์ํฐํฐ์๋ง ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ด ์๋ ์ด๊ธฐ ์ฝ๋๋ค.
Post ์ํฐํฐ
Post ์ํฐํฐ๋ @Table ์ด๋
ธํ
์ด์
์ indexes ์์ฑ์ด ์์ด ์ธ๋ฑ์ค๊ฐ ์ ํ ์ ์ฉ๋์ง ์์ ์ํ์๋ค.

์ธ๋ฑ์ค ์ ์ฉ ์ Post ์ํฐํฐ ์ฝ๋๋ค.
@Table์ indexes ์์ฑ์ด ์์ด ๋ณ๋ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ง ์์๋ค.

Post ์ํฐํฐ์ user_id, reading_status, completed_date ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ์ฝ๋๋ค.
Memo ์ํฐํฐ
Memo ์ํฐํฐ์๋ ํน์ ๊ฒ์๋ฌผ์ ๋ฉ๋ชจ ๋ชฉ๋ก์ ์กฐํํ ๋ ์์ฃผ ์ฌ์ฉ๋๋ post_id ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค.
@Table(name = "memos", indexes = {
@Index(name = "idx_memos_post_id", columnList = "post_id")
})
Memo ์ํฐํฐ์ post_id ์ปฌ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ์ฝ๋๋ค.
Reminder ์ํฐํฐ
Reminder ์ํฐํฐ์๋ ์ฌ์ฉ์๋ณ ๋ฆฌ๋ง์ธ๋ ์กฐํ์ ์ฌ์ฉ๋๋ user_id์, ์ค์ผ์ค๋ฌ๊ฐ ๋งค๋ถ ์๋ฆผ ๋์์ ์ฐพ์ ๋ ์ฌ์ฉํ๋ reminder_time ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค.
@Table(name = "reminders", indexes = {
@Index(name = "idx_reminders_user_id", columnList = "user_id"),
@Index(name = "idx_reminders_reminder_time", columnList = "reminder_time")
})
Reminder ์ํฐํฐ์ user_id์ reminder_time ์ปฌ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ์ฝ๋๋ค.
5. ์ ์ฉ ํ ํ์ธ
์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์คํํ๊ณ , H2์์ ์ธ๋ฑ์ค๊ฐ ์ค์ ๋ก ์์ฑ๋์๋์ง ๋ค์ ํ์ธํ๋ค.

์ธ๋ฑ์ค ์ ์ฉ ํ user_id, reading_status, completed_date ๋ฑ ์ถ๊ฐํ ์ปฌ๋ผ๋ค์ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ๋ค.
@Index ์ค์ ์ ์ํฐํฐ ์ฝ๋์ ์ ์ธํ๋ค๊ณ ๋๋๋ ๊ฒ์ด ์๋๋ผ, ์ค์ DB์ ์ํ๋ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์๋์ง ํ์ธํ๋ ๊ณผ์ ๊น์ง ํจ๊ป ํ์ํ๋ค.6. ์ฐธ๊ณ
jakarta.persistence.Indeximport๊ฐ ํ์ํ๋ค.- ๋ก์ปฌ H2 ํ๊ฒฝ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์์ ์ ์๋์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์์ฑ๋๋ค.
- ์ด์ MySQL ํ๊ฒฝ์์๋ ๋ฐฐํฌ ์ DDL ์ ์ฉ ๋ฐฉ์์ ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค.
- ์ธ๋ฑ์ค๋ ์กฐํ ์ฑ๋ฅ์ ๋์ผ ์ ์์ง๋ง, insert/update ์ ์ธ๋ฑ์ค๋ ํจ๊ป ๊ฐฑ์ ๋๋ฏ๋ก ์ฐ๊ธฐ ์ฑ๋ฅ์๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
7. ๋ฐฐ์ด ์
์ธ๋ฑ์ค๋ ์ฒ์๋ถํฐ ๋ชจ๋ ์ปฌ๋ผ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ๋ก WHERE ์กฐ๊ฑด์ ์์ฃผ ๋ฑ์ฅํ๋ ์ปฌ๋ผ์ ํ์
ํ ๋ค ์ ํ์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ธ๋ฑ์ค๊ฐ ๋ง์์ง์๋ก ์กฐํ ์ฑ๋ฅ์ ์ข์์ง ์ ์์ง๋ง, insert/update ์ ์ธ๋ฑ์ค๋ ํจ๊ป ๊ฐฑ์ ๋๊ธฐ ๋๋ฌธ์ ์ฐ๊ธฐ ์ฑ๋ฅ์ ๋จ์ด์ง ์ ์๋ค. ๋ฐ๋ผ์ ์กฐํ ํจํด๊ณผ ์ฐ๊ธฐ ๋น๋๋ฅผ ํจ๊ป ๊ณ ๋ คํด์ ์ ์ฉํด์ผ ํ๋ค.
๋ํ H2์ INFORMATION_SCHEMA.INDEXES๋ฅผ ํตํด ํ์ฌ ์ ์ฉ๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ธํ ์ ์๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค. ๋ก์ปฌ์์ JPA ์ํฐํฐ ์ค์ ์ด ์ค์ DB์ ๋ฐ์๋์๋์ง ๊ฒ์ฆํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.