1์ฅ - ์คํ๋ง๋ถํธ ๊ฐ๋ฐ ์ค๋น!
1์ฅ - ์คํ๋ง๋ถํธ ๊ฐ๋ฐ ์ค๋น! ๊ด๋ จ
์์์ด ๋ฐ์ด๋ค.
์ฌ๋ฌ๋ถ์ ์ด๋ฏธ ์คํ๋ง๋ถํธ๋ฅผ ํฅํด ์ฒซ๊ฑธ์์ ๋ด๋๋ ์ผ๋ ์ฑ๊ณต์ ์ ๋ฐ ์ด๋ฃฌ ์ ์ด๋ค. ์ถํํ๋ค. ์ด ์ฑ ์ ์ฒ์๋ถํฐ ๋๊น์ง ๋ชจ๋ ๋ด์ฉ์ด ์ด์ด์ง๋ค. ๋ฐ๋ผ์ ์ด ์ฑ ์ ํ๋ฆ์ด ์ค์ํ๋ฉฐ ๊ทธ์ค์์๋ ์์์ด ๊ฐ์ฅ ์ค์ํ๋ค. ์ด ์ฅ์์๋ ์คํ๋ง๋ถํธ๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ ์ ์ ์ค๋นํด์ผ ํ ๊ฒ์ ์์๋ณด์.
์คํ๋ง๋ถํธ ๊ฐ๋ฐ์ ์์ํ๊ธฐ ์ ์๋ ๋ฌด์์ ์ค์นํด์ผ ํ ๊น? ์ฌ๊ธฐ์๋ ์๋ฐ์ STS(Spring Tool Suite) ์๋ํฐ๋ฅผ ์ค์นํ๋ค. STS ์๋ํฐ๋ ์คํ๋ง๋ถํธ ๊ฐ๋ฐ์ ํ๊ฒฐ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๋๊ตฌ์ด๋ค. ๋ชจ๋ ์ค๋น๋ฅผ ๋ง์น๋ฉด ์๋ก์ด ์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ ์์ฑํด ๋ณด์.
์ฐธ๊ณ ๋ก ์ค์ต ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด ์ ์ฝ๊ณผ ๊ฐ๋ ์ฑ์ ์ํด ์ฝ๋ ์ ์ฒด๋ฅผ ํ์ํ์ง ์๊ณ ์ค์ต์ ํ์ํ ๋ถ๋ถ๋ง ํ์ํ๋ค. ๋๋ถ์ด ์ ์ฒด ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ฉฐ ๊ณต๋ถํ ๋ ์๋ฅผ ์ํด ๊ฐ ์ฅ ๋์ ๋ถ์ ์์ค ๋ณด๊ธฐ ๋งํฌ๋ฅผ ์๋ดํ๋ค.
์ด ์ฅ์ ๋ชฉํ
- ์๋ฐ์ STS๋ฅผ ์ค์นํ๊ณ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค๋นํ๋ค.
- ์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ์ฒซ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ ๋ง๋ ๋ค.
- ์คํ๋ง๋ถํธ ์๋ฒ๋ฅผ ์คํํ๊ณ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค.
01. ํ์๊ฐ ์๊ฐํ๋ ์คํ๋ง๋ถํธ๋?
์คํ๋ง๋ถํธ(Spring Boot)๋ ์๋ฐ์ ์น ํ๋ ์์ํฌ๋ก ๊ธฐ์กด ์คํ๋ง ํ๋ ์์ํฌ(Spring Framework)์ ํฐ์บฃ ์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์ฌ๋ฌ ํธ์ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํ์ฌ ๊พธ์คํ ์ธ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์๋ ํ๋ ์์ํฌ์ด๋ค.
์คํ๋ง๋ถํธ๋ ์น ํ๋ก๊ทธ๋จ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด ์ฃผ๋ ์น ํ๋ ์์ํฌ๋ค
์คํ๋ง๋ถํธ๋ ์น ํ๋ก๊ทธ๋จ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ฃผ๋ ์น ํ๋ ์์ํฌ์ด๋ค. ์น ํ๋ ์์ํฌ๋ผ๋ ํํ์ ์ฒ์ ๋ฃ๋ ์ฌ๋์ ์ํด ์ ์ ์น ํ๋ ์์ํฌ๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ๋ค.
์น ํ๋ ์์ํฌ๋?
์น ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ณธ ๊ฒฝํ์ด ์๋๊ฐ? ๋ง์ฝ ๊ทธ๋ฐ ๊ฒฝํ์ด ์๋ค๋ฉด ์น ํ๋ก๊ทธ๋จ์ ์ํด ์ผ๋ง๋ ๋ง์ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ผ ํ๋์ง ์ ์๊ณ ์์ ๊ฒ์ด๋ค.

์๋ฅผ ๋ค์ด ์ฟ ํค๋ ์ธ์ ์ฒ๋ฆฌ, ๋ก๊ทธ์ธ/๋ก๊ทธ์์ ์ฒ๋ฆฌ, ๊ถํ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ ๋ฑ ์น ํ๋ก๊ทธ๋จ์ ์ํด ๋ง๋ค์ด์ผ ํ ๊ธฐ๋ฅ์ด ์ ๋ง ์ฐ๋๋ฏธ์ฒ๋ผ ๋ง๋ค. ํ์ง๋ง ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ์ฌ๋ฌ๋ถ์ด ์ผ์ผ์ด ๋ง๋ค ํ์๊ฐ ์๋ค. ์๋ํ๋ฉด ์น ํ๋ ์์ํฌ์๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ๋ค์ด ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ์ ์น ํ๋ ์์ํฌ์ ์๋ ๊ธฐ๋ฅ์ ์ตํ์ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ฝ๊ฒ ๋งํด ์น ํ๋ ์์ํฌ๋ ์น ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ํ ์คํํฐ ํคํธ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ๋ก ๋ง๋ค์ด์ง ์น ํ๋ ์์ํฌ ์ค ํ๋๊ฐ ๋ฐ๋ก ์คํ๋ง๋ถํธ์ด๋ค.
์ผ๋ง๋ ๋นจ๋ฆฌ ๋ง๋ค ์ ์๋?
[์คํ๋ง๋ถํธ์ ๋น ๋ฅธ ๊ฐ๋ฐ ์๋๋ฅผ ๋ณด์ฌ ์ฃผ๋ ์]
@Controller
public class HelloController {
@GetMapping("/")
@ResponseBody
public String hello() {
return "Hello World";
}
}
์คํ๋ง๋ถํธ๋ ํผํผํ ์น ํ๋ ์์ํฌ์ด๋ค
๊ฐ๋ฐ์๊ฐ ์น ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋ ๊ฐ์ฅ ์ด๋ ต๊ฒ ๋๋ผ๋ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ฐ๋ก ๋ณด์ ๊ธฐ๋ฅ์ด๋ค. ์ด ์ธ์์๋ ๊ธฐ์์ฒ์ธํ ๋ฐฉ๋ฒ์ผ๋ก ์น ์ฌ์ดํธ๋ฅผ ๊ดด๋กญํ๋ ์ฌ๋๋ค์ด ์๋ค. ์ด๋ฐ ๊ณต๊ฒฉ์ ๊ฐ๋ฐ์ ํ๋ก ์ ์ํ๊ฒ ๋์ํ๊ธฐ๋ ๋ฌด์ฒ ์ด๋ ค์ด ์ผ์ด๋ค. ํ์ง๋ง ๊ฑฑ์ ํ ํ์๋ ์๋ค. ์คํ๋ง๋ถํธ๋ ์ด๋ฐ ๋ณด์ ๊ณต๊ฒฉ์ ๊ธฐ๋ณธ์ผ๋ก ์์ฃผ ์ ๋ง์ ์ค๋ค. ๊ทธ๋งํผ ์คํ๋ง๋ถํธ๋ ํผํผํ ์น ํ๋ ์์ํฌ๋ค. ์๋ฅผ ๋ค์ด SQL ์ธ์ ์ , XSS(cross-site scripting), CSRF(cross-site request forgery), ํด๋ฆญ์ฌํน(clickjacking)๊ณผ ๊ฐ์ ๋ณด์ ๊ณต๊ฒฉ์ ๊ธฐ๋ณธ์ผ๋ก ๋ง์ ์ค๋ค. ์ฆ, ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ณด์ ๊ณต๊ฒฉ์ ๋ํ ์ฝ๋๋ฅผ ์ฌ๋ฌ๋ถ์ด ์งค ํ์๊ฐ ์๋ค.
- SQL ์ธ์ ์ ์ ์ ์์ ์ธ SQL์ ์ฃผ์ ํ์ฌ ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- XSS๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํด ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- CSRF๋ ์์กฐ๋ ์์ฒญ์ ๋ณด๋ด๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ด๋ค.
- ํด๋ฆญ์ฌํน์ ์ฌ์ฉ์์ ์๋ํ์ง ์์ ํด๋ฆญ์ ์ ๋ํ๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ด๋ค.
์คํ๋ง๋ถํธ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ์ค๋น๋์ด ์๋ค
์คํ๋ง๋ถํธ๋ 2012๋ ์ ๋ฑ์ฅํ์ฌ 10๋ ์ด์์ ์ธ์์ ๊ฐ๋ดํ ๋ฒ ํ ๋ ์น ํ๋ ์์ํฌ์ด๋ค. ๊ทธ๋์ ์ ๋ง ๋ฌด์ํ ๋ง์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณ ๋ ๋ค๋ฌ์ด์ก๋ค. ํน์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ํ๋๊ฐ? ํ์ด์ง ๊ธฐ๋ฅ์ ์ํ๋๊ฐ? ์ด๋ฏธ ์คํ๋ง๋ถํธ์ ์๋ค. ์ด๋ฏธ ์์ ๋ฟ ์๋๋ผ ๋๋ฌด๋๋ ์ ๋ง๋ค์ด์ ธ ์๋ค. ํ๋ง๋๋ก ์คํ๋ง๋ถํธ์๋ ์ฌ๋ฌ๋ถ์ด ํ์๋ก ํ๋ ์น ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ ์ํ ๋๊ตฌ์ ๊ธฐ๋ฅ์ด ๋๋ถ๋ถ ์ค๋น๋์ด ์๋ค. ํ์๋ ์คํ๋ง๋ถํธ๋ฅผ ๊ณต๋ถํ ์ฌ๋ฌ๋ถ์๊ฒ '์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ ๊ธฐ๋ฅ์ ์๋ก ๋ง๋๋๋ผ ์ ์จ ๊ณ ์ํ์ง ๋ง๋ผ'๋ ์ด์ผ๊ธฐ๋ฅผ ๊ผญ ํด ์ฃผ๊ณ ์ถ๋ค.

์คํ๋ง๋ถํธ๋ WAS๊ฐ ๋ฐ๋ก ํ์์๋ค.
์คํ๋ง๋ถํธ ๋์ ์คํ๋ง๋ง ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์๋ ํฐ์บฃ๊ณผ ๊ฐ์ WAS(Web Application Server)๊ฐ ํ์ํ๋ค. WAS์ ์ข ๋ฅ(Tomcat, Weblogic, WebSphere, JBoss, Jeus ๋ฑ)๋ ๋งค์ฐ ๋ค์ํ๋ฉฐ ์ค์ ๋ฐฉ์๋ ์ ๊ฐ๊ฐ์ด์ด์ WAS์ ๋ํด ๊ณต๋ถํด์ผํ ๋ด์ฉ๋ ์๋นํ๋ค. ํ์ง๋ง ์คํ๋ง๋ถํธ์๋ ํฐ์บฃ ์๋ฒ๊ฐ ๋ด์ฅ๋์ด ์๊ณ ์ค์ ๋ ์๋ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ์ WAS์ ๋ํด์ ์ ํ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค. ์ฌ์ง์ด ๋ฐฐํฌ๋๋ jar ํ์ผ์๋ ํฐ์บฃ์๋ฒ๊ฐ ๋ด์ฅ๋์ด ์คํ๋๋ฏ๋ก ์๋ก ๋ค๋ฅธ WAS๋ค๋ก ์ธํด ๋ฐ์๋๋ ๋ฌธ์ ๋ค๋ ์ฌ๋ผ์ง๋ค.
์คํ๋ง๋ถํธ๋ก ์์ฑํ๋๋ผ๋ ํฐ์บฃ ๋์ ๋ค๋ฅธ WAS๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์คํ๋ง๋ถํธ๋ ์ค์ ์ด ์ฝ๋ค.
์คํ๋ง๋ถํธ ์ด์ ์ ์คํ๋ง๋ง์ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ณด์๋ค๋ฉด ์๋นํ ๋ณต์กํ ์ค์ ๋ค๋ก ์ธํด ๋ง์ ์ด๋ ค์์ ๊ฒช์์ ๊ฒ์ด๋ค. ์ฌ์ง์ด ํ๋ฒ ์ค์ ํ ๊ธฐ๋ฅ๋ค์ด ์คํ๋ง ๋ฒ์ ์ ์ผ๋ก ์ธํด ๋ณ๊ฒฝ๋๊ณ ์์ด์ง๋ ์ผ๋ ๋น์ผ๋น์ฌ ํ์๋ค. ํ์ง๋ง ์คํ๋ง๋ถํธ๋ ์คํ๋ง์ ๋ณต์กํ ์ค์ ์ ์๋ํํ๊ณ ๋จ์ํ ํ์ฌ ๋๊ตฌ๋ ์คํ๋ง์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์๋ค. ์คํ๋ง์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ํ๋ ์์ํฌ(Django[1], Rails[2] ๋ฑ)์ ๊ฐ๊ฒฐํจ์ ๋ง์ด ๋ถ๋ฌ์ ํ๋๋ฐ ์คํ๋ง๋ถํธ์ ๋ฑ์ฅ๊ณผ ๊พธ์คํ ๋ฐ์ ์ผ๋ก ์ธํด ์ด์ ๋ ๋์ด์ ๋ถ๋ฌ์ํ ์ด์ ๊ฐ ์์๋ฏ ํ๋ค.
์คํ๋ง๋ถํธ๋ ์ฌ๋ฏธ์๋ค
์คํ๋ง๋ถํธ๋ก ์น ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ฒ์ด ๊ฒ์์ ํ๋ ๊ฒ๋ณด๋ค ์ฌ๋ฐ๋ค๊ณ ํ๋ฉด ๋ฏฟ๊ฒ ๋๊ฐ? ์ฝ๊ฐ ๊ณผ์ฅ์ด๊ธด ํ์ง๋ง ๋ฌด์ธ๊ฐ์ ํ๋ฆฐ ๋ฏ์ด ์ฝ๋ฉ์ ํ๊ณ ์๋ ํ์ ์์ ์ ๋ฐ๊ฒฌํ ๋๊ฐ ์์๋๋ฐ, ๊ทธ๋๊ฐ ๋ฐ๋ก ์น ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์์ ๋์๋ค. ์ ๋ง์ด๋ ์์ฌํ์ง ๋ง๊ณ ์ง๊ธ ๋น์ฅ ์คํ๋ง๋ถํธ๋ก ์น ํ๋ก๊ทธ๋๋ฐ์ ์์ํด ๋ณด์.
02. ์๋ฐ ์ค์นํ๊ธฐ
2. ์๋ฐ ์ค์นํ๊ธฐ
์์์ ์ธ๊ธํ๋ฏ์ด ์คํ๋ง๋ถํธ๋ ์๋ฐ๋ก ๋ง๋ค์ด์ง ์น ํ๋ ์์ํฌ์ด๋ค. ๊ทธ๋์ ์คํ๋ง๋ถํธ๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ์๋ฐ ์ค์น๊ฐ ํ์์ด๋ค.
JDK ์ค์น
์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํด ํ์์ ์ผ๋ก ํ์ํ JDK๋ฅผ ๋จผ์ ์ค์นํด ๋ณด์. JDK๋ Java Development Kit
์ ์ฝ์์ด๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ํด์๋ ๋๊ตฌ๋ ์ด๊ฒ์ ์ค์นํด์ผ ํ๋ค. ์๋ฐ๋ ์๋ ์ฌ ๋ง์ดํฌ๋ก์์คํ
์ฆ์์ ๋ง๋ค๊ณ ๋ฐฐํฌํ์ง๋ง ์ค๋ผํด์ด ์ฌ์ ์ธ์ํ๋ฉด์๋ถํฐ ๋ผ์ด์ผ์ค๊ฐ ์ข ๋ณต์กํ๊ฒ ๋ณ๊ฒฝ๋์๋ค. ํ์ง๋ง ๊ณต๋ถ๋ฅผ ์ํด ํ์ํ JDK๋ ์จ๋ผ์ธ์์ ๋ฌด๋ฃ๋ก ๋ค์ด๋ก๋ํ์ฌ ์ค์นํ ์ ์๋ค.
์ด ์ฑ ์์๋ ์ฌ๋ฌ๋ถ์ด ์๋์ฐ์ฆ ๋๋ ๋งฅ ์ด์์ฒด์ ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์งํํ๋ค. (ํ์ง๋ง ๋ฆฌ๋ ์ค๋ ๊ธฐํ ๋ค๋ฅธ OS ์ฌ์ฉ์๋ผ๋ ์ค์น๋ฅผ ์ ์ธํ๋ฉด ๋๋จธ์ง ๊ฒ๋ค์ ๋ชจ๋ ๋์ผํ๊ฒ ์งํํ ์ ์์ ๊ฒ์ด๋ค.)
JDK๋ฅผ ๋ค์ด๋ก๋ ํ ์ ์๋ URL์ ๋ค์๊ณผ ๊ฐ๋ค.
- https://www.oracle.com/java/technologies/downloads/
๋ง์ฝ ์ URL์ด ๋์ด์ ์ ํจํ์ง ์๋ค๋ฉด ๊ตฌ๊ธ ๊ฒ์์ฐฝ์์ "JDK Download" ๋ก ๊ฒ์ํ๊ณ ๋ค์ด๊ฐ๋ฉด ๋๋ค.
์๋์ฐ์ฆ์ JDK ์ค์น
์๋์ฐ์ฆ์ ๊ฒฝ์ฐ "Windows" ํญ์ ์ ํํ ํ "x64 MSI Installer" JDK๋ฅผ ๋ค์ด๋ก๋ํ๋ค.

๋ค๋ฅธ ์ผ๋ฐ ํ๋ก๊ทธ๋จ์ ์ค์นํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ธ ํด๋ฆญํ์ฌ ์ค์นํ๋ฉด ๋๋ค. ์ค์น๋ฅผ ์ํ ๊ณผ์ ์ ๋งค์ฐ ์ฌ์ฐ๋ฏ๋ก ์๋ตํ๊ฒ ๋ค.
JDK๋ ๋ํดํธ๋ก ์ค์น ์ ์๋ง๋ ๋ค์๊ณผ ๋น์ทํ ๋๋ ํฐ๋ฆฌ์ ์ค์น๋ ๊ฒ์ด๋ค.
C:\program files\java\jdk-17.0.2
โป JDK ์ค์น ๋ฒ์ ์ ๋ฐ๋ผ ๋๋ ํฐ๋ฆฌ๋ช ์ด ๋ค๋ฅด๋ค.
๋งฅ OS์ JDK ์ค์น
๋งฅ OS์ ๊ฒฝ์ฐ "macOS" ํญ์ ์ ํํ ํ ์์ ์ ํ๊ฒฝ์ ๋ง๋ dmg
ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.

์ด๋ค dmg ํ์ผ์ ์ค์นํด์ผ ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ ์คํํด ๋ณด์.
uname -p
๋ง์ฝ i386
๋๋ x86_64
์ด๋ผ๊ณ ์ถ๋ ฅ๋๋ฉด "x64 DMG Installer"๋ฅผ ๋ค์ด๋ก๋ํ๋ฉด ๋๊ณ arm64๊ฐ
์ถ๋ ฅ๋๋ฉด "Arm 64 DMG Installer"๋ฅผ ๋ค์ด๋ก๋ํ๋ฉด ๋๋ค.
dmg ํ์ผ์ ์ค์นํ ํ ํฐ๋ฏธ๋์์ java -version
๋ช
๋ น์ ์คํํ์ฌ ์๋ฐ๊ฐ ์ ์ค์น๋์๋์ง ํ์ธํด ๋ณด์.
java -version
# java version "17.0.2" (... ์๋ต ...)
03. ์คํ๋ง๋ถํธ ๊ฐ๋ฐ ํ๊ฒฝ ์ค๋นํ๊ธฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋ง๋ถํธ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค๋นํด ๋ณด์.
JDK ์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ์คํ๋ง๋ถํธ ํ๋ก๊ทธ๋จ ์์ฑ์ ๋์์ฃผ๋ ๋๊ตฌ์ธ STS(Spring Tool Suite)๋ฅผ ์ค์นํด์ผ ํ๋ค. ๋ฌธ์ํ์ผ ์์ฑ์ ๋์์ฃผ๋ ๋๊ตฌ๋ก ์๋๋ HWP๊ฐ ์๋ ๊ฒ์ฒ๋ผ ํ๋ก๊ทธ๋จ ์์ฑ์ ๋์์ฃผ๋ ํด๋ค์ด ์๋ค. ์ด๋ฌํ ํด๋ค์ IDE(Intergrated Development Environment), ํตํฉ๊ฐ๋ฐํ๊ฒฝ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์คํ๋ง๋ถํธ ํ๋ก๊ทธ๋๋ฐ์ ๋์์ฃผ๋ IDE ์ค ๊ฐ์ฅ ๋ง์ด ์ถ์ฒ๋๋ ํด์ STS์ด๋ค. STS๋ ์คํ๋ง ๊ฐ๋ฐ์ ์ต์ ํ๋ ์๋ํฐ๋ก ์ดํด๋ฆฝ์ค ๊ธฐ๋ฐ์ผ๋ก ์ ์๋์๋ค.
์ธํ ๋ฆฌ์ ์ด(IntelliJ)
์คํ๋ง๋ถํธ IDE๋ก ์ธํ ๋ฆฌ์ ์ด(IntelliJ)๋ ๋ง์ด ์ฌ์ฉํ๋ค. ์ธํ ๋ฆฌ์ ์ด๋ ์คํ๋ง๋ถํธ ๊ฐ๋ฐ์ ์ํด์๋ ์ปค๋ฎค๋ํฐ ๋ฒ์ ๋ณด๋ค๋ ์ผํฐ๋ฐ ๋ฒ์ ์ ์ฌ์ฉํ ๊ฒ์ ์ถ์ฒํ๋ค. ์๋ํ๋ฉด ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ ์คํ๋ง๋ถํธ์ ๋ํ ์ง์์ด ์ ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ผ๋ก ์คํ๋ง๋ถํธ ๊ฐ๋ฐ์ ์งํํ๋ค๋ฉด ์ค์ ์ ๊ฝค๋ ๋ง์ ์๊ฐ์ ๋ณด๋ด์ผ ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์ผํฐ๋ฐ ๋ฒ์ ์ ๋ฌด๋ฃ๊ฐ ์๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ด ์ฑ ์์๋ ๋ฌด๋ฃ์ด๋ฉฐ ์ ์์ ํ ๋์ด ์๋ STS๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
๊ทธ๋๋ ์ญ์ ์ธํ ๋ฆฌ์ ์ด ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ค์์ ์ฐธ๊ณ ํ์.
STS ์ค์นํ๊ธฐ
STS๋ ๋ค์ ์ฃผ์์ ์ ์ํ๋ฉด ๋ด๋ ค๋ฐ์ ์ ์๋ค. (์ด ์ฑ ์ ์์ฑํ๋ ์์ ์๋ ๋ฒ์ 4๊ฐ ์ต์ ๋ฒ์ ์ด๋ค.)
STS ์ค์น ํ์ผ ์ฃผ์: https://spring.io/tools
์ค์นํ ๋ ํน๋ณํ ์ฃผ์ํ ์ ์ ์์ผ๋ฏ๋ก ๋๊น์ง <Next>
๋ฅผ ์ ํํ์ฌ ์ค์นํ๋ฉด ๋๋ค.
STS ์คํํ๊ธฐ
์ค์นํ STS๋ฅผ ์คํํ๋ฉด ๊ฐ์ฅ๋จผ์ ๋ค์๊ณผ ๊ฐ์ ํ๋กฌํํธ ์ฐฝ์ด ๋ํ๋๋ค.

STS์ ์์
๊ณต๊ฐ(workspace) ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํ๋ผ๋ ์ฐฝ์ด๋ค. ์์ผ๋ก STS๋ก ์์ฑํ๋ ๋ชจ๋ ํ์ผ๋ค์ด ์ด ๋๋ ํฐ๋ฆฌ ํ์์ ๋ง๋ค์ด์ง๋ค. ์ฌ์ฉ์ ํ(Home) ๋๋ ํฐ๋ฆฌ ํ์์ workspace ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํํ "Launch"๋ฅผ ๋๋ฅธ๋ค. ์ฐธ๊ณ ๋ก ๋งฅ OS์ ์ฌ์ฉ์ ํ ๋๋ ํฐ๋ฆฌ๋ /Users/<์ฌ์ฉ์๋ช
>
์ด๊ณ ์๋์ฐ์ฆ์ ์ฌ์ฉ์ ํ ๋๋ ํฐ๋ฆฌ๋ C:/Users/<์ฌ์ฉ์๋ช
>
์ด๋ค.
์ฌ๊ธฐ์ ์ง์ ํ ๋๋ ํฐ๋ฆฌ๋ ์์ผ๋ก ํ์๋๋ ํ์ผ๋ค์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๊ฐ ๋๋ค. ์์ผ๋ก ์ด ์ฑ ์์ ํ์ผ๋ช ์ ํ์ํ ๋๋ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ ์ดํ์ ๊ฒฝ๋ก๋ง ํ์ํ๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด STS๊ฐ ์คํ๋๋ค.

์คํ๋ง๋ถํธ ํ๋ก์ ํธ ์์ฑํ๊ธฐ
์ด์ ํด์ผ ํ ์ผ์ STS ์ข์ธก์ ํ์๋ "Create new Spring Starter Project"๋ฅผ ๋๋ฌ ์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.

๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค์ ํ๋ฉด์ด ๋ํ๋๋ค.

์ด ๋ถ๋ถ์ ์ค์ํ๋ฏ๋ก ์ฃผ์๊น๊ฒ ์ ๋ ฅํ์.
- Name: ํ๋ก์ ํธ์ ์ด๋ฆ์ ํด๋น๋๋ค. ์ฌ๊ธฐ์๋ "Spring Boot Board"์ ์ด๋์ ์ธ sbb๋ฅผ ์ฌ์ฉํ๋ค.
- Type: ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋๊ตฌ๋ฅผ ์ ํํ๋ ํญ๋ชฉ์ด๋ค. ๋ํดํธ๋ก Maven์ด ์ค์ ๋์ด ์์ง๋ง ์ด ์ฑ ์์๋ Gradle์ ์ฌ์ฉํ ๊ฒ์ด๋ค. Gradle์ Maven ๋ณด๋ค ๋์ค์ ๊ฐ๋ฐ๋์๊ณ Maven๋ณด๋ค ์ฑ๋ฅ์ด ์ข๊ณ ์ค์ ๋ ํธ๋ฆฌํ๋ค. ์ด ์ฑ ์ Gradle ๊ธฐ๋ฐ์ผ๋ก ์ค๋ช ๋์ด ์์ผ๋ฏ๋ก ์ฌ๋ฌ๋ถ๋ ๊ผญ "Gradle - Groovy"๋ฅผ ์ ํํ์.
- Java Version:
17
๋ฒ์ ์ ์ ํํ๋ค. - Group, Artifact, ... ๋ฑ์ ๋ค๋ฅด๊ฒ ์ค์ ํด๋ ๋์ง๋ง ์ดํ ์์ ๋ฅผ ์์ํ๊ฒ ์งํํ๊ธฐ ์ํด ์์ ๋์ผํ๊ฒ ์ค์ ํ๋๊ฒ์ ์ถ์ฒํ๋ค.
์ด์๊ณผ ๊ฐ์ด ์ค์ ํ์ผ๋ฉด "Next"๋ฅผ ๋๋ฅด์. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํ๋ง๋ถํธ ๋ฒ์ ์ ์ ํํ๋ ํ๋ฉด์ด ๋ํ๋๋ค.

์ด ์ฑ ์ ์ฐ๋ ์์ ์ ์ต์ ์์ ํ ๋ฒ์ ์ 3.0.0 ์ด๋ค. 3.0.0 ๋ฒ์ ์ ์ ํํ๊ณ Available ํญ๋ชฉ์์ web์ ์ ๋ ฅํ์ฌ "Spring Web" ํญ๋ชฉ์ ์ฐพ์์ ์ ํํ์.
"Spring Web"์ ์ ํํ์ง ์๊ณ ์ง๋์น๋ฉด ์น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ผ๋ ์ค์ํ์ง ์๋๋ก ์ฃผ์ํ์.
์ด์ด์ "Finish"๋ฅผ ๋๋ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด STS๊ฐ ์คํ๋๋ค.

์ข์ธก ์๋จ์ sbb ํ๋ก์ ํธ๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ธก ํ๋จ์ ํ๋ก์ ํธ์ ํ์ํ ํ๋ก๊ทธ๋จ๋ค์ด ๋ค์ด๋ก๋ ๋๋ ๊ฒ๋ ํ์ธํ ์ ์๋ค. ์กฐ๊ธ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ๊ฒ์ด๋ค.
04. ์คํ๋ง๋ถํธ ๋ง๋ณด๊ธฐ
์ด๋ฒ์๋ ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ http://localhost:8080/hello
๋ผ๋ URL์ ์
๋ ฅํ์ ๋ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ "Hello World"๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๋ ์น ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณผ ๊ฒ์ด๋ค.
์ด ํ๋ก๊ทธ๋จ์ด ๋์ํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ๋ถ์ ์ปดํจํฐ(localhost)๊ฐ ์น ์๋ฒ๊ฐ ๋์ด 8080 ํฌํธ์์ ์คํ๋์ด์ผ ํ๊ณ http://localhost:8080/hello
๋ผ๋ URL์ ํตํด ์๋ฒ์ ์์ฒญ์ด ๋ฐ์ํ๋ฉด "Hello World" ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ผ๋ก ์ถ๋ ฅํด์ผ ํ๋ค.
์คํ๋ง๋ถํธ๋ก ์ผ๋ง๋ ๊ฐํธํ๊ฒ ํ ์ ์๋์ง ์ง๊ธ๋ถํฐ ์์๋ณด์.
HelloController
http://localhost:8080/hello
์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ์ปจํธ๋กค๋ฌ(Controller)๊ฐ ํ์ํ๋ค. ์ปจํธ๋กค๋ฌ๋ ์๋ฒ์ ์ ๋ฌ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ(URL๊ณผ ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ ๋ฑ)์ ์ฒ๋ฆฌํ๋ ์๋ฐ ํด๋์ค์ด๋ค.
์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์ด ๋ณด์.

์ ๊ทธ๋ฆผ์ฒ๋ผ ์์๋๋ก com.mysite.sbb
์์น์์ ๋ง์ฐ์ค ์ฐ์ธก ๋ฒํผ์ ๋๋ฅด๊ณ New, Class๋ฅผ ์ ํํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋๋ค.

Name ํญ๋ชฉ์ HelloController๋ผ๊ณ ์ ๋ ฅํํ "Finish"๋ฅผ ๋๋ฅด์.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ HelloController.java
ํ์ผ์ด ์์ฑ๋๋ค.
package com.mysite.sbb;
public class HelloController {
}
ํ์ง๋ง ์ง๊ธ ์์ฑํ HelloController
๋ ๊ป๋ฐ๊ธฐ ํด๋์ค์ด๋ฏ๋ก ์ปจํธ๋กค๋ฌ์ ๊ธฐ๋ฅ์ ๊ฐ์ถ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผ ํ๋ค.
package com.mysite.sbb;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello World";
}
}
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋ ์์ธํ ์ค๋ช
ํ๊ฒ ์ง๋ง ์ฌ๊ธฐ์ ์ฌ์ฉ๋ ๊ฒ๋ค์ ๋ํด์ ๊ฐ๋จํ ์์๋ณด์. ํด๋์ค๋ช
์์ ์ ์ฉ๋ @Controller
์ ๋ํ
์ด์
์ HelloController
ํด๋์ค๊ฐ ์ปจํธ๋กค๋ฌ์ ๊ธฐ๋ฅ์ ์ํํ๋ค๋ ์๋ฏธ์ด๋ค. ์ด ์ ๋ํ
์ด์
์ด ์์ด์ผ ์คํ๋ง๋ถํธ ํ๋ ์์ํฌ๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์ธ์ํ๋ค. hello ๋ฉ์๋์ ์ ์ฉ๋ @GetMapping("/hello")
์ ๋ํ
์ด์
์ http://localhost:8080/hello
URL ์์ฒญ์ด ๋ฐ์ํ๋ฉด hello ๋ฉ์๋๊ฐ ์คํ๋จ์ ์๋ฏธํ๋ค. ์ฆ, /hello
URL๊ณผ hello ๋ฉ์๋๋ฅผ ๋งคํํ๋ ์ญํ ์ ํ๋ค.
- URL๋ช
๊ณผ ๋ฉ์๋๋ช
์ ๋์ผํ ํ์๋ ์๋ค. ์ฆ
/hello
URL์ผ ๋ ๋ฉ์๋๋ช ์ hello๊ฐ ์๋ hello2์ ๊ฐ์ด ํด๋ ์๊ด์๋ค. - Get ๋ฐฉ์์ URL ์์ฒญ์ GetMapping์ ์ฌ์ฉํ๊ณ Post ๋ฐฉ์์ URL ์์ฒญ์ PostMapping์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ @ResponseBody
์ ๋ํ
์ด์
[3]์ hello ๋ฉ์๋์ ์๋ต ๊ฒฐ๊ณผ๊ฐ ๋ฌธ์์ด ๊ทธ ์์ฒด์์ ๋ํ๋ธ๋ค. hello ๋ฉ์๋๋ "Hello World" ๋ผ๋ ๋ฌธ์์ด์ ๋ฆฌํดํ๋ฏ๋ก ์ถ๋ ฅ์ผ๋ก "Hello World" ๋ฌธ์์ด์ด ๋๊ฐ ๊ฒ์ด๋ค.
๋์ค์ ๊ณต๋ถํ๊ฒ ์ง๋ง ์๋ต ๊ฒฐ๊ณผ๋ ์ด์ฒ๋ผ ๋จ์ํ ๋ฌธ์์ด ๋ณด๋ค๋ HTML ํ์ผ๊ณผ ๊ฐ์ ํ ํ๋ฆฟ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๋ก์ปฌ์๋ฒ ์คํํ๊ธฐ
์ด์ ์์ฑํ HelloController
๊ฐ ์ ์ ๋์ํ๋์ง ํ์ธํด ๋ณด์. HelloController
์ ๋์์ ํ์ธํ๊ธฐ ์ํด์๋ ๋ก์ปฌ์๋ฒ๋ฅผ ์คํํด์ผ ํ๋ค. ๋ก์ปฌ์๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์คํํ๋ค.

- ๋จผ์ ์ ๊ทธ๋ฆผ์ ์ข์ธก ํ๋จ์ Boot Dashboard๊ฐ ๋ณด์ด์ง ์๋๋ค๋ฉด STS ์๋จ์ ํด๋ฐ์์ "Boot Dashboard" ์์ด์ฝ์ ๋๋ฌ์ ์คํํ๋ค.
- Boot Dashboard์์ local ์ ํ๋ฒ ๋๋ฅด๋ฉด ๊ทธ๋ฆผ์ฒ๋ผ "sbb" ๋ผ๋ ํ๋ก์ ํธ๋ช ์ด ๋ณด์ธ๋ค. ์ฌ๊ธฐ์ "sbb"๋ฅผ ๋ง์ฐ์ค๋ก ์ ํํ์.
- "sbb"๋ฅผ ์ ํํ๋ฉด ๋ก์ปฌ์๋ฒ๋ฅผ ์คํํ ์ ์๋ ๋ฒํผ๋ค์ด ๋ณด์ธ๋ค. ๊ฐ์ฅ ์ข์ธก์ ๋ฒํผ์ ๋๋ฌ์ ์๋ฒ๋ฅผ ์คํํ๋ค. ์์๋๋ก ์งํํ๋ฉด ๋ก์ปฌ์๋ฒ๊ฐ ์คํ๋๊ณ STS ์ฝ์์ฐฝ์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ค์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.

๋ธ๋ผ์ฐ์ ๋ก ํ์ธํ๊ธฐ
์๋ฒ๊ฐ ์คํ๋์์ผ๋ ์ด์ HelloController์ ๋์์ ํ์ธํด ๋ณด์. ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ๊ณ ์ฃผ์์ฐฝ์ http://localhost:8080/hello
๋ผ๊ณ ์
๋ ฅํด ๋ณด์.
๋ก์ปฌ์๋ฒ๋ ๋ํดํธ๋ก 8080 ํฌํธ๋ก ์คํ๋๋ค.

์์ ๊ฐ์ด /hello
URL์ด ์์ฒญ๋๋ฉด ์ปจํธ๋กค๋ฌ์ธ HelloController
์ hello
๋ฉ์๋์ ๋งคํ๋ hello
๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ "Hello World"๋ผ๋ ๋ฌธ์์ด์ด ๋ธ๋ผ์ฐ์ ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์คํ๋ง๋ถํธ์ ์ธ๊ณ์ ์จ ๊ฒ์ ์ถํํ๋ค ^^
05. ์คํ๋ง๋ถํธ ๋๊ตฌ ์ค์นํ๊ธฐ
์ด๋ฒ์ฅ์์๋ ์คํ๋ง๋ถํธ ๊ฐ๋ฐ์ ๋์์ฃผ๋ ๋๊ตฌ๋ค์ ๋ํด์ ์์๋ณด์.
Spring Boot Devtools
๋จผ์ ์คํ๋ง๋ถํธ ๋ก์ปฌ ์๋ฒ๋ฅผ ์์ํ ํ ์ด์ ์ฅ์์ ์์ฑํ๋ HelloController
๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์.
package com.mysite.sbb;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello SBB";
}
}
์ถ๋ ฅํ๋ ๋ฌธ์์ด์ "Hello World"์์ "Hello SBB"๋ก ๋ณ๊ฒฝํ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์์ ํ๊ณ http://localhost:8080/hello
URL์ ํธ์ถํ๋๋ผ๋ ์ฌ์ ํ "Hello World" ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค. ์๋ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ก์ปฌ์๋ฒ๊ฐ ๋ณ๊ฒฝ๋ ํด๋์ค๋ฅผ ๋ฆฌ๋ก๋ฉํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ์ ๊ฐ๋ฐ์ ์งํํ๋ ๋์์๋ ๊ฝค ๋ถํธํ ์ผ์ด๋ค. ํ๋ก๊ทธ๋จ์ ์์ ํ๊ณ ๋ณ๊ฒฝ๋ ์ฌํญ์ ํ์ธํ๋ ค๋ฉด ๋งค๋ฒ ์๋ฒ๋ฅผ ์ฌ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด Spring Boot Devtools๋ฅผ ์ค์นํด์ผ ํ๋ค.
Spring Boot Devtools๋ ์คํ๋ง๋ถํธ ๊ฐ๋ฐ์ ๋์์ ์ฃผ๋ ๋๊ตฌ์ด๋ค. Spring Boot Devtools๋ฅผ ์ค์นํ๋ฉด ์๋ฒ ์ฌ์์ ์์ด๋ ํด๋์ค ๋ณ๊ฒฝ์ ์๋ฒ๊ฐ ์๋์ผ๋ก ์ฌ๊ธฐ๋ ๋๋ค.
Spring Boot Devtools์๋ ์ด์ธ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ด ์๋๋ฐ ๊ทธ๊ฒ๋ค์ ๋ํด์๋ ํ์ํ ๋์ ์์๋ณด์.
Spring Boot Devtools๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ทธ๋ ์ด๋ค(Gradle)[4]๋ก ์ค์นํด์ผ ํ๋ค. ๋ค์๊ณผ ๊ฐ์ด build.gradle ํ์ผ์ ์์ ํ์.
ํ์ผ๋ช :
/sbb/build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.mysite'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
tasks.named('test') {
useJUnitPlatform()
}
dependencies ํญ๋ชฉ์ developmentOnly 'org.springframework.boot:spring-boot-devtools'
๋ฅผ ์ถ๊ฐํ๋ค.
developmentOnly
Gradle์ developmentOnly
๋ ๊ฐ๋ฐํ๊ฒฝ์๋ง ์ ์ฉ๋๋ ์ค์ ์ด๋ค. ์ฆ, ์ด์ํ๊ฒฝ์ ๋ฐฐํฌ๋๋ jar, war ํ์ผ์๋ developmentOnly
๋ก ์ค์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ธ๋๋ค.
build.gradle
ํ์ผ์ ๋ด์ฉ์ ์ ์ฉํ๋ ค๋ฉด ๋ค์์ฒ๋ผ build.gradle
ํ์ผ์ ์ ํํํ ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค ๋ฒํผ์ ๋๋ฌ [Gradle -> Refresh Gradle Project]
๋ฅผ ์ ํํ์ฌ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํ๋ค.
์ค์น๊ฐ ์๋ฃ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด Boot Dashboard์ ์๋ฒ๋ช
์ด sbb
์์ sbb[devtools]
๋ก ๋ฐ๋๋ค.

๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์๋ฒ๋ฅผ ์ฌ์์ํ์.

๊ทธ๋ฆผ์์ "1๋ฒ"์ ๋๋ฅด๋ฉด ์๋ฒ๊ฐ ์ฌ์์ํ๋ค. (์ค์ง์ ์์์ ๋์์ ์งํ)
์ด์ Spring Boot Devtools๊ฐ ์ ์ฉ๋์์ผ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ http://localhost:8080/hello
URL์ ํธ์ถํด ๋ณด์. ์๋ฒ๋ฅผ ์ฌ์์ ํ๊ธฐ ๋๋ฌธ์ "Hello SBB" ๋ผ๋ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. ์๋ฒ ์ฌ์์ ์์ด๋ ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ฉ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ถ๋ ฅ ๋ฌธ์์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ๋ณ๊ฒฝํ์.
package com.mysite.sbb;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello Spring Boot Board";
}
}
์์ ์ฌํญ์ด ์ ๋ฐ์๋๋์ง http://localhost:8080/hello
URL์ ํธ์ถํด ํ์ธํด ๋ณด์. ์๋ฒ๋ฅผ ์ฌ์์ํ์ง ์์๋ "Hello Spring Boot Board" ๋ฌธ์์ด์ด ์ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
Live Reload
HelloController์ ์ถ๋ ฅ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ฉด Spring Boot Devtools์ ์ํด ์์ ์ฌํญ์ด ์ ์ ์ฉ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์์ URL์ ๋ค์ ํธ์ถํ๋๊ฐ ๋ธ๋ผ์ฐ์ ๋ฆฌํ๋ ์(Refresh)๋ฅผ ํด์ผ๋ง ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค. Spring Boot Devtools์ Live Reload ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์ฌํธ์ถ(๋๋ ๋ฆฌํ๋ ์) ์์ด ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์๋ค. ๋ค๋ง Live Reload ๊ธฐ๋ฅ์ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ํตํด์๋ง ๊ฐ๋ฅํ๋ค.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ LiveReload++
ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ค์นํ์.
๊ทธ๋ฆฌ๊ณ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ์์ ๋ค์์ฒ๋ผ LiveReload++
๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ์.

๊ทธ๋ฌ๋ฉด ๋ธ๋ผ์ฐ์ ์ฐ์ธก ์๋จ์ LiveReload++
์ด ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

LiveReload++
์์ด์ฝ์ ์ ํํ๋ฉด ๋ค์์ฒ๋ผ ํ์ฑํ ๋๋ค.

์ด์ STS์์ ํ๋ก๊ทธ๋จ์ ์์ ํ๋ฉด ์๋ฒ๋ ๋ฌผ๋ก ๋ธ๋ผ์ฐ์ ๋ ๋ฆฌ๋ก๋ฉ๋์ด ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ถ๊ฐ ์์ ์์ด ์ฆ์ ํ์ธํ ์ ์๋ค.
๋กฌ๋ณต
๋กฌ๋ณต(lombok)์ ์๋ฐ ํด๋์ค์ Getter, Setter, ์์ฑ์ ๋ฑ์ ์๋์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ๋๊ตฌ์ด๋ค. SBB ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ํฐํฐ ํด๋์ค๋ DTO ํด๋์ค๋ฑ์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ด๋ ํด๋์ค์ ์์ฑ๋ค์ ๋ํ Getter, Setter๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ๋ฌผ๋ก Getter, Setter ๋ฉ์๋๋ฅผ ์ง์ ๋ง๋ค์ด๋ ๋์ง๋ง ๋กฌ๋ณต(lombok)์ ์ฌ์ฉํ๋ฉด ์ข ๋ ๊น๋ํ ์์ค์ฝ๋๋ฅผ ๋ง๋ค์ ์๋ค.
๋กฌ๋ณต ์ค์น
๋กฌ๋ณต์ ์ฌ์ฉํ๋ ค๋ฉด ํ๋ฌ๊ทธ์ธ์ ๋จผ์ ์ค์น ํด์ผํ๋ค. ๋ค์์ URL์์ ๋กฌ๋ณต ํ๋ฌ๊ทธ์ธ์ ๋ค์ด๋ก๋ ํ์.
๊ทธ๋ฆฌ๊ณ ๋ค์ด๋ก๋ํ lombok.jar
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์นํ์.
java -jar lombok.jar
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ํ๋๋ค.

๋กฌ๋ณต ํ๋ฌ๊ทธ์ธ์ด ์ค์น๋ IDE๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๊ฒฝ๊ณ ๋ฉ์์ง์ด๋ค. "ํ์ธ"์ ๋๋ฌ ๋ฉ์์ง์ฐฝ์ ๋ซ์. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋๋ค.

์ ํ๋ฉด์์ ๋ค์ ์์๋ก ๋กฌ๋ณต์ ์ค์นํ์.
- "Specify location"์ ๋๋ฌ ๋กฌ๋ณต ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ IDE์ธ STS๊ฐ ์ค์น๋ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ค.
- "Install / Update"๋ฅผ ๋๋ฌ ๋กฌ๋ณต ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ค.
- "Quit Installer"๋ฅผ ๋๋ฌ ์ค์น ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ค.
๊ทธ๋ฆฌ๊ณ STS๋ฅผ ์ข
๋ฃํ๊ณ ๋ค์ ์์ํํ build.gradle
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์.
// (... ์๋ต ...)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
// (... ์๋ต ...)
๋กฌ๋ณต ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ์ปดํ์ผ์ ๋กฌ๋ณต์ด ์ ์ฉ๋๋๋ก ํ๋ค.
build.gradle
ํ์ผ์ ์์ ํ ํ์๋ ๋ฐ๋์[Gradle -> Refresh Gradle Project]
๋ฅผ ์ ํํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ ํด์ผ ํ๋ค.
compileOnly
build.gradle
ํ์ผ์ compileOnly
๋ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ปดํ์ผ ๋จ๊ณ์์๋ง ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.annotationProcessor
์ปดํ์ผ ๋จ๊ณ์์ ์ ๋ํ ์ด์ ์ ๋ถ์ํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
Getter, Setter
๋ค์์ฒ๋ผ HelloLombok
ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋กฌ๋ณต์ด ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ์ธํด ๋ณด์.
์๋ ์ฝ๋ ์์ฑ์ ์ค๋ฅ๊ฐ ์์ด์ผ ํ๋ค.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/
HelloLombok.java
package com.mysite.sbb;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class HelloLombok {
private String hello;
private int lombok;
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok();
helloLombok.setHello("ํฌ๋ก");
helloLombok.setLombok(5);
System.out.println(helloLombok.getHello());
System.out.println(helloLombok.getLombok());
}
}
HelloLombok
ํด๋์ค์ hello, lombok 2๊ฐ์ ์์ฑ์ ์ถ๊ฐํ ํ ํด๋์ค๋ช
๋ฐ๋ก ์์ @Getter, @Setter๋ผ๋ ์ ๋ํ
์ด์
์ ์ ์ฉํ๋๋ Getter, Setter ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ง ์์๋ setHello, setLombok, getHello, getLombok ๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
๋กฌ๋ณต์ผ๋ก ์ปดํ์ผ๋ ํด๋์ค์๋ Getter์ Setter ๋ฉ์๋๊ฐ ์ค์ ๋ก ํฌํจ๋๋ค.
์ ํ ํฌ ์คํ๋ง๋ถํธ
๋กฌ๋ณต ์ ์ฉ์ด ์๋๋ค๋ฉด?
์ดํด๋ฆฝ์ค์ ๋กฌ๋ณต์ด ์ ์ฉ ์๋๋ ์ผ์ด์ค๋ ๋งค์ฐ ๋ค์ํ์ง๋ง JDK ์ค์ ์ด ์๋ชป๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค.

์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด [Preferences -> Java -> Installed JREs]
์์ ์ค์น๋ JDK๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ ๋กฌ๋ณต์ด ์ ๋์ํ๋์ง ํ์ธํด ๋ณด์.
RequiredArgsConstructor
์ด๋ฒ์๋ HelloLombok
ํด๋์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด ๋ณด์.
package com.mysite.sbb;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Getter
@Setter
public class HelloLombok {
private final String hello;
private final int lombok;
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok("ํฌ๋ก", 5);
System.out.println(helloLombok.getHello());
System.out.println(helloLombok.getLombok());
}
}
hello, lombok ์์ฑ์ final
์ ์ ์ฉํ๊ณ ๋กฌ๋ณต์ @RequiredArgsConstructor
์ ๋ํ
์ด์
์ ์ ์ฉํ๋ฉด ํด๋น ์์ฑ์ ํ์๋กํ๋ ์์ฑ์๊ฐ ๋กฌ๋ณต์ ์ํด ์๋์ผ๋ก ์์ฑ๋๋ค. (โป final
์ด ์๋ ์์ฑ์ ์์ฑ์์ ํฌํจ๋์ง ์๋๋ค.)
final
์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ @Setter๋ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ Setter ๋ฉ์๋๋ค๋ ์ฌ์ฉํ ์ ์๋ค.final
์ ํ๋ฒ ์ค์ ํ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ ํค์๋์ด๋ค.
์ฆ, ๋ค์๊ณผ ๊ฐ์ด ์์ฑ์๋ฅผ ์ง์ ์์ฑํ ๊ฒฝ์ฐ์ ๋์ผํ๋ค.
package com.mysite.sbb;
import lombok.Getter;
@Getter
public class HelloLombok {
private final String hello;
private final int lombok;
public HelloLombok(String hello, int lombok) {
this.hello = hello;
this.lombok = lombok;
}
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok("ํฌ๋ก", 5);
System.out.println(helloLombok.getHello());
System.out.println(helloLombok.getLombok());
}
}
@RequiredArgsConstructor
์ ๋ํ
์ด์
์ ์ดํ ์งํ๋๋ ์ฑํฐ์์ ์์กด์ฑ ์ฃผ์
(Dependency Injection)์ ์ฌ์ฉ๋๋ค.
DI(Dependency Injection) - ์คํ๋ง์ด ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ์ฌ ์ฃผ์ ํ๋ค.
์ฅ๊ณ (Django)๋ ํ์ด์ฌ์ผ๋ก ์์ฑ๋ ์คํ ์์ค ์น ํ๋ ์์ํฌ์ด๋ค. โฉ๏ธ
๋ฃจ๋น์จ๋ ์ผ์ฆ(Ruby on Rails)๋ ๋ฃจ๋น๋ก ์์ฑ๋ ์คํ ์์ค ์น ํ๋ ์์ํฌ์ด๋ค. ์ค์ฌ์ ๋ ์ผ์ฆ๋ผ ๋ถ๋ฅธ๋ค. ๋ด๋งํฌ์ ๋ฐ์ด๋น๋ ํ์ด๋ค๋ง์ด์ด ํ์จ(David Heinemeier Hansson)์ ์ํด ์์๋์ด ์คํ ์์ค๋ก ๊ฐ๋ฐ๋๊ณ ์๋ค. โฉ๏ธ
ํ๋ก๊ทธ๋๋ฐ์์ ์ ๋ํ ์ด์ ์ ์์ค ์ฝ๋์ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ธฐ์ ์ด๋ค. ์ ๋ํ ์ด์ ์ ์ฃผ์์ฒ๋ผ ์ฝ๋์ ํฌํจ๋์ง๋ง ์ปดํ์ผ๋ฌ๋ ๋ฐํ์ ํ๊ฒฝ์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์ฒ๋ฆฌ๋๋ค. โฉ๏ธ
Gradle(๊ทธ๋ ์ด๋ค)์ ์๋ฐ, Kotlin, ๊ทธ๋ฃจ๋น ๋ฑ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋น๋ ์๋ํ ๋๊ตฌ์ด๋ค. Gradle์ ํ๋ก์ ํธ ๋น๋ ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ, ํ ์คํธ ์คํ, ๋ฐฐํฌ, ๋ฆฌ์์ค ๋ณต์ฌ ๋ฐ ๊ธฐํ ๋ค์ํ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. โฉ๏ธ