ํค์ด ํ๋ธ๋ฅด!
์ฐ๋ฆฌ๋ ์ฃผ์ ๋ฅผ ๊ณ์ ํ๊ตฌํฉ๋๋ค
๋ค์ ๋ค๋ฆ์ ์ด ๊ธฐ์ฌ์์ ๋๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด "Java์ ๊ธฐ๋ฅ"(๋๋ ํด๋ผ์ด์ธํธ ์ธ์ด๊ฐ ๋ฌด์์ด๋ )์ด ์๋๋ผ "๋ฐ์ดํฐ๋ฒ ์ด์ค์์" ์ค๊ณ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ ๊ฒ์
๋๋ค. ์์
). ๋ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๋ฉด ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํ๊ธฐ ์์ํ๋ฉด ๊ธด ๊ณ ํต๊ณผ ๊ดด๋ก์์ ๊ธธ์ ๋ค์ด์๊ฒ ๋ฉ๋๋ค.
๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์
๋๋ค
์น์
์ reddit์ ๋ํ ํฅ๋ฏธ๋ก์ด ํ ๋ก
์ฝ๋ ์์ฑ
jOOQ๋ฅผ ์๊ฒ ๋ ํ jOOQ๊ฐ ์์ค ์ฝ๋ ์์ฑ์ ์ฌ๊ฐํ๊ฒ ์์กดํ์ฌ ์คํ๋๋ค๋ ์ฌ์ค์ ๋ถ๊ฐํ๋ ์์์ ์ฌ์ฉ์ ๊ณ์ธต์ด ์๋ค๋ ์ฌ์ค์ ์ผ๋ง๋ ๋๋์ต๋๊น? ์๋ฌด๋ ๋น์ ์ด ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ ๋ฐฉ์์ผ๋ก jOOQ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ง ์์ผ๋ฉฐ, ์๋ฌด๋ ๋น์ ์ด ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก(๋งค๋ด์ผ์ ์ค๋ช ๋ ๋๋ก) jOOQ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค. (๋ ๊ฑฐ์) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ก ์์ํ์ฌ jOOQ ์ฝ๋ ์์ฑ๊ธฐ๋ก ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋งํ์ฌ ํ ์ด๋ธ์ ๋ํ๋ด๋ ํด๋์ค ์ธํธ๋ฅผ ์ป์ ๋ค์ ์ ํ์ ์์ฑํฉ๋๋ค. ๋ค์ ํ ์ด๋ธ์ ๋ํ ์์ ํ ์ฟผ๋ฆฌ:
for (Record2<String, String> record : DSL.using(configuration)
// ^^^^^^^^^^^^^^^^^^^^^^^ ะะฝัะพัะผะฐัะธั ะพ ัะธะฟะฐั
ะฒัะฒะตะดะตะฝะฐ ะฝะฐ
// ะพัะฝะพะฒะฐะฝะธะธ ัะณะตะฝะตัะธัะพะฒะฐะฝะฝะพะณะพ ะบะพะดะฐ, ะฝะฐ ะบะพัะพััะน ัััะปะฐะตััั ะฟัะธะฒะตะดะตะฝะฝะพะต
// ะฝะธะถะต ััะปะพะฒะธะต SELECT
.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
// vvvvv ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ัะณะตะฝะตัะธัะพะฒะฐะฝะฝัะต ะธะผะตะฝะฐ
.from(ACTOR)
.orderBy(1, 2)) {
// ...
}
์ฝ๋๋ ๋น๋ ์ธ๋ถ์์ ์๋์ผ๋ก ์์ฑ๋๊ฑฐ๋ ๋ชจ๋ ๋น๋์์ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฌํ ์ฌ์์ ์งํ์ ๋ค๋ฐ๋ฅผ ์ ์์ต๋๋ค.
์์ค ์ฝ๋ ์์ฑ
์ฝ๋ ์์ฑ์ ๋ํ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์(์๋ ๋ฐ ์๋)๊ณผ ๊ด๋ จ๋ ๋ค์ํ ์ฒ ํ, ์ฅ์ ๋ฐ ๋จ์ ์ด ์์ผ๋ฉฐ ์ด ๊ธฐ์ฌ์์๋ ์์ธํ ๋ ผ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋ ์ฝ๋์ ์์ ์ ์ฐ๋ฆฌ ์์คํ ๋ด์์๋ ์ธ๋ถ์์๋ ์ฐ๋ฆฌ๊ฐ ๋น์ฐํ๊ฒ ์ฌ๊ธฐ๋ "์ง์ค"์ Java๋ก ์ฌํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ค ์๋ฏธ์์ ์์ค ์ฝ๋์์ ๋ฐ์ดํธ ์ฝ๋, ๊ธฐ๊ณ ์ฝ๋ ๋๋ ๋ค๋ฅธ ์ข ๋ฅ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ปดํ์ผ๋ฌ๋ ๋์ผํ ์์ ์ ์ํํฉ๋๋ค. ํน์ ์ด์ ์ ๊ด๊ณ์์ด ๋ค๋ฅธ ์ธ์ด๋ก "์ง์ค"์ ํํํฉ๋๋ค.
๊ทธ๋ฌํ ์ฝ๋ ์์ฑ๊ธฐ๊ฐ ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
- ์ผ๋ถ ์ง์ค(๋ด๋ถ ๋๋ ์ธ๋ถ)์ด ์์ต๋๋ค(์: ์ฌ์, ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฑ).
- ์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ด ์ฌ์ค์ ์ง์ญ์ ์ผ๋ก ํํํ ํ์๊ฐ ์์ต๋๋ค.
๋ํ ์ค๋ณต์ ํผํ๊ธฐ ์ํด ์ด๋ฌํ ํํ์ ์์ฑํ๋ ๊ฒ์ด ๊ฑฐ์ ํญ์ ๊ถ์ฅ๋ฉ๋๋ค.
์ ํ ๊ณต๊ธ์ ๋ฐ ์ฃผ์ ์ฒ๋ฆฌ
์ฐธ๊ณ : jOOQ์ ์ฝ๋ ์์ฑ์ ๋ํ ๋ ๋ค๋ฅธ ๋ณด๋ค ํ๋์ ์ด๊ณ ๊ตฌ์ฒด์ ์ธ ์ ๊ทผ ๋ฐฉ์์๋ ์ ํ ๊ณต๊ธ์ ์ฌ์ฉ์ด ํฌํจ๋ฉ๋๋ค.
์ด๋ค ์๋ฏธ์์, ๋ค์์ ์ ์ธํ๊ณ ๋ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์ ๋์ผํ ์ผ์ด ์ฌ๊ธฐ์ ๋ฐ์ํฉ๋๋ค.
- ์์ฑ๋ ์ฝ๋๊ฐ ๋ณด์ด์ง ์์ต๋๋ค.
- ์ ํ์ ์ ๊ณตํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ฆ, "true"๋ฅผ ํญ์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ "์ง์ค"๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ๋กฌ๋ณต์ ๊ฒฝ์ฐ์๋ ์ฝ์ต๋๋ค. ํญ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ ์ฐ๊ฒฐ์ ์์กดํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์์๋ ์กฐ๊ธ ๋ ์ด๋ ต์ต๋๋ค.
์ฝ๋ ์์ฑ์ ์ด๋ค ๋ฌธ์ ๊ฐ ์์ต๋๊น?
์๋ ๋๋ ์๋์ผ๋ก ์ฝ๋ ์์ฑ์ ์์ํ๋ ๊ฒ์ด ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ํ ๊น๋ค๋ก์ด ์ง๋ฌธ ์ธ์๋ ์ฝ๋ ์์ฑ์ด ์ ํ ํ์ํ์ง ์๋ค๊ณ ๋ฏฟ๋ ์ฌ๋๋ค์ด ์์์ ์ธ๊ธํด์ผ ํฉ๋๋ค. ๋ด๊ฐ ๊ฐ์ฅ ์์ฃผ ์ ํ๋ ์ด ๊ด์ ์ ๋ํ ์ ๋น์ฑ์ ๋น๋ ํ์ดํ๋ผ์ธ์ ์ค์ ํ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. ๋ค, ์ ๋ง ์ด๋ ต์ต๋๋ค. ์ถ๊ฐ ์ธํ๋ผ ๋น์ฉ์ด ์์ต๋๋ค. ํน์ ์ ํ(jOOQ, JAXB ๋๋ Hibernate ๋ฑ)์ ์ด์ ๋ง ์์ํ๋ ๊ฒฝ์ฐ API ์์ฒด๋ฅผ ํ์ตํ์ฌ ๊ฐ์น๋ฅผ ์ป์ ์ํฌ๋ฒค์น๋ฅผ ์ค์ ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. .
์์ฑ๊ธฐ ์ฅ์น๋ฅผ ์ดํดํ๋ ๋ฐ ๋๋ ๋น์ฉ์ด ๋๋ฌด ๋์ผ๋ฉด ์ค์ ๋ก API๊ฐ ์ฝ๋ ์์ฑ๊ธฐ์ ์ ์ฉ์ฑ์ ๋ํด ์ ๋๋ก ์๋ํ์ง ์์ ๊ฒ์ ๋๋ค(ํฅํ์๋ ์ฌ์ฉ์ ์ง์ ๋ ์ด๋ ต๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค). ์ฌ์ฉ์ฑ์ ๊ทธ๋ฌํ API์ ๋ํด ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฝ๋ ์์ฑ์ ๋ํ ํ๋์ ์ฃผ์ฅ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ด๋ถ ๋๋ ์ธ๋ถ ์ง๋ฆฌ์ ๋ก์ปฌ ํํ์ ์์ผ๋ก ์์ ํ ์์ฑํ์ญ์์ค.
๋ง์ ์ฌ๋๋ค์ด ์ด ๋ชจ๋ ๊ฒ์ ํ ์๊ฐ์ด ์๋ค๊ณ ๋งํ ๊ฒ์ ๋๋ค. ์ํผ ์ ํ์ ๋ง๊ฐ์ผ์ด ๋ค๊ฐ์์ต๋๋ค. ์ธ์ ๊ฐ๋ ์กฐ๋ฆฝ ์ปจ๋ฒ ์ด์ด๋ฅผ ๋น์งํ๊ณ ์๊ฐ์ด ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์๊ฒ ๋๋ตํ ๊ฒ์ด๋ค:
๊ทธ๋ฌ๋ Hibernate/JPA์์๋ "Java๋ก" ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค.
์ ๋ง. Hibernate์ ๊ทธ ์ฌ์ฉ์๋ค์๊ฒ ์ด๊ฒ์ ํํ์ด์ ์ ์ฃผ์ ๋๋ค. Hibernate์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ช ๊ฐ์ง ์ํฐํฐ๋ฅผ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
@Entity
class Book {
@Id
int id;
String title;
}
๊ทธ๋ฆฌ๊ณ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ์ค๋น๋์์ต๋๋ค. ์ด์ Hibernate์ ๋ง์ ๋ถ๋ถ์ ์ด ์ํฐํฐ๊ฐ SQL "dialect"์ DDL์์ ์ ํํ ์ด๋ป๊ฒ ์ ์๋๋์ง์ ๋ํ ๋ณต์กํ "์ธ๋ถ ์ฌํญ"์ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
CREATE TABLE book (
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
title VARCHAR(50),
CONSTRAINT pk_book PRIMARY KEY (id)
);
CREATE INDEX i_book_title ON book (title);
... ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์์ํฉ๋๋ค. ๋น ๋ฅด๊ฒ ์์ํ๊ณ ์คํํ๊ณ ๋ค์ํ ๊ฒ์ ์๋ํ ์ ์๋ ์ ๋ง ๋ฉ์ง ๊ธฐ๋ฅ์ ๋๋ค.
๊ทธ๋ฌ๋, ๋ด๊ฐ ๋ณด์. ๋๋ ๊ฑฐ์ง๋ง์ ํ๊ณ ์์๋ค.
- Hibernate๋ ์ด ๋ช ๋ช ๋ ๊ธฐ๋ณธ ํค์ ์ ์๋ฅผ ์ค์ ๋ก ์ํํฉ๋๊น?
- Hibernate๋ TITLE์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํฉ๋๊น? ๋๋ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ํ์ํ๋ค๋ ๊ฒ์ ํ์คํ ์๋๋ค.
- Hibernate๋ ์ด ํค๋ฅผ ID ์ฌ์์ ID ํค๋ก ๋ง๋ค๊น์?
์๋ง ์๋ ๊ฒ๋๋ค. ํ๋ก์ ํธ๋ฅผ ์ฒ์๋ถํฐ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ํ์ํ ์ฃผ์์ ์ถ๊ฐํ๋ ์ฆ์ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํญ์ ํธ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ Book ์ํฐํฐ๋ ๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์ ํ์์ ์ทจํฉ๋๋ค.
@Entity
@Table(name = "book", indexes = {
@Index(name = "i_book_title", columnList = "title")
})
class Book {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
String title;
}
์์ํ. ์ฌ์ํ๋ค. ๋ค์ ๋งํ์ง๋ง, ์ด ๊ฒฝ์ฐ ์ฒ์์๋ ๋งค์ฐ ์ฌ์ธ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋์ค์ ๋น์ฉ์ ์ง๋ถํด์ผ ํฉ๋๋ค.
์กฐ๋ง๊ฐ ์์ฐ์ ๋ค์ด๊ฐ์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ธ์ด ์๋์ ๋ฉ์ถฅ๋๋ค. ์๋ํ๋ฉด:
ํ๋ก๋์ ํ๊ฒฝ์์๋ ํ์ํ ๊ฒฝ์ฐ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ๊ธฐํ๊ณ ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ ๊ฑฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ํ๋ฉ๋๋ค.
์ง๊ธ๋ถํฐ ์์ํ ๋น์ ์ ์จ์ผ ํ ๊ฒ์
๋๋ค
๋ฐ๋ผ์ ํ๋ก๋์ ์ผ๋ก ์ด๋ํ๋ ์ฆ์ ํซ ํจ์น๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๋งค์ฐ ๋นจ๋ฆฌ ์์ฐ์ ํฌ์ ๋์ด์ผ ํฉ๋๋ค. ํ๋ก๋์ ์ ์ํ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํํ ํ์ดํ๋ผ์ธ์ ์ค๋นํ๊ณ ๊ตฌ์ฑํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฌด๋ฆฌํ๊ฒ ํจ์น๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ์ผ์ ์ ๋๋ก ํ ์๊ฐ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ํญ์ ๋๊ตฐ๊ฐ์ ์๋ชป์ด๊ธฐ ๋๋ฌธ์ Hibernate๋ฅผ ๊พธ์ง์ต๋๋ค. ํ์ง๋ง ๋น์ ์ ์๋๋๋ค ...
๋์ ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฒ์ด ์์ ํ ๋ค๋ฅด๊ฒ ์ํ๋ ์ ์์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ๊ฑฐ์ ๋ฅ๊ทผ ๋ฐํด๋ฅผ ๋ฌ์.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ์ง์ ํ "์ง์ค"๊ณผ ์ด์ ๋ํ "์ฃผ๊ถ"์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ์์ต๋๋ค. ์คํค๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด์์๋ง ์ ์๋๊ณ ๋ค๋ฅธ ๊ณณ์์๋ ์ ์๋์ง ์์ผ๋ฉฐ ๊ฐ ํด๋ผ์ด์ธํธ๋ ์ด ์คํค๋ง์ ๋ณต์ฌ๋ณธ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์คํค๋ง์ ๊ทธ ๋ฌด๊ฒฐ์ฑ์ ์ค์ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ์ ๋ณด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
์ด๊ฒ์ ์ง๋ถํ๊ธฐ๊น์ง ํ ์ค๋๋ ์งํ์
๋๋ค. ๊ธฐ๋ณธ ๋ฐ ๊ณ ์ ํค๊ฐ ์ข์ต๋๋ค. ์ธ๋ ํค๋ ๊ด์ฐฎ์ต๋๋ค. ์ ์ฝ ์กฐ๊ฑด ํ์ธ์ด ์ข์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๊ทธ๊ฒ ์ ๋ถ๊ฐ ์๋๋๋ค. ์๋ฅผ ๋ค์ด Oracle์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ง์ ํ ์ ์์ต๋๋ค.
- ํ ์ด๋ธ์ด ์๋ ํ ์ด๋ธ์คํ์ด์ค
- ๊ทธ๋ ์ PCTFREE ๊ฐ์น๋ ๋ฌด์์ ๋๊น
- ์ํ์ค์ ์บ์ ํฌ๊ธฐ๋ ์ผ๋ง์ ๋๊น(id ๋ค)
์๊ท๋ชจ ์์คํ ์์๋ ์ด ๋ชจ๋ ๊ฒ์ด ์ค์ํ์ง ์์ ์ ์์ง๋ง "๋น ๋ฐ์ดํฐ" ์์ญ์ผ๋ก ์ ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๋ ์์ต๋๋ค. ์์์ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ ๋ฒค๋ ์ ๊ณต ์คํ ๋ฆฌ์ง ์ต์ ํ์ ์ด์ ์ ํจ์ฌ ์ผ์ฐ ์์ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ณธ ์ด๋ค ORM(jOOQ ํฌํจ)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉํ ์ ์๋ ์ ์ฒด DDL ์ต์ ์ธํธ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ORM์ DDL ์์ฑ์ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์ ์ค๊ณ๋ ์คํค๋ง๋ DDL๋ก ์์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์์ฑ๋ ๋ชจ๋ DDL์ ๊ทผ์ฌ์น์ผ ๋ฟ์ ๋๋ค.
ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ด๋ป์ต๋๊น?
์์์ ์ธ๊ธํ๋ฏ์ด ํด๋ผ์ด์ธํธ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ณต์ฌ๋ณธ์ธ ํด๋ผ์ด์ธํธ ๋ณด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. ๋งํ ํ์๋ ์์ด ์ด ํด๋ผ์ด์ธํธ ๋ณด๊ธฐ๋ ์ค์ ๋ชจ๋ธ๊ณผ ๋๊ธฐํ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ฌ์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ์ฝ๋ ์์ฑ๊ธฐ๋ก.
๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ SQL์ ํตํด ๋ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ก ๋ค๋ฅธ SQL ์ธ์ด๋ก ๋ ๋ชจ๋ ํ ์ด๋ธ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server
SELECT table_schema, table_name
FROM information_schema.tables
-- DB2
SELECT tabschema, tabname
FROM syscat.tables
-- Oracle
SELECT owner, table_name
FROM all_tables
-- SQLite
SELECT name
FROM sqlite_master
-- Teradata
SELECT databasename, tablename
FROM dbc.tables
์ด๋ฌํ ์ฟผ๋ฆฌ(๋๋ ๋ทฐ, ๊ตฌ์ฒดํ๋ ๋ทฐ, ํ
์ด๋ธ ๋ฐํ ํจ์๋ ๊ณ ๋ คํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ ์ฌํ ์ฟผ๋ฆฌ)๋ ๋ค์์ ํธ์ถํ์ฌ ์คํ๋ฉ๋๋ค. DatabaseMetaData.getTables()
์ด๋ฌํ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์์ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ํด๋ผ์ด์ธํธ ์ธก ํํ์ ์์ฑํ๋ ๊ฒ์ด ์๋์ ์ผ๋ก ์ฝ์ต๋๋ค.
- JDBC ๋๋ Spring์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ผ๋ จ์ ๋ฌธ์์ด ์์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ํฐํฐ ์์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- jOOQ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ jOOQ ๋ฉํ ๋ชจ๋ธ์ ์์ฑํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ API(์: jOOQ ๋๋ JPA)๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์์ ๋ฐ๋ผ ์์ฑ๋ ๋ฉํ ๋ชจ๋ธ์ด ์ ๋ง ํ๋ถํ๊ณ ์์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์์ ์กฐ์ธ์ ๊ฐ๋ฅ์ฑ์ ์๊ฐํด ๋ณด์ญ์์ค.
์ด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฆ๋ถ์ด ์๋์ผ๋ก ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ํด๋ณด์ญ์์ค.
ALTER TABLE book RENAME COLUMN title TO book_title;
์ ๋ง ์ด ์ผ์ ๋ ๋ฒ ํ์๊ฒ ์ต๋๊น? ์ด๋ ํ ๊ฒฝ์ฐ์๋. DDL์ ์ปค๋ฐํ๊ณ ๋น๋ ํ์ดํ๋ผ์ธ์ ํตํด ์คํํ๊ณ ์ ๋ฐ์ดํธ๋ ์ํฐํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
@Entity
@Table(name = "book", indexes = {
// ะั ะพะฑ ััะพะผ ะทะฐะดัะผัะฒะฐะปะธัั?
@Index(name = "i_book_title", columnList = "book_title")
})
class Book {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
@Column("book_title")
String bookTitle;
}
๋๋ ์ ๋ฐ์ดํธ๋ jOOQ ํด๋์ค. ๋๋ถ๋ถ์ DDL ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋ฌธ๋ฟ๋ง ์๋๋ผ ์๋ฏธ ์ฒด๊ณ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ๋ ์ฝ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฆ๊ฐ๋ก ์ธํด ์ํฅ์ ๋ฐ๋(๋๋ ๋ฐ์ ์ ์๋) ์ฝ๋๋ฅผ ํ์ธํ๋ ๊ฒ์ด ํธ๋ฆฌํ ์ ์์ต๋๋ค.
์ ์ผํ ์ง์ค
์ด๋ค ๊ธฐ์ ์ ์ฌ์ฉํ๋ ์ง ํญ์ ์ผ๋ถ ํ์ ์์คํ
์ ๋ํ ์ ์ผํ ์ง์ค ์์ค์ธ ํ๋์ ๋ชจ๋ธ์ด ์์ต๋๋ค. ๋๋ ์ ์ด๋ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ํด ๋
ธ๋ ฅํ๊ณ "์ง์ค"์ด ์ด๋์๋ ์๊ณ ๋์์ ์ด๋์๋ ์๋ ๊ธฐ์
ํผ๋์ ํผํด์ผ ํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ํจ์ฌ ์ฌ์ธ ์ ์์ต๋๋ค. XML ํ์ผ์ ๋ค๋ฅธ ์์คํ
๊ณผ ๊ตํํ๋ ๊ฒฝ์ฐ์๋ XSD๋ฅผ ์ฌ์ฉํ์ญ์์ค. XML ํ์์ jOOQ์ INFORMATION_SCHEMA ๋ฉํ ๋ชจ๋ธ์ ์ดํด๋ณด์ญ์์ค.
- XSD๋ ์ ์ดํด๋จ
- XSD๋ XML ์ฝํ ์ธ ๋ฅผ ๋งค์ฐ ์ ํ์ํ๊ณ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ธ์ด์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ฉํฉ๋๋ค.
- XSD๋ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ ๋์ด ์์ผ๋ฉฐ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ๋์ต๋๋ค.
- XJC๋ฅผ ์ฌ์ฉํ์ฌ XSD๋ฅผ Java ์ฝ๋๋ก ๋ณํํ ์ ์์ต๋๋ค.
๋ง์ง๋ง ํฌ์ธํธ๊ฐ ์ค์ํฉ๋๋ค. XML ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์์คํ ๊ณผ ํต์ ํ ๋ ์ฐ๋ฆฌ๋ ๋ฉ์์ง๊ฐ ์ ํจํ์ง ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ์ด๋ JAXB, XJC ๋ฐ XSD๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌ์ฑํ๊ธฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ฉ์์ง๋ฅผ Java ๊ฐ์ฒด๋ก ๋ง๋๋ Java ์ฐ์ ์ค๊ณ ์ ๊ทผ ๋ฐฉ์์์ ๋ฉ์์ง๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ XML๋ก ๋ ๋๋งํ๊ณ ๋ค๋ฅธ ์์คํ ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณด๋ผ ์ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ ๋ง ๋ฏธ์น ์ง์ ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์ฑ๋ XML์ ํ์ง์ด ๋งค์ฐ ๋ฎ๊ณ ๋ฌธ์ํ๋์ง ์์์ผ๋ฉฐ ๊ฐ๋ฐํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌํ ์ธํฐํ์ด์ค์ ๋ํ ์๋น์ค ํ์ง(SLA) ์์ค์ ๋ํ ํฉ์๊ฐ ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ฆ์ ๊ทธ๊ฒ์ ๋ง์ณค์ ๊ฒ์ ๋๋ค.
์์งํ ๋งํด์ ์ด๊ฒ์ JSON API์์ ํญ์ ์ผ์ด๋๋ ์ผ์ด์ง๋ง ๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ์ ๋๋ค. ๋ค์์ ๋ ผ์ํ๊ฒ ์ต๋๋ค ...
๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ทธ๋ค์ ๋์ผํฉ๋๋ค
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์์ ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋์ผํ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์คํค๋ง๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ์คํค๋ง์ ๋ํ ๋ชจ๋ ์์ ์ฌํญ์ DDL์์ ์ง์ ๊ตฌํํด์ผ ๋จ์ผ ์ ๋ณด ์์ค๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์์ค ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ๋ชจ๋ธ ์ฌ๋ณธ๋ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ์ผ๋ถ ํด๋ผ์ด์ธํธ๋ jOOQ ๋ฐ Hibernate ๋๋ JDBC(๋๋ ๋ ๋ค)๋ฅผ ์ฌ์ฉํ์ฌ Java๋ก ์์ฑ๋ ์ ์์ต๋๋ค. ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ Perl๋ก ์์ฑ๋ ์ ์๊ณ (ํ์ด์ ๋น์), ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ C#์ผ๋ก ์์ฑ๋ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ต๋๋ค. ORM์ผ๋ก ์์ฑ๋ ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ผ๋ก ํ์ง์ด ๋ฎ๊ณ ๋ฌธ์ํ๋ ์ ๋์ด ์์ง ์์ผ๋ฉฐ ๊ฐ๋ฐํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค์ํ์ง ๋ง์ธ์. ์ฒ์๋ถํฐ ์ค์ํ์ง ๋ง์ธ์. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ ํฉ๋๋ค. ์๋ํํ ์ ์๋ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํฉ๋๋ค. ์ฝ๋ ์์ฑ๊ธฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ํธ๋ฆฌํ๊ฒ ๋ณต์ฌํ๊ณ ํด๋ผ์ด์ธํธ์ ๋คํํ ์ ์๋๋ก ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์์ฑ๊ธฐ์ ๋ํด ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค. ๊ทธ๋ค์ ์ข๋ค. ๊ทธ๋ค๊ณผ ํจ๊ปํ๋ฉด ์์ฐ์ฑ์ด ๋์์ง ๊ฒ์ ๋๋ค. ์ฒ์๋ถํฐ ์ค์ ํ๋ ๋ฐ ์ฝ๊ฐ์ ์๊ฐ์ ํ ์ ํ๊ธฐ๋ง ํ๋ฉด ๋ช ๋ ๋์ ํ๋ก์ ํธ์ ์คํ ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ์ฑ๋ฅ์ด ํฅ์๋ ๊ฒ์ ๋๋ค.
๋์ค์ ๋์๊ฒ ๊ฐ์ฌํ์ง ๋ง์ญ์์ค.
์ค๋ช
๋ช ํํ๊ฒ ํ๊ธฐ: ์ด ๊ธฐ์ฌ๋ ์ ์ฒด ์์คํ (์ฆ, ๋๋ฉ์ธ, ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ๋ฑ)์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๋ง๊ฒ ์กฐ์ ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ง ์์ต๋๋ค. ์ด ๊ธฐ์ฌ์์ ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ์ฌ "์ผ๋ฅ" ์ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ์ฌ์์ฐํ์ง ์๋๋ก ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ ผ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ์์ต๋๋ค.
์ผ๋ถ ์ฅ์์์ ์ฌ์ ํ ๋ณด์กด๋๋ XNUMX๋จ๊ณ ์ํคํ ์ฒ์์๋ ์ด๋ฌํ ์์คํ ๋ชจ๋ธ์ด ๊ฐ๋ฅํ ์ ์ผํ ๋ชจ๋ธ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ์์คํ ์์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ์บก์ํํ๋ "ํ์ ์์คํ "์ผ๋ก ๋ณด์ ๋๋ค.
์์ธ
๋ชจ๋ ๊ท์น์๋ ์์ธ๊ฐ ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์ ๋ฐ ์์ค ์ฝ๋ ์์ฑ ์ ๊ทผ ๋ฐฉ์์ด ๋๋๋ก ๋ถ์ ์ ํ ์ ์๋ค๊ณ ์ด์ ์ ๋ง์๋๋ฆฐ ๋ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๊ทธ๋ฌํ ์์ธ๊ฐ ๋ช ๊ฐ์ง ์์ต๋๋ค(์๋ง๋ ๋ค๋ฅธ ์์ธ๋ ์์ ๊ฒ์ ๋๋ค).
- ์คํค๋ง๋ฅผ ์ ์ ์๊ณ ์ด์ด์ผ ํ๋ ๊ฒฝ์ฐ. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ค์ด์ด๊ทธ๋จ์ ํ์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํด. ์ฌ๊ธฐ์๋ ์ฝ๋ ์์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ-์ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค.
- ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฆ์์์ ํ๋ก๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ. ์ด ์๋ ํจํด์ ์ฝ๊ฐ ํ๋ฆด ๋ฒ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ํฐํฐ ์์ฑ ๊ฐ ์ฆ, ์ ์ ์๋ ์คํค๋ง๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ RDBMS๊ฐ ์ ํฉํ ์ง ์ ํ ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์์ธ๋ ๋ณธ์ง์ ์ผ๋ก ์์ธ์ ์
๋๋ค. RDBMS ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์คํค๋ง๋ ๋ฏธ๋ฆฌ ์๋ ค์ ธ ์๊ณ RDBMS ๋ด๋ถ์ ์์ผ๋ฉฐ "์ง์ค"์ ์ ์ผํ ์์ค์ด๋ฉฐ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ์ฌ๊ธฐ์์ ํ์๋ ๋ณต์ฌ๋ณธ์ ํ๋ํด์ผ ํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ์ฝ๋ ์์ฑ๊ธฐ๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
์ถ์ฒ : habr.com