๐ŸŒฑ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒฑ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํ•ซํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด์š”. ๋ฐ”๋กœ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฑฐ ์™„์ „ ๋Œ€๋ฐ• ์ฃผ์ œ ์•„๋‹ˆ์—์š”? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜Ž

์š”์ฆ˜ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋Œ€์„ธ๋ผ๊ณ  ํ•˜๋˜๋ฐ, ์—ฌ๋Ÿฌ๋ถ„๋„ ๋“ค์–ด๋ณด์…จ์ฃ ? ์•„์ง ๋ชจ๋ฅด์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, ์Šคํ”„๋ง์€ ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”. ์™„์ „ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋ฒ ํ”„๋ž„๊นŒ์š”? ๐Ÿ‘ฏโ€โ™‚๏ธ

์ด ๊ธ€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„๋„ ์Šคํ”„๋ง ๋งˆ์Šคํ„ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”! ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๋ ˆ์ธ ๊ณ ~! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐ŸŒŸ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ž€ ๋ญ˜๊นŒ์š”?

์ž, ๋จผ์ € ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ญ”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ์Šคํ”„๋ง์€ ์ž๋ฐ” ํ”Œ๋žซํผ์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ์ž๋ฐ”๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ ๋„์™€์ฃผ๋Š” ๋“ ๋“ ํ•œ ์กฐ๋ ฅ์ž๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ . ๐Ÿ˜Š

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ํŠน์ง•์€ '์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)'๊ณผ '์ œ์–ด์˜ ์—ญ์ „(Inversion of Control)'์ด์—์š”. ์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ์š”? ใ…‹ใ…‹ใ…‹ ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”!

์˜์กด์„ฑ ์ฃผ์ž…(DI): ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ํ•„์š”ํ•œ ๊ฒƒ์„ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ํŽธ์˜์ ์—์„œ ํ•„์š”ํ•œ ๋ฌผ๊ฑด์„ ์‚ฌ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿช

์ œ์–ด์˜ ์—ญ์ „(IoC): ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฃผ๋„ํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด์—์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ํƒ์‹œ๋ฅผ ํƒ”์„ ๋•Œ, ์šด์ „์€ ํƒ์‹œ ๊ธฐ์‚ฌ๋‹˜๊ป˜ ๋งก๊ธฐ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ ! ๐Ÿš•

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•๋ถ„์— ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ด ํ›จ์”ฌ ํŽธํ•ด์ง€๊ณ , ์ฝ”๋“œ๋„ ๊น”๋”ํ•ด์ง„๋‹ต๋‹ˆ๋‹ค. ์™„์ „ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด์ฃ ? ๐Ÿ‘

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์—ฌ๋Ÿฌ๋ถ„! ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ์•„์„ธ์š”? ๊ฐœ๋ฐœ์ž๋“ค์˜ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์ธ๋ฐ, ๊ฑฐ๊ธฐ์„œ๋„ ์Šคํ”„๋ง ๊ด€๋ จ ๊ฐ•์˜๋‚˜ ํ”„๋กœ์ ํŠธ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Œ€์š”. ๋‚˜์ค‘์— ํ•œ ๋ฒˆ ๋“ค์–ด๊ฐ€ ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ˜‰

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฃผ์š” ํŠน์ง• Spring Framework Dependency Injection Inversion of Control

์ž, ์ด์ œ ์Šคํ”„๋ง์ด ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ใ…Žใ…Ž ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šคํ”„๋ง์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿค“

๐Ÿ› ๏ธ ์Šคํ”„๋ง ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •ํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šคํ”„๋ง์œผ๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๊ทธ ์ „์— ๋จผ์ € ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด์•ผ ํ•ด์š”. ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์–ด๋ ต์ง€ ์•Š์•„์š”! ๐Ÿ˜‰

์Šคํ”„๋ง ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” JDK(Java Development Kit), IDE(ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ), ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ด์š”. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”?

1. JDK ์„ค์น˜ํ•˜๊ธฐ ๐Ÿ–ฅ๏ธ

JDK๋Š” ์ž๋ฐ” ๊ฐœ๋ฐœ ํ‚คํŠธ์˜ˆ์š”. ์Šคํ”„๋ง์€ ์ž๋ฐ” ๊ธฐ๋ฐ˜์ด๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ํ•„์š”ํ•˜๊ฒ ์ฃ ? ใ…Žใ…Ž

  • Oracle ํ™ˆํŽ˜์ด์ง€์—์„œ ์ตœ์‹  ๋ฒ„์ „์˜ JDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์š”.
  • ์„ค์น˜ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ณ  ์ง€์‹œ์— ๋”ฐ๋ผ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.
  • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— JAVA_HOME์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.

JAVA_HOME ์„ค์ •์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ๊ทธ๋ƒฅ ์ปดํ“จํ„ฐํ•œํ…Œ "์•ผ, ์ž๋ฐ” ์–ด๋”” ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค˜~"๋ผ๊ณ  ๋งํ•ด์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ๐Ÿ˜†

2. IDE ์„ค์น˜ํ•˜๊ธฐ ๐Ÿ–ฑ๏ธ

IDE๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด์—์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด์ฃ . ์Šคํ”„๋ง ๊ฐœ๋ฐœ์—๋Š” ์ฃผ๋กœ IntelliJ IDEA๋‚˜ Eclipse๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์š”.

IntelliJ IDEA vs Eclipse

- IntelliJ IDEA: ๋” ํ˜„๋Œ€์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•ด์š”. ํ•˜์ง€๋งŒ ์œ ๋ฃŒ ๋ฒ„์ „์ด ์žˆ์–ด์š”. ๐Ÿ˜ข

- Eclipse: ๋ฌด๋ฃŒ์ด๊ณ  ์˜คํ”ˆ์†Œ์Šค์˜ˆ์š”. ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•ด์„œ ํ™•์žฅ์„ฑ์ด ์ข‹์•„์š”. ๐Ÿ†“

์–ด๋–ค ๊ฑธ ์„ ํƒํ• ์ง€๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์ทจํ–ฅ์— ๋‹ฌ๋ ธ์–ด์š”. ๋‘˜ ๋‹ค ํ›Œ๋ฅญํ•œ IDE๋‹ˆ๊นŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”!

3. ๋นŒ๋“œ ๋„๊ตฌ ์„ค์น˜ํ•˜๊ธฐ ๐Ÿ”จ

๋นŒ๋“œ ๋„๊ตฌ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”. ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ฃผ๋กœ Maven์ด๋‚˜ Gradle์„ ์‚ฌ์šฉํ•ด์š”.

  • Maven: XML ๊ธฐ๋ฐ˜์˜ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์š”. ์ข€ ๋” ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์ด์ฃ .
  • Gradle: Groovy๋‚˜ Kotlin ๊ธฐ๋ฐ˜์˜ DSL์„ ์‚ฌ์šฉํ•ด์š”. ๋” ์œ ์—ฐํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์•„์š”.

์ฒ˜์Œ์—๋Š” Maven์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์™œ๋ƒ๊ณ ์š”? ์„ค์ •์ด ์ข€ ๋” ์ง๊ด€์ ์ด๊ฑฐ๋“ ์š”! ๋‚˜์ค‘์— ์‹ค๋ ฅ์ด ๋Š˜๋ฉด Gradle๋กœ ๊ฐˆ์•„ํƒ€๋Š” ๊ฒƒ๋„ ์ข‹๊ฒ ์ฃ ? ๐Ÿ˜Ž

์Šคํ”„๋ง ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์š”์†Œ JDK IDE Build Tool Spring Project

์ž, ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •์ด ๋๋‚ฌ์–ด์š”! ์–ด๋•Œ์š”, ์ƒ๊ฐ๋ณด๋‹ค ๋ณ„๊ฑฐ ์•„๋‹ˆ์ฃ ? ใ…Žใ…Ž ์ด์ œ ์ง„์งœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋์–ด์š”. ๐Ÿš€

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ํ˜น์‹œ ์ด๋Ÿฐ ํ™˜๊ฒฝ ์„ค์ •์ด ์–ด๋ ค์šฐ์‹  ๋ถ„๋“ค ๊ณ„์‹ ๊ฐ€์š”? ๊ทธ๋Ÿด ๋•Œ๋Š” ์žฌ๋Šฅ๋„ท์—์„œ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด 1:1๋กœ ๋„์™€์ค„ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์™„์ „ ๊ฟ€ํŒ์ด์ฃ ? ๐Ÿ˜‰

์ž, ์ด์ œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋„ ์ค€๋น„๋์œผ๋‹ˆ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ ์„น์…˜์—์„œ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค! ๐Ÿ’ช

๐ŸŒฑ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

์ž, ์ด์ œ ์ง„์งœ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”! ๋‘๊ทผ๋‘๊ทผํ•˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜†

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€์˜ˆ์š”. ํ•˜๋‚˜๋Š” Spring Initializr๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” IDE์—์„œ ์ง์ ‘ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ์šฐ๋ฆฌ๋Š” ๋” ์‰ฝ๊ณ  ๋น ๋ฅธ Spring Initializr ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฑฐ์˜ˆ์š”!

1. Spring Initializr ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿš€

Spring Initializr๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์›น ๋„๊ตฌ์˜ˆ์š”. ์™„์ „ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด์ฃ !

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ https://start.spring.io์— ์ ‘์†ํ•ด์š”.
  2. ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์„ ํƒํ•ด์š”:
    • Project: Maven Project (์ฒ˜์Œ์ด๋‹ˆ๊นŒ Maven์œผ๋กœ ๊ฐ‘์‹œ๋‹ค!)
    • Language: Java
    • Spring Boot: ์ตœ์‹  ์•ˆ์ • ๋ฒ„์ „ ์„ ํƒ
    • Project Metadata: Group, Artifact ๋“ฑ์„ ์„ค์ •ํ•ด์š”. ์ด๊ฑด ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์ด๋‚˜ ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ •ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.
    • Dependencies: ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์„ ํƒํ•ด์š”. ์ผ๋‹จ 'Spring Web'์€ ๊ผญ ์„ ํƒํ•˜์„ธ์š”!
  3. 'Generate' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กœ์ ํŠธ zip ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋ผ์š”.
  4. ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ zip ํŒŒ์ผ์„ ์›ํ•˜๋Š” ์œ„์น˜์— ์••์ถ• ํ•ด์ œํ•ด์š”.

์™€์šฐ! ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋์–ด์š”. ์™„์ „ ์‰ฝ์ฃ ? ใ…Žใ…Ž ๐Ÿ˜Ž

2. IDE์—์„œ ํ”„๋กœ์ ํŠธ ์—ด๊ธฐ ๐Ÿ–ฅ๏ธ

์ž, ์ด์ œ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ IDE์—์„œ ์—ด์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. IntelliJ IDEA๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์„ค๋ช…ํ• ๊ฒŒ์š”.

  1. IntelliJ IDEA๋ฅผ ์‹คํ–‰ํ•ด์š”.
  2. 'Open' ๋˜๋Š” 'Import Project'๋ฅผ ์„ ํƒํ•ด์š”.
  3. ์••์ถ• ํ•ด์ œํ•œ ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ์„ ํƒํ•˜๊ณ  'OK'๋ฅผ ํด๋ฆญํ•ด์š”.
  4. Maven ํ”„๋กœ์ ํŠธ๋กœ ์ธ์‹ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•  ๊ฑฐ์˜ˆ์š”. ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”!

์งœ์ž”~ ๐ŸŽ‰ ์ด์ œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๊ฐ€ IDE์—์„œ ์—ด๋ ธ์–ด์š”! ์–ด๋•Œ์š”, ์ƒ๊ฐ๋ณด๋‹ค ๋ณ„๊ฑฐ ์•„๋‹ˆ์ฃ ?

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๊ณผ์ • Spring Initializr Download ZIP Extract ZIP Open in IDE

3. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ ๐Ÿ”

์ž, ์ด์ œ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”? ์ฒ˜์Œ ๋ณด๋ฉด ์ข€ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”!

  • src/main/java: ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๊ณณ์ด์—์š”.
  • src/main/resources: ์„ค์ • ํŒŒ์ผ์ด๋‚˜ ์ •์  ๋ฆฌ์†Œ์Šค๊ฐ€ ์œ„์น˜ํ•ด์š”.
  • src/test: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๊ณณ์ด์—์š”.
  • pom.xml: Maven ํ”„๋กœ์ ํŠธ์˜ ์„ค์ • ํŒŒ์ผ์ด์—์š”. ์˜์กด์„ฑ์ด๋‚˜ ๋นŒ๋“œ ์„ค์ •์„ ๊ด€๋ฆฌํ•ด์š”.

ํŠนํžˆ src/main/java ํด๋” ์•ˆ์— ์žˆ๋Š” ๋ฉ”์ธ ํด๋ž˜์Šค๋ฅผ ์ฃผ๋ชฉํ•ด์ฃผ์„ธ์š”. ์ด ํด๋ž˜์Šค์— @SpringBootApplication ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘์ ์ด์—์š”!

์–ด๋•Œ์š”? ์ด์ œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋์–ด์š”! ๐Ÿ˜ƒ

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ํ˜น์‹œ ์ด ๊ณผ์ •์—์„œ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๊ทธ๋Ÿด ๋•Œ๋Š” ์žฌ๋Šฅ๋„ท์„ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ง์ ‘ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”. ์•„, ๋ฌผ๋ก  ๊ตฌ๊ธ€๋ง๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”! ใ…‹ใ…‹ใ…‹ ๐Ÿ”

์ž, ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋„ ์•Œ์•˜์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ์š”? ๋‹ค์Œ์€ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿš€

๐Ÿ–ฅ๏ธ ์ฒซ ๋ฒˆ์งธ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

๋“œ๋””์–ด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์‹œ๊ฐ„์ด์—์š”! ๐Ÿ˜† ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ ๋ฒˆ์งธ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋ ˆ์ธ ๊ณ ~! ๐Ÿš€

1. ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค๊ธฐ ๐ŸŽฎ

์Šคํ”„๋ง MVC์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์˜ˆ์š”. ๊ฐ„๋‹จํ•œ "Hello, World!" ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.

src/main/java ํด๋” ์•„๋ž˜์— ์žˆ๋Š” ํŒจํ‚ค์ง€(์˜ˆ: com.example.demo)์— ์ƒˆ๋กœ์šด ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ์ด๋ฆ„์€ HelloController.java๋กœ ํ• ๊ฒŒ์š”.


package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

์šฐ์™€! ์ฒซ ๋ฒˆ์งธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”. ๐Ÿ‘ ์ด๊ฒŒ ๋ญ˜ ํ•˜๋Š” ์ฝ”๋“œ์ธ์ง€ ๊ถ๊ธˆํ•˜์ฃ ? ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”!

  • @RestController: ์ด ํด๋ž˜์Šค๊ฐ€ RESTful ์›น ์„œ๋น„์Šค์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๋Š” ๊ฑธ ์Šคํ”„๋ง์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด์—์š”.
  • @GetMapping("/hello"): "/hello" URL๋กœ ๋“ค์–ด์˜ค๋Š” GET ์š”์ฒญ์„ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๋œป์ด์—์š”.
  • hello() ๋ฉ”์„œ๋“œ: "Hello, World!" ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œ๋  ๋‚ด์šฉ์ด์—์š”!

์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ฃ ? ใ…Žใ…Ž ๐Ÿ˜‰

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ํ•˜๊ธฐ ๐Ÿƒโ€โ™‚๏ธ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๋ฉ”์ธ ํด๋ž˜์Šค(๋ณดํ†ต DemoApplication.java๋ผ๋Š” ์ด๋ฆ„)๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”.


@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

์ด ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•ด์š”. ์™„์ „ ์‹ ๊ธฐํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜ฒ

3. ๊ฒฐ๊ณผ ํ™•์ธํ•˜๊ธฐ ๐Ÿ”

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:8080/hello๋กœ ์ ‘์†ํ•ด๋ณด์„ธ์š”.

์งœ์ž”~ ๐ŸŽ‰ "Hello, World!"๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ฌ๋‚˜์š”? ์ถ•ํ•˜๋“œ๋ ค์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ ๋ฒˆ์งธ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋™์ž‘ํ–ˆ์–ด์š”!

์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘ ๊ณผ์ • Browser Spring App GET /hello Hello, World!

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์Šคํ”„๋ง์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๊ฒŒ ๋์–ด์š”! ๐Ÿ‘

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ํ˜น์‹œ ์ด ๊ณผ์ •์—์„œ ์–ด๋ ค์›€์„ ๊ฒช์œผ์…จ๋‚˜์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”. ๊ฐœ๋ฐœ์€ ํ•ญ์ƒ ์‹œํ–‰์ฐฉ์˜ค์˜ ์—ฐ์†์ด์—์š”. ์ €๋„ ์ฒ˜์Œ์—๋Š” ๋งŽ์ด ํ—ค๋งธ๋‹ต๋‹ˆ๋‹ค. ใ…‹ใ…‹ใ…‹ ๐Ÿ˜… ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค ์žฌ๋Šฅ๋„ท๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ์ž๋“ค์˜ ๋„์›€์„ ๋ฐ›์•˜์–ด์š”. ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์กฐ์–ธ์€ ์ •๋ง ํฐ ๋„์›€์ด ๋˜๊ฑฐ๋“ ์š”!

์ž, ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ดค์œผ๋‹ˆ, ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊ฒŒ์š”! ๐Ÿš€

๐Ÿ”ง ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ ํ™•์žฅํ•˜๊ธฐ

์šฐ๋ฆฌ์˜ "Hello, World!" ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž˜ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋„ค์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋๋‚˜์š”? ๐Ÿ˜Ž

1. ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๐ŸŽญ

๋จผ์ €, URL์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„ ๋™์ ์œผ๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณผ๊ฒŒ์š”. HelloController.java ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.


@GetMapping("/hello/{name}")
public String helloName(@PathVariable String name) {
    return "Hello, " + name + "!";
}

์ด ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • @GetMapping("/hello/{name}"): URL ๊ฒฝ๋กœ์— ๋ณ€์ˆ˜๋ฅผ ํฌํ•จ์‹œ์ผœ์š”. {name} ๋ถ€๋ถ„์ด ๋ณ€์ˆ˜์˜ˆ์š”.
  • @PathVariable String name: URL ๊ฒฝ๋กœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์™€์š”.
  • ๋ฉ”์„œ๋“œ๋Š” "Hello, [์ด๋ฆ„]!"๊ณผ ๊ฐ™์€ ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์š”.

์ด์ œ http://localhost:8080/hello/Spring๊ณผ ๊ฐ™์€ URL๋กœ ์ ‘์†ํ•˜๋ฉด, "Hello, Spring!"์ด๋ผ๋Š” ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ์ฉ”์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

2. JSON ์‘๋‹ต ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๐Ÿ“Š

ํ˜„๋Œ€์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณผ๊ฒŒ์š”.

๋จผ์ €, ๊ฐ„๋‹จํ•œ Person ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”. ์ƒˆ๋กœ์šด ์ž๋ฐ” ํŒŒ์ผ Person.java๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.


public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter์™€ Setter ๋ฉ”์„œ๋“œ๋Š” IDE์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”!
}

์ด์ œ HelloController.java์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณผ๊ฒŒ์š”.


@GetMapping("/person")
public Person getPerson() {
    return new Person("Spring", 15);
}

๋†€๋ž๊ฒŒ๋„ ์ด๊ฒŒ ๋์ด์—์š”! ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ Person ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด์ค„ ๊ฑฐ์˜ˆ์š”. ์™„์ „ ํŽธํ•˜์ฃ ? ๐Ÿ‘

์ด์ œ http://localhost:8080/person์œผ๋กœ ์ ‘์†ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ JSON ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”:


{
  "name": "Spring",
  "age": 15
}

์™€์šฐ! ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ ์  ๋” ๋ฉ‹์ ธ์ง€๊ณ  ์žˆ์–ด์š”! ๐ŸŽ‰

์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ ํ™•์žฅ Dynamic Params JSON Response Future Features Enhanced Spring Web Application

3. ๋” ๋‚˜์•„๊ฐ€๊ธฐ ๐Ÿš€

์—ฌ๊ธฐ๊นŒ์ง€ ์™”๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ์Šคํ”„๋ง์˜ ๊ธฐ๋ณธ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ๊ณ„์‹  ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘ ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์ด๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์•„์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ (JPA๋‚˜ MyBatis ์‚ฌ์šฉ)
  • RESTful API ๊ตฌํ˜„
  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์ด์šฉํ•œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ์Šคํ”„๋ง ๋ถ€ํŠธ ์•ก์ถ”์—์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

์ด๋Ÿฐ ์ฃผ์ œ๋“ค์€ ์กฐ๊ธˆ ๋” ๊ณ ๊ธ‰ ๋‹จ๊ณ„์˜ ๋‚ด์šฉ์ด์—์š”. ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์›Œ๋‚˜๊ฐ€๋ฉด ๋ผ์š”. ๐Ÿ˜Š

๊ทธ๋ฆฌ๊ณ  ๋ง์ด์—์š”, ํ˜น์‹œ ์ด๋Ÿฐ ๊ณ ๊ธ‰ ์ฃผ์ œ๋“ค์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์„ ํ•œ ๋ฒˆ ๋‘˜๋Ÿฌ๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ๊ฑฐ๊ธฐ์—๋Š” ๋‹ค์–‘ํ•œ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ๊ฐœ๋ฐœ์ž๋“ค์ด ์žˆ์–ด์„œ, ๊ณ ๊ธ‰ ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ฐ•์˜๋‚˜ 1:1 ๋ฉ˜ํ† ๋ง์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ๊ฟ€ํŒ์ด์ฃ ? ๐Ÿ˜‰

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ›จ์”ฌ ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ฒŒ ๋์–ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ ๋ฒˆ์งธ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ๋” ๋ฉ‹์ ธ์ง€๊ณ  ์žˆ์–ด์š”! ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ’ช

๐Ÿงช ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์—ฌ๋Ÿฌ๋ถ„, ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ ์  ๋” ๋ฉ‹์ ธ์ง€๊ณ  ์žˆ์–ด์š”! ๐ŸŽ‰ ํ•˜์ง€๋งŒ ์ž ๊น, ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ํ…Œ์ŠคํŠธ์˜ ์ค‘์š”์„ฑ์ด ๋“œ๋Ÿฌ๋‚˜์š”. ์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฒŒ์š”!

1. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ ๐Ÿ”ฌ

๋จผ์ € ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ€์žฅ ์ž‘์€ ๋ถ€๋ถ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”.

src/test/java ํด๋”์— HelloControllerTest.java ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”:


import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class HelloControllerTest {

    @Test
    public void testHello() {
        HelloController controller = new HelloController();
        String result = controller.hello();
        assertEquals("Hello, World!", result);
    }

    @Test
    public void testHelloName() {
        HelloController controller = new HelloController();
        String result = controller.helloName("Spring");
        assertEquals("Hello, Spring!", result);
    }
}

์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • @Test ์–ด๋…ธํ…Œ์ด์…˜์€ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์ž„์„ ๋‚˜ํƒ€๋‚ด์š”.
  • assertEquals๋Š” ์˜ˆ์ƒ ๊ฒฐ๊ณผ์™€ ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์š”.
  • ์šฐ๋ฆฌ๋Š” hello()์™€ helloName() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ๊ฐ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์–ด์š”.

์ด์ œ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋ฉด ์ดˆ๋ก์ƒ‰ ์ฒดํฌ ํ‘œ์‹œ๊ฐ€ ๋œฐ ๊ฑฐ์˜ˆ์š”. ์™„์ „ ๋ฟŒ๋“ฏํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Š

2. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ ๐Ÿ”—

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด์š”. ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ๊ณผ ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด์•ผ ํ•ด์š”. ์ด๊ฑธ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ผ๊ณ  ํ•ด์š”.

๊ฐ™์€ ํด๋”์— HelloControllerIntegrationTest.java ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”:


import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testHelloEndpoint() throws Exception {
        mockMvc.perform(get("/hello"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello, World!"));
    }

    @Test
    public void testHelloNameEndpoint() throws Exception {
        mockMvc.perform(get("/hello/Spring"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello, Spring!"));
    }
}

์šฐ์™€, ์ข€ ๋ณต์žกํ•ด ๋ณด์ด์ฃ ? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • @SpringBootTest๋Š” ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด์—์š”. ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•ด์š”.
  • @AutoConfigureMockMvc๋Š” MockMvc๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ค˜์š”. MockMvc๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์˜ˆ์š”.
  • mockMvc.perform()์„ ํ†ตํ•ด HTTP ์š”์ฒญ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•ด์š”.

์ด ํ…Œ์ŠคํŠธ๋“ค๋„ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”. ๋ชจ๋“  ๊ฒŒ ์ž˜ ๋™์ž‘ํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •๋ง ํŠผํŠผํ•˜๋‹ค๋Š” ๋œป์ด์—์š”! ๐Ÿ‘

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ ๊ณผ์ • Unit Test Integration Test CI/CD Reliable Spring Application

3. ํ…Œ์ŠคํŠธ ์ž๋™ํ™”ํ•˜๊ธฐ ๐Ÿค–

ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์ค‘์š”ํ•ด์š”. CI/CD(์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ๋ฐฐํฌ) ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋ฉด, ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.

GitHub Actions๋‚˜ Jenkins ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ์ž๋™ํ™”๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฌ์ „ํžˆ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž๋™์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ .

ํ…Œ์ŠคํŠธ ์ž๋™ํ™”! ์™„์ „ ๊ฟ€์ด์ฃ ? ๊ฐœ๋ฐœ์ž์˜ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์—„์ฒญ๋‚˜๊ฒŒ ์ ˆ์•ฝํ•ด์ค˜์š”. ๐Ÿ˜‰

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠผํŠผํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ž˜ ํ•ด๋‘๋ฉด, ๋‚˜์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ ํ›จ์”ฌ ๋” ์ž์‹ ๊ฐ ์žˆ๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ํ˜น์‹œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง€์‹œ๋‚˜์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฒ˜์Œ์—๋Š” ๊ทธ๋ž˜์š”. ๐Ÿ˜… ์ด๋Ÿด ๋•Œ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋…ธํ•˜์šฐ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์•„๋‹ˆ๋ฉด ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์˜ˆ์ œ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”!

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์šฐ๋ฆฌ์˜ ๋ฉ‹์ง„ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ด๋–ป๊ฒŒ ๋ฐฐํฌํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋“œ๋””์–ด ์„ธ์ƒ์— ๋‚˜๊ฐ€๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๐Ÿš€ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌํ•˜๊ธฐ

๋“œ๋””์–ด ์šฐ๋ฆฌ์˜ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ธ์ƒ์— ์„ ๋ณด์ผ ์‹œ๊ฐ„์ด ์™”์–ด์š”! ๐Ÿ˜† ๋ฐฐํฌ๋Š” ๊ฐœ๋ฐœ ๊ณผ์ •์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ง€๋งŒ, ๊ฒฐ์ฝ” ์‰ฌ์šด ์ผ์€ ์•„๋‹ˆ์—์š”. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”!

1. JAR ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ ๐Ÿ“ฆ

์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด JAR ํŒŒ์ผ ํ•˜๋‚˜๋กœ ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ด๋””์„œ๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ฃ .

ํ„ฐ๋ฏธ๋„์—์„œ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ ํ›„, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:


./mvnw clean package

์ด ๋ช…๋ น์–ด๋Š” Maven์„ ์‚ฌ์šฉํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์š”. ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด target ํด๋”์— JAR ํŒŒ์ผ์ด ์ƒ์„ฑ๋ผ์š”.

2. ๋กœ์ปฌ์—์„œ JAR ํŒŒ์ผ ์‹คํ–‰ํ•˜๊ธฐ ๐Ÿƒโ€โ™‚๏ธ

์ƒ์„ฑ๋œ JAR ํŒŒ์ผ์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:


java -jar target/your-application-name.jar

์ด์ œ http://localhost:8080์— ์ ‘์†ํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

3. ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•˜๊ธฐ โ˜๏ธ

๋กœ์ปฌ์—์„œ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ํ™•์ธํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ ์„œ๋ฒ„์— ๋ฐฐํฌํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์ค‘์—์„œ Heroku๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณผ๊ฒŒ์š”. Heroku๋Š” ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์ด์—์š”.

  1. Heroku ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  Heroku CLI๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
  2. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด Heroku์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”:
    heroku login
  3. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ Heroku ์•ฑ์„ ์ƒ์„ฑํ•˜์„ธ์š”:
    heroku create
  4. ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ Heroku์— ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜์„ธ์š”:
    git push heroku main

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Heroku์— ๋ฐฐํฌ๋์–ด์š”. Heroku๊ฐ€ ์ œ๊ณตํ•˜๋Š” URL๋กœ ์ ‘์†ํ•ด๋ณด์„ธ์š”. ์„ธ์ƒ์—, ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธํ„ฐ๋„ท์—์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ์–ด์š”! ๐ŸŽ‰

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๊ณผ์ • Build JAR Test Locally Deploy to Cloud Live Spring Application

4. ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋กœ๊น… ๐Ÿ“Š

๋ฐฐํฌ ํ›„์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ด์š”. ์Šคํ”„๋ง ๋ถ€ํŠธ ์•ก์ถ”์—์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋˜ํ•œ, ELK ์Šคํƒ(Elasticsearch, Logstash, Kibana)๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์ฃ .

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ‘์ž๊ธฐ ํŠธ๋ž˜ํ”ฝ์ด ํญ์ฆํ•˜๋ฉด ์„œ๋ฒ„๋ฅผ ์ฆ์„คํ•œ๋‹ค๋“ ์ง€, ์—๋Ÿฌ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” API๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋“ ์ง€ ํ•˜๋Š” ์‹์œผ๋กœ์š”.

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ธ์ƒ์— ๋‚˜์™”์–ด์š”! ๐ŸŒ ์ •๋ง ๋Œ€๋‹จํ•˜์ง€ ์•Š๋‚˜์š”? ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ „ ์„ธ๊ณ„ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฑฐ์˜ˆ์š”!

ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”. ๋ฐฐํฌ๋Š” ๋์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์‹œ์ž‘์ด์—์š”. ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๊ณ , ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋‚˜๊ฐ€์•ผ ํ•ด์š”. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ์ง„์ •ํ•œ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์ด์ฃ ! ๐Ÿ˜Š

๊ทธ๋ฆฌ๊ณ  ๋ง์ด์—์š”, ํ˜น์‹œ ๋ฐฐํฌ ๊ณผ์ •์—์„œ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฒ˜์Œ์—๋Š” ๊ทธ๋ž˜์š”. ์ด๋Ÿด ๋•Œ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋ฐฐํฌ ๋…ธํ•˜์šฐ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์•„๋‹ˆ๋ฉด ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋„์›€์„ ๊ตฌํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”!

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์—ฌ์ •์ด ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ „์ฒด ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ  ์•ž์œผ๋กœ์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ๊ฒŒ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๐Ÿš€

๐ŸŽ“ ์ •๋ฆฌ ๋ฐ ์•ž์œผ๋กœ์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ

์™€์šฐ! ์ •๋ง ๋Œ€๋‹จํ•œ ์—ฌ์ •์ด์—ˆ์–ด์š”, ์—ฌ๋Ÿฌ๋ถ„! ๐Ÿ‘ ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ณ , ๋ฐฐํฌํ•˜๋Š” ์ „ ๊ณผ์ •์„ ํ•จ๊ป˜ ์‚ดํŽด๋ดค์–ด์š”. ์ด์ œ ์ „์ฒด ๊ณผ์ •์„ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

1. ๊ฐœ๋ฐœ ๊ณผ์ • ์ •๋ฆฌ ๐Ÿ“

  1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •: JDK, IDE, ๋นŒ๋“œ ๋„๊ตฌ ์„ค์น˜
  2. ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ: Spring Initializr ์‚ฌ์šฉ
  3. ๊ธฐ๋ณธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ: ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ
  4. ๊ธฐ๋Šฅ ํ™•์žฅ: ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ, JSON ์‘๋‹ต ๋ฐ˜ํ™˜
  5. ํ…Œ์ŠคํŠธ ์ž‘์„ฑ: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
  6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ: JAR ํŒŒ์ผ ์ƒ์„ฑ, ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ํ™œ์šฉ

์ด ๊ณผ์ •์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ์Šคํ”„๋ง์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๊นŒ์ง€ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ๋ฐฐ์› ์–ด์š”. ์ •๋ง ๋Œ€๋‹จํ•ด์š”! ๐ŸŽ‰

2. ์•ž์œผ๋กœ์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ ๐Ÿš€

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„, ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์—์š”. ์Šคํ”„๋ง๊ณผ ์›น ๊ฐœ๋ฐœ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋„“๊ณ  ๊นŠ๋‹ต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋” ๋ฐœ์ „ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์ œ๋“ค์„ ๊ณต๋ถ€ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

  • ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์„ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ: ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋น„๋™๊ธฐ, ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.
  • ๋„์ปค์™€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค: ์ปจํ…Œ์ด๋„ˆํ™”์™€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๋” ํšจ์œจ์ ์ธ ๋ฐฐํฌ์™€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”.
์Šคํ”„๋ง ๊ฐœ๋ฐœ์ž์˜ ์„ฑ์žฅ ๊ฒฝ๋กœ Basic Spring Spring Data Spring Security Spring Cloud Reactive Docker Kubernetes Advanced Spring Developer

์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๋ฒˆ์— ๋ฐฐ์šฐ๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณต๋ถ€ํ•ด ๋‚˜๊ฐ€๋ฉด ๋ผ์š”. ๋กœ๋งˆ๋„ ํ•˜๋ฃจ์•„์นจ์— ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•˜์ž–์•„์š”? ๊ฐœ๋ฐœ ์‹ค๋ ฅ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ๐Ÿ˜‰

3. ์ง€์†์ ์ธ ํ•™์Šต์˜ ์ค‘์š”์„ฑ ๐Ÿ“š

๊ธฐ์ˆ ์˜ ์„ธ๊ณ„๋Š” ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•ด์š”. ํŠนํžˆ ์›น ๊ฐœ๋ฐœ ๋ถ„์•ผ๋Š” ๋”์šฑ ๊ทธ๋ ‡์ฃ . ๊ทธ๋ž˜์„œ ์ง€์†์ ์ธ ํ•™์Šต์ด ์ •๋ง ์ค‘์š”ํ•ด์š”. ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ , ์ตœ์‹  ํŠธ๋ Œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋Š” ๋น„๊ฒฐ์ด์—์š”.

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

4. ๋งˆ๋ฌด๋ฆฌ ๐ŸŽˆ

์—ฌ๋Ÿฌ๋ถ„, ์ •๋ง ๋Œ€๋‹จํ•ด์š”! ์Šคํ”„๋ง์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ํ•จ๊ป˜ ์‚ดํŽด๋ดค์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๊ธฐ๋ณธ์ ์ธ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๊ฒŒ ๋์–ด์š”. ๐Ÿ‘

ํ•˜์ง€๋งŒ ์ด๊ฑด ์‹œ์ž‘์ผ ๋ฟ์ด์—์š”. ์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ , ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€์„ธ์š”. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ์–ธ์  ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„๋„ ๋ฉ‹์ง„ ์Šคํ”„๋ง ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช

๊ทธ๋ฆฌ๊ณ  ๊ธฐ์–ตํ•˜์„ธ์š”. ๊ฐœ๋ฐœ์€ ํ˜ผ์ž ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋„์›€์„ ๋ฐ›๊ณ , ๋˜ ๋‹ค๋ฅธ ์ด๋“ค์„ ๋•๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด์š”. ์žฌ๋Šฅ๋„ท์ด๋‚˜ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ฐ™์€ ํ”Œ๋žซํผ์„ ์ ๊ทน ํ™œ์šฉํ•ด๋ณด์„ธ์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์†Œํ†ตํ•˜๋ฉด์„œ ๋” ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

์ž, ์ด์ œ ์ •๋ง ๋์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฉ‹์ง„ ์Šคํ”„๋ง ๊ฐœ๋ฐœ ์—ฌ์ •์„ ์‘์›ํ• ๊ฒŒ์š”. ์–ธ์  ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  ๋ฉ‹์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์‹์„ ๋“ค์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์„๊ฒŒ์š”. ํŒŒ์ดํŒ…! ๐Ÿš€๐ŸŒŸ