๐Ÿ–ฅ์ˆœ์ˆ˜ JAVA ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋Š” ์Šคํ”„๋ง ํ•ต์‹ฌ IOC(์ œ์–ด์˜ ์—ญ์ „), DI(์˜์กด๊ด€๊ณ„ ์ฃผ์ž…)โ—๏ธ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป

DEVJUNยท2021๋…„ 12์›” 19์ผ
0
post-thumbnail

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„  ๊ฐ์ฒด์ง€ํ–ฅ 5์›์น™(SOLID)์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž. ํšŒ์›์„ ๊ฐ€์ž…ํ•˜๊ณ  ํšŒ์›์„ ์กฐํšŒํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.


  1. ์™ผ์ชฝ์€ ํšŒ์›์˜ ๋“ฑ๊ธ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค (์ƒ์ˆ˜๋“ค๋ผ๋ฆฌ ๋ชจ์•„ ๋†“์€ enum(์—ด๊ฑฐํ˜•)์ด๊ณ  ์˜ค๋ฅธ์ชฝ์€ ํšŒ์› ํด๋ž˜์Šค์ด๋‹ค.


  1. ์™ผ์ชฝ์€ ํšŒ์›์„ ์ €์žฅํ•  ๊ฒฝ์šฐ์— ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ์ž์ฒด ๋””๋น„๋‚˜, ์™ธ๋ถ€ ๋””๋น„์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํšŒ์›์ €์žฅ์†Œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™” ํ–ˆ๊ณ , ์˜ค๋ฅธ์ชฝ์€ ํšŒ์›์ €์žฅ์†Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ํšŒ์›์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌํ˜„ํด๋ž˜์Šค์ด๋‹ค.


  1. ์™ผ์ชฝ์€ ํšŒ์›์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  ์˜ค๋ฅธ์ชฝ์€ ํšŒ์› ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ ๊ตฌํ˜„ํด๋ž˜์Šค์ด๋‹ค.

3๋ฒˆ ์˜ค๋ฅธ์ชฝ ์ด๋ฏธ์ง€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

private final MemberRepository memberRepository = new MemoryMemberRepository();

์ด ์ฝ”๋“œ์— MemberServiceImpl ์ด๋ผ๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฟ ์•„๋‹ˆ๋ผ MemoryMemberRepositroy ๋ผ๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค์—๋„ ์˜์กด์„ ํ•˜๊ณ  ์žˆ๋‹ค.

์ฆ‰ ๊ฐ์ฒด์ง€ํ–ฅ 5์›์น™ OCP (๊ฐœ๋ฐฉ ํ์‡„ ์›์น™)๊ณผ DIP(์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ์›์น™)์„ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” OCP๋Š” ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์œผ๋‚˜ ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ์—ฌ๊ธฐ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” MemberServiceImpl ํด๋ž˜์Šค์ด๋‹ค.

์ง€๊ธˆ์€ MemoryMemberRepository(๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋งŒ์•ฝ DBRepository(๋””๋น„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์› ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค๋ฉด

private final MemberRepository memberRepository = new DBRepository();

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€” ๊ฒƒ์ด๊ณ  ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ(MemberServiceImpl class)๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Š” OCP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ถ”์ƒํ™”(์ธํ„ฐํŽ˜์ด์Šค)์—๋งŒ ์˜์กดํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ณด์•˜๋“ฏ์ด ๊ตฌ์ฒด ํด๋ž˜์Šค์—๋„ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ์— DIP๊นŒ์ง€ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„ ์ฆ‰ ์‹คํ–‰์—๋งŒ ์‹ ๊ฒฝ์„ ์จ์•ผํ•˜๋Š”๋ฐ, ๋ฌด์—‡์„ ์ž์‹ ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ• ์ง€ ๋””๋น„์— ์ €์žฅํ• ์ง€ ๋“ฑ์„ ๊ฒฐ์ •ํ•˜๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค. SRP(๋‹จ์ผ์ฑ…์ž„ ์›์น™)๊นŒ์ง€ ์œ„๋ฐฐํ•˜๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ๋Š” ์œ„ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•ด์•ผ ํ•œ๋‹คโ€ผ๏ธ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•˜๊ณ  ์–ด๋””์— ์ €์žฅ์„ ํ• ์ง€๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์„ ๋ฐ›์œผ๋ฉด ๋ ๊ฒƒ์ด๋‹ค.



๋ฐ‘์— ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ณด๊ฒŒ ๋˜๋ฉด OCP์™€ DIP ๋ชจ๋‘๋ฅผ ์ง€ํ‚จ ๋‹ค์ด์–ด๊ทธ๋žจ์ด๋‹ค.



์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹์„ ๊ตฌ์„ฑ ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง€๋Š” ๋ณ„๋„์˜ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค

AppConfig ํด๋ž˜์Šค์—์„œ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค)๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…(์—ฐ๊ฒฐ)ํ•ด์ค€๋‹ค.

์˜ค๋ฅธ์ชฝ MemberServiceImpl์—์„œ ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋œ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Private final MemberRepository memberRepository;

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋“œ๋””์–ด ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  ๊ทธ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์„œ ์–ด๋–ค ๊ฒƒ์œผ๋กœ ์ €์žฅํ• ์ง€๋Š” AppConfigํด๋ž˜์Šค(์™ธ๋ถ€)์—์„œ ๊ฒฐ์ •์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ MemberServiceImplํด๋ž˜์Šค์—์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๊ฒŒ ๋˜๊ณ , ์˜์กด๊ด€๊ณ„๋Š” ์™ธ๋ถ€์— ๋งก๊ธฐ๊ณ  ์ €์žฅ, ์กฐํšŒ ๋“ฑ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถœ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์ธ MemberServiceImplํด๋ž˜์Šค ์ž…์žฅ์—์„œ ๋ดค์„ ๋•Œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์•„ ์ด๊ฒƒ์„ ๐Ÿ‘๐Ÿป DI(Dependency Injection) ์˜์กด์„ฑ ์ฃผ์ž… ๋‹ค๋ฅธ ๋ง๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.



AppConfig ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ด ๋ณด์ด๋„๋ก ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

๋ฆฌํŒฉํ† ๋ง์„ ํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๊ตฌ์„ฑ์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด MemberServiceImpl์ด๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ์˜ ๊ธฐ๋Šฅ ๋ฟ ์•„๋‹ˆ๋ผ ์–ด๋””์— ์ €์žฅํ• ์ง€ ๊นŒ์ง€ ๊ฒฐ์ •์„ ํ•˜์—ฌ OCP, DIP๋ฅผ ์œ„๋ฐ˜ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ AppConfig๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์™ธ๋ถ€์—์„œ ์–ด๋””์— ์ €์žฅํ• ์ง€ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด ์คŒ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ œ์–ดํ๋ฆ„์ด AppConfigํด๋ž˜์Šค๋กœ ๋„˜์–ด๊ฐ”๋‹ค.

์ด๋ฅผ IOC(์ œ์–ด์˜ ์—ญ์ „)์ด๋ผ ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ (๋Ÿฐํƒ€์ž„)์— ์™ธ๋ถ€์—์„œ ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์‹ค์ œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ ๋˜๋Š” ๊ฒƒ์„ DI(์˜์กด๊ด€๊ณ„ ์ฃผ์ž…)์ด๋ผ ํ•œ๋‹ค!! ๐Ÿ–ฅ

์ถœ์ฒ˜

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

profile
๐Ÿง‘๐Ÿปโ€๐Ÿ’ปiOS

0๊ฐœ์˜ ๋Œ“๊ธ€