์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- s3 ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- redis ํ ์คํธ์ฝ๋
- s3 log ์ ์ฅ
- AWS Certified Solutions Architect - Associate
- ํ๋ก๊ทธ๋๋จธ์ค ์ปฌ๋ฌ๋ง๋ถ
- s3 ์ด๋ฏธ์ง ์ ์ฅ
- Kafka
- prod docker-compose
- ์ ํจ์ค ์ค์ผ์ค๋ฌ
- ํ์ดํผ๋ฐ์ด์
- ์ ํจ์ค ๋น๋ ์ค๋ฅ
- nGrinder
- ํ๋ก๊ทธ๋๋จธ์ค
- ํ๋ก๊ทธ๋๋จธ์ค ํฉ์นํ์์๊ธ
- jvm ๋ฐ๋ฐ๋ฅ๊น์ง ํํค์น๊ธฐ
- docker
- Codedeploy ์ค๋ฅ
- docker-compose kafka
- ์คํํ๋ ๋ฏธ์ค
- ์๋ฐ
- redis ์กฐํ
- private subnet ec2 ๋ก์ปฌ ์ ์
- ์๋ฒ ํฐ์ง๋ ๋์ปค ์ฌ์คํ
- aws saa ํฉ๊ฒฉ
- Entity
- docker ps -a
- ๋ค์ค ์ปจํ ์ด๋
- docker compose
- JPA
- aws ์ฟ ํฐ
- Today
- Total
๐๐ข๐๐ โ๐๐๐ ๐๐๐ก๐๐ ๐๐๐๐โง
[Spring] ์ฑ๋ฅ ์ต์ ํ 3ํธ - ์ธ๋ฑ์ค ํ์ฉํ๊ธฐ ๋ณธ๋ฌธ
[Spring] ์ฑ๋ฅ ์ต์ ํ 3ํธ - ์ธ๋ฑ์ค ํ์ฉํ๊ธฐ
๐คRyusun๐ค 2024. 3. 15. 08:30์ธ๋ฑ์ค
- ํ ์ด๋ธ์ ๋์ ์๋๋ฅผ ๋์ฌ์ฃผ๋ ์๋ฃ ๊ตฌ์กฐ
- ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์์ค๋ค.
- ์๋ฅผ ๋ค์ด, ์ฑ ์ ์ฐพ์๋ณด๊ธฐ๊ฐ ์์ ๋ ํน์ ์ฃผ์ ๋ ๋จ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฑ ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ฐพ์๋ณด์ง ์๊ณ , ์ฐพ์๋ณด๊ธฐ์์ ํด๋น ๋จ์ด๋ฅผ ์ฐพ์ ๋ฐ๋ก ํด๋น ํ์ด์ง๋ก ๊ฐ ์ ์๋ฏ์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค๋ ๋น์ทํ ์ญํ ์ ํ๋ค.
์ธ๋ฑ์ค์ ์ฅ์ & ํจ๊ณผ
- ๊ฒ์ ์ฑ๋ฅ ํฅ์: WHERE ์ ์์ ํน์ ์นผ๋ผ์ ์ด์ฉํ ์กฐ๊ฑด ๊ฒ์์ด ๋นจ๋ผ์ง๋ค. ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ค์บํ์ฌ ์กฐ๊ฑด์ ๋ง๋ ํ์ ์ฐพ์์ผ ํ๋ค. ํ์ง๋ง ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋น ๋ฅด๊ฒ ๊ฒ์์ด ๊ฐ๋ฅํ๋ค.
- ์กฐ์ธ ์ฑ๋ฅ ํฅ์: JOIN ์ ์์ ์กฐ์ธํ ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ์กฐ์ธ์ ์ํํ ์ ์๋ค. ์ด๋ ๋ ํ ์ด๋ธ ๊ฐ์ ๋งค์นญ๋๋ ํ์ ํจ์จ์ ์ผ๋ก ์ฐพ์ ์ ์๋๋ก ๋์์ค๋ค.
- ์ ๋ ฌ ๋ฐ ๊ทธ๋ฃนํ ์ฑ๋ฅ ํฅ์: ์ธ๋ฑ์ค๋ ์ ๋ ฌ ๋ฐ ๊ทธ๋ฃนํ ์์ ์๋ ๋์์ ์ค๋ค. ํนํ, **ORDER BY**๋ GROUP BY ์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ ฌ์ด๋ ๊ทธ๋ฃนํ ์์ ์ด ๋นจ๋ผ์ง๋ค.
- ๋ฒ์ ๊ฒ์ ์ต์ ํ: ์ผ๋ถ ์ธ๋ฑ์ค๋ ๋ฒ์ ๊ฒ์์ ํนํ ์ ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ง ๋ฒ์๋ ์ซ์ ๋ฒ์์ ๋ํ ๊ฒ์์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ผ๋ก ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์ฐ์ ์ฑ๋ฅ ํ
์คํธ๋ฅผ ํ๊ธฐ ์ํด ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
์๋์ ์ฌ์ดํธ์ ๊ฐ๋ฉด ์ฝ๊ฒ ๋๋ฏธ๋ฐ์ดํฐ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
๋ง์ ๋๋ฏธ๋ฐ์ดํฐ๊ฐ ์์์๋ก ์ฑ๋ฅ ๋น๊ต๊ฐ ๋ ์๋๋ค.
๋๋ฏธ ๋ฐ์ดํฐ ์์ฑํ๋ ์ฌ์ดํธ
์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ฌ ๋ฐ์ดํฐ ๊ฐ์๋ฅผ ์์์๋ค.
SELECT count(*) FROM ํ
์ด๋ธ๋ช
;
ํ์๋ ์ฝ 6์ฒ๊ฐ ์ ๋ ๋ง๋ค์๋ค.
์ด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํด ๋ณด์!
1. ์ปฌ๋ผ ๋ถ์ํ๊ธฐ
ํจ๊ณผ์ ์ธ ์ธ๋ฑ์ค ์์ฑํ๋ ค๋ฉด ์ด๋ค ์ปฌ๋ผ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด์ผ ํ ์ง ๋จผ์ ๋ถ์ํ ํ์๊ฐ ์๋ค.
- ๊ฐ๋ฐํ๋ฉด์ ์์ฑํ ์ฟผ๋ฆฌ ๋ถ์ํ๊ธฐ
- where, join ๋ฑ์์ ์ฌ์ฉํ๋ ์ปฌ๋ผ๋ค ๋ถ์ํ๊ธฐ
ํ์ง๋ง where์ , join์ ์ ์นผ๋ผ์ด ์ฌ๋ฌ ๊ฐ์ง๋ผ๋ฉด ์๋ 4๊ฐ์ง ๊ธฐ์ค์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๊ฒฐ์ ํ๋ฉด ๋๋ค.
- ์นด๋๋๋ฆฌํฐ (Cardinality)
- ํน์ ์นผ๋ผ์ด๋ ๊ด๊ณ์์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋ ์ ๋
- ์นด๋๋๋ฆฌํฐ๊ฐ ๋์์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
- ์ ํ๋ (Selectivity)
- ๋ฐ์ดํฐ์์ ํน์ ๊ฐ์ ์ผ๋ง๋ ์ ์ ํํ ์ ์๋์ง์ ๋ํ ์งํ
- ์ ํ๋๊ฐ ๋ฎ์์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
- ํ์ฉ๋
- ํด๋น ์ปฌ๋ผ์ด ์ค์ ์์ ์์ ์ผ๋ง๋ ํ์ฉ๋๋์ง์ ๋ํ ๊ฐ
- ํ์ฉ๋๊ฐ ๋์์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
- ์ค๋ณต๋
- ์ค๋ณต ์ธ๋ฑ์ค ์ฌ๋ถ์ ๋ํ ๊ฐ
- ์ค๋ณต๋๊ฐ ์์์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
SELECT
CONCAT(ROUND(COUNT(DISTINCT dog_id_fk) / COUNT(*) * 100, 2), '%') AS dog_id_cardinality,
CONCAT(ROUND(COUNT(DISTINCT date) / COUNT(*) * 100, 2), '%') AS date_cardinality,
CONCAT(ROUND(COUNT(DISTINCT created_date) / COUNT(*) * 100, 2), '%') AS created_cardinality,
CONCAT(ROUND(COUNT(DISTINCT status) / COUNT(*) * 100, 2), '%') AS status_cardinality
FROM tb_attendance;
๋์ค๋ ์งํ๋ฅผ ๋ณด๊ณ ์ ๋์ ์นด๋๋๋ฆฌํฐ์ธ ์นผ๋ผ์ ์ธ๋ฑ์ค๋ก ์ ํ๋ฉด ๋๋ค.
2. ์ธ๋ฑ์ค ์ค์ ํ๊ธฐ
-- ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX idx_attendance_dog_id_fk ON tb_attendance ( dog_id_fk );
-- ์ธ๋ฑ์ค ํ์ธ
show index from tb_attendance;
์ธ๋ฑ์ค๋ฅผ ์์ฑํ ํ ํ์ธํด ๋ณด์.
์คํ๊ณํ์ ํตํด ์ธ๋ฑ์ค ํ์ธํ๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์คํ๋๋์ง, ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
explain
SELECT * FROM tb_attendance
WHERE dog_id_fk = 1
;
์คํ ๊ณํ์ ์ฃผ์ ํ๋
- id: ์ฟผ๋ฆฌ ๋ด์ SELECT ๋ช ๋ น์ด์ ๋ํ ์๋ณ์. ํ์ ์ฟผ๋ฆฌ๋ ์กฐ์ธ์ด ์๋ ๊ฒฝ์ฐ, ๊ฐ๊ฐ์ SELECT์ ๋ํด ๊ณ ์ ํ id๊ฐ ํ ๋น๋๋ค.
- select_type: ์ฟผ๋ฆฌ์ ์ ํ. ์๋ฅผ ๋ค์ด, SIMPLE์ ๋จ์ SELECT ์ฟผ๋ฆฌ, SUBQUERY๋ ํ์ ์ฟผ๋ฆฌ, DERIVED๋ FROM ์ ์์ ํ์๋ ํ ์ด๋ธ์ ๋ํ๋ธ๋ค.
- table: ํด๋น ๋ผ์ธ์ด ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ์ด๋ฆ
- type: ์กฐ์ธ ์ ํ์ด๋ ํ ์ด๋ธ ์ ๊ทผ ๋ฐฉ์. ALL์ ์ ์ฒด ํ ์ด๋ธ ์ค์บ, index๋ ์ธ๋ฑ์ค ์ค์บ ๋ฑ์ ์๋ฏธํ๋ค.
- possible_keys: ์ฟผ๋ฆฌ ์คํ์ ์ฌ์ฉ๋ ์ ์๋ ์ธ๋ฑ์ค์ ๋ชฉ๋ก
- key: ์ค์ ๋ก ์ฟผ๋ฆฌ ์คํ์ ์ฌ์ฉ๋ ์ธ๋ฑ์ค
- key_len: ์ฌ์ฉ๋ ์ธ๋ฑ์ค์ ์ต๋ ๊ธธ์ด. ์ด๋ ์ธ๋ฑ์ค์ ์ด๋ ๋ถ๋ถ๊น์ง ์ฌ์ฉ๋์๋์ง๋ฅผ ๋ํ๋ธ๋ค.
- ref: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๋ ์ฐธ์กฐ๋ ์ปฌ๋ผ์ด๋ ์์
- rows: ์ฟผ๋ฆฌ ์คํ์ ์ํด ์ฝ์ด์ผ ํ ํ์ ์ถ์ ์น
- Extra: ๊ธฐํ ์ ๋ณด. ์ฌ๊ธฐ์ **"Using index condition"**์ ์ธ๋ฑ์ค ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ํํฐ๋ง๋์์์ ๋ํ๋ธ๋ค.
3. Mysql Profiling์ผ๋ก ์์น ํ์ธํด ๋ณด๊ธฐ
Mysql Profiling
- MySQL์์๋ ์ฟผ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๋ ๋์ ๊ฐ ๋จ๊ณ๋ณ ์์ ์ ์๊ฐ์ด ์ผ๋ง๋ ๊ฑธ๋ ธ๋์ง ํ์ธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
-- ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ ํ์ฑํ ์ฌ๋ถ ํ์ธ
show variables like '%profiling%';
-- profiling ๊ธฐ๋ฅ ํ์ฑํํ๊ธฐ
set profiling=1;
set profiling_history_size=100;
์์ ์ฝ๋๋ฅผ ์์๋๋ก ์ ๋ ฅํ๋ฉด ๋๋ค.
๊ทธ๋ผ profiling = on์ผ๋ก, profiling_history_size = 100์ผ๋ก ๋ฐ๋๋ค.
์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌ ์์ด๋๋ฅผ ๋จผ์ ์ฐพ์์ค์ผ ํ๋ค.
์ด๋ฅผ ์ํด์ ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ ํตํด ํ์ธํ๊ณ ์ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ์คํ์ ํด์ฃผ๋ฉด ๋๋ค.
์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ๊ณ ์ show profiles ๋ช ๋ น์ด๋ฅผ ํตํด์ ์ฟผ๋ฆฌ ์์ด๋๋ฅผ ์ฐพ์๋ณด์.
select * from tb_attendance
where dog_id_fk = 1;
show profiles;
๋จ๊ณ๋ณ ์ฟผ๋ฆฌ๋ฅผ ๋ณผ ์ ์๊ณ ์ฌ๊ธฐ์ ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
- ์ฐพ์ Query_id์ ๋ํด profiling ๊ธฐ๋ฅ์ผ๋ก ํ์ธํ๊ธฐ.
- Profile์ ํตํด ์กฐํํ ์ ์๋ ์ธ๋ถ ๋ชฉ๋ก
- BLOCK IO
- MEMORY
- CPU
- CONTEXT SWITCHES
- IPC
- PAGE FAULTS
- SOURCE
- SWAPS
- Profile์ ํตํด ์กฐํํ ์ ์๋ ์ธ๋ถ ๋ชฉ๋ก
-- ํด๋น ์ฟผ๋ฆฌ๋ฌธ์ ์ํ ์๊ฐ์ ๋ ์์ธํ ๋จ์๋ก ํ์ธ
show profile for query 37;
์ด์ ์ ์ ๋ ฅํ๋ ์ฟผ๋ฆฌ๊ฐ ์คํ๋์ ๋ ๊ฐ ๋จ๊ณ๋ณ๋ก ์ํ๋ ์๊ฐ์ ์ธ๋ถ์ ์ผ๋ก ๋ณผ ์ ์๋ค.
-- ํด๋น ์ฟผ๋ฆฌ์ CPU ์ฌ์ฉ๋์ ๋ถ์
show profile cpu for query 37;
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ๊ณผ ํ์ ์คํ ์๊ฐ ์ฐจ์ด
0.002361 -> 0.000158
๋ก ์คํ์๊ฐ์ด ํ์ฐํ ์ค์๋ค.!!
์ด๋ก์จ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ ๋ ์์น๊ฐ ๊ฐ์ ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ngrinder๋ก ์ฑ๋ฅ ํ ์คํธ
์ฐ์ ๋ง๋ ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํ๊ณ ์ ์ฑ๋ฅ์ ํ ์คํธํด๋ณด์
ํ์๋ ์์์ api๋ฅผ ๋ง๋ค๊ณ ์ ngrinder์์ ์คํ์์ผฐ๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ๊ฒ์ฆํ, ํต๊ณผํ๋ฉด ์ฑ๋ฅํ ์คํธ๋ฅผ ์งํํด ๋ณธ๋ค.
์ธ๋ฑ์ค๋ฅผ ์์ฑ ์ ๊ฒฐ๊ณผ
์ธ๋ฑ์ค ์์ฑ ํ ๊ฒฐ๊ณผ
TPS : 41.0 -> 41.8
์ต๊ณ TPS: 69.5 -> 55.0
ํ๊ท ํ ์คํธ ์๊ฐ : 246.30 -> 240.35
์ด ์คํ ํ ์คํธ : 2385 -> 2433
TPS๋ ์์ฃผ ๋ฏธ์ธํ๊ฒ ์ข์์ก์ง๋ง ์คํํ ์คํธ๋ ๋ง์ด ์ฆ๊ฐํ๋ค.
ํ ์ด๋ธ๋ง๋ค ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค๋ฉด ์ฑ๋ฅ์ ๊ฐ์ ์ด ๋ง์ด ๋ ๊ฒ ๊ฐ๋ค!
๋!!
์ฐธ๊ณ
https://www.inflearn.com/course/์ฑ๋ฅ-๊ฐ์ -์ด์-๋ค์ง๊ธฐ
๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ฑ๋ฅ ๊ฐ์ ์ด์ ๋ค์ง๊ธฐ ๊ฐ์ - ์ธํ๋ฐ
๊ธฐ๋ณธ ๊ธฐ์ ์คํ์ ํ์ฉํด์ ์ฑ๋ฅ ๊ฐ์ ์ ํด๋ณด๊ณ ! ๊ฐ์ ํ ๋ณํ๋ฅผ ๋ถํํ ์คํธ์ ๋ชจ๋ํฐ๋ง ํด์ ํตํด ํ์ธํด๋ด ๋๋ค! ์ฃผ์ ๋ณ ๋ฉด์ ๋๋น๋ ๊ฐ์ด ์งํํฉ๋๋ค!, '์ฑ๋ฅ ๊ฐ์ ์ด์๋ค์ง๊ธฐ'๋ฅผ ํตํด ์ฑ๋ฅ๊ฐ
www.inflearn.com
https://rachel0115.tistory.com/entry/MySQL-์ธ๋ฑ์ค-INDEX-์ ๋ฆฌ-๋์-๋ฐฉ์-์์ฑ-์ญ์ -์ค๊ณ
[MySQL] - ์ธ๋ฑ์ค (INDEX) ์ ๋ฆฌ (๋์ ๋ฐฉ์, ์์ฑ, ์ญ์ , ์ค๊ณ)
์ธ๋ฑ์ค๋? ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ์ถ์ถํ๋๋ก ๋์์ฃผ๋ ํ๋์ '๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด'์ ๋๋ค. ๋ง์น ์ฌ์ ์ '์ฐพ์๋ณด๊ธฐ'์ ๊ฐ์ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ์๋ฉด
rachel0115.tistory.com
https://yurimkoo.github.io/db/2020/03/14/db-index.html
์ ๋ฆผ's Blog
๋ฒ ์งฑ์ด๊ฐ ๋๊ณ ์ถ์ ๊ฐ๋ฏธ์ ๊ธฐ์ ๋ธ๋ก๊ทธ
yurimkoo.github.io
'๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด๐ป > ๐๐ฉ๐ซ๐ข๐ง๐ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] SSE & Kafka ๋ฅผ ํ์ฉํด์ ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (0) | 2024.03.22 |
---|---|
[Spring] ์ฑ๋ฅ ์ต์ ํ 2ํธ - ์ค์นด์ฐํธ ๋ชจ๋ํฐ๋ง TOOL ์ค์น (1) | 2024.03.14 |
[Spring] ์ฑ๋ฅ ์ต์ ํ 1ํธ - ๋ถํํ ์คํธ ngrinder ์ค์นํ๊ธฐ (0) | 2024.03.09 |
[Spring] DTO ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํด์ผํ ๊น (0) | 2024.03.08 |
[JPA] @Enumerated, @Converter (0) | 2023.08.26 |