๐ฑ ์คํ๋ง ํ๋ ์์ํฌ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐํ๊ธฐ ๐

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํซํ ์ฃผ์ ๋ก ์ฐพ์์์ด์. ๋ฐ๋ก ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ์ด๊ฑฐ ์์ ๋๋ฐ ์ฃผ์ ์๋์์? ใ ใ ใ ๐
์์ฆ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ๋์ธ๋ผ๊ณ ํ๋๋ฐ, ์ฌ๋ฌ๋ถ๋ ๋ค์ด๋ณด์ จ์ฃ ? ์์ง ๋ชจ๋ฅด์๋ ๋ถ๋ค์ ์ํด ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด, ์คํ๋ง์ ์๋ฐ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ฃผ๋ ํ๋ ์์ํฌ์์. ์์ ๊ฐ๋ฐ์๋ค์ ๋ฒ ํ๋๊น์? ๐ฏโโ๏ธ
์ด ๊ธ์ ํตํด ์ฌ๋ฌ๋ถ๋ ์คํ๋ง ๋ง์คํฐ๊ฐ ๋ ์ ์์ด์! ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณผ๊น์? ๋ ์ธ ๊ณ ~! ๐โโ๏ธ๐จ
๐ ์คํ๋ง ํ๋ ์์ํฌ๋ ๋ญ๊น์?
์, ๋จผ์ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ๋ญ์ง ์์๋ณผ๊น์? ์คํ๋ง์ ์๋ฐ ํ๋ซํผ์ ์ํ ์คํ์์ค ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์์. ์ฝ๊ฒ ๋งํด์, ์๋ฐ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ๋์์ฃผ๋ ๋ ๋ ํ ์กฐ๋ ฅ์๋ผ๊ณ ํ ์ ์์ฃ . ๐
์คํ๋ง์ ํต์ฌ ํน์ง์ '์์กด์ฑ ์ฃผ์ (Dependency Injection)'๊ณผ '์ ์ด์ ์ญ์ (Inversion of Control)'์ด์์. ์ด๊ฒ ๋ญ ์๋ฆฌ๋๊ณ ์? ใ ใ ใ ๊ฑฑ์ ๋ง์ธ์, ์ฐจ๊ทผ์ฐจ๊ทผ ์ค๋ช ํด๋๋ฆด๊ฒ์!
์์กด์ฑ ์ฃผ์ (DI): ์ฝ๊ฒ ๋งํด์, ํ์ํ ๊ฒ์ ์ธ๋ถ์์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด์์. ๋ง์น ์ฐ๋ฆฌ๊ฐ ํธ์์ ์์ ํ์ํ ๋ฌผ๊ฑด์ ์ฌ์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ์! ๐ช
์ ์ด์ ์ญ์ (IoC): ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์๋ ํ๋ ์์ํฌ๊ฐ ์ฃผ๋ํ๋ค๋ ๊ฐ๋ ์ด์์. ๋ง์น ์ฐ๋ฆฌ๊ฐ ํ์๋ฅผ ํ์ ๋, ์ด์ ์ ํ์ ๊ธฐ์ฌ๋๊ป ๋งก๊ธฐ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐
์ด๋ฐ ํน์ง๋ค ๋๋ถ์ ์คํ๋ง์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์ด ํจ์ฌ ํธํด์ง๊ณ , ์ฝ๋๋ ๊น๋ํด์ง๋ต๋๋ค. ์์ ๊ฐ๋ฐ์ ์นํ์ ์ด์ฃ ? ๐
๊ทธ๋ฐ๋ฐ ๋ง์ด์์, ์ฌ๋ฌ๋ถ! ํน์ ์ฌ๋ฅ๋ท์ด๋ผ๋ ์ฌ์ดํธ ์์ธ์? ๊ฐ๋ฐ์๋ค์ ์ฌ๋ฅ์ ๊ณต์ ํ๊ณ ๊ฑฐ๋ํ ์ ์๋ ํ๋ซํผ์ธ๋ฐ, ๊ฑฐ๊ธฐ์๋ ์คํ๋ง ๊ด๋ จ ๊ฐ์๋ ํ๋ก์ ํธ ๋์์ ๋ฐ์ ์ ์๋์. ๋์ค์ ํ ๋ฒ ๋ค์ด๊ฐ ๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์์! ๐
์, ์ด์ ์คํ๋ง์ด ๋ญ์ง ๋์ถฉ ๊ฐ์ด ์ค์๋์? ใ ใ ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋ง์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ป๊ฒ ๊ฐ๋ฐํ๋์ง ์์๋ณผ๊น์? ๐ค
๐ ๏ธ ์คํ๋ง ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ํ๊ธฐ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋ง์ผ๋ก ๊ฐ๋ฐ์ ์์ํด๋ณผ๊น์? ๊ทธ ์ ์ ๋จผ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํด์ผ ํด์. ๊ฑฑ์ ๋ง์ธ์, ์ด๋ ต์ง ์์์! ๐
์คํ๋ง ๊ฐ๋ฐ์ ์ํด์๋ 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๋ก ๊ฐ์ํ๋ ๊ฒ๋ ์ข๊ฒ ์ฃ ? ๐
์, ์ด๋ ๊ฒ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ์ด ๋๋ฌ์ด์! ์ด๋์, ์๊ฐ๋ณด๋ค ๋ณ๊ฑฐ ์๋์ฃ ? ใ ใ ์ด์ ์ง์ง ๊ฐ๋ฐ์ ์์ํ ์ค๋น๊ฐ ๋์ด์. ๐
๊ทธ๋ฐ๋ฐ ๋ง์ด์์, ํน์ ์ด๋ฐ ํ๊ฒฝ ์ค์ ์ด ์ด๋ ค์ฐ์ ๋ถ๋ค ๊ณ์ ๊ฐ์? ๊ทธ๋ด ๋๋ ์ฌ๋ฅ๋ท์์ ๋์์ ๋ฐ์๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์. ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ค์ด 1:1๋ก ๋์์ค ์ ์๊ฑฐ๋ ์. ์์ ๊ฟํ์ด์ฃ ? ๐
์, ์ด์ ๊ฐ๋ฐ ํ๊ฒฝ๋ ์ค๋น๋์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณผ๊น์? ๋ค์ ์น์ ์์ ๊ณ์๋ฉ๋๋ค! ๐ช
๐ฑ ์คํ๋ง ํ๋ก์ ํธ ์์ํ๊ธฐ
์, ์ด์ ์ง์ง ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณผ ๊ฑฐ์์! ๋๊ทผ๋๊ทผํ์ง ์๋์? ใ ใ ใ ๐
์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง์์. ํ๋๋ Spring Initializr๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ IDE์์ ์ง์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด์์. ์ฐ๋ฆฌ๋ ๋ ์ฝ๊ณ ๋น ๋ฅธ Spring Initializr ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฑฐ์์!
1. Spring Initializr ์ฌ์ฉํ๊ธฐ ๐
Spring Initializr๋ ์คํ๋ง ๋ถํธ ๊ธฐ๋ฐ์ ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ์น ๋๊ตฌ์์. ์์ ๊ฐ๋ฐ์ ์นํ์ ์ด์ฃ !
- ๋ธ๋ผ์ฐ์ ์์ https://start.spring.io์ ์ ์ํด์.
- ํ๋ก์ ํธ ์ค์ ์ ์ ํํด์:
- Project: Maven Project (์ฒ์์ด๋๊น Maven์ผ๋ก ๊ฐ์๋ค!)
- Language: Java
- Spring Boot: ์ต์ ์์ ๋ฒ์ ์ ํ
- Project Metadata: Group, Artifact ๋ฑ์ ์ค์ ํด์. ์ด๊ฑด ํ๋ก์ ํธ์ ์ด๋ฆ์ด๋ ํจํค์ง ์ด๋ฆ์ ์ ํ๋ ๊ฑฐ์์.
- Dependencies: ํ์ํ ์์กด์ฑ์ ์ ํํด์. ์ผ๋จ 'Spring Web'์ ๊ผญ ์ ํํ์ธ์!
- 'Generate' ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ๋ก์ ํธ zip ํ์ผ์ด ๋ค์ด๋ก๋๋ผ์.
- ๋ค์ด๋ก๋ ๋ฐ์ zip ํ์ผ์ ์ํ๋ ์์น์ ์์ถ ํด์ ํด์.
์์ฐ! ์ด์ ๊ธฐ๋ณธ์ ์ธ ์คํ๋ง ํ๋ก์ ํธ๊ฐ ์์ฑ๋์ด์. ์์ ์ฝ์ฃ ? ใ ใ ๐
2. IDE์์ ํ๋ก์ ํธ ์ด๊ธฐ ๐ฅ๏ธ
์, ์ด์ ์์ฑ๋ ํ๋ก์ ํธ๋ฅผ IDE์์ ์ด์ด๋ณผ ๊ฑฐ์์. IntelliJ IDEA๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ค๋ช ํ ๊ฒ์.
- IntelliJ IDEA๋ฅผ ์คํํด์.
- 'Open' ๋๋ 'Import Project'๋ฅผ ์ ํํด์.
- ์์ถ ํด์ ํ ํ๋ก์ ํธ ํด๋๋ฅผ ์ ํํ๊ณ 'OK'๋ฅผ ํด๋ฆญํด์.
- Maven ํ๋ก์ ํธ๋ก ์ธ์ํ๊ณ ์๋์ผ๋ก ์์กด์ฑ์ ๋ค์ด๋ก๋ํ ๊ฑฐ์์. ์กฐ๊ธ๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์!
์ง์~ ๐ ์ด์ ์คํ๋ง ํ๋ก์ ํธ๊ฐ 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!"๊ฐ ํ๋ฉด์ ๋ํ๋ฌ๋์? ์ถํ๋๋ ค์! ์ฌ๋ฌ๋ถ์ ์ฒซ ๋ฒ์งธ ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋์ํ์ด์!
์ด์ ์ฌ๋ฌ๋ถ์ ์คํ๋ง์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ ๊ธฐ๋ณธ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋์ด์! ๐
๊ทธ๋ฐ๋ฐ ๋ง์ด์์, ํน์ ์ด ๊ณผ์ ์์ ์ด๋ ค์์ ๊ฒช์ผ์ จ๋์? ๊ฑฑ์ ๋ง์ธ์. ๊ฐ๋ฐ์ ํญ์ ์ํ์ฐฉ์ค์ ์ฐ์์ด์์. ์ ๋ ์ฒ์์๋ ๋ง์ด ํค๋งธ๋ต๋๋ค. ใ ใ ใ ๐ ๊ทธ๋ด ๋๋ง๋ค ์ฌ๋ฅ๋ท๊ฐ์ ํ๋ซํผ์์ ๋ค๋ฅธ ๊ฐ๋ฐ ์๋ค์ ๋์์ ๋ฐ์์ด์. ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ค์ ์กฐ์ธ์ ์ ๋ง ํฐ ๋์์ด ๋๊ฑฐ๋ ์!
์, ์ด์ ๊ธฐ๋ณธ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด๋ดค์ผ๋, ์กฐ๊ธ ๋ ๋ณต์กํ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณผ๊น์? ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ณผ๊ฒ์! ๐
๐ง ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ ํ์ฅํ๊ธฐ
์ฐ๋ฆฌ์ "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
}
์์ฐ! ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ ๋ฉ์ ธ์ง๊ณ ์์ด์! ๐
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 ์์ฒญ์ ์๋ฎฌ๋ ์ด์ ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํด์.
์ด ํ ์คํธ๋ค๋ ์คํํด๋ณด์ธ์. ๋ชจ๋ ๊ฒ ์ ๋์ํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ง ํผํผํ๋ค๋ ๋ป์ด์์! ๐
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๋ ์ด๋ณด์๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ๋ซํผ์ด์์.
- Heroku ๊ณ์ ์ ๋ง๋ค๊ณ Heroku CLI๋ฅผ ์ค์นํ์ธ์.
- ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํด Heroku์ ๋ก๊ทธ์ธํ์ธ์:
heroku login
- ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์์ ๋ค์ ๋ช
๋ น์ด๋ก Heroku ์ฑ์ ์์ฑํ์ธ์:
heroku create
- ๋ค์ ๋ช
๋ น์ด๋ก Heroku์ ์ฝ๋๋ฅผ ํธ์ํ์ธ์:
git push heroku main
์์ฐ! ์ด์ ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด Heroku์ ๋ฐฐํฌ๋์ด์. Heroku๊ฐ ์ ๊ณตํ๋ URL๋ก ์ ์ํด๋ณด์ธ์. ์ธ์์, ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธํฐ๋ท์์ ๋์ํ๊ณ ์์ด์! ๐
4. ๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊น ๐
๋ฐฐํฌ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๊ณ์ ๋ชจ๋ํฐ๋งํด์ผ ํด์. ์คํ๋ง ๋ถํธ ์ก์ถ์์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์์ด์. ๋ํ, ELK ์คํ(Elasticsearch, Logstash, Kibana)๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ๋ก๊ทธ๋ฅผ ์์งํ๊ณ ๋ถ์ํ ์ ์์ฃ .
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ๊ฐ์๊ธฐ ํธ๋ํฝ์ด ํญ์ฆํ๋ฉด ์๋ฒ๋ฅผ ์ฆ์คํ๋ค๋ ์ง, ์๋ฌ๊ฐ ์์ฃผ ๋ฐ์ํ๋ API๋ฅผ ์์ ํ๋ค๋ ์ง ํ๋ ์์ผ๋ก์.
์, ์ด์ ์ฐ๋ฆฌ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ์์ ๋์์ด์! ๐ ์ ๋ง ๋๋จํ์ง ์๋์? ์ฌ๋ฌ๋ถ์ด ์ง์ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ธ๊ณ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์๊ฒ ๋ ๊ฑฐ์์!
ํ์ง๋ง ๊ธฐ์ตํ์ธ์. ๋ฐฐํฌ๋ ๋์ด ์๋๋ผ ์๋ก์ด ์์์ด์์. ๊ณ์ํด์ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ์์งํ๊ณ , ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋๊ฐ์ผ ํด์. ๊ทธ๊ฒ ๋ฐ๋ก ์ง์ ํ ๊ฐ๋ฐ์์ ์ถ์ด์ฃ ! ๐
๊ทธ๋ฆฌ๊ณ ๋ง์ด์์, ํน์ ๋ฐฐํฌ ๊ณผ์ ์์ ์ด๋ ค์์ ๊ฒช๊ณ ๊ณ์ ๊ฐ์? ๊ฑฑ์ ๋ง์ธ์. ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์ฒ์์๋ ๊ทธ๋์. ์ด๋ด ๋ ์ฌ๋ฅ๋ท๊ฐ์ ํ๋ซํผ์ ํ์ฉํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฐฐํฌ ๋ ธํ์ฐ๋ฅผ ๋ฐฐ์ธ ์ ์์ ๊ฑฐ์์. ์๋๋ฉด ์คํ์ค๋ฒํ๋ก์ฐ ๊ฐ์ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ๋์์ ๊ตฌํด๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์!
์, ์ด์ ์ฐ๋ฆฌ์ ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ฌ์ ์ด ๊ฑฐ์ ๋๋๊ฐ๊ณ ์์ด์. ๋ง์ง๋ง์ผ๋ก ์ ์ฒด ๊ณผ์ ์ ์ ๋ฆฌํ๊ณ ์์ผ๋ก์ ๋ฐ์ ๋ฐฉํฅ์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ๊ฒ์. ์ค๋น๋์ จ๋์? ๐
๐ ์ ๋ฆฌ ๋ฐ ์์ผ๋ก์ ๋ฐ์ ๋ฐฉํฅ
์์ฐ! ์ ๋ง ๋๋จํ ์ฌ์ ์ด์์ด์, ์ฌ๋ฌ๋ถ! ๐ ์ฐ๋ฆฌ๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ , ํ ์คํธํ๊ณ , ๋ฐฐํฌํ๋ ์ ๊ณผ์ ์ ํจ๊ป ์ดํด๋ดค์ด์. ์ด์ ์ ์ฒด ๊ณผ์ ์ ํ ๋ฒ ์ ๋ฆฌํด๋ณผ๊น์?
1. ๊ฐ๋ฐ ๊ณผ์ ์ ๋ฆฌ ๐
- ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ : JDK, IDE, ๋น๋ ๋๊ตฌ ์ค์น
- ์คํ๋ง ํ๋ก์ ํธ ์์ฑ: Spring Initializr ์ฌ์ฉ
- ๊ธฐ๋ณธ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ: ์ปจํธ๋กค๋ฌ ์์ฑ
- ๊ธฐ๋ฅ ํ์ฅ: ๋์ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ, JSON ์๋ต ๋ฐํ
- ํ ์คํธ ์์ฑ: ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ: JAR ํ์ผ ์์ฑ, ํด๋ผ์ฐ๋ ํ๋ซํผ ํ์ฉ
์ด ๊ณผ์ ์ ํตํด ์ฌ๋ฌ๋ถ์ ์คํ๋ง์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ, ํ ์คํธ, ๋ฐฐํฌ๊น์ง ์ ๋ฐ์ ์ธ ๋ด์ฉ์ ๋ฐฐ์ ์ด์. ์ ๋ง ๋๋จํด์! ๐
2. ์์ผ๋ก์ ๋ฐ์ ๋ฐฉํฅ ๐
ํ์ง๋ง ์ฌ๋ฌ๋ถ, ์ด๊ฒ ๋์ด ์๋์์. ์คํ๋ง๊ณผ ์น ๊ฐ๋ฐ์ ์ธ๊ณ๋ ์ ๋ง ๋๊ณ ๊น๋ต๋๋ค. ์์ผ๋ก ๋ ๋ฐ์ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๋ค์ ๊ณต๋ถํด๋ณด๋ ๊ฑด ์ด๋จ๊น์?
- ์คํ๋ง ๋ฐ์ดํฐ JPA: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ๋ ์ฝ๊ฒ ํ ์ ์์ด์.
- ์คํ๋ง ์ํ๋ฆฌํฐ: ์ธ์ฆ๊ณผ ๊ถํ ๊ด๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด์.
- ์คํ๋ง ํด๋ผ์ฐ๋: ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ ์ ์์ด์.
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ: ๋น๋๊ธฐ, ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด์.
- ๋์ปค์ ์ฟ ๋ฒ๋คํฐ์ค: ์ปจํ ์ด๋ํ์ ์ค์ผ์คํธ๋ ์ด์ ์ ํตํด ๋ ํจ์จ์ ์ธ ๋ฐฐํฌ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์.
์ด ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ๋ฐฐ์ฐ๋ ค๊ณ ํ์ง ๋ง์ธ์. ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณต๋ถํด ๋๊ฐ๋ฉด ๋ผ์. ๋ก๋ง๋ ํ๋ฃจ์์นจ์ ๋ง๋ค์ด์ง์ง ์์๋ค๊ณ ํ์์์? ๊ฐ๋ฐ ์ค๋ ฅ๋ ๋ง์ฐฌ๊ฐ์ง์์. ๐
3. ์ง์์ ์ธ ํ์ต์ ์ค์์ฑ ๐
๊ธฐ์ ์ ์ธ๊ณ๋ ๋น ๋ฅด๊ฒ ๋ณํํด์. ํนํ ์น ๊ฐ๋ฐ ๋ถ์ผ๋ ๋์ฑ ๊ทธ๋ ์ฃ . ๊ทธ๋์ ์ง์์ ์ธ ํ์ต์ด ์ ๋ง ์ค์ํด์. ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ , ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ด ์ข์ ๊ฐ๋ฐ์๊ฐ ๋๋ ๋น๊ฒฐ์ด์์.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์ตํ์ธ์. ํ์ต์ ๋ฐฉ๋ฒ์ ๋ค์ํด์. ์ฑ ์ ์ฝ์ ์๋ ์๊ณ , ์จ๋ผ์ธ ๊ฐ์๋ฅผ ๋ค์ ์๋ ์์ด์. ์คํ ์์ค ํ๋ก์ ํธ์ ์ฐธ์ฌํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ฃ . ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์ ํตํด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ์ง์์ ๊ณต์ ํ๋ ๊ฒ๋ ํ๋ฅญํ ํ์ต ๋ฐฉ๋ฒ์ด์์.
4. ๋ง๋ฌด๋ฆฌ ๐
์ฌ๋ฌ๋ถ, ์ ๋ง ๋๋จํด์! ์คํ๋ง์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ์ ์ฒด ๊ณผ์ ์ ํจ๊ป ์ดํด๋ดค์ด์. ์ด์ ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ณธ์ ์ธ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋์ด์. ๐
ํ์ง๋ง ์ด๊ฑด ์์์ผ ๋ฟ์ด์์. ์์ผ๋ก๋ ๊ณ์ํด์ ๊ณต๋ถํ๊ณ , ๊ฒฝํ์ ์์๊ฐ์ธ์. ๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์ธ์ ๊ฐ ์ฌ๋ฌ๋ถ๋ ๋ฉ์ง ์คํ๋ง ์ ๋ฌธ๊ฐ๊ฐ ๋ ์ ์์ ๊ฑฐ์์. ํ์ดํ ! ๐ช
๊ทธ๋ฆฌ๊ณ ๊ธฐ์ตํ์ธ์. ๊ฐ๋ฐ์ ํผ์ ํ๋ ๊ฒ ์๋์์. ์ปค๋ฎค๋ํฐ์ ๋์์ ๋ฐ๊ณ , ๋ ๋ค๋ฅธ ์ด๋ค์ ๋๋ ๊ฒ๋ ์ค์ํด์. ์ฌ๋ฅ๋ท์ด๋ ์คํ์ค๋ฒํ๋ก์ฐ ๊ฐ์ ํ๋ซํผ์ ์ ๊ทน ํ์ฉํด๋ณด์ธ์. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ์ํตํ๋ฉด์ ๋ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ ๊ฑฐ์์.
์, ์ด์ ์ ๋ง ๋์ด์์. ์ฌ๋ฌ๋ถ์ ๋ฉ์ง ์คํ๋ง ๊ฐ๋ฐ ์ฌ์ ์ ์์ํ ๊ฒ์. ์ธ์ ๊ฐ ์ฌ๋ฌ๋ถ์ด ๋ง๋ ๋ฉ์ง ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๋ค์ ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๊ณ ์์๊ฒ์. ํ์ดํ ! ๐๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ