์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ž‘์‹ฌ 30์ผ ์ฑŒ๋ฆฐ์ง€ ์ตœ์ข… ํ›„๊ธฐ !!

dhkim22 2021. 10. 14. 13:31

๐Ÿ“Œ Spring์„ ๋„“~~~๊ฒŒ ๊ฒฝํ—˜ํ•˜๋ฉฐ ์ž…๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ฐ•์˜

Java, Spring, Springboot, Spring Data JPA, Spring Security, Spring Batch, Spring Cloud ..... 

 

Spring Cloud ์ชฝ์€ ์•„์ง ๋‹ค ์ œ๋Œ€๋กœ ๋“ฃ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ง„์†”ํ•œ ํ›„๊ธฐ๋ฅผ ์ ์–ด๋ณธ๋‹ค.

 

๐Ÿ“Œ JAVA

๋‚˜๋Š” C, C++, Java, Python ๋“ฑ๋“ฑ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ž…๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋ฐฐ์šธ ๋•Œ ์ฑ…์„ ์‚ฌ์šฉํ–ˆ๋‹ค. Java, C++ ๋ชจ๋‘ ์œค์„ฑ์šฐ ๋‹˜์˜ ์—ดํ˜ˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ์ž…๋ฌธํ–ˆ๋Š”๋ฐ ์ฑ…์„ ํ†ตํ•ด ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋„ ๋ถ„๋ช…ํžˆ ์žฅ์ ์ด ์žˆ๊ฒ ์ง€๋งŒ ์ด๋ฒˆ์— ์ž…๋ฌธ๊ฐ•์˜๋ฅผ ๋‹ค์‹œ ๋“ค์–ด๋ณด๋‹ˆ ์ธ๊ฐ•์ด ํ›จ์”ฌ ์ข‹์ง€ ์•Š์„๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.  ์ •๋ง ๊ธฐ์ดˆ์ ์ธ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ž๋ฐ”8๋ถ€ํ„ฐ ์ ์šฉ๋œ ๊ธฐ์ˆ ๊นŒ์ง€ ์ƒˆ๋กœ ๋ฐฐ์šฐ๊ธฐ๋„ ๋ณต์Šตํ•˜๊ธฐ๋„ ํ•œ ์ข‹์€ ๊ฐ•์˜์˜€๋‹ค. Spring ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๊ฐ€ ์‚ด์ง ์ง€์น  ๋•Œ ํ•œ๋ฒˆ์”ฉ ๋“ค์–ด์ฃผ๋ฉด ์‚ด์ง ํ™˜๊ธฐ๊ฐ€ ๋˜๋Š”? ๋А๋‚Œ์ด์˜€๋‹ค.

Java ๊ฐ•์˜ ๋˜ํ•œ ์™„๊ฐ•์€ ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์นดํ…Œ๊ณ ๋ฆฌ๋งŒ ๋ด๋„ Java์— ๋Œ€ํ•ด ๊ฑฐ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.  

 

๋‚˜๋Š” Java๋ฅผ ์ž˜ ์•„๋Š”๊ฐ€..?

๋‚˜๋Š” Spring์€ ์“ฐ๋ฉด์„œ Java๋ฅผ ์ œ๋Œ€๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”๊ฐ€? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ž๋ฐ” 8 ๋ฌธ๋ฒ•์„ ์“ธ ๋•Œ์ด๋‹ค.  ๊ทธ์™ธ์˜ ๊ฒƒ๋„ ๋งŽ์ง€๋งŒ.. Part2์˜ CH6 ์ž๋ฐ”์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค ๋ถ€๋ถ„์—์„œ Lambda, Stream, Function, ์ž…์ถœ๋ ฅ, Logger, Serialization, Multi-Thread ๋“ฑ์„ ๋ฐฐ์šฐ๊ฒŒ ๋˜๋Š”๋ฐ ๋‚˜์˜ Java ์‹ค๋ ฅ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•˜๊ณ  ๋ถ€์กฑํ•˜๋‹ค๋ฉด ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.

 

์ถ”๊ฐ€๋กœ Spring์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค ํ•  ๋•Œ ํˆญํˆญ ํŠ€์–ด๋‚˜์˜ค๋Š” ๋””์ž์ธ ํŒจํ„ด์— ์žˆ์–ด์„œ๋„ ์‹ค์Šต๊ณผ ํ•จ๊ป˜ ๋‹ค๋ฃฌ๋‹ค.

 

์ด ๊ฐ•์˜๋ฅผ ์™„๊ฐ•ํ•œ๋‹ค๋ฉด JAVA ๊ธฐ๋ณธ์„œ๋ฅผ ํ•œ ๊ถŒ์„ ํ†ต์œผ๋กœ ์ฝ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“Œ Spring

 

๋””์ž์ธ ํŒจํ„ด

Spring ๊ณต๋ถ€๋ฅผ ํ•  ๋•Œ ๊ท€์ฐฎ๊ณ  ์ดํ•ดํ•˜๊ณ  ์™ธ์šฐ๊ธฐ ํž˜๋“ค์–ด์„œ ์‰ฝ๊ฒŒ ๊ธฐํ”ผํ•˜๋Š” ๋””์ž์ธํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค. ๋‚ด ์งง์€ ๊ฒฝํ—˜์œผ๋กœ Spring์ด ๋งŒ๋“ค์–ด์ง„ ๊ตฌ์กฐ๋ฅผ ์–ด๋А์ •๋„ ์ดํ•ดํ•˜๋ ค๋ฉด ๋””์ž์ธ ํŒจํ„ด์„ ์•„์ฃผ ์ž˜ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด, ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด, ํ”„๋ก์‹œ ํŒจํ„ด ๋“ฑ Spring ์ฑ… ๋˜๋Š” ๋‹ค๋ฅธ ๊ฐ•์˜์—์„œ ํ•œ๋ฒˆ์”ฉ ๋“ค์–ด๋ณธ ํŒจํ„ด์„ ์ซ™ ๋‹ค๋ฃฌ๋‹ค.

 

REST API

๊ฐ•์˜๋Š” Rest API ์„ค๊ณ„๋กœ ์‹œ์ž‘๋œ๋‹ค. REST API์˜ ๊ธฐ๋ณธ์ด์ž ๋ชจ๋“  ๊ฒƒ์ธ GET, POST, PUT, DELETE ์„ค๊ณ„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•˜๋‚˜ํ•˜๋‚˜ ๊นŠ๊ฒŒ ๋ฐฐ์šฐ๊ณ  ๊ฐ์ฒด ๋งคํ•‘๋ฐฉ๋ฒ•, Json ๋ฆฌํ„ด ๋ฐฉ๋ฒ• ๋“ฑ REST API ์„ค๊ณ„ ์ „๋ฐ˜์„ ์ž˜ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

 

Ioc, DI, AOP

๋‹ค์Œ์€ Spring์˜ ์ฒ ํ•™? ์ฏค ๋˜๋Š” IoC, DI, AOP ์— ๋Œ€ํ•ด ๋ฐฐ์šด๋‹ค. Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ก ์ ์œผ๋กœ๋„ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ก ์ ์ธ ์„ค๋ช…๊ณผ ๋”๋ถˆ์–ด AOP ๋ถ€๋ถ„์—์„œ ๋กœ๊น…, ๋ฉ”์„œ๋“œ ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ • ๋“ฑ ์‹ค์Šต์˜ˆ์ œ๋ฅผ ์ ์šฉํ•œ ๊ฒƒ์ด ์ฐธ ๊ดœ์ฐฎ์•˜๋‹ค.

 

ํ…Œ์ŠคํŠธ

Spring ์ž…๋ฌธ์ž๊ฐ€ ์‹ ๊ฒฝ์“ฐ๊ธฐ ํž˜๋“  Test ๋ถ€๋ถ„๋„ ๋‹ค๋ฃฌ๋‹ค. Junit์„ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์•ž์„œ ์„ค๊ณ„ํ•œ API์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์ข€ ๋” ์ง„์งœ๊ฐ™์€? ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ Jacoco๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•์ธ๊นŒ์ง€ ๋ถธ๋ฆฌ ๊ตฟ์ด์˜€๋‹ค.

 

Swagger

REST API๋ฅผ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์ž‡๋Š” Swagger๋„ ๋ฐฐ์šด๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฐฐ์šฐ๊ณ  ๋‹ค ์ดํ•ดํ•œ๋‹ค๋ฉด ์ •๋ง REST API๋ฅผ ์“ธ์ค„ ์•„๋Š” ์‚ฌ๋žŒ์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. REST API ์„ค๊ณ„๋ถ€ํ„ฐ ๋ฌธ์„œํ™”๊นŒ์ง€ ์ญ‰~ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํฐ ์žฅ์ ์ด๋‹ค.

 

๋ง›์ง‘ ๋ฆฌ์ŠคํŠธ ํ”„๋กœ์ ํŠธ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐ์šด ๊ฒƒ์„ ๋ชจ๋‘ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ API ๊ธฐ๋ฐ˜ ํ† ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ•์˜์˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

๐Ÿ“Œ Spring Data JPA

 

์‹ฌํ”Œํ•œ ๊ฐ•์˜ ์Šคํƒ€์ผ

JPA ๋ถ€๋ถ„์—์„œ ๊ฐ€์žฅ ์ข‹์•˜๋˜ ๊ฒƒ์€ UI ์—†์ด ์ง„ํ–‰๋๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŽ์€ JPA ๊ฐ•์˜์—์„œ JPA๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ UI๋ผ๋„ ๊ตฌ์„ฑํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š”๋ฐ ์ด ๊ฐ•์˜๋Š” TDD ๊ธฐ๋ฐ˜์œผ๋กœ๋งŒ ์‹ค์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ •๋ง Spring์— ์ž…๋ฌธํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด Test๋ฅผ ๋‹ค๋ค„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๊ธฐํšŒ๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.  

๋ฐฉ๋Œ€ํ•œ ์–‘์˜ JPA๋ฅผ ๊ฑฐ์˜ ๋‹ค ๋‹ค๋ฃฌ๋‹ค. ์ •๋ง ๊ธฐ๋ณธ์ ์ธ SQL๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ง€์‹์ด ์žˆ๋‹ค๋ฉด ์™„๊ฐ•ํ•˜๋Š”๋ฐ ์ „ํ˜€ ๋ฌด๋ฆฌ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐ๋œ๋‹ค. 

 

ใ… ใ… 

์กฐ๊ธˆ ์•„์‰ฌ์› ๋˜ ์ ์€ ์•ž์„œ ๋งํ–ˆ๋˜ ์žฅ์ ์ด๋‹ค. ๊ฑฐ์˜ ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ•์˜๊ฐ€ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์žฅ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค. ์กฐ๊ธˆ ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด์ด๋‹ค.

 

Repository

JPA์—์„œ ํฌ~์€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๋Š” Repository ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด JPA๋ฅผ ์ฒ˜์Œ ๊ฒฝํ—˜ํ•ด๋ณธ ์‚ฌ๋žŒ๋„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๋ช…ํ•œ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ทธ๋ƒฅ ์ด๊ฑฐ ์“ฐ์„ธ์š” ~ ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ธฐ์•ผ ํ•˜๊ฒ ์ง€๋งŒ ๋” ๋‚ด๋ถ€์ ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ์ดํ•ด๋ฅผ ํ•œ๋‹ค๋ฉด ๋‚˜์ค‘์— ์„ ํƒ์˜ ํญ์ด ๋” ๋„“์–ด์งˆ ๊ฒƒ์ด๋‹ค.

 

Query, Entity

๋‹ค์Œ์œผ๋กœ ์ œ๋Œ€๋กœ Entity๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์—ฌ~~๋Ÿฌ Query๋ฅผ ์—ฌ~~๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ์—ญ์‹œ๋‚˜ UI์— ์‹œ๊ฐ„๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ณ  ํ•ต์‹ฌ๋งŒ ๋ฝ‘๋Š” ๊ฐ•์˜๋ฐฉ์‹์ด ์ฐธ ์ข‹์•˜๋‹ค.

 

EntityListener

๊ฐ€์žฅ ํฅ๋ฏธ๋กญ๊ฒŒ ๋“ค์—ˆ๋˜ ์„น์…˜์ด๋‹ค. ๋‹ค๋ฅธ ๋งค์ฒด๋ฅผ ํ†ตํ•ด์„œ EntityListener๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณธ ์ ์ด ์žˆ๊ธด ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ํŠนํžˆ ๊นŠ๊ฒŒ ๋‹ค๋ค˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

EntityListener๋ฅผ ๋ฐฐ์› ์„ ๋•Œ๋„ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ auditingentitylistener ์ •๋„๋งŒ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ์ด๋ฒˆ์— ์ง์ ‘ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. 

๊ธฐ์–ตํ•˜์ž !! @PrePersist, @PreUpdate, @PostPersist, @PostUpdate, @PostLoad !!

๋“ฑ๋ก์€ @EntityListeners(value = MyEntityListener.class) ... 

 

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

JPA๋ฅผ ๋ฐฐ์šฐ๋ฉด ๋ฌด์กฐ๊ฑด ๋‚˜์˜ค๋Š” ๊ทธ ๋‹จ์–ด N+1

์–ด๋–ค ๋‘ ๊ฐ์ฒด๊ฐ€ 1:N์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์กŒ์„ ๋•Œ 1 ์ชฝ์„ ์กฐํšŒํ–ˆ์„ ๋•Œ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” N๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•œ๋‹ค๋ฉด ??  ์‰ฃ..

fetch join, @EntityGraph๋กœ ํ•ด๊ฒฐ !! (fetch join์ด ์นœ์ˆ™ํ•˜๊ณ  ์‰ฌ์šด ๋А๋‚Œ?)

 

 

๐Ÿ“Œ Spring Security

 

So ์–ด๋ ต .. But ๊ตฟ

์Œ.. ์ผ๋‹จ ์–ด๋ ต๋‹ค. Security ์ž์ฒด๊ฐ€ Spring์—์„œ ์–ด๋ ค์šด ๋ถ€๋ถ„์œผ๋กœ ๊ผฝํžˆ๊ธฐ๋„ ํ•˜๊ณ  ๊ฐ•์‚ฌ๋‹˜๋„ ๊ฝค๋‚˜ ๋‚œ์ด๋„ ์žˆ๋Š” ์ˆ˜์—…๋ฐฉ์‹์„ ๊ฐ€์ง€์…จ๋‹ค.

์ดˆ๋ฐ˜์— ๊ฐ•์˜๋ฅผ ์œ„ํ•œ ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ๋ถ€ํ„ฐ ๋‚˜์™€ ๊ฐ™์€ ์ดˆ๋ฐ”์ž๋ผ๋ฉด ๋ฉ˜๋ถ•์— ๋น ์งˆ ๊ฒƒ์ด๋‹ค... ์ด ๋ถ€๋ถ„๋งŒํผ์€ Spring์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ˆ™๋‹ฌ๋œ ์‚ฌ๋žŒ์—๊ฒŒ ์ถ”์ฒœํ•œ๋‹ค. ์ •๋ง ๊นŠ์€ ๋ถ€๋ถ„๊นŒ์ง€ ๋“ค์–ด๊ฐ€๋ฉด์„œ Spring Security๋ฅผ ํŒŒ๊ณ ๋“ ๋‹ค. Security์˜ ํ•„ํ„ฐ์ฒด์ธ์—์„œ ์ค‘์š”ํ•œ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ์•ˆ์œผ๋กœ ์ญ‰์ญŠ ํŒŒ๊ณ  ๋“ค์–ด๊ฐ€๋ฉด์„œ ์ดํ•ด๋ฅผ ๋•๋Š”๋‹ค. ๋„ˆ๋ฌด ๊นŠ๋‹ค๊ณ  ์ƒ๊ฐ๋  ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋ถ„๋ช… ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋ณธ์ธ์˜ ์ˆ˜์ค€๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉฐ ๊ฐ€๋ณ๊ฒŒ ๋“ฃ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. (๋‚˜๋Š” 20% ์ •๋„ ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™๋‹ค..)

 

๋งŒ์•ฝ ์™„์ „ ์‹ค์Šต์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์ˆ˜์—…๋ฐฉ์‹์„ ์›ํ•œ๋‹ค๋ฉด ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ•์‚ฌ๋‹˜๊ณผ ํ•จ๊ป˜ Spring Security์— ๋Œ€ํ•œ ์ฑ… ํ•œ ๊ถŒ์„ ์ฝ๋Š” ๋А๋‚Œ์ด๋‹ค. ์Œ.. ์ด๋ก  98.5%? ๊ทธ๋ ‡๋‹ค๊ณ  ์ฝ”๋“œ๋ฅผ ์น˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ์ฝ”๋“œ๋กœ ์น˜๋ฉด์„œ ํ•˜๋Š”๋ฐ ๋”ฐ๋ผํ•˜๊ธฐ ํž˜๋“ค์—ˆ๋‹ค. ๊ฑฐ์˜ ์ด๋ก ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ์น˜์ง€ ์•Š๊ณ  ๊ฐ•์‚ฌ๋‹˜์˜ ๋ง๊ณผ ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๋Š”๋ฐ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ๋„ ์ถ”์ฒœํ•œ๋‹ค. (๋‚˜๋Š” ๋„์ค‘์— ํฌ๊ธฐํ•˜๊ณ  ํ•„๊ธฐ ๋ชจ๋“œ์— ๋“ค์–ด๊ฐ”๋‹ค.)

 

Security ๋ถ€๋ถ„ ์™„๊ฐ•ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค..

์™„๊ฐ•์„ ๋ชปํ–ˆ์ง€๋งŒ ๋ชจ๋“  ๊ฐ•์˜ ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ Securiy ๋ถ€๋ถ„์ด ์ฝ”๋“œ๋Ÿ‰๊ณผ ์ •๋ฆฌํ•œ ์–‘์ด ๊ฐ€์žฅ ๋งŽ๋‹ค. ๊ทธ์ •๋„ ํฌ๊ฒŒ ๋‹ค๋ฃจ๊ณ  ๋งŽ์ด ๋‹ค๋ฃจ๊ณ  ๊นŠ๊ฒŒ ๋‹ค๋ฃฌ๋‹ค. ๋ญ”๊ฐ€ ์—„์ฒญ ๋˜‘๋˜‘ํ•œ ๋Œ€ํ•™ ๊ต์ˆ˜๋‹˜๊ป˜ ์ˆ˜์—…์„ ๋ฐ›๋Š” ๋А๋‚Œ?? ๊ฐํžˆ ๋‹จ์–ธํ•œ๋‹ค. ์ด ๊ฐ•์˜๋ฅผ ๋ชจ๋‘ ์ดํ•ดํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ Spring Security ์ „๋ฌธ๊ฐ€๋ผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ์–ด๋ ค์› ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— ์žˆ์–ด Security ๋ถ€๋ถ„์—์„œ ๋ง‰ํžŒ๋‹ค๋ฉด ๋ถ„๋ช… ๋‹ค์‹œ ์ฐพ์„ ๊ฐ•์˜๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๐Ÿ“Œ Spring Batch

์ฐธ ์ข‹์€ ๊ฐ•์˜์˜€๋‹ค. ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ธฐ ์ „์—๋„ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์ง€๋งŒ Spring Batch๋Š” ์ •๋ง ์ฒ˜์Œ์ด์˜€๋‹ค. ๋Œ€๋ถ€๋ถ„์ด ๊ทธ๋Ÿฌ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ๋œ๋‹ค. (๊ฐ•์˜ ์ฃผ์ œ๋กœ ํ”์น˜ ์•Š์œผ๋‹ˆ..) ์ผ๋‹จ ์ž…๋ฌธ์ž์˜ ์‹œ์„ ์œผ๋กœ ๋ดค์„ ๋•Œ ์ดํ•ดํ•˜๊ธฐ ์ข‹๋‹ค. ๊ต‰์žฅํžˆ ๊ธฐ์ดˆ์ ์ธ ๊ฒƒ๋ถ€ํ„ฐ ๋‹จ๊ณ„์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ๋ฌด๋ฆฌ์—†๋‹ค. Batch ์ž์ฒด๋ฅผ ๋ชฐ๋ผ๋„ ๊ฐ€๋Šฅ!

 

๊ฐ ์ฃผ์ œ์˜ ๊ฐ•์˜ ์‹œ์ž‘์‹œ ์ด๋ก ์ ์ธ ๋ถ€๋ถ„์„ ์‚ด์ง ๋‹ค๋ฃจ๊ณ  ๋ผ์ด๋ธŒ ์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ•์˜ ๋ฐฉ์‹์ด ์ฐธ ์ข‹์•˜๋‹ค. ์‹ค์Šต ์˜ˆ์ œ ๋˜ํ•œ ๊ฝค๋‚˜ ํƒ„ํƒ„ํ•˜๊ฒŒ ์งœ์—ฌ์ง„ ๋А๋‚Œ์ด์˜€๋‹ค. ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฒ„์ „์—… ์‹œํ‚ค๋Š” ๋ถ€๋ถ„๋„ ๋‚˜์™€์„œ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ์งœ์•ผ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋„ ๋ฝ€์ธํŠธ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ถ”๊ฐ€๋กœ Batch ๋ถ€๋ถ„๋ง๊ณ  ๊ธฐ๋Šฅ Java ์ฝ”๋“œ์— ์žˆ์–ด์„œ๋„ ๋ฐฐ์šธ ์ ์ด ๋งŽ์•˜๋‹ค. ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ํ˜ผ์ž ์ฐพ์•„๋ณธ Java ๊ด€๋ จ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์•˜๋‹ค. (๋ถ€์กฑํ•จ์„ ๋งค์šฐ ๋А๋‚Œ ..)

 

๋‹ค์Œ์œผ๋กœ ๊ฐ•์˜๊ฐ€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—์„œ ๊ธฐ๋Šฅ๋‹จ์œ„? ๊ฐ•์˜๋‹จ์œ„ ๋ณ„๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ์ง„ํ–‰๋œ๋‹ค. ์ฝ”๋”ฉ์ด๋ผ๋Š”๊ฒŒ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๋‚˜์ค‘์— ์–ธ์ œ๋“  ํ•„์š”ํ•  ๋•Œ ๋ด์•ผํ•˜๋Š”๋ฐ ๊ฐ•์˜๋ฅผ ๋”ฐ๋ผํ•˜๊ธฐ๋งŒ ํ•ด๋„ ์ธ๋ฑ์‹ฑ์ด ์ž˜ ๋˜๋Š” ๋А๋‚Œ์ด๋ผ ์ข‹์•˜๋‹ค. ( ๋‚˜๋Š” ๊ฐ•์˜๋ณด๋‹ค ํŒจํ‚ค์ง€๋ฅผ ์กฐ๊ธˆ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋‚˜๋ˆด๋‹ค)

 

 

๊ทธ๋Ÿผ ์ฒ˜์Œ ๋ฐฐ์›Œ๋ณธ Batch ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์‹œ ๊ธฐ์–ตํ•ด๋ณด์ž!!

 

Job -> Step -> Tasklet / Chunk

 

Chunk๋Š” ItemReader -> ItemProcessor -> ItemWriter

 

ItemReader

ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

                         FlatFileItemReader

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

                        JdbcCursorItemReader, JdbcPagingItemReader, JpaCursorItemReaderBuilder

 

ItemProcessor

ItemProcessor์—์„œ null์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ItemWriter๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

ItemWriter

๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

                        FlatFileItemWriter

๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

                        JpaItemWriter, JdbcBatchItemWriter

 

์ฒ˜์Œ ๋‹ค๋ค„๋ณด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฐœ๋…์ด ๋งŽ์ด ์žˆ์ง€๋งŒ ์ปค๋ฆฌํ˜๋Ÿผ ๋Œ€๋กœ ์ž˜ ๋”ฐ๋ผ์˜จ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ํŠน๋ณ„ํžˆ ํ˜ผ์ž ์ฐพ์•„๋ณด๋ฉด์„œ ๊ณ ์ƒํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ๋„ˆ๋ฌด ์‰ฝ๋‹ค๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ๊ฐ•์˜ ํ›„๋ฐ˜๋ถ€์— ... ๋งค~~์šฐ ์–ด๋ ต๋‹ค.. ํ›„๋ฐ˜๋ถ€์—๋Š” ๋ฐฐ์šด ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ๊ฐ„๋‹จํ•œ๊ฒŒ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ† ๋Œ€๋กœ ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์‹œ๋„๋ฅผ ํ•ด๋ณธ๋‹ค. Async, Multi-Thread, Partition ๋“ฑ ์„ฑ๋Šฅ๊ฐœ์„ ์˜ ํฌ์ธํŠธ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ๊ฐ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ง€ํ‘œ๊นŒ์ง€ ๋ณด์—ฌ์ค€๋‹ค. ์–ธ์  ๊ฐ€ ๋ฐฐ์น˜์ž‘์—…์„ ๊ตฌํ˜„ํ•  ๋•Œ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ด์Šˆ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ๋‹ค์‹œ ๋Œ์•„์™€์„œ ๋“ค์„ ๊ฒƒ์ด๋‹ค.

 

 

๐Ÿ‘ ๊ณ ์ƒํ–ˆ๋‹ค!!

30์ผ ๋ณ„๋กœ ๊ธธ์ง€ ์•Š์€ ์‹œ๊ฐ„์œผ๋กœ ์ƒ๊ฐ๋๋‹ค. ๋ˆˆ ๊นœ๋นกํ•˜๋ฉด ํ˜๋Ÿฌ๊ฐ€์žˆ๋Š” ๊ฒŒ ํ•œ ๋‹ฌ์ด์˜€์œผ๋‹ˆ.. 

๊ทผ๋ฐ ํ•˜๋ฃจ๋„ ๋นผ์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ณ„๋กœ ๊ธธ์ง€ ์•Š์€ ์‹œ๊ฐ„์ž„์—๋„ ํž˜๋“ค์—ˆ๋‹ค. (์ค‘๊ฐ„์— ๊ฐ„์— ์ถ”์„ ใ… ใ… ใ… ใ… ใ… ใ… )

3์ฃผ์ฐจ? ์ •๋„์—์„œ์•ผ ์กฐ๊ธˆ ์Šต๊ด€์ด ๋๋˜ ๊ฒƒ ๊ฐ™๋‹ค.  ์ด์ œ ๋งค์ผ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•˜๋Š”๊ฒŒ ์ต์ˆ™ํ•˜๋‹ค. ์•„์ง๋„ ๋งŽ์ด ๋‚จ์€ ๊ฐ•์˜.. ํ˜ผ์ž๋งŒ์˜ ์ฑŒ๋ฆฐ์ง€๋ฅผ ์ด์–ด๊ฐ€๋ณด์ž!

 

์–ด๋–ค ๊ณ„๊ธฐ๋กœ๋“  ๋ชฉํ‘œ๋ฅผ ๋‘๊ณ  ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ์œจ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ํ™˜๊ธ‰์ด๋ผ๋Š” ๋ชฉํ‘œ๊ฐ€ ์ข€ ๊ทธ๋ ‡๊ธด ํ•ด๋„ ์–ด์จŒ๋“  ๋ชฉํ‘œ๊ฐ€ ์ˆ˜๋ฆฝ๋˜์—ˆ๊ธฐ์— ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์Šค์Šค๋กœ ์˜์ง€๊ฐ€ ๊ทธ๋ฆฌ ๊ฐ•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ •๋ง ๊ฐ•์ถ”ํ•˜๊ณ  ์‹ถ๋‹ค. ๋„ˆ๋ฌด ์‹ฌํ•œ ์ฑ„์ฐ์งˆ์€ ๋„ˆ๋ฌด ์•„ํ”„๋‹ค.. ํŒจ์ŠคํŠธ์บ ํผ์Šค 30์ผ ์ฑŒ๋ฆฐ์ง€.. ๋‚˜์—๊ฒŒ ๋”ฑ ๋งž๋Š” ํšŒ์ดˆ๋ฆฌ๊ฐ€ ๋˜์–ด ์ฃผ์—ˆ๋‹ค. ใ…Ž


 

 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

 

โœ…  ์ˆ˜๊ฐ•์ธ์ฆ!!

1. SpringDataJpa ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ

 

 

2. SpringBatch ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ

 

 

3. SpringSecurity.. ๊ฐ€์žฅ ํž˜๋“ค์—ˆ์ง€๋งŒ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋„์›€์ด ๋  ๋‚˜๋งŒ์˜ ์ž๋ฃŒ 

 

4. ์ฒซ ๋‚ ..์˜ ์ˆ˜๊ฐ•๊ธฐ๋ก

 

 

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.