๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

Spring Data ๊ตฌ์กฐ ๊ธฐ๋Šฅ ๋ชฉ๋ก ๊ฐ•๋ ฅํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ์ฒด ๋งคํ•‘ ์ถ”์ƒํ™” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์—์„œ ๋™์  ์ฟผ๋ฆฌ ํŒŒ์ƒ ๊ธฐ๋ณธ ์†์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ตฌํ˜„ ๋„๋ฉ”์ธ ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ช…๋ฃŒํ•œ ์ถ”์  ๊ธฐ๋Šฅ ์ง€์›(์ƒ์„ฑ ์ผ์‹œ, ๋งˆ์ง€๋ง‰ ๋ณ€๊ฒฝ ์ผ์‹œ, ์ƒ์„ฑ์ž, ๋งˆ์ง€๋ง‰ ๋ณ€๊ฒฝ์ž) ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ฝ”๋“œ ํ†ตํ•ฉ ๊ฐ€๋Šฅ์„ฑ JavaConfig ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • XML ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ฐ„ํŽธํ•œ Spring ํ†ตํ•ฉ Spring MVC ์ปจํŠธ๋กค๋Ÿฌ์™€์˜ ๊ณ ๊ธ‰ ํ†ตํ•ฉ ๊ต์ฐจ ์Šคํ† ์–ด ์ง€์†์„ฑ์— ๋Œ€ํ•œ ์‹คํ—˜์  ์ง€์› ์›๋ฆฌ Repository ๋Š” MarkerInterface๋กœ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์€ ์—†๋‹ค. Repository ~ JpaRepository ๊นŒ์ง€๋Š” @NotRepositoryBean ์ด ๋ถ™์–ด์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. JpaRepository ๋ถ™์ด๋ฉด ์•Œ๋งž์€ ํ”„๋กœ..
Cascade(์˜์†์„ฑ ์ •์˜) ์‚ฌ์šฉ ์œ„์น˜ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ ๋ฐ˜๋Œ€ํŽธ - ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ(๋‹ค๋Œ€์ผ ์—์„œ ์ผ) ์ฆ‰, @OneToMany๊ฐ€ ์žˆ๋Š” ์ชฝ ๋˜๋Š” @OneToOne๋„ ๊ฐ€๋Šฅ ์‚ฌ์šฉ ์กฐ๊ฑด ์–‘์ชฝ ์—”ํ‹ฐํ‹ฐ์˜ ๋ผ์ดํ”Œ ์‚ฌ์ดํด์ด ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๊ธ€์ด ์‚ญ์ œ๋˜๋ฉด ์ฒจ๋ถ€ํŒŒ์ผ๋„ ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ๋กœ์˜ ์˜์†์„ฑ ์ „์ด๋Š” ํ˜„์žฌ ์—”ํ‹ฐํ‹ฐ์—์„œ๋งŒ ์ „์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฒจ๋ถ€ ํŒŒ์ผ์„ ๊ฒŒ์‹œ๊ธ€์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์˜์†์„ฑ ์ „์ด๋ฅผ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์˜ต์…˜ ์ข…๋ฅ˜ ALL : ์ „์ฒด ์ƒํƒœ ์ „์ด PERSIST : ์ €์žฅ ์ƒํƒœ ์ „์ด REMOVE : ์‚ญ์ œ ์ƒํƒœ ์ „์ด MERGE : ์—…๋ฐ์ดํ„ฐ ์ƒํƒœ ์ „์ด REFRESH : ๊ฐฑ์‹  ์ƒํƒœ ์ „์ด DETACH : ๋น„์˜์†์„ฑ ์ƒํƒœ ์ „์ด orphanRemoval(๊ณ ์•„ ๊ฐ์ฒด ์ œ๊ฑฐ) ์‚ฌ์šฉ ์œ„์น˜ @OneToM..
DB ๋ฅผ Java ์•ฑ๊ณผ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด JDBC ํƒ„์ƒ๐ŸŽ‰ JDBC(Java Database Connectivity) JDBC Driver๋Š” ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ DB์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต JDBC Driver Manager๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— Connection(์—ฐ๊ฒฐ)์„ ์ƒ์„ฑํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  Statement(์ƒํƒœ)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ  ResultSet(๊ฒฐ๊ณผ ์…‹)์„ ์ƒ์„ฑํ•ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. โš ๏ธ ๊ผญ ์‚ฌ์šฉ ํ›„์—๋Š” close()๋ฅผ ํ˜ธ์ถœํ•ด ์ž์› ํ•ด์ œ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. โš ๏ธ JDBC ์˜ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋กœ QueryMapper ํƒ„์ƒ ๐ŸŽ‰ JDBC๋กœ ์ง์ ‘ SQL์„ ์ž‘์„ฑํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ SQL ์ฟผ๋ฆฌ ์š”์ฒญ ์‹œ ์ค‘๋ณต ์ฝ”๋“œ ๋ฐœ์ƒ DB ๋ณ„ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๊ตฌ๋ถ„ ์—†์ด Checked ..
EDA(Event Driven Architecture)? ๋ถ„์‚ฐ๋œ ์‹œ์Šคํ…œ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑ(๋ฐœํ–‰)ํ•˜๊ณ , ๋ฐœํ–‰๋œ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ˆ˜์‹ ์ž๋Š” ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์˜ ์•„ํ‚คํ…์ฒ˜ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ ์ƒํ˜ธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํŒจํ„ด์œผ๋กœ ์ฃผ๋กœ Message Broker(Kafka, RabbitMQ)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ Event Generator(Publisher, Producer, Creater) ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์˜ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ๋Š” Event Channel๋กœ ์ „์†ก๋œ๋‹ค. Event Channel(Bus) Event Generator์—์„œ Event Processing Engine์œผ๋กœ ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํŒŒํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜ ์ฆ‰, ์ด๋ฒคํŠธ๋ฅผ ํ•„์š”๋กœ ..
KEEP ๊ตณ์ด ๋ง์„ ํ•˜์ง€ ์•Š์•„๋„ ์ •ํ•ด์ง„ ๋ฒ”์œ„๊นŒ์ง€ ์•Œ์•„์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜์˜€๋‹ค. ์ด๋ฒˆํ”„๋กœ์ ํ‹€์—์„œ GIT์„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋•Œ๋ณด๋‹ค ๋งŽ์ด์จ๋ด์„œ ๋งค์šฐ์ข‹์•˜๊ณ  ์‹ค๋ ฅ์žˆ๋Š” ํŒ€์›๋“ค ๋•๋ถ„์— ๋ฐฐ์›Œ๊ฐ„๊ฒŒ ๋งŽ๋‹ค. ์„ค๊ณ„๋‹จ๊ณ„์—์„œ ERD์™€ API๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ํ•„์š”ํ•œ API๊ธฐ๋Šฅ๋“ค๊ณผ Entitiy์™€ ํ•ด๋‹น Entity๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฉด๋ฐ€ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ ์‹ค ์„œ๋ฒ„ ๊ตฌ์ถ•๋‹จ๊ณ„์—์„œ ๋น ๋ฅด๊ฒŒ ๋ชฉํ‘œํ–ˆ๋˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ• ์ˆ˜์žˆ๋˜ ์  ํŒ€์›๊ณผ์˜ ์›ํ™œํ•œ ์†Œํ†ต์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ง„ํ–‰๋„ ๋ฐ ๋ฌธ์ œ์  ๊ณต์œ ๋ฅผ ํ†ตํ•ด ๋น ๋ฅธ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ PROBLEM ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ํ™”๋ฉด๊ณต์œ ๋ฅผ ํ†ตํ•œ ํ•ด๊ฒฐ๋ฐฉํ•œ ๋…ผ์˜ @Valid๋ฅผ ์ด์šฉํ•œ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ๊ธ€๋กœ๋ฒŒ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋กœ ๋‚˜์˜ค๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์•„์ง ์ดํ•ด๋„๊ฐ€ ๋ถ€์กฑํ•ด์„œ ํ•˜์ง€๋ชปํ–ˆ๋‹ค. ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ๋ฐฑ์˜คํ”ผ์Šค์˜ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์„ ๊นŠ๊ฒŒ ์ƒ๊ฐ ..
Spring AOP Annotation @Aspect Spring Bean ํด๋ž˜์Šค์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ ์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜ @Around: ํ•ต์‹ฌ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ ์ „๊ณผ ํ›„(@Before + @After) @Before: ํ•ต์‹ฌ๊ธฐ๋Šฅ ํ˜ธ์ถœ ์ „(ex. Client์˜ ์ž…๋ ฅ ๊ฐ’ Validation ์ˆ˜ํ–‰) @After : ํ•ต์‹ฌ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์–ธ์ œ๋‚˜ ๋™์ž‘(try, catch์˜ finally() ์ฒ˜๋Ÿผ ๋™์ž‘) @AfterReturning : ํ•ต์‹ฌ๊ธฐ๋Šฅ ํ˜ธ์ถœ ์„ฑ๊ณต ์‹œ (ํ•จ์ˆ˜์˜ Return ๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) @AfterThrowing : ํ•ต์‹ฌ๊ธฐ๋Šฅ ํ˜ธ์ถœ ์‹คํŒจ ์‹œ, ์ฆ‰ ์˜ˆ์™ธ(Exception)๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋™์ž‘(ex. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ email์ด๋‚˜ SMS ๋ณด๋ƒ„) ํฌ์ธํŠธ์ปท ํฌ์ธํŠธ์ปท Expression Langua..
์ง€์—ฐ ๋กœ๋”ฉ ์Œ์‹ ํ…Œ์ด๋ธ”๊ณผ ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์ด N:1 ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋ผ ๊ฐ€์ • "์•„๋ณด์นด๋„ ํ”ผ์ž"์˜ ๊ฐ€๊ฒฉ์„ ์กฐํšŒํ•˜๋ ค๊ณ  ํ–ˆ์„ ๋ฟ์ธ๋ฐ ์ž๋™์œผ๋กœ JOIN ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋„ ๊ฐ€์ ธ์˜ด JPA๋Š” ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์„ค์ •๋œ Entity์˜ ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ง€, ํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ์˜ฌ ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ์Œ ์ฆ‰, ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ•˜๊ฒŒ๋˜๋Š”๋ฐ JPA์—์„œ๋Š” Fetch Type์ด๋ผ๊ณ  ๋ถ€๋ฆ„ Fetch Type์˜ ์ข…๋ฅ˜์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” LAZY, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” EAGER LAZY๋Š” ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ํ•„์š”ํ•œ ์‹œ์ ์— ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด EAGER๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ์œผ๋กœ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ๋ชจ๋“  Entity์˜ ์ •๋ณด๋ฅผ ์ฆ‰์‹œ ๊ฐ€์ ธ์˜ด ๊ธฐ๋ณธ์ ์œผ๋กœ @OneToMany ์• ๋„ˆํ…Œ์ด์…˜์€ Fetch Type์˜ default ๊ฐ’์ด LAZY๋กœ ์ง€์ •๋˜์–ด ..
์ถœ๋ฐœ ๋น„๋””์˜ค ์—ฌํ–‰ Keep ์˜ˆ์œ ๋ง ์†Œํ†ต ๋งค์ผ ํšŒ์˜๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋จธ์ง€ ๋ฐ ์ง„๋„ ๊ณต์œ  Problem ์˜จ๋ผ์ธ์—์„œ์˜ ์†Œํ†ต ํ•œ๊ณ„ ์†Œ๊ทน์ ์ธ ๋งˆ์ธ๋“œ ์†Œํ†ต ๋ถ€์žฌ๋กœ ์ธํ•˜์—ฌ ๋ชจ๋“  ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์ง„ํ–‰ ๋ชปํ•จ Try ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•(๊ฒŒ๋”, zep, ์Šฌ๋ž™ ๋“ฑ)์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ๋ถ„๋ฐฐ๋œ ์—ญํ•  ์™ธ์—๋„ ์„ ๋œป ๋„์™€์ฃผ๊ธฐ ๋‹ค๋ฅธ ํŒ€์›์˜ ์ง„ํ–‰ ์ƒํ™ฉ ์ ๊ทน์ ์œผ๋กœ ๊ณต์œ ๋ฐ›์•„ ์„œ๋กœ์˜ ํž˜๋“  ๋ถ€๋ถ„์„ ๋„์™€์ฃผ๊ธฐ ํŒ€์›๋“ค์˜ ํ•œ๋งˆ๋”” ๊น€ํ˜œ์œค : ํŒ€์žฅ์ด๋ผ๋Š” ์ง์ฑ…์„ ๋งก์•˜๋Š”๋ฐ, ํŒ€์›๋“ค์„ ๋งŽ์ด ๋„์™€์ฃผ์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋“ค ๋งก์€ ๋ฐ”๋ฅผ ์—ด์‹ฌํžˆ ํ•ด์ฃผ์…จ๊ณ , ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ตœ์„ ์„ ๋‹คํ•ด ์ž„ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๋˜ ๊ฐ™์€ ํŒ€์ด ๋œ๋‹ค๋ฉด, ์ ๊ทน์ ์œผ๋กœ ์†Œํ†ตํ•ด์š”!! ๋ฌธ๊ธฐํ˜„ : ์ง„๋„๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š”๊ฒŒ ๋Šฆ์–ด์ ธ ์ •์ž‘ ์‹ค์ œ๋กœ ์ƒ๊ฐํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋Š” ์‹œ๊ฐ„์€ ์ ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ํŒ€ํ”„๋กœ์ ํŠธ..
KIMHYEYUN
'๋‚ด์ผ๋ฐฐ์›€์บ ํ”„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก