Server๐Ÿงค/JPA

Server๐Ÿงค/JPA

[JPA] ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ - ๋น„๊ด€์  ๋ฝ VS ๋‚™๊ด€์  ๋ฝ

์ด์Šˆ ์ƒํ™ฉ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— '๋๋ง์ž‡๊ธฐ' ๊ธฐ๋Šฅ์„ ์ œ๊ณต์ค‘์ด๋‹ค. ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ๋‘๊ฐœ์˜ ๋‹จ์–ด๊ฐ€ ๋™์‹œ์— ์‚ฝ์ž…๋˜์—ˆ๋‹ค! ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ • ์šฐ์„  Chatgpt๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด์•˜๋‹ค. 1. ๊ฒฉ๋ฆฌ์ˆ˜์ค€ ์„ค์ •์„ ๊ณ ๋ ค -> ํƒˆ๋ฝ ์šฐ์„  PostgreSQL์—์„œ๋Š” 4๊ฐ€์ง€์˜ Transaction ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋๋ง์ž‡๊ธฐ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ดค์„๋•Œ, ํ•˜๋‚˜์˜ transaction์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„๋•Œ, ๋‹ค๋ฅธ transaction์—์„œ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋„ ์ฝ์–ด์•ผํ•จ. Postgresql์€ Read Uncommited๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค! ๊ฒฐ๋ก ์ ์œผ๋กœ DirtyRead๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. 2. ๋‚™๊ด€์  ๋ฝ๊ณผ ๋น„๊ด€์  ๋ฝ ๊ณ ๋ คํ•˜๊ธฐ (์˜ค ๊ดœ์ฐฎ๋‹ค!) ๋‚™๊ด€์ ๋ฝ๊ณผ ๋น„๊ด€์ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ค€์€ "๋™์‹œ์— ์ˆ˜์ •์„..

Server๐Ÿงค/JPA

[JPA] Java Persistence API

JPA ๊ฐœ์š” Persistence Java ๊ฐ์ฒด(์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ)๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ๊ฐ์ฒด์˜ ์˜์†์„ฑ์„ ๋ณด์žฅํ•จ Java Persistence API Object-Relational Mapping(ORM) ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ Java ํ‘œ์ค€ API Entity๋กœ ์ •์˜๋œ Java ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์‚ฌ์ด์˜ mapping ๋ฐฉ๋ฒ•์„ ์„ค์ •(annotation ์ด์šฉ) ์„ค์ •๋œ Mapping์— ๋”ฐ๋ผ Java๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ๋Š” Interface ์ œ๊ณต -> EntityManager JDBC API๋‚˜ Data Mapper (ex: MyBatis)์˜ ๋Œ€์•ˆ Java ์ค‘์‹ฌ์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. Persistence Provider (JPA Provider) JPA์˜..

Server๐Ÿงค/JPA

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

์ƒํ™ฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋„ฃ์–ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ฒผ๋‹ค. History์— ์žˆ๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ํ™œ๋™์ •๋ณด์— ํ•ด๋‹น id๋ฅผ ๊ฐ€์ง„ ์œ ์ €์—๊ฒŒ ํ•œ๊บผ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž‘์—…์ด์˜€๋‹ค. ์ฒ˜์Œ์— ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋Š” forEach๋ฌธ์œผ๋กœ ๊ฐ๊ฐ save๋ฅผ ๋Œ๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค. ํ•ด๋‹น ์ž‘์—…์˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋กœ save์™€ saveAll ์— ๋Œ€ํ•œ ๊ฒƒ์„ ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋‹ค. ์ด๋ฒˆ๊ธฐํšŒ์— ํ•ด๋‹น ์ฟผ๋ฆฌ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ฒ˜์Œ์— ์ž‘์„ฑํ•œ save() ๋ฉ”์†Œ๋“œ์ด๋‹ค. memberHistories.forEach(memberHistory -> memberActivityRepository.save( memberActivityRepository.save( MemberActivity.builder() .memb..

Server๐Ÿงค/JPA

[JPA] ํ”„๋ก์‹œ

ํ”„๋ก์‹œ? Member ์—”ํ‹ฐํ‹ฐ์™€ Team ์—”ํ‹ฐํ‹ฐ๋Š” @Many(Member)ToOne(Team) ๊ด€๊ณ„์— ์žˆ๋‹ค. Member๋ฅผ ์กฐํšŒํ• ๋•Œ, Team์„ ํ•ญ์ƒ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด? - ๋‚ญ๋น„๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ•ญ์ƒ Team์„ ์กฐํšŒํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ด์œ ๋Š” ์—†๋‹ค! JPA๋Š” ์ด ๋‚ญ๋น„๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด, ์ง€์—ฐ๋กœ๋”ฉ๊ณผ ํ”„๋ก์‹œ๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค. ์ง€์—ฐ๋กœ๋”ฉ JPA์—๋Š” em.find()์™€ em.getReference()๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. em.find() : DB๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์กฐํšŒ em.getReference() : DB์˜ ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฐ€์งœ(ํ”„๋ก์‹œ) ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์กฐํšŒ Member ์—”ํ‹ฐํ‹ฐ @Entity @Getter @Setter public class Member exte..

yujindonut
'Server๐Ÿงค/JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก