์ข์ ์ด์ ๋ฆฌํฌํธ๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋๊ฐNew
๐ Overview
์ง๋ โ์กฐ์ฉํ ๋น์ด๋ฒ๋ฆฐ ๊ฐ ํ๋์์ ์์ํ ORM ๋ฉ์ด์ ์ ๊ทธ๋ ์ด๋ ๊ฒ์ฆ ์ ๋ตโ ํฌ์คํ ์ ์ด๋ ๊ฒ ๋งบ์๋ค.
๊ฐ์ ์ฌ๋ก์ ์ ์คํธ๋ฆผ ์ด์๋ ์ฐพ์ง ๋ชปํ๋ค. ์ฌํ ์กฐ๊ฑด์ ์ขํ๊ณ โ๋ฒ๊ทธโ๋ก ๋ณผ์ง โ์ง๋จ ๋ฉ์์ง ๊ฐ์ ์์ฒญโ์ผ๋ก ๋ณผ์ง ์ค์ค๋ก ๋จผ์ ๊ฒฐ๋ก ์ ๋ธ ๋ค, ์ต์ ์ฌํ ์ ์ฅ์์ ํจ๊ป ์ ๋ณดํด๋ณผ ์๊ฐ์ด๋ค.
์ด์ ๊ทธ ์ด์๋ฅผ ์ฌ๋ ธ๋ค.
- 09-21 13:51 โ ์ด์ ๋ฑ๋ก (mikro-orm#8292)
- 09-21 14:12 โ ๋ค๋ฅธ ์ปจํธ๋ฆฌ๋ทฐํฐ๊ฐ PR ๋ฑ๋ก (mikro-orm#8293), ์ด์๋ก๋ถํฐ 21๋ถ
- 09-22 02:25 โ ๋ฉ์ธํ ์ด๋ ๋จธ์ง, ์ด์ ์ข ๋ฃ
์ ์ ๋ด๊ฐ ์ด ์ฝ๋๋ ํ ์ค๋ ์๋ค. ๊ณ ์น ๊ฒ์ ๋ค๋ฅธ ์ฌ๋์ด๊ณ , ๋๋ ์ฌํ๊ณผ ์ด์ ๋ณธ๋ฌธ๋ง ์ผ๋ค.
์ด ๊ธ์ ์ฌ๋ด์์ ์ฐํ๋ก ๋ฎ์ด๋ ๋ฌธ์ ๋ฅผ ์ ์คํธ๋ฆผ ์ด์๋ก ์ฎ๊ธฐ๊ธฐ๊น์ง์ ๊ธฐ๋ก์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ด ์ด์๊ฐ 21๋ถ ๋ง์ PR๋ก ์ด์ด์ก๋์ง, ๊ทธ ์ด์ ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ๋ค์ ๋จ๊ธด๋ค.
1. ์ฐํ์ ์ ๋ณด๋ฅผ ๋ถ๋ฆฌํ ์ด์
๋ฌธ์ ์์ฒด๋ ์ง๋ ๊ธ์์ ์ ๋ฆฌํ๋ค. ์๋ฒ ๋๋ ๊ฐ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ด๋ฆ(User.password)๊ณผ ๊ทธ ๊ฐ์ด ์ ์ฅ๋๋ ์ปฌ๋ผ ์ด๋ฆ(password)์ด ๊ฐ์ ๋, JOIN ์ผ๋ก ํจ๊ป ๋ถ๋ฌ์ค๋ ๊ฒฝ๋ก์์๋ง ๋งคํ์ด ๊นจ์ง๋ ํ์์ด๋ค.
๋น์ ์ ํํ ํด๋ฒ์ ์ด๋ฆ ์ถฉ๋ ์์ฒด๋ฅผ ์์ ๋ ๊ฒ์ด์๋ค. ํ๋กํผํฐ ์ด๋ฆ์ hashedPassword ๋ก ๋ฐ๊พธ๊ณ fieldName ์ ๋ฐ๋ก ์ค์, DB ์คํค๋ง๋ ๊ทธ๋๋ก ๋ ์ฑ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ์์์๋ง ๋๋๋ค.
์ด ์ฐํ๋ ์ ๊ทธ๋ ์ด๋๋ฅผ ๋ง์ง ์๊ธฐ ์ํ ์ ํ์ด์๋ค. ๋ฌธ์ ๋ฅผ ์ดํดํ ๊ฒ์ ์๋์๋ค. ์์ธ์ ์ฌ์ ํ ORM ์์ ์์๊ณ , ์ฐ๋ฆฌ๋ ๊ทธ ์์ ์ด๋ฆ ํ๋๋ฅผ ๋ฎ์ด๋ ์ํ์๋ค.
๊ทธ๋์ ์ฐํ์ ์ ๋ณด๋ฅผ ํ๋์ ์์ ์ผ๋ก ๋ฌถ์ง ์์๋ค. ์ฐํ๋ ๋ฐฐํฌ๊น์ง ๋๋ด๊ณ , ์ ๋ณด๋ ๊ทธ ๋ค์ ๋ฐ๋ก ์งํํ๋ค. ์ฐํ๊ฐ ์ด๋ฏธ ๋ฐฐํฌ๋์ด ์์ผ๋ ์ ๋ณด๋ฅผ ์๋๋ฌ์ผ ํ ์ด์ ๊ฐ ์์๊ณ , ๊ทธ๋งํผ ์ฌํ์ ๋ค๋ฌ์ ์๊ฐ์ด ์๊ฒผ๋ค.
๋๋๋ฆด ๊ณํ์ด ํ์ํ๋ ๊ฒ๋ ์ด์ ์๋ค. hashedPassword ๋ผ๋ ์ด๋ฆ๊ณผ fieldName: '_password' ๋ ์๋ ํ์ ์๋ ๊ฒ์ด๋ค. ์ด ํ์ ์ ์ง์ฐ๋ ค๋ฉด ์
์คํธ๋ฆผ์ด ๊ณ ์ณ์ง๋ ์๋ฐ์ ์์๋ค.
2. ์ฌํ์ ๋จ์ ์ผ๋ก ๋ง๋ค์ง ์๊ธฐ
MikroORM ์ ์ด์ ํ
ํ๋ฆฟ์์ ์ฌํ ์ ์ฅ์๋ฅผ ์๊ตฌํ๊ณ , ๊ทธ์ ํจ๊ป mikro-orm/reproduction ์ด๋ผ๋ ์ฌํ์ฉ ๋ฒ ์ด์ค ์ ์ฅ์๋ฅผ ์ ๊ณตํ๋ค.
๋๋ ์ด ์ ์ฅ์๋ฅผ fork ํด์ JH8459/reproduction ์ ๋ง๋ค๊ณ , ์ฆ์์ ์ฌํํ๋ ์ปค๋ฐ ํ๋๋ง ์น์๋ค.
fork ๋ฅผ ํํ ๊ฒ์ ํธํด์๊ฐ ์๋์๋ค. ๋ฒ ์ด์ค์ ์ปค๋ฐ ์ด๋ ฅ์ ๋ณด๋ฉด ๋ฉ์ธํ ์ด๋๊ฐ ์ง์ ์ ๋ฆฌํด๋ ๊ฒ์ด๊ณ , ์ปค๋ฐ ๋ฉ์์ง์ ๊ทธ ์๋๊ฐ ์ ํ ์๋ค.
์ฌํ ์ฝ๋๋ฅผ ORM ๋ณธ์ฒด์ ํ ์คํธ๋ก ์ฎ๊ธธ ๋ ์ด์ฐจํผ ํด์ผ ํ๋ ์์ง์ ๋ฏธ๋ฆฌ ํด๋ ๋ฒ ์ด์ค๋ผ๋ ๋ป์ด๋ค. ํ ์คํธ ๋ฌ๋, ๋๋ผ์ด๋ฒ, ์ํฐํฐ ์ ์ ๋ฐฉ์์ด ๋ชจ๋ ๋ณธ์ฒด ํ ์คํธ์ ๊ฐ์ ๋ชจ์์ผ๋ก ๋ง์ถฐ์ ธ ์๋ค.
๊ทธ ์์ ์ปค๋ฐ ํ๋๋ง ์ฌ๋ฆฌ๋ฉด ๋ฐ๋ ์ชฝ์ ์ ์ฅ์ ์ ์ฒด๋ฅผ ํ์ ํ์๊ฐ ์๋ค. ๊ทธ ์ปค๋ฐ๋ง ๋ณด๋ฉด ์ฌํ ์กฐ๊ฑด์ด ๋ค ๋์จ๋ค. ์ค์ ๋ก ์ด๋ฒ PR ์ ํ๊ท ํ
์คํธ๋ ๊ทธ ํํ๋ฅผ ๊ทธ๋๋ก ์ด์ด๋ฐ์ tests/issues/GH8292.test.ts ๋ก ๋ค์ด๊ฐ๋ค.
๋ฒ ์ด์ค README ์ ์ ํ ํํธ๋ ์ฌ์ค์ ์ฑ์ ๊ธฐ์ค์ด๋ค.
- ํ ๋ฒ์ ํ๋์ ๋ฌธ์ ๋ง ์ฌํํ ๊ฒ
- ํ ์คํธ๋ ์๊ธฐ์๊ฒฐ์ ์ผ ๊ฒ โ ๋ฐ์ดํฐ ์ค๋น๊น์ง ํ ์คํธ ์์์
- CLI ๋ฅผ ์ฐ์ง ๋ง๊ณ ์ ๋ถ ํ๋ก๊ทธ๋จ์ผ๋ก ํ ๊ฒ
- ๊ด๋ จ ์๋ ๊ฒ์ ์ ๋ถ ์ ๊ฑฐํ ๊ฒ
- ํ ์คํธ์ ์ค๋ณต์ ๊ด์ฐฎ๋ค, ๋ณต์กํ ์ถ์ํ๋ณด๋ค ๋ซ๋ค
- ์ฃผ์๋ ์ข์ง๋ง ๋จ์ธ์ด ๋ ์ข๋ค
์ค์ ์ํฐํฐ๋ ํ๋๊ฐ ์์ญ ๊ฐ์์ง๋ง ์ฌํ์์๋ User / Password / Profile ์ธ ๊ฐ๋ง ๋จ๊ฒผ๋ค. ๋๋ผ์ด๋ฒ๋ ์ธ๋ฉ๋ชจ๋ฆฌ SQLite ๋ก ๋ฐ๊ฟจ๋ค. ๋ฌธ์ ์ ์กฐ๊ฑด์ ์๋ฒ ๋๋ ํ๋กํผํฐ ์ด๋ฆ๊ณผ ์์ ์ปฌ๋ผ ์ด๋ฆ์ด ๊ฐ๋ค๋ ๊ฒ ํ๋์๊ณ , ๋๋จธ์ง๋ ์ฌํ์ ํ๋ฆฌ๋ ์ก์์ด์๋ค.
๊ฐ์ฅ ์ ๊ฒฝ ์ด ๊ฒ์ ๋ฐ๋ก ์๋ค. ํต๊ณผํ๋ ํ ์คํธ๋ฅผ ์ผ๋ถ๋ฌ ํจ๊ป ๋ฃ์๋ค.
test('direct load hydrates embedded', async () => { ... }); // ํต๊ณผ
test('select-in populate hydrates embedded', async () => { ... }); // ํต๊ณผ
// fails in v7: Cannot use 'as u1__password' alias on embedded property 'u1.password'
test('joined populate hydrates embedded', async () => { ... }); // ์คํจ
// fails in v6: Empty .update() call detected! Table: `user`. Columns: .
test('flush after joined populate issues no user update', async () => { ... }); // ์คํจ์คํจํ๋ ์ผ์ด์ค๋ง ์ฌ๋ฆฌ๋ฉด ์ฝ๋ ์ฌ๋์ ์ฒซ ์ง๋ฌธ์ ์ค์ ์ด ์๋ชป๋ ๊ฒ ์๋๋๋ ๊ฒ์ด ๋๋ค. ๊ทธ ์ง๋ฌธ์ ๋ตํ๋ ค๋ฉด ์๋ณต์ด ํ ๋ฒ ๋ ํ์ํ๊ณ , ๊ทธ๋ ๊ฒ ๋๋ฉด ์ด์๋ ๋๊ฐ ๋ค๋ก ๋ฐ๋ฆฐ๋ค.
๊ฐ์ ์ํฐํฐ์ ๊ฐ์ ๋ฐ์ดํฐ๋ก ํต๊ณผํ๋ ๊ฒฝ๋ก๋ฅผ ๋๋ํ ๋๋ฉด ๊ทธ ์ง๋ฌธ์ด ๋์ค์ง ์๋๋ค. ์ํฐํฐ ์ ์๊ฐ ์๋๋ผ ๋ก๋ฉ ์ ๋ต๋ง ๋ค๋ฅด๋ค๋ ๊ฒ ํ ์คํธ ์ด๋ฆ์์ ์ด๋ฏธ ๋ณด์ธ๋ค.
fork ๋ถํฐ ์ด์ ๋ฑ๋ก๊น์ง๋ 11๋ถ์ด ๊ฑธ๋ ธ๋ค. ์์์ ์ฌํ์ ๋ค๋ฌ์ ์๊ฐ์ด ์๊ฒผ๋ค๊ณ ์ ์ ๊ฒ๊ณผ ์ด๊ธ๋ ๋ณด์ด์ง๋ง, ์ฐํ๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ์กฐ๊ฑด์ ์ด๋ฏธ ์ขํ๋๊ธฐ ๋๋ฌธ์ ์ ์ฅ์ ์์ ์์ฒด๋ ์งง๊ฒ ๋๋ฌ๋ค.
3. ์ด์ ๋ณธ๋ฌธ์ ๋ฌด์์ ์ ์๋
๊ฐ์ฅ ์์ ๋ ๊ฒ์ v6 ์ v7 ์ ์ฆ์์ด ๋ค๋ฅด๋ค๋ ์ ์ด์๋ค. ๊ฐ์ ๋งคํ์ธ๋ฐ v7 ์ ์์ธ๋ฅผ ๋์ง๊ณ , v6 ์ ์กฐ์ฉํ ๋น UPDATE ๋ฅผ ๋ง๋ ๋ค.
# v7 โ joined populate ์์ฒด๊ฐ ์คํจ
DriverException: Cannot use 'as u1__password' alias on embedded property 'u1.password'
because it expands to multiple columns.
# v6 โ ์กฐํ๋ ๋์ง๋ง, ์ดํ flush ์์
Empty .update() call detected! Update data does not contain any values to update. Table: `user`. Columns: .ํ์ชฝ๋ง ๋ณด๋ฉด ์๋ ์ง์ํ์ง ์๋ ์ค๊ณ๋ก ์ฝํ๋ค. ๋ฒ์ ์ ๋ฐ๋ผ ์ฆ์์ด ๊ฐ๋ฆฐ๋ค๋ ์ ์ด ๊ทธ๋ ์ง ์๋ค๋ ์ชฝ์ ๊ทผ๊ฑฐ๊ฐ ๋๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ ๋ค์ ํ์ธํ ๋ฒ์๋ฅผ ์ ์๋ค. next(7.2.1-dev.24)์ 7.2.1, 7.2.0 ์์ ์คํจํ๊ณ , 6.6.16 ์์๋ joined populate ๋ ํต๊ณผํ๋๋ฐ flush ๋ง ์คํจํ๋ค. sqlite ์ mariadb 11.4 ์์ชฝ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์๋ค. ๋น์ทํด ๋ณด์ด๋ ๊ธฐ์กด ์ด์(#8271, #8272)๋ ๋จผ์ ์ฐพ์์, ๊ทธ ์์ ์ด ๋ค์ด๊ฐ next ์์๋ ์ฌํ๋๋ค๋ ๊ฒ์ ํจ๊ป ์ ์๋ค. ๋๋ผ์ด๋ฒ ๋ฌธ์ ์ธ์ง ์ด๋ฏธ ๊ณ ์ณ์ง ๋ฌธ์ ์ธ์ง ํ์ธํ๋ ๋ชซ์ ๋๊ธฐ์ง ์์ผ๋ ค๋ ์๋์๋ค.
์๊ตฌ๋ ์ต์๋ก ์ ์๋ค. ๋ฉ์ธํ
์ด๋๋ ์ ๋ถํฐ ๋จ์ผ ์์ฑ ์๋ฒ ๋๋ธ๋ณด๋ค ์ปค์คํ
ํ์
์ ๊ถ๊ณ ํด์๊ณ , ๊ทธ ์ํ์์ ์ฐ๋ฆฌ ๋งคํ์ด ๋์ํ๊ฒ ํด๋ฌ๋ผ๊ณ ์ฐ๋ฉด ๊ถ๊ณ ๋ฅผ ๋ฌด์ํ ์ค๊ณ๋ฅผ ๋ ๋ฐ์ณ ๋ฌ๋ผ๋ ์์ฒญ์ด ๋๋ค. ๊ทธ๋์ ๊ฐ์ ๋งคํ์ด ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์คํจํ๊ณ ์๋ฌ ๋ฉ์์ง์์ ์์ธ๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค๋ ๊ฒ๋ง ๋จ๊ฒผ๋ค. ๋ณ์นญ ํด์ ๋จ๊ณ์์ u1.password ๊ฐ ์ปฌ๋ผ์ด ์๋๋ผ ์๋ฒ ๋๋ ํ๋กํผํฐ๋ก ํ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค๋ ์ง์์ ์ ์์ง๋ง ๋จ์ ํ์ง๋ ์์๋ค. ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ์ฌ๋ผ์ง๋ค๋ ์ฐํ์ฑ
๋ ๊ฐ์ด ์ ์ด๋๋ค.
4. 21๋ถ ๋ค์ ์จ PR, ๊ทธ๋ฆฌ๊ณ ๋ด ์ ๊ณ ๋ณด๋ค ๋์๋ ์์
PR ์ ์ด์ ๋ฑ๋ก 21๋ถ ๋ค์ ์ฌ๋ผ์๊ณ , ๊ฐ์ ๋ ๋ฉ์ธํ
์ด๋๊ฐ ๋จธ์งํ๋ค. ๋ณ๊ฒฝ์ QueryBuilder ํ ๊ณณ, 16์ค์ด์๋ค.
// ์กฐ์ธ ์ ๋ต์ ์ปฌ๋ผ ์ด๋ฆ์ผ๋ก select ํ๋๋ฐ, ๊ทธ ์ด๋ฆ์ด ์ธ๋ผ์ธ ์๋ฒ ๋๋ ํ๋กํผํฐ ์ด๋ฆ๊ณผ ์ถฉ๋ํ ์ ์๋ค
const shadowed =
customAlias &&
prop?.kind === ReferenceKind.EMBEDDED &&
(this.#state.aliases[a]?.meta ?? this.mainAlias.meta).props.some(
p => (p.kind !== ReferenceKind.EMBEDDED || p.object) && p.fieldNames?.includes(f),
);
if (prop?.kind === ReferenceKind.EMBEDDED && !shadowed) {
// ๊ธฐ์กด์ฒ๋ผ ์ฌ๋ฌ ์ปฌ๋ผ์ผ๋ก ํผ์น๊ณ , ๋ณ์นญ์ด ๋ถ์ด ์์ผ๋ฉด ๊ฑฐ๋ถํ๋ค
}๋ณ์นญ์ด ๋ถ์ select ์ ์ด๋ฆ์ด ์ํฐํฐ์ ์ค์ ์ปฌ๋ผ๊ณผ ์ผ์นํ๋ฉด, ์๋ฒ ๋๋ ํ๋กํผํฐ๊ฐ ์๋๋ผ ๊ทธ ์ปฌ๋ผ์ผ๋ก ํด์ํ๋๋ก ๋ฐ๊พผ ๊ฒ์ด๋ค. ๋ณ์นญ์ด ์์ผ๋ฉด ์ข ์ ๋๋ก ํ๋กํผํฐ ์ ์ฒด๋ฅผ ํผ์น๋ค. ๋ด๊ฐ ์ง์ํ๋ ์ง์ ๊ณผ ๊ฐ์ ์๋ฆฌ์๋ค.
์์ ์ด ๋ด๊ฐ ์ ๊ณ ํ ๊ฒ๋ณด๋ค ๋์๋ค๋ ์ ์ด ํฅ๋ฏธ๋ก์ ๋ค. ๊ฐ์ ๋ถ๊ธฐ์์ ๋ ๊ฐ์ง๊ฐ ๋ ๊ณ ์ณ์ก๋ค.
persist: false์ธ ์์์ ๊ฐ์ง ์ธ๋ผ์ธ ์๋ฒ ๋๋ธ์ด ์ปฌ๋ผ ์ ๊ฐ ๊ณผ์ ์์ ๊นจ์ง๋ ๋ฌธ์ - ์ ๊ฐ๋ ์ปฌ๋ผ์ ์์ฒญ๋ ์กฐ์ธ ๋ณ์นญ์ด ๋ถ์ง ์์, ์กฐ์ธํด์ ์ฝ์ด์ผ ํ ์๋ฒ ๋๋ธ์ ๋ฉ์ธ ํ ์ด๋ธ์์ ์ฝ์ด์ค๋ ๋ฌธ์
๋ ๋ฒ์งธ๊ฐ ๋์ ๊ฑธ๋ ธ๋ค. ์์ธ๋ ์๊ณ ๊ฐ๋ ์ฑ์์ง๋๋ฐ ์ถ์ฒ๊ฐ ํ๋ฆฐ ํํ๋ค. ๋ด๊ฐ ์ฌ๋ฆฐ ๋ฌธ์ ๋ ๊ทธ๋๋ ์๋๋ฝ๊ฒ ํฐ์ง๊ธฐ๋ ํ๋๋ฐ, ์ด์ชฝ์ ์กฐ์ฉํ ํ๋ฆฐ ๊ฐ์ ์ค๋ค. ์ ๋ณดํ์ง ์์๋ ๋ฒ๊ทธ๊ฐ ๊ฐ์ ๋ถ๊ธฐ ์์ ํจ๊ป ์์๋ ์ ์ด๋ค.
๋จธ์ง๋ ํ๊ท ํ
์คํธ๋ ๋ด ์ฌํ๋ณด๋ค ๋๋ค. ๋จ์ผ ์ปฌ๋ผ ์๋ฒ ๋๋ธ๋ฟ ์๋๋ผ ๋ค์ค ์ปฌ๋ผ ์๋ฒ ๋๋ธ, ์ค์ฒฉ ์๋ฒ ๋๋ธ, persist: false ์์, ์๋ฒ ๋๋ธ ์ปฌ๋ผ๊ณผ ์ด๋ฆ์ด ๊ฒน์น๋ ํ๋ฒํ ์ค์นผ๋ผ ํ๋กํผํฐ๊น์ง ํ ํ์ผ์ ๋ค์ด๊ฐ๋ค. ๋ด ์ฌํ ๋ค ์ค์ ๊ทธ ํํ์ ์จ์ ์ ๋์๋ค.
๋จ์ ์ผ์ ์ฐํ๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ์ด๋ค. ์์ ์ด ๋ฆด๋ฆฌ์ค์ ์ค๋ฆฌ๋ฉด hashedPassword ๋ฅผ ์๋ ์ด๋ฆ์ผ๋ก ๋๋๋ฆด ์ ์๋ค. ๋๋๋ฆฌ๋ ๊ธฐ์ค์ ๋ฒ์ ์ ์ฌ๋ ธ๋ค๋ ์ฌ์ค์ด ์๋๋ผ, ์กฐ์ธ ์ ๋ต์ผ๋ก ๋ถ๋ฌ์จ ๊ฐ์ด ์ฑ์์ง๋ ๊ฒ์ ํ์ธํ ์์ ์ผ๋ก ์ก์๋๋ ค ํ๋ค.
๐ค Understanding
์ด๋ฒ ์ผ์์ ๋จ์ ๊ฒ์ ์ธ ๊ฐ์ง๋ค.
- ์ฐํ์ ์ ๋ณด๋ ๊ฐ์ด ๋ฌถ์ง ์๋ ํธ์ด ๋ซ๋ค. ์ฐํ๋ฅผ ๋จผ์ ๋๋ด๋ฉด ์ ๋ณด๊ฐ ๊ธํด์ง์ง ์๊ณ , ๊ทธ๋งํผ ์ฌํ์ ๋ค๋ฌ์ ์ฌ์ ๊ฐ ์๊ธด๋ค. ๋ฐ๋๋ก ์ ๋ณด๊ฐ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๋ฐฐํฌ๋ฅผ ๋ฏธ๋ค๋ค๋ฉด ๋ ๋ค ๋ฆ์ด์ก์ ๊ฒ์ด๋ค.
- ์ฌํ์ ์ฌ๋ฆฌ๋ ์ชฝ์์ ์ต๋ํ ๋๋ด๋๋ ๊ฒ ๋ซ๋ค. ํ๋ก์ ํธ๊ฐ ์ฌํ ๋ฒ ์ด์ค๋ฅผ ์ ๊ณตํ๋ค๋ฉด ๊ทธ๊ฒ์ fork ํ๋ ๊ฒ์ด ๋จผ์ ๋ค. ์ด์ํ ๋ ํ์ํ ์์ง์ด ์ด๋ฏธ ๋๋ ์๊ณ , ๋ด ์ปค๋ฐ ํ๋์ ์ฌํ ์กฐ๊ฑด์ด ๋ค ๋ด๊ธด๋ค. ์ฌ๊ธฐ์ ํต๊ณผํ๋ ๊ฒฝ๋ก๊น์ง ํจ๊ป ๋ฃ์ผ๋ฉด ์ค์ ๋ฌธ์ ๊ฐ ์๋๋๋ ๋๋ฌผ์์ด ๋์ค์ง ์๋๋ค.
- ๊ธฐ์ฌ์ ๋จ์๊ฐ ๊ผญ PR ์ ์๋๋ค. ์ด๋ฒ์ ๊ณ ์น ์ฌ๋์ ๋ด๊ฐ ์๋์ง๋ง, ๊ณ ์น ์ ์๋ ํํ๋ก ๋ฌธ์ ๋ฅผ ์ฎ๊ฒจ๋๋ ์ผ์๋ ๋ชซ์ด ์์๋ค๊ณ ์๊ฐํ๋ค. ์ฝ๋๋ฅผ ์ธ ์๊ฐ์ด ์์ด์ ์ ๋ณด๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฒ๋ณด๋ค๋, ์ฌํ์ ์ ๋ง๋ค์ด ๋๊ธฐ๋ ํธ์ด ์ค์ ๋ก ๋ ๋นจ๋ฆฌ ๊ณ ์ณ์ง๋ค.
์ฐธ๊ณ ์๋ฃ
- mikro-orm #8292 โ Joined populate throws when embedded property has the same name as its column
- mikro-orm #8293 โ fix(sql): resolve inline embeddable columns that shadow the property name
- mikro-orm/reproduction โ ์ฌํ์ฉ ๋ฒ ์ด์ค ์ ์ฅ์
- JH8459/reproduction โ ์ด๋ฒ ์ด์์ ์ต์ ์ฌํ
- MikroORM ๊ณต์ ๋ฌธ์ โ Embeddables
- Discussion #3685 โ ๊ฐ ๊ฐ์ฒด ๋งคํ์ ๋ํ ๋ฉ์ธํ ์ด๋ ๊ถ๊ณ