JiwonDev

#1 ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •

by JiwonDev

#0 IntelliJ ์„ค์น˜

Jetbrain์˜ IntelliJ๋ฅผ ์„ค์น˜ํ•ด์ฃผ์ž. ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฒ„์ „์„ ์„ค์น˜ํ•ด๋„ ๋˜๊ณ , ํ•™์ƒ์ด๋ผ๋ฉด ํ•™๊ต๊ณ„์ •์œผ๋กœ ์œ ๋ฃŒ๋ฒ„์ „์„ ์„ค์น˜ํ•ด๋„ ๋œ๋‹ค.

https://www.jetbrains.com/ko-kr/idea/

 

IntelliJ IDEA: ์šฐ์ˆ˜์„ฑ๊ณผ ์ธ์ฒด ๊ณตํ•™์ด ๋‹ด๊ธด JetBrains Java IDE

 

www.jetbrains.com

 


#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์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , IntelliJ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์„ค์น˜ํ•ด์ฃผ์ž.

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์— ์ ‘๊ทผํ•˜์ž. 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด C:\User\์œ ์ €๋ช…\jpashop.mv.db ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€๋ง๊ณ  ์œ„์™€ ๊ฐ™์ด tcp๋ฅผ ๊ฑฐ์ณ url๋กœ ์ ‘์†ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด, ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•ด์ฃผ์ž.

# 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 ๋กœ ์ ‘์†ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200]

 

๐Ÿงจ ์Šคํ”„๋ง์—์„œ ๋กœ์ปฌ 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

 

GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s

Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth - GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-p...

github.com

 

๊ทธ๋ฆฌ๊ณ  gradle reload ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ถ”๊ฐ€์ ์ธ ์„ค์ •์€ github readme ์ฐธ์กฐ.


# ์š”์•ฝ

๊ฐœ๋ฐœํ™˜๊ฒฝ: (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์— ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.  

 

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ