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

๋ชฉ๋ก์ „์ฒด ๊ธ€ (105)

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

[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..

[Spring] Bean, Component

โญ ์Šคํ”„๋ง ๋นˆ(Spring Bean) Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด Class๋ฅผ ์ƒ์„ฑํ•˜๊ณ  new ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•œ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Spring์ด ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด ์ฆ‰, new ์—ฐ์‚ฐ์ž๋กœ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ๊ทธ ๊ฐ์ฒด๋Š” Bean ์ด ์•„๋‹ˆ๋ฉฐ ApplicationContext.getBean()์œผ๋กœ ์–ป์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Spring์—์„œ์˜ ๋นˆ์€ ApplicationContext๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด, ์ฆ‰ ApplicationContext๊ฐ€ ๋งŒ๋“ค์–ด์„œ ๊ทธ ์•ˆ์— ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ @Component, @Service, @Repository, @Controller, @Configuration ๋“ฑ๋“ฑ ์ด๋Ÿฌํ•œ Bean ๋“ค์€ ์–ด๋–ป๊ฒŒ ..