Skip to content

code-hyun/study_jpa

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

4 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์ฝ”๋ฆฌ์•„ IT ์•„์นด๋ฐ๋ฏธ ๊ตญ๋น„๊ณผ์ •

JPA

ORM(Object Relational Mapping)

๊ฐ์ฒด ์ง„์˜๊ณผ RDB ์ง„์˜์„ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ ๊ตฌ์กฐ์˜ ๋ถˆ์ผ์น˜๋ฅผ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์˜ ์ด์นญ์ด๋‹ค.
๊ฐ์ฒด ์ง€ํ–ฅ ๊ตฌ์กฐ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RDB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
ORM์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ SQL๋ฌธ์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ RDB์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

JPA(Java Persistence API)

ORM์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„(ํ‹€)์ด๋‹ค.
Java Application์šฉ RDB ๋งคํ•‘ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ, DBMS ๋ฒค๋”์‚ฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ
ORM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ORM ํ‘œ์ค€์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์€ ํ‹€๋งŒ ์ œ๊ณตํ•˜๋ฉฐ,
์ž์ฒด์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. JPA์— ์„ค๊ณ„๋œ ๊ตฌ์กฐ์— ๋งž์ถฐ์„œ ๊ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ 
์ง์ ‘ ORM์„ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. JPA๋Š” ORM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ORM ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ฉฐ, ๊ตฌํ˜„๋˜์ง€ ์•Š์€
JPA๋ฅผ ORM์ด๋ผ๊ณ  ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

Hibernate Framework

๋ชจ๋“  Java Application์— ๋Œ€ํ•ด ๊ฐ์ฒด ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ฑ„ ์ฟผ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค์˜ ๊ฒฝ๋Ÿ‰ ORM์ด๋‹ค.
JPA๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์ด๋ฉฐ, ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค.
๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„ ๊ตฌ์„ฑ์„ ์ง€์›ํ•˜๋ฉฐ, ์ƒ์†, ์ง€์—ฐ์„ฑ, ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ถˆํ•„์š”๋ฅผ ์ง€์›ํ•œ๋‹ค.

Spring Data JPA

JPA๋ฅผ ์ถ”์ƒํ™”ํ•œ Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ JPA๋ฅผ ์“ฐ๊ธฐ ํŽธํ•˜๊ฒŒ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— JPA๋ฅผ ๋ชจ๋ฅด๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด

1. ์ƒ์†
โ–ถ RDB์˜ ์ƒ์†
[๊ฐœ๋ฐœ์ž]      [๊ธฐํš์ž]

 ๋ฒˆํ˜ธ      	๋ฒˆํ˜ธ
 -----------   -----------
 ์ด๋ฆ„      	์ด๋ฆ„
 ์ƒ๋…„์›”์ผ      	์ƒ๋…„์›”์ผ
 ๊ฒฝ๋ ฅ      	๊ฒฝ๋ ฅ
 ๊ธฐ์ˆ ๋“ฑ๊ธ‰      	OA๋“ฑ๊ธ‰
 ํ”„๋กœ์ ํŠธ ์ˆ˜   	ํด๋ผ์ด์–ธํŠธ ์ˆ˜

๋˜๋Š”

 [์‚ฌ์›]

 ๋ฒˆํ˜ธ
 -----------
 ์ด๋ฆ„
 ์ƒ๋…„์›”์ผ
 ๊ฒฝ๋ ฅ
 ๊ธฐ์ˆ ๋“ฑ๊ธ‰
 OA๋“ฑ๊ธ‰
 ํ”„๋กœ์ ํŠธ ์ˆ˜
 ํด๋ผ์ด์–ธํŠธ ์ˆ˜

๋˜๋Š”

 [์‚ฌ์›] - ์Šˆํผ

 ๋ฒˆํ˜ธ(PK)
 -----------   
 ์ด๋ฆ„
 ์ƒ๋…„์›”์ผ
 ๊ฒฝ๋ ฅ

 [๊ฐœ๋ฐœ์ž] - ์„œ๋ธŒ   [๊ธฐํš์ž] - ์„œ๋ธŒ

 ๋ฒˆํ˜ธ(PK, FK)   ๋ฒˆํ˜ธ(PK, FK)
 -----------   -----------
 ๊ธฐ์ˆ ๋“ฑ๊ธ‰      OA๋“ฑ๊ธ‰
 ํ”„๋กœ์ ํŠธ ์ˆ˜   ํด๋ผ์ด์–ธํŠธ ์ˆ˜

 1:1 ๊ด€๊ณ„์—์„œ INSERT๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์ƒ๊ธด๋‹ค.
 ๊ฒŒ๋‹ค๊ฐ€ SELECT๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JOIN์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ฟผ๋ฆฌ๊ฐ€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•ด์ง„๋‹ค.
 ๋งŒ์•ฝ์— ์ด๋Ÿฐ RDB์˜ ํ…Œ์ด๋ธ” ๊ด€๊ณ„๋ฅผ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋ฉด,

โ–ถ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ

 Developer developer = list.get(developerId);
 ์œ„์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
2. ์—ฐ๊ด€๊ด€๊ณ„
โ–ถ ๊ฐ์ฒด ์—ฐ๊ด€ ๊ด€๊ณ„: ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ„๋‹ค(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();

 ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
3. ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
โ”Œโ”€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();
...

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๋‹ค.
4. ๊ฐ’ ๋น„๊ต
SQL ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ ๋’ค ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด์— ๋‹ด์œผ๋ฉด ๋งค๋ฒˆ new๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—
๋™์ผํ•œ ์กฐํšŒ ๊ฒฐ๊ณผ์˜ ๊ฐ์ฒด์ผ์ง€๋ผ๋„ ์ฃผ์†Œ๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค.

โ–ถ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ
ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ์ฒด ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด 
list.get(memberId) == list.get(memberId);
5. ๊ฒฐ๋ก 
์ฆ‰, ๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜๋ก ์ž‘์—…์ด ์˜คํžˆ๋ ค ๋ณต์žกํ•ด์ง€๊ณ  ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— RDB ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค.
RDB๋ฅผ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๋“ฏ ์‚ฌ์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ํŽธํ•ด์ง€๊ณ  ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”๋ฐ,
๋ฐ”๋กœ ์ด ๊ธฐ์ˆ ์„ JPA๋ผ๊ณ  ํ•œ๋‹ค.

JPA๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

1. SQL ์ค‘์‹ฌ ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ

2. ์ƒ์‚ฐ์„ฑ
  ์ €์žฅ: jpa.persist(market);
  ์กฐํšŒ: jpa.find(marketId);
  ์ˆ˜์ •: market.setMarketName("์ด๋งˆํŠธ");
  ์‚ญ์ก”: jpa.remove(market);

3. ์œ ์ง€๋ณด์ˆ˜
  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์š”์ฒญํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ•„๋“œ ์ถ”๊ฐ€ ์‹œ
  ํด๋ž˜์Šค ์•ˆ์— ํ•„๋“œ๋งŒ ํ•œ ๊ฐœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋. SQL๋ฌธ์„ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์Œ.

4. ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ

JPA์™€ ์ƒ์†

Employee	Developer extends Employee

employeeId	developerId
employeeName	developerLevel
  developerProjectCount


- INSERT

โ–ท ๊ฐœ๋ฐœ์ž
  jpa.persist(developer);

โ–ท JPA
  INSERT ๋‘ ๋ฒˆ ํ•ด์คŒ.

์ž์‹ ํ•„๋“œ์— ๋ถ€๋ชจ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹ ๊ฐ์ฒด์— ์ฑ„์šฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ.

- SELECT

โ–ท ๊ฐœ๋ฐœ์ž
  jpa.findById(Developer.class, developerId);

โ–ท JPA
  ๋ถ€๋ชจ ํ…Œ์ด๋ธ”๊ณผ JOINํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด

JPA์™€ ์—ฐ๊ด€๊ด€๊ณ„

Flower	โ†’	Pot

id		id
name		shape
Pot pot	color

flower.setPot(pot);
jpa.persist(flower);

jpa.findById(Flower.class, flowerId);

JPA์™€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

 โ”Œโ”€Marketโ”€โ”
 โ”‚        โ”‚
Clientโ”€โ”€Order	Flowerโ”€โ”€Pot
 โ”‚
 Delivery  


Flower flower = jpa.findById(Flower.class, flowerId);
Pot pot = flower.getPot();
market.getOrder().getClient();

โ€ป SELECT ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— NPE ์ฒดํฌ๋Š” ๋ฐ˜๋“œ์‹œ ํ•ด์•ผํ•œ๋‹ค.

JPA์™€ ๊ฐ’ ๋น„๊ต

Market market1 = jpa.findById(Market.class, marketId);
Market market2 = jpa.findById(Market.class, marketId);

market1 == market2;

๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฌด์กฐ๊ฑด ๊ฐ™๋‹ค.

JPQL

๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด
์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
SQL์€ SQL๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
ํ‚ค์›Œ๋“œ๋Š” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์ด ์—†๋‹ค.
๋ณ„์นญ(as) ํ•„์ˆ˜
typedQuery: ๋ฆฌํ„ด ํƒ€์ž…์„ ์ •ํ™•ํžˆ ์•Œ๋•Œ
Query: ๋ฆฌํ„ด ํƒ€์ž…์ด ์ •ํ™•ํ•˜์ง€ ์•Š์„๋•Œ

JPQL์„ ์‚ฌ์šฉํ•˜๋Š” QueryDSL์€ ๋ฌด์กฐ๊ฑด ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ ์บ์‹œ์— INSERT ํ•œ๋‹ค.
๋งŒ์•ฝ ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ 1์ฐจ ์บ์‹œ์— ์กด์žฌํ•˜๋ฉด, ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„๋ฆฐ๋‹ค.

Entity์˜ 4๊ฐ€์ง€ ์ƒํƒœ

์˜์† ์ƒํƒœ : 1์ฐจ ์บ์‹œ์— ๋“ฑ๋ก๋œ ์ƒํƒœ
์ค€์˜์† ์ƒํƒœ : detached instance์ด๋ฉฐ. detached()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 1์ฐจ ์บ์‹œ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ
๋น„์˜์† ์ƒํƒœ : 1์ฐจ ์บ์‹œ์— ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์ƒํƒœ
์‚ญ์ œ ์ƒํƒœ: remove()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 1์ฐจ ์บ์‹œ๋กœ๋ถ€ํ„ฐ ์‚ญ์ œ๋œ ์ƒํƒœ
์˜์† ์ƒํƒœ์ธ ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ์—๋งŒ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

table ์ „๋žต

1.SINGLE_TABLE ์ „๋žต
๋‹จ์ผ ํ…Œ์ด๋ธ” ์ „๋žต
๋ชจ๋“  ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋ชจ์•„์„œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ์ƒ์„ฑํ•˜๋ฉฐ, 
๊ตฌ๋ถ„ ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ์ •๋ณด๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ „๋žต
๋ถ€๋ชจ ํ…Œ์ด๋ธ” extends ํ•ด์ฃผ๊ธฐ
์กฐ์ธ์„ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ์กฐํšŒ ๊ฐ€๋Šฅ.
์ฟผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋Š” @NotNull์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๋งŽ์•„์งˆ ์ˆ˜๋ก ์กฐํšŒ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
2.TABLE_PER_CLASS ์ „๋žต
์—”ํ‹ฐํ‹ฐ ๋‹น ํ•œ๊ฐœ ํ…Œ์ด๋ธ” ์ „๋žต
๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋งˆ๋‹ค ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ „๋žต, ์‹ค๋ฌด์—์„œ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋Š” @NotNull ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ž์‹ ํ…Œ์ด๋ธ”๋ผ๋ฆฌ JOIN์‹œ ๊ฒน์น˜๋Š” ์ปฌ๋Ÿผ์œผ๋กœ ์ธํ•ด ์กฐํšŒ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ณ  ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.

๋ถ€๋ชจ ํด๋ž˜์Šค์— abstract๋ฅผ ๋ถ™์ด๋ฉด ๋ถ€๋ชจ๋ฅผ ๋‹จ๋…์œผ๋กœ ์“ฐ์ง€ ์•Š๊ณ  ์ž์‹ ํ…Œ์ด๋ธ” 2๊ฐœ ์ƒ์„ฑ
3.joined ์ „๋žต
1.  ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ PK๋ฅผ ์Šˆํผํ‚ค๋กœ ์„ค์ •ํ•˜๊ณ , ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ PK๋ฅผ ์„œ๋ธŒํ‚ค๋กœ ์„ค์ •ํ•˜๋Š” ์ „๋žต
2.  ์ •๊ทœํ™” ๋ฐฉ์‹
3.  ์กฐํšŒ ์‹œ JOIN์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
4.  ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ํ•„์š”
5.  INSERT ์ž‘์„ฑ ์‹œ ์ฟผ๋ฆฌ 2๋ฒˆ ์‹คํ–‰
์„ฑ๋Šฅ ์ข‹์€์ˆœ
์ผ๋ฐ˜์ฟผ๋ฆฌ -> ํ•œ๋ฐฉ์ฟผ๋ฆฌ -> ์ฟผ๋ฆฌ ๋‘๋ฒˆ

fetch

์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, ์กฐํšŒ์‹œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ์ˆ ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
- EAGER
	๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„ ๊ฐ์ฒด๋ฅผ JOINํ•˜์—ฌ ํ•œ๋ฐฉ ์ฟผ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
- LAZY
	์ฒซ ๊ฐ์ฒด๋งŒ SELECT ํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.
 
๋ณต์žกํ•œ ์—ฐ๊ด€๊ด€๊ณ„ ์†์—์„œ EAGER๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ JOIN์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์‹ค๋ฌด์—์„œ๋Š” LAZY๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ,
ํ•œ๋ฐฉ ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ์—๋Š” JPQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ํ…Œ์ด๋ธ”๋ผ๋ฆฌ๋งŒ JOINํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

cascade(์˜์†์„ฑ ์ „์ด)

์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์ƒํƒœ๋กœ ์ „ํ™œ๋  ๋•Œ ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ๋„ ์˜์†์ƒํƒœ๋กœ ๊ฐ™์ด ์ „ํ™˜๋˜๊ณ ,
์‚ญ์ œ์ƒํƒœ๋กœ ์ „ํ™˜๋  ๋•Œ๋„ ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์‚ญ์ œ์ƒํƒœ๋กœ ์ „ํ™˜๋œ๋‹ค.
์ฆ‰, ์—ฐ๊ด€๊ด€๊ณ„ ๊ฐ์ฒด์—๋„ ์˜์† ์ƒํƒœ๋ฅผ ์ „์ดํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ ๋ชจ๋‘ ์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ cascade์— CascadeType.PERSIST๋ฅผ ์„ค์ •ํ•˜๋ฉด,
์ž๋™์œผ๋กœ ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—
์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†๋‹ค. 
boardDAO.save(reply1);
boardDAO.save(reply2);

์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์˜์†์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด,
ํ˜„์žฌ 1์ฐจ ์บ์‹œ์—๋Š” ์—”ํ‹ฐํ‹ฐ ๋ฐ ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ ๋ชจ๋‘ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

1:1 ๊ด€๊ณ„์—์„œ๋Š” ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜์‹œ N์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
CascadeType.Remove๋Š” ๋กœ์ง์— ๋”ฐ๋ผ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ,
์ž˜๋ชป ์„ค์ • ์‹œ ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ ํ›„ ๊ธฐ์กด ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์‚ญ์ œํ•˜๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๋ฐ˜๋ ค๋™๋ฌผ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ฃผ์ธ ์ •๋ณด๋„ ์‚ญ์ œ๋œ๋‹ค.

Hibernate์˜ ์“ฐ๊ธฐ์ง€์—ฐ์ €์žฅ์†Œ ์ฟผ๋ฆฌ ์‹คํ–‰ ์ˆœ์„œ

-find, updqte, insert, remove ์ˆœ์„œ๋กœ ์‹คํ–‰๋œ๋‹ค.
-find๋ฅผ ํ•˜๊ธฐ ์ „์— ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, flush ํ›„ find๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

FK

insert ์‹คํ–‰ ์‹œ, @JoinColum์œผ๋กœ ์„ค์ •๋œ ๊ฐ์ฒด๋กœ๋งŒ FK๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
@joinColum์ด ์„ค์ •๋˜์ง€ ์•Š์€ ์—ฐ๊ด€๊ฐ์ฒด๋กœ๋Š” FK๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.

๋‹จ๋ฐฉํ–ฅ

INSERT ์‹คํ–‰ ์‹œ, @JoinColumn์œผ๋กœ ์„ค์ •๋œ ๊ฐ์ฒด๋กœ๋งŒ FK๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
//        @JoinColumn์ด ์„ค์ •๋˜์ง€ ์•Š์€ ์—ฐ๊ด€๊ฐ์ฒด๋กœ๋Š” FK๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.

์–‘๋ฐฉํ–ฅ

๊ด€๊ณ„์—์„œ๋Š” @JoinColumn์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ mappedBy๋กœ FK๋ฅผ ์„ค์ •ํ•œ๋‹ค.
mappedBy๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋ชจ๋“  ํ…Œ์ด๋ธ”์— FK๊ฐ€ ์ƒ๊ธด๋‹ค.
RDB์—์„œ ์„ค๊ณ„ํ•  ๋•Œ N ์ชฝ์— FK๋ฅผ ๋‘๊ธฐ ๋•Œ๋ฌธ์—
FK๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

mappedBy

๋‹จ๋ฐฉํ–ฅ 2๊ฐœ๋กœ ์–‘๋ฐฉํ–ฅ์„ ์„ค๊ณ„ํ–ˆ์„ ๊ฒฝ์šฐ ์„œ๋กœ FK๋ฅผ ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, ์„œ๋กœ ์ˆ˜์ •์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์–‘์ชฝ ๋ชจ๋‘์˜ fk๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(์ผ๊ด€์„ฑ) ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋ฌด๊ฒฐ์„ฑ์— ์œ„๋ฐ˜๋  ์ˆ˜๋„ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ, mappedBy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ N ์ชฝ์˜ FK๋ฅผ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
mappedBy์— ์ž‘์„ฑํ•œ ํ•„๋“œ๋ช…์€ RDB ์ง„์˜์—์„œ "_id"๋ฅผ ๋ถ™์—ฌ FK์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 

๋ฌธ์ œ ๋ฐœ์ƒ
mappedBy๋ฅผ question์œผ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—,
question_id๋Š” Question์—”ํ‹ฐํ‹ฐ์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ Answer ์—”ํ‹ฐํ‹ฐ์— question_id๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด,
answer์— question์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

ํŽธ์˜๋ฉ”์†Œ๋“œ

์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹Œ ๋ฐ˜๋Œ€ํŽธ ์—”ํ‹ฐํ‹ฐ๋กœ FK๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•  ๋•Œ
NULL๊ฐ’์„ ๊ธฐ์กด FK๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ์‚ฌ์šฉํ•œ๋‹ค.

orphanRemoval = true

์ปฌ๋ ‰์…˜์œผ๋กœ ์‚ญ์ œ๋œ ๊ฐ์ฒด๋“ค๊นŒ์ง€ ์ „๋ถ€ ๊ฐ์ง€ํ•˜๋„๋ก ์„ค์ •

JpaRepository<Type, Id>

Type: ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„
Id: PK ์ž๋ฃŒํ˜•

Spring Data JPA

JpaRepository๋ฅผ ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์— ์ง์ ‘ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“  ํ›„ ์ฃผ์ž…ํ•ด์ค€๋‹ค.

@NoArgsConstructor(access = AccessLevel.PROTECTED)

์™ธ๋ถ€์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰์Œ๊ณผ ๋™์‹œ์—, Spring์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก PORTECTED๋กœ ์„ค์ •ํ•œ๋‹ค.

@Builder

๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋งŒ๋“  ํ›„ 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์ ˆ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

DTO(QueryProjection)

- ์ง‘๊ณ„ํ•จ์ˆ˜ ์‚ฌ์šฉ
- ํ™”๋ฉด์œผ๋กœ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ
1. ๋‘ ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ์ผ ๊ฒฝ์šฐ(fetchJoin, QueryProjection์ด ํ•„์š” ์—†์Œ)
2. ์„ธ ๊ฐœ ์ด์ƒ์˜ ์—”ํ‹ฐํ‹ฐ์ผ ๊ฒฝ์šฐ(join์ด ๊ฐ€๋Šฅํ•˜๋ฉด QueryProjection์‚ฌ์šฉ)

์„ธ์…˜

JWT -> ์„ธ์…˜์ €์žฅ ์•ˆํ•˜๋Š” ๋ฐฉ์‹ ํ† ํฐ
security

์Šคํ”„๋ง ์„ธ์…˜ ๋ฌธ์ œ์ 

์„œ๋ฒ„ ์ฆ์„ค์‹œ ์„ธ์…˜ ์ •๋ณด ๊ณต์œ  ๋ถˆ๊ฐ€๋Šฅ

rest๋กœ ์„ค๊ณ„ํ•˜๋Š” ์ด์œ 

	ํƒ€์–ธ์–ด, ํƒ€์„œ๋ฒ„์™€ ์„ธ์…˜์ด ์—ฐ๊ฒฐ์ด ๋˜์•ผ๋จ

L4 switch

๋™์ผํ•œ ip๋กœ ์—ฐ๊ฒฐํ•ด๋„ ๋ถ„๋ฐฐ๊ธฐ ์—ญํ• 
ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ๊ตฌ์ถ• (ํด๋Ÿฌ์Šคํ„ฐ๋ง)

Redis

no sql, no schema
key, value
์†๋„ ๋น ๋ฆ„

Spring Security

์Šคํ”„๋ง ๊ธฐ๋ฐ˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ์„ ์œ„ํ•ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

Spring Security ํ๋ฆ„

(back to top)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages