๊ฐ์ฒด ์ง์๊ณผ RDB ์ง์์ ์๋์ผ๋ก ๋งคํํ์ฌ ๊ตฌ์กฐ์ ๋ถ์ผ์น๋ฅผ ๊ฐ๋ฐ์ ๋์ ํด๊ฒฐํด์ฃผ๋ ๊ธฐ์ ์ ์ด์นญ์ด๋ค.
๊ฐ์ฒด ์งํฅ ๊ตฌ์กฐ์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ RDB์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ORM์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ SQL๋ฌธ์ ์ง์ ์์ฑํ์ง ์์๋ RDB์ ์ํธ ์์ฉํ ์ ์๋ค.
ORM์ ์ฌ์ฉํ๊ธฐ ์ํ ์ค๊ณ๋(ํ)์ด๋ค.
Java Application์ฉ RDB ๋งคํ ๊ด๋ฆฌ๋ฅผ ์ํ ์ธํฐํ์ด์ค์ด๋ฉฐ, DBMS ๋ฒค๋์ฌ์ ์์กดํ์ง ์๊ณ ๋
๋ฆฝ์ ์ผ๋ก
ORM์ ์ฌ์ฉํ ์ ์๋ ORM ํ์ค์ด๋ค. ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ๋์ด ์์ง ์์ ํ๋ง ์ ๊ณตํ๋ฉฐ,
์์ฒด์ ์ธ ์์
์ ์ํํ์ง ์๋๋ค. JPA์ ์ค๊ณ๋ ๊ตฌ์กฐ์ ๋ง์ถฐ์ ๊ฐ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ
์ง์ ORM์ ๊ตฌํํ์ฌ ์ฌ์ฉํ๋ค. JPA๋ ORM์ ์ฌ์ฉํ ์ ์๋ ORM ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ, ๊ตฌํ๋์ง ์์
JPA๋ฅผ ORM์ด๋ผ๊ณ ๋งํ๊ธฐ๋ ์ด๋ ต๋ค.
๋ชจ๋ Java Application์ ๋ํด ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ์ ์งํ ์ฑ ์ฟผ๋ฆฌ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์คํ ์์ค์ ๊ฒฝ๋ ORM์ด๋ค.
JPA๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด์ด๋ฉฐ, ์ฌ๋ฌ ๊ตฌํ์ฒด ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๊ตฌํ์ฒด์ด๋ค.
๊ฐ์ฒด ๊ฐ ๊ด๊ณ ๊ตฌ์ฑ์ ์ง์ํ๋ฉฐ, ์์, ์ง์ฐ์ฑ, ํ์ด์ง ์ฒ๋ฆฌ, ์์ธ ์ฒ๋ฆฌ ๋ถํ์๋ฅผ ์ง์ํ๋ค.
JPA๋ฅผ ์ถ์ํํ Repository ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ JPA๋ฅผ ์ฐ๊ธฐ ํธํ๊ฒ ๋ค์ํ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
๋ด๋ถ์ ์ผ๋ก๋ JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ JPA๋ฅผ ๋ชจ๋ฅด๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ํ๋ค ์ ์๋ค.
โถ RDB์ ์์
[๊ฐ๋ฐ์] [๊ธฐํ์]
๋ฒํธ ๋ฒํธ
----------- -----------
์ด๋ฆ ์ด๋ฆ
์๋
์์ผ ์๋
์์ผ
๊ฒฝ๋ ฅ ๊ฒฝ๋ ฅ
๊ธฐ์ ๋ฑ๊ธ OA๋ฑ๊ธ
ํ๋ก์ ํธ ์ ํด๋ผ์ด์ธํธ ์
๋๋
[์ฌ์]
๋ฒํธ
-----------
์ด๋ฆ
์๋
์์ผ
๊ฒฝ๋ ฅ
๊ธฐ์ ๋ฑ๊ธ
OA๋ฑ๊ธ
ํ๋ก์ ํธ ์
ํด๋ผ์ด์ธํธ ์
๋๋
[์ฌ์] - ์ํผ
๋ฒํธ(PK)
-----------
์ด๋ฆ
์๋
์์ผ
๊ฒฝ๋ ฅ
[๊ฐ๋ฐ์] - ์๋ธ [๊ธฐํ์] - ์๋ธ
๋ฒํธ(PK, FK) ๋ฒํธ(PK, FK)
----------- -----------
๊ธฐ์ ๋ฑ๊ธ OA๋ฑ๊ธ
ํ๋ก์ ํธ ์ ํด๋ผ์ด์ธํธ ์
1:1 ๊ด๊ณ์์ INSERT๋ฅผ ํ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒ ์์ฑํด์ผํ๋ ๋ถํธํจ์ด ์๊ธด๋ค.
๊ฒ๋ค๊ฐ SELECT๋ฅผ ํ๊ธฐ ์ํด์๋ JOIN์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ฟผ๋ฆฌ๊ฐ ๊ต์ฅํ ๋ณต์กํด์ง๋ค.
๋ง์ฝ์ ์ด๋ฐ RDB์ ํ
์ด๋ธ ๊ด๊ณ๋ฅผ ์๋ฐ ์ปฌ๋ ์
์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค๋ฉด,
โถ ์ปฌ๋ ์
์ฌ์ฉ
Developer developer = list.get(developerId);
์์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์กฐํํ ์ ์๋ค.
โถ ๊ฐ์ฒด ์ฐ๊ด ๊ด๊ณ: ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ๋ค(Flower์์ Pot์ ๊ทผ์ ๊ฐ๋ฅ, Pot์์ Flower์ ๊ทผ ๋ถ๊ฐ๋ฅ)
Flower โ Pot
id id
name shape
Pot pot color
โถ RDB ์ฐ๊ด ๊ด๊ณ: ์๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ๋ค(FLOWER์์ POT์, POT์์ FLOWER๋ฅผ ์ ๊ทผํ ์ ์๋ค)
FLOWER โ POT
ID(PK) ID(PK)
-------- --------
NAME SHAPE
POT_ID(FK) COLOR
โถ RDB ์ค์ฌ ์ค๊ณ
class Flower{
Long id;
String name;
String potId; //FK๋ RDB๋ฐฉ์์์์ ์ฐ๊ด๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ผ ํจ.
}
RDB ๋ฐฉ์์ผ๋ก ์ค๊ณํ๋ฉด, ์กฐํ ์ JOIN์ ํ์ฌ FLOWERํ
์ด๋ธ๊ณผ POTํ
์ด๋ธ์์ ๊ฐ๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์
๊ฐ ๊ฐ์ฒด์ ๋ด์์ฃผ๊ฑฐ๋ DTO์ ๋ด์์ฃผ์ด์ผ ํ๋ค.
โถ ๊ฐ์ฒด ์ค์ฌ ์ค๊ณ
class Flower{
Long id;
String name;
Pot pot; // ์ฐธ์กฐ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ก ํจ.
}
flower.setPot(pot)ํํ์ ๊ฐ์ด ๋ณต์กํ๊ฒ ์์
ํด์ผ ํ๋ค.
โถ ์ปฌ๋ ์
์ฌ์ฉ
ํ์ง๋ง ๋ง์ฝ ์๋ฐ ์ปฌ๋ ์
์ผ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด,
list.add(๊ฝ);
Flower flower = list.get(flowerId);
Pot pot = flower.getPot();
ํจ์ฌ ํธํ๊ฒ ์์
์ด ๊ฐ๋ฅํ๋ค.
โโMarketโโ
โ โ
ClientโโOrder FlowerโโPot
โ
Delivery
๊ฐ์ฒด๋ ๋ชจ๋ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์์ด์ผ ํ๋ค.
ํ์ง๋ง SQL ์์ฑ ์ ์ด๋ฏธ ํ์ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๋ค.
๋ง์ฝ Market๊ณผ Flower๋ฅผ JOINํด์ ์กฐํ๋ฅผ ํ๋ค๋ฉด,
market.getFlower()๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง
market.getPot()๋ null์ผ ์ ๋ฐ์ ์๋ค.
๋ฐ๋ผ์ ์ํฐํฐ์ ๋ํ ์ ๋ขฐ๊ฐ ๋ฌด๋์ง ์ ๋ฐ์ ์๋ค.
Market market = marketDAO.findById(marketId);
market.getFlower(); // null์ด ์๋๋ผ๊ณ ํ์ ํ ์ ์๋ค.
market.getOrder().getClient(); // null์ด ์๋๋ผ๊ณ ํ์ ํ ์ ์๋ค.
marketDAO์ ์๋ findById()๋ฅผ ๋ถ์ํ์ง ์๋ ์ด์ ๊ฐ ์ํฐํฐ์ ๋ํด ์ ๋ขฐํ ์ ์๋ค.
๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ ์กฐํ์ ๋ํ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ธํด๋์์ผ ํ๋ค.
marketDAO.getFlower();
marketDAO.getOrderWithClient();
marketDAO.getOrderWithClientWithDelivery();
...
ํ์ง๋ง ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ค์ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น๋ค.
SQL ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ค ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ฒด์ ๋ด์ผ๋ฉด ๋งค๋ฒ new๊ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์
๋์ผํ ์กฐํ ๊ฒฐ๊ณผ์ ๊ฐ์ฒด์ผ์ง๋ผ๋ ์ฃผ์๊ฐ ๋ชจ๋ ๋ค๋ฅด๋ค.
โถ ์ปฌ๋ ์
์ฌ์ฉ
ํ์ง๋ง ๋ง์ฝ ์๋ฐ ์ปฌ๋ ์
์์ ๊ฐ์ฒด ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด
list.get(memberId) == list.get(memberId);
์ฆ, ๊ฐ์ฒด์งํฅ์ผ๋ก ์ค๊ณํ ์๋ก ์์
์ด ์คํ๋ ค ๋ณต์กํด์ง๊ณ ๋์ด๋๊ธฐ ๋๋ฌธ์ RDB ์ค์ฌ์ผ๋ก ์ค๊ณํ ์๋ฐ์ ์๋ค.
RDB๋ฅผ ์๋ฐ ์ปฌ๋ ์
์ ์ ์ฅํ๋ฏ ์ฌ์ฉํ๋ฉด ๊ต์ฅํ ํธํด์ง๊ณ ๋ง์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋๋ฐ,
๋ฐ๋ก ์ด ๊ธฐ์ ์ JPA๋ผ๊ณ ํ๋ค.
1. SQL ์ค์ฌ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
2. ์์ฐ์ฑ
์ ์ฅ: jpa.persist(market);
์กฐํ: jpa.find(marketId);
์์ : market.setMarketName("์ด๋งํธ");
์ญ์ก: jpa.remove(market);
3. ์ ์ง๋ณด์
ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด ํ๋๋ฅผ ์์ฒญํ์ฌ ์๋ก์ด ํ๋ ์ถ๊ฐ ์
ํด๋์ค ์์ ํ๋๋ง ํ ๊ฐ ์ถ๊ฐํ๋ฉด ๋. SQL๋ฌธ์ ์์ ํ ํ์ ์์.
4. ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ
Employee Developer extends Employee
employeeId developerId
employeeName developerLevel
developerProjectCount
- INSERT
โท ๊ฐ๋ฐ์
jpa.persist(developer);
โท JPA
INSERT ๋ ๋ฒ ํด์ค.
์์ ํ๋์ ๋ถ๋ชจ ํ๋๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ ๊ฐ์ฒด์ ์ฑ์ฐ๊ธฐ๋ง ํ๋ฉด ๋จ.
- SELECT
โท ๊ฐ๋ฐ์
jpa.findById(Developer.class, developerId);
โท JPA
๋ถ๋ชจ ํ
์ด๋ธ๊ณผ JOINํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
Flower โ Pot
id id
name shape
Pot pot color
flower.setPot(pot);
jpa.persist(flower);
jpa.findById(Flower.class, flowerId);
โโMarketโโ
โ โ
ClientโโOrder FlowerโโPot
โ
Delivery
Flower flower = jpa.findById(Flower.class, flowerId);
Pot pot = flower.getPot();
market.getOrder().getClient();
โป SELECT ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ NPE ์ฒดํฌ๋ ๋ฐ๋์ ํด์ผํ๋ค.
Market market1 = jpa.findById(Market.class, marketId);
Market market2 = jpa.findById(Market.class, marketId);
market1 == market2;
๋์ผํ ํธ๋์ญ์
์์ ์กฐํํ ์ํฐํฐ๋ ๋ฌด์กฐ๊ฑด ๊ฐ๋ค.
๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด
์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํ๋ค.
SQL์ SQL๋ก ๋ณํ๋๋ค.
ํค์๋๋ ๋์๋ฌธ์ ๊ตฌ๋ถ์ด ์๋ค.
๋ณ์นญ(as) ํ์
typedQuery: ๋ฆฌํด ํ์
์ ์ ํํ ์๋
Query: ๋ฆฌํด ํ์
์ด ์ ํํ์ง ์์๋
JPQL์ ์ฌ์ฉํ๋ QueryDSL์ ๋ฌด์กฐ๊ฑด ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ค.
๊ฐ์ ธ์จ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ ์บ์์ INSERT ํ๋ค.
๋ง์ฝ ๋์ผํ ๊ฐ์ฒด๊ฐ 1์ฐจ ์บ์์ ์กด์ฌํ๋ฉด, ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ๋ฆฐ๋ค.
์์ ์ํ : 1์ฐจ ์บ์์ ๋ฑ๋ก๋ ์ํ
์ค์์ ์ํ : detached instance์ด๋ฉฐ. detached()๋ฅผ ์ฌ์ฉํ์ฌ 1์ฐจ ์บ์๋ก๋ถํฐ ๋ถ๋ฆฌ๋ ์ํ
๋น์์ ์ํ : 1์ฐจ ์บ์์ ๋ฑ๋ก๋์ง ์์ ์ํ
์ญ์ ์ํ: remove()๋ฅผ ์ฌ์ฉํ์ฌ 1์ฐจ ์บ์๋ก๋ถํฐ ์ญ์ ๋ ์ํ
์์ ์ํ์ธ ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ์๋ง ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค.
๋จ์ผ ํ
์ด๋ธ ์ ๋ต
๋ชจ๋ ์์ ๊ฐ์ฒด๋ฅผ ๋ชจ์์ ํ๋์ ํ
์ด๋ธ๋ก ์์ฑํ๋ฉฐ,
๊ตฌ๋ถ ์ปฌ๋ผ์ ์ถ๊ฐํ์ฌ ๊ฐ ์ ๋ณด๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก ํ๋ ์ ๋ต
๋ถ๋ชจ ํ
์ด๋ธ extends ํด์ฃผ๊ธฐ
์กฐ์ธ์ ์ฌ์ฉํ ํ์ ์์ด ์กฐํ ๊ฐ๋ฅ.
์ฟผ๋ฆฌ๋ฅผ ๋จ์ํ๊ฒ ์์ฑํ์ฌ ์กฐํํ ์ ์๋ค.
์์ ์ํฐํฐ์ ํ๋๋ @NotNull์ ์ฌ์ฉํ ์ ์๋ค.
ํ
์ด๋ธ์ ์ปฌ๋ผ์ด ๋ง์์ง ์๋ก ์กฐํ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค.
์ํฐํฐ ๋น ํ๊ฐ ํ
์ด๋ธ ์ ๋ต
๋ถ๋ชจ ์ํฐํฐ์ ์์ ์ํฐํฐ๋ง๋ค ํ
์ด๋ธ์ ์์ฑํ๋ ์ ๋ต, ์ค๋ฌด์์์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์๋๋ค.
์์ ์ํฐํฐ์ ํ๋๋ @NotNull ์ฌ์ฉํ ์ ์๋ค.
์์ ํ
์ด๋ธ๋ผ๋ฆฌ JOIN์ ๊ฒน์น๋ ์ปฌ๋ผ์ผ๋ก ์ธํด ์กฐํ ์ฑ๋ฅ์ด ๋จ์ด์ง๊ณ ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ค.
๋ถ๋ชจ ํด๋์ค์ abstract๋ฅผ ๋ถ์ด๋ฉด ๋ถ๋ชจ๋ฅผ ๋จ๋
์ผ๋ก ์ฐ์ง ์๊ณ ์์ ํ
์ด๋ธ 2๊ฐ ์์ฑ
1. ๋ถ๋ชจ ์ํฐํฐ PK๋ฅผ ์ํผํค๋ก ์ค์ ํ๊ณ , ์์ ์ํฐํฐ์ PK๋ฅผ ์๋ธํค๋ก ์ค์ ํ๋ ์ ๋ต
2. ์ ๊ทํ ๋ฐฉ์
3. ์กฐํ ์ JOIN์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค.
4. ๋ณต์กํ ์ฟผ๋ฆฌ ์์ฑ ํ์
5. INSERT ์์ฑ ์ ์ฟผ๋ฆฌ 2๋ฒ ์คํ
์ฑ๋ฅ ์ข์์
์ผ๋ฐ์ฟผ๋ฆฌ -> ํ๋ฐฉ์ฟผ๋ฆฌ -> ์ฟผ๋ฆฌ ๋๋ฒ
์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ ๊ฒฝ์ฐ, ์กฐํ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ ํ๋ ์ต์
์ด๋ค.
- EAGER
๋ชจ๋ ์ฐ๊ด๊ด๊ณ ๊ฐ์ฒด๋ฅผ JOINํ์ฌ ํ๋ฐฉ ์ฟผ๋ฆฌ๋ก ๊ฐ์ ธ์จ๋ค.
- LAZY
์ฒซ ๊ฐ์ฒด๋ง SELECT ํ๊ณ , ์ฐ๊ด๊ด๊ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ฟผ๋ฆฌ๊ฐ ๋ค์ ์คํ๋๋ค.
๋ณต์กํ ์ฐ๊ด๊ด๊ณ ์์์ EAGER๋ก ์ฌ์ฉํ๋ฉด ๋ถํ์ํ JOIN์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ค๋ฌด์์๋ LAZY๋ก ์ค์ ํด์ผ ํ๋ฉฐ,
ํ๋ฐฉ ์ฟผ๋ฆฌ๊ฐ ํ์ํ ๋์๋ JPQL์ ์ฌ์ฉํ์ฌ ์ ํํ ์ํ๋ ํ
์ด๋ธ๋ผ๋ฆฌ๋ง JOINํ์ฌ ์ฌ์ฉํ๋ค.
์ํฐํฐ๊ฐ ์์์ํ๋ก ์ ํ๋ ๋ ์ฐธ์กฐ ์ํฐํฐ๋ ์์์ํ๋ก ๊ฐ์ด ์ ํ๋๊ณ ,
์ญ์ ์ํ๋ก ์ ํ๋ ๋๋ ์ฐธ์กฐ ์ํฐํฐ๊น์ง ์ญ์ ์ํ๋ก ์ ํ๋๋ค.
์ฆ, ์ฐ๊ด๊ด๊ณ ๊ฐ์ฒด์๋ ์์ ์ํ๋ฅผ ์ ์ดํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ต์
์ด๋ค.
์ฐธ์กฐ ์ํฐํฐ ๋ชจ๋ ์์ ์ํ๋ก ์ ํํด์ผ ํ๋ค.
ํ์ง๋ง cascade์ CascadeType.PERSIST๋ฅผ ์ค์ ํ๋ฉด,
์๋์ผ๋ก ์ฐธ์กฐ ์ํฐํฐ๊น์ง ์์ ์ํ๋ก ์ ํ๋๊ธฐ ๋๋ฌธ์
์๋์ ์ฝ๋๋ฅผ ์์ฑํ ํ์ ์๋ค.
boardDAO.save(reply1);
boardDAO.save(reply2);
์ํฐํฐ๋ฅผ ์์์ํ๋ก ๋ณ๊ฒฝํ๊ณ ์ฐธ์กฐ ์ํฐํฐ๊น์ง ์์์ํ๋ก ๋ณ๊ฒฝ๋์๋ค๋ฉด,
ํ์ฌ 1์ฐจ ์บ์์๋ ์ํฐํฐ ๋ฐ ์ฐธ์กฐ ์ํฐํฐ ๋ชจ๋ ๋ฑ๋ก๋์ด ์๋ ์ํ์ด๋ค.
1:1 ๊ด๊ณ์์๋ ์ถํ ์ ์ง๋ณด์์ N์ด ๋ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํ๋ค.
CascadeType.Remove๋ ๋ก์ง์ ๋ฐ๋ผ ์ค์ ํด์ผ ํ๋ฉฐ,
์๋ชป ์ค์ ์ ์ฐธ์กฐ ์ํฐํฐ ์ญ์ ํ ๊ธฐ์กด ์ํฐํฐ๊น์ง ์ญ์ ํ๋ ์ด์๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ ค๋๋ฌผ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ฉด ์ฃผ์ธ ์ ๋ณด๋ ์ญ์ ๋๋ค.
-find, updqte, insert, remove ์์๋ก ์คํ๋๋ค.
-find๋ฅผ ํ๊ธฐ ์ ์ ๋์ ์ํฐํฐ ์ฟผ๋ฆฌ๊ฐ ์๋ค๋ฉด, flush ํ find๊ฐ ์งํ๋๋ค.
insert ์คํ ์, @JoinColum์ผ๋ก ์ค์ ๋ ๊ฐ์ฒด๋ก๋ง FK๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
@joinColum์ด ์ค์ ๋์ง ์์ ์ฐ๊ด๊ฐ์ฒด๋ก๋ FK๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
INSERT ์คํ ์, @JoinColumn์ผ๋ก ์ค์ ๋ ๊ฐ์ฒด๋ก๋ง FK๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
// @JoinColumn์ด ์ค์ ๋์ง ์์ ์ฐ๊ด๊ฐ์ฒด๋ก๋ FK๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
๊ด๊ณ์์๋ @JoinColumn์ ์ฌ์ฉํ์ง ์์๋ mappedBy๋ก FK๋ฅผ ์ค์ ํ๋ค.
mappedBy๋ฅผ ์๋ตํ๋ฉด ๋ชจ๋ ํ
์ด๋ธ์ FK๊ฐ ์๊ธด๋ค.
RDB์์ ์ค๊ณํ ๋ N ์ชฝ์ FK๋ฅผ ๋๊ธฐ ๋๋ฌธ์
FK๋ฅผ ํ๋๋ก ๊ฐ์ง๊ณ ์๋ ์ํฐํฐ๊ฐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋์ด์ผ ํ๋ค.
๋จ๋ฐฉํฅ 2๊ฐ๋ก ์๋ฐฉํฅ์ ์ค๊ณํ์ ๊ฒฝ์ฐ ์๋ก FK๋ฅผ ์์ ๋ฐ ์ถ๊ฐํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ, ์๋ก ์์ ์ ํ๊ฒ ๋๋ฉด ์์ชฝ ๋ชจ๋์ fk๋ฅผ ๋๊ธฐํํด์ผ ํ๊ธฐ ๋๋ฌธ์(์ผ๊ด์ฑ) ๋ฒ๊ฑฐ๋กญ๊ณ ๋ฌด๊ฒฐ์ฑ์ ์๋ฐ๋ ์๋ ์๋ค.
๋ฐ๋ผ์, mappedBy๋ฅผ ์ฌ์ฉํ์ฌ N ์ชฝ์ FK๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํด์ผ ํ๋ค.
mappedBy์ ์์ฑํ ํ๋๋ช
์ RDB ์ง์์์ "_id"๋ฅผ ๋ถ์ฌ FK์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ๋๋ค.
๋ฌธ์ ๋ฐ์
mappedBy๋ฅผ question์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์,
question_id๋ Question์ํฐํฐ์์ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ Answer ์ํฐํฐ์ question_id๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด,
answer์ question์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ ์ํฐํฐ๊ฐ ์๋ ๋ฐ๋ํธ ์ํฐํฐ๋ก FK๋ฅผ ์ถ๊ฐํ๊ณ ์ ํ ๋
NULL๊ฐ์ ๊ธฐ์กด FK๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ ์ฌ์ฉํ๋ค.
์ปฌ๋ ์
์ผ๋ก ์ญ์ ๋ ๊ฐ์ฒด๋ค๊น์ง ์ ๋ถ ๊ฐ์งํ๋๋ก ์ค์
Type: ์ํฐํฐ ์ด๋ฆ
Id: PK ์๋ฃํ
JpaRepository๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค์ ์ง์ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ ํ ์ฃผ์
ํด์ค๋ค.
์ธ๋ถ์์ ๊ฐ์ฒด ์์ฑ์ ๋ง์๊ณผ ๋์์, Spring์์๋ ์ฌ์ฉํ ์ ์๋๋ก PORTECTED๋ก ์ค์ ํ๋ค.
๊ธฐ๋ณธ ์์ฑ์ ๋ง๋ ํ setter ์ผ์ ๋ ๋นผ๋จน์ ๊ฐ์ด ์์ ์ ์์
์ด๊ธฐํ ์์ฑ์์ ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋ค์ด์์ผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค.
๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.
์ ๊ทํ๋, ํ ๊ฐ์ ํ
์ด๋ธ์์ ์ด์ํ์ ๋๋ ๋์ผํ ๋ฐ์ดํฐ ์ค๋ณต ๋ฐ์์ผ๋ก ์ธํด ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๋ ์์
์ ๋งํ๋ค.
์ ๊ทํ ํ์๋ ์กฐํ ์ JOIN์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
์ ๊ทํ๋, ํ ๊ฐ์ ํ
์ด๋ธ์์ ์ด์ํ์ ๋๋ ๋์ผํ ๋ฐ์ดํฐ ์ค๋ณต ๋ฐ์์ผ๋ก ์ธํด ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๋ ์์
์ ๋งํ๋ค.
์ ๊ทํ ํ์๋ ์กฐํ ์ JOIN์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
**
์ ๊ทํ: JOINED
๋ฐ์ ๊ทํ: SINGLE_COLUMN
ํจ์น ์กฐ์ธ ์, ํด๋น ํ
์ด๋ธ์ ํญ๋ชฉ๋ง ๋ค๋ฅธ ์ ์์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
pay, pay.order๋ฅผ ํจ์น ์กฐ์ธ์ผ๋ก ์งํ ์, pay๋ง select ์ ์์ ์ฌ์ฉํ ์ ์๋ค.(pay, order, pay.product X)
from ์ ์ pay๋ง ์์ฑํ๊ณ ๋ค๋ฅธ ์ ์์ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ํ ํ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋ค.
ํด๋น ๊ฐ์ฒด๋ฅผ select์ ์ ์์ฑํ ๋ค java์ชฝ์์ ์ํฐํฐ ๊ทธ๋ํ ํ์์ ์งํํ ๋
select(order).from(order).join(order.member).fecthJoin()
select์ ์ ์ํ๋ ์ฐ๊ด ์ํฐํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ DTO๋ฅผ ์์ฑํด์ผ ํ ๋
select(order.member).from(order)
๊ธฐ์ค
1 : N => select(a) ์ด๋ค ( select(a).~ join(). fetchJoin())
N : 1 => select(b.a)๋ฅผ ์ด๋ค ( select(b.a) ~ join())
1-> a
ํจ์น์กฐ์ธ์ ์ถ๊ฐ ์ ์ธ ์กฐ๊ฑด์ ์ on์ ์ด ์๋ where์ ์ ์์ฑํด์ผ ํ๋ค.
- ์ง๊ณํจ์ ์ฌ์ฉ
- ํ๋ฉด์ผ๋ก ์ฌ๋ฌ ์ํฐํฐ๋ฅผ ๋ณด๋ผ ๋
1. ๋ ๊ฐ์ ์ํฐํฐ์ผ ๊ฒฝ์ฐ(fetchJoin, QueryProjection์ด ํ์ ์์)
2. ์ธ ๊ฐ ์ด์์ ์ํฐํฐ์ผ ๊ฒฝ์ฐ(join์ด ๊ฐ๋ฅํ๋ฉด QueryProjection์ฌ์ฉ)
JWT -> ์ธ์
์ ์ฅ ์ํ๋ ๋ฐฉ์ ํ ํฐ
security
์๋ฒ ์ฆ์ค์ ์ธ์
์ ๋ณด ๊ณต์ ๋ถ๊ฐ๋ฅ
ํ์ธ์ด, ํ์๋ฒ์ ์ธ์
์ด ์ฐ๊ฒฐ์ด ๋์ผ๋จ
๋์ผํ ip๋ก ์ฐ๊ฒฐํด๋ ๋ถ๋ฐฐ๊ธฐ ์ญํ
ํด๋ผ์ฐ๋ ์ธํ๋ผ ๊ตฌ์ถ (ํด๋ฌ์คํฐ๋ง)
no sql, no schema
key, value
์๋ ๋น ๋ฆ
์คํ๋ง ๊ธฐ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์
์์ ๋ณด์์ ์ํด ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๋ฅผ ์ฌ์ฉํด ์ ๊ทผ์ ์ ์ดํ๋ ํ๋ ์์ํฌ