How to save JSON array in MySQL with TypeORM
๋ณธ ๊ธ์ ์ ๊ฐ NestJS
ํ๋ ์ ์ํฌ๋ฅผ ํตํด ๊ฐ๋ฐํ๋ฉด์ ๊นจ๋ฌ์ ๋
ธํ์ฐ๋ฅผ ๊ธฐ๋กํ ๊ฒ์
๋๋ค. ์ ๊ฐ ์ ์ํ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์๋ ์์ต๋๋ค. ์ง์ ์ ์ธ์ ๋ ํ์์
๋๋ค :)
์ฃผ์!: ์ด ๊ธ์ MySQL
DB์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
NestJS
ํ๋ ์์ํฌ๋ TypeORM
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด DB๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ณธ ๊ธ์ TypeORM
์ ํตํด JSON ๋ฐฐ์ด์ MySQL DB์ ์ด๋ป๊ฒ ์ ์ฅํ ์ง์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃฌ๋ค.
When we save โarrayโ in DB column?
DB Column์ array ํ์ ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ๋ ์๊ฐ๋ณด๋ค ์์ฃผ ๋ฑ์ฅํ๋ค.
Foreign Key Relation (OneToMany/ManyToOne)1
Person
์ ๋ํ Entity์ Email
Entity๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์ด๋, ํ ์ฌ๋์ด ์ฌ๋ฌ ์ด๋ฉ์ผ์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ๊ทธ ๋์ ๊ด๊ณ๋ โOneToMany/ManyToOneโ์ด๋ค. MySQL์ ํ
์ด๋ธ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ๋๋ค.
+----+--------------------+--------------+
| id | person | email_id(fk) |
+----+--------------------+--------------+
| 1 | Tom | 1 |
| 2 | Evans | 2, 3 |
+----+--------------------+--------------+
+----+------------------+----------------+
| id | email | person_id(fk) |
+----+------------------+----------------+
| 1 | tom@mail.com | 1 |
| 2 | evans@mail.com | 2 |
| 3 | evans@univ.ac.kr | 2 |
+----+------------------+----------------+
๋ ํ
์ด๋ธ์ ๋ณด๋ฉด, ๊ฐ๊ฐ email_id
์ person_id
๋ผ๋ foreign key๋ฅผ ๊ฐ์ง๊ณ ์๋ค. Person
์ Evans
๊ฒฝ์ฐ ํน๋ณํ๊ฒ ๋ ๊ฐ์ ์ด๋ฉ์ผ์ ๊ฐ์ง๊ณ ์์ด email_id
๋ฅผ ๋ฐฐ์ด์ ๊ฐ์ง๊ฒ ๋๋ค.
์ฆ, OneToMany/ManyToOne ๊ด๊ณ ์๋์์ fk_id Array๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ค.
simple-array
Foreign key๊ฐ ์๋๋๋ผ๋, MySQL์ ์ปฌ๋ผ์๋ ๋ฐฐ์ด์ ์ ์ฅํ ์ ์๋ค. TypeORM
์ simple-array
๋ฅผ ํตํด์ MySQL์ ๊ฐ๋จํ ํํ์ ๋ฐฐ์ด์ ์ ์ฅํ ์ ์๊ฒ ๋์์ค๋ค.
@Column('simple-array')
num_arr: number[];
@Column('simple-array')
str_arr: string[];
ํ์ง๋ง simple-array
๋ฐฉ์์ผ๋ก string[]
์ ์ ์ฅํ๊ฒ ๋๋ฉด, ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๊ฒ์ ๋ท๋ถ๋ถ์์ ๋ ์์ธํ ๋ค๋ฃฌ๋ค.
How to save JSON array?
์ง๊ธ๊น์ง MySQL ์์์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ดค๋ค. ๊ทธ๋ผ ์ด๋ฒ์ JSON ๋ฐฐ์ด์ MySQL์ ์ด๋ป๊ฒ ์ ์ฅํ ์ ์์์ง ์ดํด๋ณด์.
simple-array
๋ฅผ ์ฌ์ฉํด๋ณด์!
@Column('simple-array')
json_arr: JSON[];
@Column
์ simple-array
์์ฑ์ ์ฃผ๊ณ , ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฐ์ด ํํ๋ก ์ ์ธํ์๋ค. ์ด ๊ฒฝ์ฐ๋ ๊ณผ์ฐ ์ ์ฅํ ์ ์์๊น?? NOPE! ์ด ๊ฒฝ์ฐ๋ ์ค๋ฅ๊ฐ ๋๋ค. ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ดํด๋ณด์.
DataTypeNotSupportedError: Data type "Array" in "example.json_arr" is not supported by "mysql" database.
?? ์์์ ์ฐ๋ฆฌ๋ MySQL์ด ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ดค๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ์ ์ค๋ฅ ๋ฉ์์ง๋ MySQL์์ Array
ํ์
์ ์ง์ํ์ง ์๋๋ค๊ณ ๋งํ๋ค.
์ค๋ฅ๋ฉ์์ง์ ๋ง์ด ๋ง๋ค. MySQL์ Array
ํ์
์ ์ง์ํ์ง ์๋๋ค. ์ด๋ค ๋ฐฉ๋ฒ์ ํตํด์ ์ฐ๋ฆฌ์๊ฒ ๋ฐฐ์ด์ ์ง์ํ๋ ๊ฒ ๊ฐ์ ๋๋์ ์ฃผ๋ ๊ฒ์ผ ๋ฟ์ด๋ค!!
simple-array
๋ฅผ ์ฌ์ฉํด๋ณด์! - string[]
๋ฒ์
์ง๊ธ์ ๋ฌธ์ ๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์. ์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์ฌ์ ํ JSON ๋ฐฐ์ด์ MySQL์ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง JSON[]
ํํ๊ฐ ๋ถ๊ฐ๋ฅํ๋, ์ด์ ์ ์ดํด๋ณธ string[]
๋ฐฉ์์ผ๋ก ์ฐํํด๋ณด์.
@Column('simple-array')
json_arr: string[];
javascript์์๋ JSON.stringify()
๋ผ๋ ํจ์๋ฅผ ํตํด์ JSON
์ string
ํํ๋ก serialize ํด์ค ์ ์๋ค. ์ฐ๋ฆฌ์ ๊ณํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- API์์๋ JSON ๋ฐฐ์ด๋ก ์ ๋ ฅ์ ๋ฐ๋๋ค.
- ์
๋ ฅ๋ฐ์ JSON ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๋ชจ๋ JSON์
JSON.stringify()
๋ฅผ ์ ์ฉํด์ serialize - MySQL์
string[]
๋ก ์ ์ฅ Get
์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋คstring[]
๋ก ์ ์ฅ๋ string ๋ฐฐ์ด์ ๋ฌธ์์ด์JSON.parse()
๋ก ํ์ฑํด์ ๋ฆฌํด
์ด๋ ๊ฒ ํ๋ค๋ฉด JSON ๋ฐฐ์ด์ string ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ์ค๋ฅ ๋ฉ์์ง ์์ด DB์ ์ ์ฅํ ์ ์๋ค.
ํ์ง๋งโฆ
string[]
๋ฒ์ ์ ๋ฌธ์
JSON์ ์ ์ฅํ๋ ์ฐ๋ฆฌ์๊ฒ ์ด ๋ฐฉ๋ฒ๋ ๋ฌธ์ ๊ฐ ์๋ค.
๋ค์๊ณผ ๊ฐ์ JSON ๋ฐฐ์ด์ด ์ ์ฅ๋๋ค๊ณ ํด๋ณด์.
[{name: 'Baker', job: 'musician'}, {name: 'Euler', job: 'mathematician'}]
์ด๊ฒ์ JSON.stringify()
๋ก ๋ฐ๊พธ๋ฉด,
["{name: 'Baker', job: 'musician'}", "{name: 'Euler', job: 'mathematician'}"]
๊ฐ ๋๋ค.
DB์ ์ ์ฅ๋ ์ ๋๋ค. ํ์ง๋ง Get
์ผ๋ก DB์ ์ ์ฅ๋ ๊ฒ์ ํ์ธํด๋ณด๋ฉดโฆ
["{name: 'Baker'",
"job: 'musician'}",
"{name: 'Euler'",
"job: 'mathematician'}"]
๋ค์๊ณผ ๊ฐ์ ๊ดด์ํ ํํ๊ฐ ๋๋คโฆ!!
๊ทธ ์ด์ ๋โฆ
MySQL์ pseudo-Array
์ฐ๋ฆฌ๋ MySQL์ด JSON ๋ฐฐ์ด์ ์ ์ฅ์ด ์ ๋๋๋ผ๋, number ๋ฐฐ์ด์ด๋ string ๋ฐฐ์ด ์ ๋๋ ์ง์ํ๋ค๊ณ ์ฌ๊ธฐ๊ณ ์์๋ค. ํ์ง๋งโฆ ๊ทธ๊ฑด TypeORM
์ ๋์์์ด์๋ค!!
์ฌ์ค MySQL์ Array
ํ์
์ ์ ํ ์ง์ํ์ง ์๋๋ค!! (์ด๋ฏธ ์ค๋ฅ ๋ฉ์์ง๋ก ํ์ธ๋ ํ๋ค.) ๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ simple-array
์์ฑ์ ์จ์ ์ ์ฅํ ๊ฑด ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ??
simple-array
๋ ๋ชจ๋ ๋ฐฐ์ด์ string
์ผ๋ก ์ ์ฅํ๋ค. ๋ง์ฝ, number ๋ฐฐ์ด์ด๋ผ๋ฉด, "1, 2, 3"
, string ๋ฐฐ์ด์ด๋ผ๋ฉด, "Bill, John, Baker"
. ๊ทธ๋์ string ์ค๊ฐ์ ์ฝค๋ง(,)๋ผ๋ ๋ค์ด๊ฐ๋ฉด, DB์๋ ์ด๋ ๊ฒ ์ ์ฅ๋ ๊ฒ์ด๋ค.
"'In other words, please be true', 'In other words, I love you'"
์ฆ, string ๋ฐฐ์ด์ด๋๋ผ๋ DB์๋ ๊ทธ๋ฅ ํ๋์ string๋ง ์ ์ฅ๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ TypeORM
์ ์ฝค๋ง(,)๋ฅผ ๊ธฐ์ค์ผ๋ก simple-array
๋ก ์ ์ธ๋ Column์ ์ ๋ณด๋ฅผ ํ์ฑํ๋ค. ๊ทธ๋ ๊ธฐ์ ์๋ 2๊ฐ์ string์ ์ ์ฅํ๋๋ผ๋, DB ๊ฐ์ ์ฝ์ผ๋ฉด 4๊ฐ์ string์ ์ป๊ฒ ๋๋ ๊ฒ์ด๋ค ใ
ใ
์ฌ์ค MySQL
์ ์๋ชป์ด ์๋ค. TypeORM
์ simple-array
๋ฐฉ์์ด MySQL
์์ ์ ๋
์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ผ ์๋ ์๋ค. ๋ค๋ฅธ DB์์๋ ์ด๋ ๊ฒ ํ๋์ string์ผ๋ก ์ ์ฅ๋์ง ์์ ์๋ ์๋ค.2 MySQL์๋ ์ด๋ ๋ค๋ ๊ฒ์ด๋คโฆ ใ
ใ
JSON์ ๊ฒฝ์ฐ Object๋ฅผ ๋์ดํ๊ธฐ ์ํด ์ฝค๋ง(,)๊ฐ ๋ฑ์ฅํ ์ ๋ฐ์ ์์ง๋ง, ์ผ๋ฐ string์์๋ ์ฝค๋ง๊ฐ ๋ฑ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๋ค. ๊ทธ๋์ TypeORM
๊ฐ๋ฐ์๊ฐ ์์์ฑ์ง ๋ชป ํ์ ์๋ ์๋ค. ๊ทธ์ทจ๋ง ์ด๋ฐ ์ฌ์ํ ์ค๋ฅ๋ ๊ฐ๋ฐ์์๋ ํฐ ๊ฑธ๋ฆผ๋์ด ๋๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์๋ ์๋ค. (์ด๊ฒ ๋๋ฌธ์ ๋ฐ๋์ ์ ๋ ๋ ธ๋คโฆ)
[Solution] ๊ทธ๋ฅ string์ผ๋ก ์ ์ฅํ๋ผ!
๋ช๋ฒ์ ์ํ์ฐฉ์ค๋ฅผ ํตํด TypeORM์ simple-array
๊ฐ MySQL ์์์ ์ด๋ป๊ฒ ๋ฐฐ์ด์ ์ ์ฅํ๋์ง ํ์ธํ์๋คโฆ
๊ทธ๋ผ ์ด๊ฑธ ํ์ฉํด์ ์ฝ๋๋ฅผ ๋ค์ ๊ตฌ์ฑํด๋ณด์.
@Column()
json_arr: string;
Column์ ๊ทธ๋ฅ string
์ผ๋ก ์ค์ ํ๋ค.
JSON ๋ฐฐ์ด์ JSON ํ๋ํ๋๋ JSON.stringify()
ํจ์๋ก serialize ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ JSON.parse()
๊ฐ ๊ฐ๋ฅํ ํํ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋ค.
// save JSON array into MySQL DB
saveJSONArray(json_arr: JSON[]) {
let jsonArr_string = "[";
for(let i=0; i < json_arr.length; i++){
jsonArr_string += JSON.stringify(json_arr[i]);
if(i < json_arr.length-1){
jsonArr_string += ",";
}
}
jsonArr_string += "]";
this.yourRepository.save({ json_arr: jsonArr_string });
}
// load JSON array from MySQL DB
async findJSONArray(): Promise<YourEntry[]> {
const entry_arr = await this.yourRepository.find();
for(let i=0; i < entry_arr.length; i++){
entry_arr[i].json_arr = JSON.parse(entry_arr[i].json_arr);
}
return entry_arr;
}
์ด๋ ๊ฒ ์์ json_arr: string
์ผ๋ก ์ค์ ํ๊ณ , DB์ ๊ฐ์ ์ฝ์ ๋ JSON.parse()
๋ก ํ์ฑํด JSON์ผ๋ก ๋ฆฌํดํด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์ต์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. (๋ฌผ๋ก ๋๊ตฐ๊ฐ๋ ์ด๊ฒ๋ณด๋ค ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์ฌ์ฉํ๊ณ ์์ ์๋ ์๋ค!)
-
ManyToMany๋ OneToMany/ManyToOne์ ๋ค๋ฅด๊ฒ Array ๊ธฐ๋ฐ์ด ์๋๋ค. ManyToManyo์ ๊ฒฝ์ฐ function table์ ๋ง๋ค์ด Relation์ ๊ด๋ฆฌํ๊ณ ๊ธฐ๋กํ๋ค.ย ↩
-
๋ณธ์ธ์ด ์ง์ ํ์ธํด๋ณธ ๊ฒ์ ์๋์ง๋ง, TypeORM์์ ProgressDB์ ๋ํด์๋
jonb
๋ฅผ ํตํด JSON ๋ฐฐ์ด ์ ์ฅ ๋ฐฉ์์ ๊ตฌํํ ๊ฒ ๊ฐ์๋ค.ย ↩