๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ชฉ๋ก๐—ฃ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด๐Ÿ’ป/๐’๐ฉ๐ซ๐ข๐ง๐  (28)

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] Spock

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ๊ธฐ๋Šฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•ด์ค€๋‹ค. ex) A๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€๋กœ ๊ฐœ๋ฐœํ•˜์—ฌ ์˜คํ”ˆํ–ˆ๋”๋‹ˆ ๊ธฐ์กด์— ์ž˜ ์‚ฌ์šฉํ•˜๋˜ B๋ผ๋Š” ๊ธฐ๋Šฅ์ด ๋ฌธ์ œ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„ ์ดˆ๊ธฐ์— ๋ฌธ์ œ ๋ฐœ๊ฒฌ์— ๋„์›€์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•! ex) ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—†์ด ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ -> ๋ฐฐํฌ ํ›„ ๋ฌธ์ œ ๋ฐœ์ƒ -> ์›์ธ ํŒŒ์•…, ๋‹ค์‹œ ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ์ˆ˜์ • -> ์•ผ๊ทผ.. Spock ํ”„๋ ˆ์ž„์›Œํฌ BDD(Behaviour-Driven Development) ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋Œ€ํ•˜๋Š” ๋™์ž‘๊ณผ ํ…Œ์ŠคํŠธ์˜ ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด์ฃผ๊ณ  ์‚ฐ๋งŒํ•œ ์ฝ”๋“œ๋Š” ๋’ค๋กœ ์ˆจ๊ฒจ์ฃผ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. Groovy ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฉฐ JUnit ..

[Spring] Docker

Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๋„๊ตฌ์ด๋ฉฐ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค ๊ฐ€์ƒํ™” ํ”Œ๋žซํผ ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐœ๋…์—์„œ ๋ฌผ๊ฑด์„ ์†์‰ฝ๊ฒŒ ์šด์†กํ•ด์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ์†์‰ฝ๊ฒŒ ๋ฐฐํฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. •์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ๋ฐฉ์‹์€ ๊ตฌ๊ธ€์„ ๋น„๋กฏํ•ด ๋Œ€๋ถ€๋ถ„ ์„œ๋น„์Šค ํšŒ์‚ฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ์„œ๋น„์Šค ์šด์˜ ์ค‘ ๋”ฐ๋ผ์„œ AWS, Azure, Google Cloud๋“ฑ ์–ด๋””์„œ๋“  ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค. ์™œ Docker ๋ฅผ ์‚ฌ์šฉํ• ๊นŒ? ๋„์ปค๋Š” ์„œ๋ฒ„๋งˆ๋‹ค ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์šด์˜์ฒด์ œ๋ถ€ํ„ฐ ์ปดํŒŒ์ผ๋Ÿฌ, ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋“ฑ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ auto scaling ์— ์œ ๋ฆฌํ•˜๋‹ค. ๋„์ปค์™€ ๊ธฐ์กด ๊ฐ€์ƒํ™” ๊ธฐ์ˆ (VM) ๊ฐ€์ƒํ™”๋ž€? ๊ฐ€์ƒํ™”๋Ÿฐ ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์ ์ธ ์„œ๋ฒ„..

[Spring] Entity,์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

Entity ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ๋Œ€์‘ํ•˜๋Š” ํด๋ž˜์Šค @Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” JPA์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ์—”ํ‹ฐํ‹ฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. EntityManager ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ๋‚ด๋ถ€์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context)๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋“ค์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋ณธ ๋™์ž‘์ธ CRUD(Create, Read, Update, Delete)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ์ƒ๋ช…์ฃผ๊ธฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด์šฉ ๋น„์˜์†(new) new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ƒํƒœ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ์ด ์—†๋Š” ์ƒํƒœ ์˜์†(managed) - ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ - ์˜์† ์ƒ..

[Spring] DI (์™œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?)

DI (Dependency Injection) ์˜์กด์„ฑ ์ฃผ์ž…(์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…) ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•œ ํ›„ ์ฃผ์ž…์‹œ์ผœ ์ค€๋‹ค. ์žฅ์  ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค. ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์—†์• ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐํ•ฉ๋„(coupling)์€ ๋‚ฎ์ถ”๋ฉด์„œ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์ž‘์„ฑ์€ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๋‘ ๊ฐ์ฒด ๊ฐ„์— ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒฐํ•ฉ๋œ ๊ฐ์ฒด๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DI๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ฏ€๋กœ ์˜์กด๊ด€๊ณ„๊ฐ€ ์•ฝํ•ด์ง€๊ณ  ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• 1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)..

[Spring] JPA, ORM

JPA(Java Persistence API) Java ์ง„์˜์—์„œ ORM(Object-Relational Mapping) ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ ์ธํ„ฐํŽ˜์ด์Šค ์ด๊ธฐ ๋•Œ๋ฌธ์— Hibernate, OpenJPA ๋“ฑ์ด JPA๋ฅผ ๊ตฌํ˜„ํ•จ ORM(Object-Relational Mapping) Object Relational Mapping = ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ) ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ persistent API๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋ฉค๋ฒ„ ํ…Œ์ด๋ธ”์˜ ๋„ค์ž„์€ ๋ฉค๋ฒ„ ๊ฐ์ฒด์˜ ๋„ค์ž„ ํ•„๋“œ์— ๋งคํ•‘๋˜๋ฉด ๋  ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์„ ORM์ด๋ผ๊ณ  ๋ถ€..

[Spring] TestCode, TDD, JUnit, assertJ

Test Code ์ œํ’ˆ ๋˜๋Š” ์„œ๋น„์Šค์˜ ํ’ˆ์งˆ์„ ํ™•์ธํ•˜๊ณ  ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜, ํŠน์ •ํ•œ ๊ธฐ๋Šฅ, UI, ์„ฑ๋Šฅ, API์ŠคํŽ™์ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ข…๋ฅ˜ ํ…Œ์ŠคํŠธ ํ”ผ๋ผ๋ฏธ๋“œ๋Š” ๋Œ€์ƒ ๋ฒ”์œ„๋‚˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ Unit test(๋‹จ์œ„ ํ…Œ์ŠคํŠธ), Integration test(ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ), UI ํ…Œ์ŠคํŠธ(E2E ํ…Œ์ŠคํŠธ) 3๊ฐ€์ง€์˜ ํ…Œ์ŠคํŠธ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฒƒ์ด ํ…Œ์ŠคํŠธ ํ”ผ๋ผ๋ฏธ๋“œ์ž…๋‹ˆ๋‹ค. 1. Unit Test ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋‚˜ ๋ชจ๋“ˆ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ๋‹จ์œ„์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์ฐจ์˜ ํƒ€์ด์–ด๋ฅผ ํ•˜๋‚˜ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ..

[Spring] AOP

AOP (Aspect Oriented Programming) ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ ์–ด๋–ค ๋กœ์ง์„ ํ•ต์‹ฌ์ ์ธ ๊ด€์ , ๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ทธ ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™” ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ—ค์น˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ• ํ•ต์‹ฌ์ ์ธ ๊ด€์ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง. ๋ถ€๊ฐ€์ ์ธ ๊ด€์ : ํ•ต์‹ฌ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ DB ์—ฐ๊ฒฐ(JDBC), ๋กœ๊น…, ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๋“ฑ AOP์˜ ์žฅ์  ๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌํ•ญ์œผ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ์‹œ์ผœ ํ•ต์‹ฌ ๋กœ์ง์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ์— ๋”ฐ๋ผ ์ฝ”๋“œ์˜ ์ค‘๋ณต ์ œ๊ฑฐ, ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋“ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์— ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ˆ˜์ • ์—†์ด ํ•ด๋‹น ๋กœ์ง๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค. AOP ์ฃผ์š” ํ‚ค์›Œ๋“œ Aspect ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ(Cros..