#1 ํ๋ก์ ํธ ํ๊ฒฝ์ค์
by JiwonDev#0 IntelliJ ์ค์น
Jetbrain์ IntelliJ๋ฅผ ์ค์นํด์ฃผ์. ์ปค๋ฎค๋ํฐ๋ฒ์ ์ ์ค์นํด๋ ๋๊ณ , ํ์์ด๋ผ๋ฉด ํ๊ต๊ณ์ ์ผ๋ก ์ ๋ฃ๋ฒ์ ์ ์ค์นํด๋ ๋๋ค.
https://www.jetbrains.com/ko-kr/idea/
#1 (๋ณด์ผ๋ฌ ํ๋ ์ดํธ) https://start.spring.io/
์๋ ์๋ ์ค์ ์ ๊ฒ์ํด์ ํ๋ฃจ์ข ์ผ ๋ง๋ค์ด์ผํ๋๋ฐ, ์คํ๋ง ๋ถํธ๊ฐ ๋์จ๋ค๋ก 10๋ถ๋ง์ ๋๋ผ ์ ์๊ฒ ๋์๋ค.
Core: Spring Web / View: Thymeleaf(ํ ํ๋ฆฟ ์์ง) / ORM: Spring Data Jpa / DB: H2(ํ ์คํธ&๊ฐ๋ฐ์ฉ)
์คํ๋ง ๋ถํธ ํ๋ก์ ํธ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์๋ค๋ฉด ๋น๋ํด์ ์ ์๋ํ๋์ง ํ์ธํด๋ณด์. ๊ธฐ๋ณธ ํฌํธ๋ 8080์ธ๋ฐ ๋ง์ฝ ๊ฒน์น๋ค๋ฉดapplication.properties ํ์ผ์ ์ด์ฉํด ์๋์ ๊ฐ์ด ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
// application.properties์ ์์ฑ
server.port = ํฌํธ๋ฒํธ
๊ทธ๋ฆฌ๊ณ Lombok ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐ๋ก ์ค์นํด์ฃผ์. ์น์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋ ์๋์์ฑ์ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Lombok์ ์ฌ์ฉํ๋ ค๋ฉด Annotation Processor๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์ค์ ์์ ์ฐพ์์ ํ์ฑํ ํด์ฃผ์. ์ฐธ๊ณ ๋ก ์ด๋ ธํ ์ด์ ํ๋ก์ธ์ฑ์ ์ปดํ์ผ ํ์์ ์ด๋ ธํ ์ด์ ์ ์ค์บํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ฝ์ ๋ ํด(hook)์ด๋ค.
๋ง์ง๋ง์ผ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ ๋ ์๋ฒ๋ฅผ ์ฌ์์ํ์ง ์๊ณ , ์ผ๋ถ ํ์ผ๋ง ์ฌ์ปดํ์ผํ๊ธฐ ์ํด์ spring-boot-devtools๋ฅผ ์๋์ ๊ฐ์ด ์๋์ผ๋ก ์ถ๊ฐํด์ฃผ์. ์ถ๊ฐํ ๋ค์ Gradle์ ์๋ก๊ณ ์นจํด์ฃผ๋ฉด ์ค์น๋๋ค.
// bulid.gradle
... ์๋ต ...
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
# View ํ ํ๋ฆฟ ์์ง (Thymeleaf)
์ต๊ทผ์๋ Thymeleaf, Freemarker, Groovy๋ฑ ์๋ ์ JSP๋ฅผ ๋์ฒดํ ์ ์๋ View ํ ํ๋ฆฟ ์์ง๋ค์ด ์กด์ฌํ๋ค. ์คํ๋ง ์งํ์์๋ HTML ๋ฌธ๋ฒ์ ๊นจ์ง์๊ณ ๊ทธ๋๋ก ์ฌ์ฉํ๋ Thymeleaf v3.0๋ฅผ ๋ฐ๊ณ ์๋ค.
Thymeleaf ๊ณต์ ์ฌ์ดํธ, ์คํ๋ง ๊ณต์ ํํ ๋ฆฌ์ผ, ์คํ๋ง๋ถํธ ๋ฉ๋ด์ผ
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<span th:text="${hello}"> default text </span>
<input style="width: 100px; height:30px;" th:value="${hello}">
<div th:switch="${hello}">
<p th:case="'admin'">admin
<p th:case="#{hello}=='user'">User
<p th:case="*">*์
๋๋ค
</div>
<p th:if="${hello}=='web'" th:text="${hello}"></p>
<p th:text="${hello}" th:unless="${true}">
unless ์
๋๋ค
</p>
<div class="btn-group" th:each="item:${itemList}">
<button class="btn btn-secondary" style="margin: 5px;" th:text="${item.landmarkName}"
th:value="${item.landmarkSn}"></button>
</div>
</body>
</html>
# Database (H2)
JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Spring Data JPA๋ฅผ ์ค์นํด์ฃผ๋ฉด ๋๋ค. ์ด๋ JDBC๋ ํฌํจํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์นํด๋ ๋๋๋ฐ, ๊ฐ๋ฐ๋จ๊ณ์์๋ ์๋ฐ๋ก ๊ตฌ์ฑ๋ ๊ฐ๋ฒผ์ด H2 DB๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋์ค์ ๋ฐ๊พธ๋ ํ์์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
H2 DB๋ ์๋ฐ๋ฅผ ์ค์น ํ ํ www.h2database.com ์์ ๋ค์ด๋ฐ์ ์ ์๋ค. ์ค์น ํ H2/bin/h2.bat์ ํตํด ์น์ผ๋ก ์คํํ ์ ์๋ค. ์ ์ผ ์ฒ์์๋ jdbc:h2:~/jpashop ์ผ๋ก ์ ์ํ์ฌ DB ํ์ผ์ ์์ฑ ํ jdbc:h2:tcp://localhost/~/jpashop๋ก ์ ์ํ์ฌ ๋คํธ์ํฌ๋ก DB์ ์ ๊ทผํ์.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ์ ์๋ฃํ๋ค๋ฉด, ํ๋ก์ ํธ์ ์ฐ๊ฒฐํด์ฃผ์.
# YAML์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ค์ ์ ์ฝ๊ธฐํธํ๊ฒ ๋ง๋ ๋ค.
# ์ค์ ๋ฐฉ๋ฒ์ spring-boot ๋ฉ๋ด์ผ์ ์น์ ํ๊ฒ ์ ํ์๋ค.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
# ์ฑ ์คํ ์์ ์ ๊ธฐ์กด ํ
์ด๋ธ์ ์ง์ฐ๊ณ ์๋ก ์์ฑํจ.
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
๐งจ์์ฑ๊ถํ์ด ์๋ค๊ณ ๋ฌ๋ค๋ฉด, C:// ์ฌ์ฉ์(Users) / ์ ์ ๋ช ์ ๋ค์ด๊ฐ์ test.mv.db ์ฒ๋ผ ํ์ผ์ ๋ง๋ค์ด์ฃผ์.
๊ทธ๋ฌ๊ณ ๋์ jdbc:h2:~/test ๋ก ์ ์์ ์๋ํด DB๋ฅผ ๋ง๋ค๊ณ ์ดํ jdbc:h2:tcp://localhost/~/test ๋ก ์ ์ํด์ฃผ๋ฉด ๋๋ค.
๐งจ ์คํ๋ง์์ ๋ก์ปฌ H2 DB๊ฐ ์๋๋ผ, ๊ทธ๋ฅ ์ธ๋ฉ๋ชจ๋ฆฌ DB๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ๋ ์๋ค. (์ด๊ฒฝ์ฐ Tcp DataGrip ์ฌ์ฉ์ ๋ถ๊ฐ๋ฅ)
spring:
datasource:
url: jdbc:h2:mem:test
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
๐งจ ์๋์ ๊ฐ์ด ํฌํธ๋ฒํธ๊ฐ ๊ฒน์น๋ค๊ณ ๋ฌ๋ค๋ฉด ํด๋น ํฌํธ๋ฅผ ๊บผ์ฃผ๊ฑฐ๋, H2DB ํฌํธ๋ฅผ ๋ฐ๊ฟ์ฃผ์
Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use: NET_Bind" [90061-200]
์ฌ์ฉ์ค์ธ ํฌํธ๋ฅผ ๋๋ ๋ฐฉ๋ฒ์ netstat ๋ช ๋ น์ด๋ก ํฌํธ๋ฅผ ์ฐพ์์, ๋๋ฉด๋๊ณ
netstat -ano | findstr 8005 (8005 ํฌํธ๋ฒํธ์ฐพ๊ธฐ)
taskkill /f /pid 19072 (PID 19072 ๊ฐ์ ์ข
๋ฃ)
H2DB ํฌํธ๋ณ๊ฒฝ์
h2/bin ๊ฒฝ๋ก๋ก ์ด๋ํด์ ์ฝ์๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
java -cp h2-1.4.200.jar org.h2.tools.Server -webPort 8083
# P6 Spy
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌํ๋ผ๋ฉํ๊ฐ ๋ณด์ด์ง ์์ ๋ถํธํ๋ฐ, ์คํ์์ค๋ฅผ ์ด์ฉํด์ ๋ณด์ด๊ฒ ๋ง๋ค ์ ์๋ค. P6spy๋ง๊ณ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ ์์ผ๋ ๊ถ๊ธํ๋ฉด ์ค๋ช ์ ์ฝ์ด๋ณด๋๋ก ํ์. (* ๊ฐ๋ฐ์ด ์๋ ์ด์์์๋ ์ด๋ฐ Lib๋ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ค.)
https://github.com/gavlyukovskiy/spring-boot-data-source-decorator#quick-start
# ์์ฝ
๊ฐ๋ฐํ๊ฒฝ: (IntelliJ)
๋น์ฆ๋์ค App ์๋ฐ ํ๋ ์์ํฌ: (Spring Core)
Server: (Spring boot์ ๋ด์ฅ ํฐ์บฃ)
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ: (Gradle, Springboot)
View: (thymeleaf ํ ํ๋ฆฟ ์์ง)
DB: (H2)
ORM: (Spring boot JPA, ๊ฐ์ฒด์งํฅ -> ๊ด๊ณํDB ์ฐ๊ฒฐ)
Spring Core์ Spring MVC, Spring Boot์ ์ฐจ์ด
@Spring framework
Spring framework๊ฐ ์ ๊ณตํ๋ ๋ชจ๋๋ค์ ํต์ฌ์ ์์กด์ฑ ์ฃผ์ ๊ณผ IoC(Inversion of Control)์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์์กด์ฑ ์ฃผ์ ๊ณผ IoC๋ฅผ ํตํด ์์ค๋ณ๊ฒฝ์ ์ต์ํ ํ๋ฉฐ ํ๋ก๊ทธ๋จ์ ์ ์ดํ ์ ์์ต๋๋ค.
@Spring Boot
์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ง ํ๋ ์์ํฌ์์ ์ค์ ์์ด ์ฝ๊ฒ ์์กด์ฑ ์ฃผ์ ์ ๋ฐ์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์น์์๋ ๋ค์๊ณผ ๋น์ทํ ์๊ตฌ์ฌํญ๋ค์ ๊ฐ์ฃ . Spring MVC, Jackson Databind (๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ฉ), Hibernate-Validator (Java Validation API ๋ฅผ ์ด์ฉํ ์๋ฒ์ฌ์ด๋ ์ ํจ์ฑ ํ์ธ ์ฉ), Log4j (๋ก๊น ์ฉ). ์ฐ๋ฆฌ๊ฐ ์ด ์ฝ์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด ๋ชจ๋ ํ๋ ์์ํฌ๋ค์ด ํธํ๋๋ ๋ฒ์ ์ ์ ํํ๊ณ ํ๋ํ๋ ์ค์ ํ์ผ์ ์์ฑํด์ผ ํ์ต๋๋ค.
์คํ๋ง๋ถํธ๋ ์คํํฐํฉ(ex Spring Starter Web)์ ์ ๊ณตํด์ฃผ์ด ์ด๋ฌํ ์ค์ ์ ์๋์ผ๋ก ๊ตฌ์ฑํ ์ ์๊ฒ ํด์ฃผ๊ณ , ์คํ๋ง ๋ถํธ ์์ฒด์ Java์ฝ๋๋ก ์์ฑ๋ ์น์๋ฒ(๊ธฐ๋ณธ๊ฐ_ํฐ์บฃ)๋ฅผ ๋ด์ฅํ๊ณ ์๊ธฐ์ ๋ณต์กํ ํ๊ฒฝ์ค์ , ๋ฐฐํฌ๊ณผ์ ์์ด ํ๋ก์ ํธ ์๋ฒ๊น์ง ํต์งธ๋ก JAR ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ค๋๋ค.
@Spring MVC
์คํ๋ง๋ถํธ๋ ํฐ์บฃ ์น ์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์๊ธด ํ์ง๋ง, ๋ณต์กํ ๋น์ฆ๋์ค์ ์ฌ์ฉ๋๋ ํฐ ์ฑ์ ๊ฒฝ์ฐ ๋ด์ฅ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๊ธฐ์ ๋ฌด๋ฆฌ๊ฐ ์๊ณ , WAS์ ์ง์ ์ธํ ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋์ ์ด๋ฐ ๊ฒฝ์ฐ Spring MVC ํํ๋ก ๋ง๋ค์ด ์ด๋ฏธ ์กด์ฌํ๋ WAS์ ๋ฐฐํฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
'๐ฑ Spring Framework > Spring Boot & Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋๋ค ์คํ๋ง ๋ถํธ #1 (0) | 2022.03.02 |
---|---|
#2 ํ๋ก์ ํธ ๊ธฐํ & ๋๋ฉ์ธ ์ค๊ณ (0) | 2021.08.08 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev