Server๐Ÿงค/JPA

[SpringDataJPA] save(), saveAll() ์ฐจ์ด

yujindonut 2023. 5. 14. 10:07
728x90

์ƒํ™ฉ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋„ฃ์–ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ฒผ๋‹ค.

History์— ์žˆ๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ํ™œ๋™์ •๋ณด์— ํ•ด๋‹น id๋ฅผ ๊ฐ€์ง„ ์œ ์ €์—๊ฒŒ ํ•œ๊บผ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž‘์—…์ด์˜€๋‹ค.

์ฒ˜์Œ์— ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋Š” forEach๋ฌธ์œผ๋กœ ๊ฐ๊ฐ save๋ฅผ ๋Œ๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค.

ํ•ด๋‹น ์ž‘์—…์˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋กœ save์™€ saveAll ์— ๋Œ€ํ•œ ๊ฒƒ์„ ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋‹ค.

์ด๋ฒˆ๊ธฐํšŒ์— ํ•ด๋‹น ์ฟผ๋ฆฌ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


์ฒ˜์Œ์— ์ž‘์„ฑํ•œ save() ๋ฉ”์†Œ๋“œ์ด๋‹ค.

memberHistories.forEach(memberHistory -> memberActivityRepository.save(
        memberActivityRepository.save(
                MemberActivity.builder()
                .memberId(member.getId())
                .part(memberHistory.getPart())
                .generation(memberHistory.getGeneration())
                .build()
        )
));

row 100๊ฐœ๋ฅผ Insert  297ms๊ฐ€ ๊ฑธ๋ ธ๋‹ค.

 

 

๋‘๋ฒˆ์งธ๋กœ ์ž‘์„ฑํ•œ saveAll() ๋ฉ”์†Œ๋“œ์ด๋‹ค.

val memberActivities = new ArrayList<MemberActivity>();
        memberHistories.forEach(memberHistory -> memberActivities.add(
                MemberActivity.builder()
                .memberId(member.getId())
                .part(memberHistory.getPart())
                .generation(memberHistory.getGeneration())
                .build()
        )
);
memberActivityRepository.saveAll(memberActivities);

row 100๊ฐœ๋ฅผ Insert  114ms๊ฐ€ ๊ฑธ๋ ธ๋‹ค. Batch insert๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค!

 

Batch insert ์—ฌ๋ถ€์˜ ์†๋„์ฐจ์ด๊ฐ€ ํ™•์—ฐํ•œ ์ฐจ์ด๊ฐ€ ๋ณด์ธ๋‹ค.

 


save() ๋ฉ”์†Œ๋“œ

ํ˜ธ์ถœ๋ ๋•Œ๋งˆ๋‹ค, new transaction์ด ์ƒ์„ฑ๋œ๋‹ค.

saveAll() ๋ฉ”์†Œ๋“œ

์˜ค์ง ํ•˜๋‚˜์˜ transaction์ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋‚˜์ค‘์— save()๋ ๋•Œ ์žฌ์‚ฌ์šฉ๋œ๋‹ค.

 


 

์•„๋ž˜ insert ์ฟผ๋ฆฌ ๋ฌธ์žฅ์ด ์ถœ๋ ฅ๋˜์–ด์„œ, ์ฟผ๋ฆฌ ๊ฐœ์ˆ˜๋Š” ๋˜‘๊ฐ™์ด ๋‚˜๊ฐ€๋Š”์ค„ ์•Œ์•„์„œ, ๋ฌด์Šจ ์ฐจ์ด์ง€?๋ผ๊ณ  ์ƒ๊ฐ์„ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค!

 

Hibernate๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฒŒํฌ insert๋Š” ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ multi value ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์•„์„œ ํ•œ๋ฒˆ์— ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค. (๊ทธ๋ž˜์„œ ์œ„์˜ ๋‘๊ฐœ์˜ ์ฟผ๋ฆฌ ๋ชจ๋‘ ๋˜‘๊ฐ™์€ ๊ฐœ์ˆ˜์˜ ์ฟผ๋ฆฌ ๋ฌธ์žฅ์ด ๋กœ๊ทธ์— ์ฐํžˆ์ง€๋งŒ, ๋ฒŒํฌ๋กœ ์ž…๋ ฅ๋˜๋Š๋ƒ ์•„๋‹ˆ๋ƒ์˜ ์ฐจ์ด )

 

์ด ์ถœ๋ ฅ๋œ ๊ฐœ๋ณ„ insert๋ฌธ์€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ DB์— ๋ณด๋‚ธ SQL์ด ์•„๋‹ˆ๋ผ SQL Hibernate๊ฐ€ ๋“œ๋ผ์ด๋ฒ„์— ๋ณด๋‚ธ ๋‚ด์šฉ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

๋”๋ณด๊ธฐ

 

 

 

 

๊ฒฐ๋ก  : save(), saveAll()์˜ ํ™•์—ฐํ•œ ์†๋„์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค. 

728x90