๐Ÿšง

[๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…] spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ ๋ฐ gradle ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

purpplee 2021. 11. 19. 14:19

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ

์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๐Ÿ‘‰ Spring Initializer ๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ dependency ์—์„œ web, jpa, lombok, devtools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  generate ๋ฅผ ํด๋ฆญํ•˜๋ฉด zip ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ ๋œ๋‹ค. ๋‹ค์šด๋ฐ›์€ zip ํŒŒ์ผ์„ ์••์ถ• ํ•ด์ œ ํ›„ IntelliJ ์—์„œ open ํ•˜๋ฉด ๋œ๋‹ค.

  • web : Spring MVC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RESTful์„ ํฌํ•จํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œ. Apache Tomcat์„ ๊ธฐ๋ณธ ๋‚ด์žฅ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • JPA(Java Persistence API) : ORM(Object Relational Mapping) ์ด๋ผ๋Š” ๋ฐ์ด๋ฒ ์ด์Šค table ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘(๋ณ€ํ™˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.) ์‹œ์ผœ์ฃผ๋Š” ๊ธฐ์ˆ ์˜ ํ‘œ์ค€์œผ๋กœ, ์ด ORM ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค(AP ๊ทœ๊ฒฉ)์˜ ๋ชจ์Œ์ด๋‹ค. Hibernate ๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ฐธ๊ณ ๋กœ Spring Data JPA ๋Š” Hibernate ๋“ฑ๊ณผ ๊ฐ™์€ JPA provider ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JPA ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด JPA๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ์ถ”์ƒํ™” ์‹œํ‚จ ๊ฒƒ์ด๋‹ค.
  • lombok : Annotation ์„ ํ†ตํ•ด getter, setter, builder ๋“ฑ์˜ ๋ฐ˜๋ณต ๋ฉ”์†Œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
  • devtools : ๋น ๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘, LiveReload ๋ฐ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

 

gradle ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

Gradle ๋กœ ์ƒ์„ฑํ•œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ์ด๋‹ค.

  • .gradle : gradle ์ด ์‚ฌ์šฉํ•˜๋Š” ํด๋”. task ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธ์ง‘ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค.
  • .idea : ๋กœ์ปฌ IntelliJ IDE ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ ํด๋”๋‹ค.
  • gradle : gradle ์ด ์‚ฌ์šฉํ•˜๋Š” ํด๋”. gradle ํ™˜๊ฒฝ์„ ์ •๋ฆฌํ•œ wrapper ํŒŒ์ผ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
  • src : ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ๊ฐ์ข… ์†Œ์Šค์ฝ”๋“œ์™€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.
    • main : java ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.
    • test : test ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ๋‹ค.
  • .gitignore : git ์ด ๋ฌด์‹œํ•  ํŒŒ์ผ๋“ค์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค.
  • build.gradle : gradle ์˜ ๋นŒ๋“œ ์„ค์ • ํŒŒ์ผ์ด๋‹ค. groovy ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์— dependency ๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  • gradlew : gradle ์˜ ๋ช…๋ น ํŒŒ์ผ. macOS ์™€ Linux ์šฉ์ด๋‹ค.
  • gradle.bat : gradle ์˜ ๋ช…๋ น ํŒŒ์ผ. windows ์šฉ์ด๋‹ค.
  • setting.gradle : ํ”„๋กœ์ ํŠธ ์„ค์ • ์ •๋ณด ํŒŒ์ผ์ด๋‹ค.

 

build.gradle

ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ™์€ dependecy ์˜ ์ด๋ฆ„ ๋ฐ ๋ฒ„์ „์„ ์ ์œผ๋ฉด ์ดํ›„ gradle ์ด ๋นŒ๋“œํ•  ๋•Œ ์•Œ์•„์„œ ๋‹ค์šด๋ฐ›์•„์ค€๋‹ค. spring initializer ์—์„œ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋˜ jap, web, lombok, devtool ๋“ค์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค. ์ง€๊ธˆ์€ database ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์œผ๋‹ˆ jpa ๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌ ํ•ด์ค€๋‹ค. ์•ˆ ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์‹คํ–‰์ด ์•ˆ ๋  ๊ฒƒ์ด๋‹ค.

plugins {
	id 'org.springframework.boot' version '2.5.7'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

...

dependencies {
	//implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

...

 

 

src/main/java/TodolistTutorialApplication.java

spring initializer ๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€ ์†Œ์Šค ์ฝ”๋“œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” main ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋‚ด์žฅ๋œ ํ†ฐ์บฃ์„ ์ž์ฒด์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ค๊ธฐ ๋–„๋ฌธ์— spring ๊ณผ ๋‹ฌ๋ฆฌ ๋ณ„๋„์˜ ์›น์„œ๋ฒ„๋ฅผ ๋‹ค์šด๋ฐ›์ง€ ์•Š๊ณ ๋„ ๋ฐ”๋กœ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

package com.todolist.tutorial;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TodolistTutorialApplication {

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

}

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

IDE ์—์„œ run ์„ ํ•˜๋ฉด ์‹คํ–‰๋œ๋‹ค.

 

์ปค๋งจ๋“œ๋ผ์ธ์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ์—์„œ gradle ํ˜น์€ ./gradlew ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•œ๋‹ค. (window ์—์„œ๋Š” gradlew)

~/Project/study/springboot/tutorial > gradle bootRun
~/Project/study/springboot/tutorial > ./gradlew bootRun

 

์„ฑ๊ณต ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  localhost:8080์— ์ ‘์†ํ•˜๋ฉด error ํŽ˜์ด์ง€๊ฐ€ ๋œฐ ๊ฒƒ์ด๋‹ค.  ๋งŒ์•ฝ ์‹คํ–‰์ด ์•ˆ ๋œ๋‹ค๋ฉด build.gradle ํŒŒ์ผ์—์„œ jpa dependency ๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌ ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

2:13:48 ์˜คํ›„: Executing task ':TodolistTutorialApplication.main()'...

> Task :compileJava
> Task :processResources UP-TO-DATE
> Task :classes

> Task :TodolistTutorialApplication.main()
14:13:50.772 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@18e2c412

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.7)

2021-11-19 14:13:51.126  INFO 19062 --- [  restartedMain] c.t.t.TodolistTutorialApplication        : Starting TodolistTutorialApplication using Java 1.8.0_202 on userui-MacBookPro.local with PID 19062 (/Users/user/Project/study/springboot/tutorial/build/classes/java/main started by user in /Users/user/Project/study/springboot/tutorial)
2021-11-19 14:13:51.134  INFO 19062 --- [  restartedMain] c.t.t.TodolistTutorialApplication        : No active profile set, falling back to default profiles: default
2021-11-19 14:13:51.180  INFO 19062 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-11-19 14:13:51.180  INFO 19062 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-11-19 14:13:51.980  INFO 19062 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-11-19 14:13:51.991  INFO 19062 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-11-19 14:13:51.991  INFO 19062 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.55]
2021-11-19 14:13:52.055  INFO 19062 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-11-19 14:13:52.055  INFO 19062 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 874 ms
2021-11-19 14:13:52.393  INFO 19062 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2021-11-19 14:13:52.423  INFO 19062 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-19 14:13:52.432  INFO 19062 --- [  restartedMain] c.t.t.TodolistTutorialApplication        : Started TodolistTutorialApplication in 1.651 seconds (JVM running for 2.058)
2021-11-19 14:15:16.716  INFO 19062 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-19 14:15:16.716  INFO 19062 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-11-19 14:15:16.718  INFO 19062 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms

 

๋ฐ˜์‘ํ˜•