TransactionRequiredException ํ•ด๊ฒฐ - ์ดˆ๊ธฐํ™” ์‹œ์ ์— Transaction ํš๋“

TransactionRequiredException ํ•ด๊ฒฐ - ์ดˆ๊ธฐํ™” ์‹œ์ ์— Transaction ํš๋“

1. ๊ฐœ์š” JPA ๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ์ค‘ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ INSERT ํ•ด์ฃผ๋Š” ๋นˆ์„ ์ƒ์„ฑํ•˜๋ ค ํ•˜์˜€๋‹ค. @PostConstruct ๋ฅผ ํ†ตํ•ด Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ธฐ๋™๋˜๋Š” ์‹œ์ ์— ์ž‘์„ฑํ•ด๋‘” ๋กœ์ง์— ์˜ํ•ด ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋“ค์ด persist ๋˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ JPA ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ Insert ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•˜๊ณ , ๋ญ”๊ฐ€ ์ฐ์ฐํ•œ ๋Š๋‚Œ์€ ๋“ค์—ˆ์ง€๋งŒ ๋Œ€์ถฉ @Transactional ์• ๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์ด๊ณ  ์ž‘๋™์„ ์‹œ์ผœ๋ณด์•˜๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. @Component @Transactional public class TestDataInit { @PersistenceContext private EntityManager em; @PostConstruct public v..

  • textsms
์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ณต์Šต 3 - ๋นˆ ์Šค์ฝ”ํ”„์™€ ์ƒ๋ช…์ฃผ๊ธฐ

์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ณต์Šต 3 - ๋นˆ ์Šค์ฝ”ํ”„์™€ ์ƒ๋ช…์ฃผ๊ธฐ

1. ๊ฐœ์š” ์•ž์„œ ์Šคํ”„๋ง์ด ๋งŽ์€ ๊ฐ์ฒด๋“ค์„ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜์—ฌ ํ•„์š”ํ•œ ์‹œ์ ์— ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•™์Šตํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋นˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€, ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธ๋˜๋Š” ์ˆœ๊ฐ„์— ํ•„์š”ํ•œ ๋™์ž‘๋“ค(์˜ˆ: ์ปค๋„ฅ์…˜ ์—ฐ๊ฒฐ ๋“ฑ)์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ์–ด์•ผ ํ• ๊นŒ? ๋งŒ์•ฝ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋˜ ๋„์ค‘, ์„œ๋ฒ„๋กœ ์˜ค๋Š” ํŠน์ • API์— ๋Œ€ํ•ด UUID์™€ ์š”์ฒญ URL์„ ๋กœ๊น…ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์•ž์„  ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜์ž. 2. ๋นˆ ์Šค์ฝ”ํ”„ Hello ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ€์ƒ์˜ ์•„์ฃผ์•„์ฃผ ์ค‘์š”ํ•œ(…!) API ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ•ด๋‹น API ์˜ ์š”์ฒญ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. @RestController..

  • textsms

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•œ ์ „๋žตํŒจํ„ด

1. ์ „๋žต ํŒจํ„ด์ด๋ž€ ์ „๋žต ํŒจํ„ด์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ทธ๋ฃน์œผ๋กœ ์ •์˜ํ•˜๊ณ , ๊ฐ ๊ทธ๋ฃน์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ๊ทธ๋ฃน์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ–‰๋™ ๋””์ž์ธํŒจํ„ด์ด๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ JAVA API ๋‚ด์—์„œ๋„ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋นˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ „๋žตํŒจํ„ด์„ ๊น”๋”ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํŠน์ • ์„œ๋น„์Šค์˜ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฌด๊ฑฐ์›Œ ์ง€๋Š”๊ฒƒ์„ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. 2. ์ ์šฉ ์˜ˆ์ œ ๊ธฐ์กด์— ํšŒ์‚ฌ์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒฐ์ œ ์ˆ˜๋‹จ์ด ๋งŽ์ง€ ์•Š์•˜๋Š”๋ฐ, ์ด๋ฒˆ์— ์‹ ๊ทœ ์•ฑ ๋Ÿฐ์นญ๊ณผ ๋”๋ถˆ์–ด ๋‹ค์–‘ํ•œ ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ์ง€์›ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ •์‚ฐ ๋ชจ๋“ˆ๋„ ๊ทธ์— ๋งž์ถ”์–ด ์—ฌ๋Ÿฌ ๊ฒฐ์ œ์ˆ˜๋‹จ์— ๋”ฐ๋ฅธ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ์†Œํ™”ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค. ๊ธฐ์กด์— ์ง€์›ํ•˜๋˜ ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ํŽธ์˜์ƒ A..

  • textsms
์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ณต์Šต 2 - ์‹ฑ๊ธ€ํ†ค๊ณผ ํŒจํ„ด๊ณผ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ

์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ณต์Šต 2 - ์‹ฑ๊ธ€ํ†ค๊ณผ ํŒจํ„ด๊ณผ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ

1. ๊ฐœ์š” ์—ด์‹ฌํžˆ ๊ฐœ๋ฐœํ•˜์—ฌ ๋Ÿฐ์นญํ•œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์„œ๋น„์Šค๊ฐ€ ์ž…์†Œ๋ฌธ์„ ํƒ€์„œ ์ด์šฉ์ž ์ˆ˜๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์—„์ฒญ๋‚œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ๋‹นํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ. ์Šคํ”„๋ง์€ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฌํ•œ ์ˆ˜๋งŽ์€ ๋™์‹œ ์š”์ฒญ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ํƒ„์ƒํ–ˆ๋˜ ์Šคํ”„๋ง์ด ์ทจํ–ˆ๋˜ ์ƒ์กด ์ „๋žต์€ ๋ฌด์—‡์ด์—ˆ์„๊นŒ? ๋ณดํ†ต ์•„๋ฌด๋ฆฌ ๋””์ž์ธ ํŒจํ„ด์— ๊ด€์‹ฌ์ด ์—†๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋„, ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ•œ๋ฒˆ์ฏค ๋“ค์–ด๋ณธ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์•„๊ฐ€์„œ ์Šคํ”„๋ง์ด ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•˜๋Š”์ง€ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€ ํ•™์Šตํ•ด๋ณด๋„๋ก ํ•˜์ž. 2. ์‹ฑ๊ธ€ํ†ค์˜ ๊ฐœ์š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€ ์ด๋ฆ„์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ private ์œผ๋กœ ์ œํ•œํ•˜๊ณ  ์Šคํƒœํ‹ฑ ์˜์—ญ์— ์ƒ์„ฑํ•ด๋‘” ํ•˜๋‚˜์˜ ์ธ..

  • textsms
์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ณต์Šต 1 - DIP, OCP ์›์น™๊ณผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ณต์Šต 1 - DIP, OCP ์›์น™๊ณผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

1. ๊ฐœ์š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์•„์„œ ์ž„์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘, DB๊ฐ€ ํ™•์ •๋˜๊ณ  JPA๋กœ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ๋ ˆ์ด์–ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. DI ์ปจํ…Œ์ด๋„ˆ, ํ˜น์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์—๋Š” ์˜์กด๊ด€๊ณ„๋ฅผ ์ง์ ‘ ๊ตฌํ˜„์ฒด๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ง€์ •ํ•ด ์ฃผ์—ˆ์ง€๋งŒ, ์ด๋Š” SOLID 5์›์น™ ์ค‘ DIP, OCP์— ์œ„๋ฐฐ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? 2. ์Šคํ”„๋ง์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์„ฑ๊ณตํ•ด์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑ ํ•ด๋ณด์ž. class MemberServiceImplTest { //์•„์ง ๋ณ„๋‹ค๋ฅธ DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์„œ๋น„์Šค ๊ฐ์ฒด๋„ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ์ฃผ์ž…ํ•˜๋„๋ก ํ•œ๋‹ค. MemberService memberService = new MemberServic..

  • textsms