어떤 기능을 하는 어플리케이션을 제작할때, 전체의 기능을 각각의 기능으로 쪼개어 담당하도록 합니다.
따라서 이런 세부적인 기능을들 담당하는 component를 알맞게 생성하고 연관지으며 프로그램이 동작하게 됩니다.
Spring 이란?
<bean id="subject" class="com.doo.subjects"/>
<bean id="student" class="com.doo.student">
<constructor-arg ref=subjects"/>
</bean>
- Java 방식
@Configuration
public class SchoolConfiguration{
@Bean
public Subject subject() {
return new Subject();
}
@Bean
public Student student() {
return new Student(subject());
}
}
(여기서 bean의 id는 함수명이 됩니다.)
하지만 스프링의 autoconfiguration 기능에 의해 관계를 정의하지 않더라도 container가 bean으로 생성할수 있으며 spring boot를 이용하면 아주 쉽게 향상된 autoconfiguration 기능을 이용하고, project를 생성 할 수 있습니다.
Spring project의 생성
Spring Tool Suite IDE의 사용
먼저 하기 링크에서 tools을 다운 받습니다.
흠..저는 Eclipse plugin으로 다운받았습니다.
(그나마 제일 만만한 IDE네요)
설치후에 상단메뉴에서 아래와 같이 선택합니다.
File -> New -> Spring Starter Project
그럼 아래와 같이 프로젝트 정보를 넣는란이 나옵니다.
Name: 생성할 프로젝트 이름을 넣습니다.
빌드 타입은 Maven으로 하겠습니다. (gradle이 편한신 분은 그래들을 써도 무방합니다.
또한 Packaging은 jar로 합니다.
그리고 전 Language를 Kotlin으로 선택했습니다. 물론 기본은 Java이나, 좀더 간결한 Kotlin으로 앞으로 개발을 진행할 예정이기 때문입니다. 이것도 기호에 따라..
나머지 정보는 자신의 프로젝트 정보에 맞게 넣어줍니다.
Next!!
최신 Spring Boot Version을 사용합니다. (딱히 특정 버전이 필요한게 아니라면..)
그리고 필요 라이브러리를 선택해서 추가합니다.
저는 Selected: 란에 있는 네개의 라이브러리를 기본으로 추가했습니다.
Finish!!
참고로 intellj 에서도 File -> New -> Project from Existing Sources... 메뉴를 통해서 생성해 놓은 project의 import가 가능합니다.
웹페이지를 이용한 Project 생성
https://start.spring.io 에 접속하면 위에서 두번에 나눠서 봤던 화면을 한 화면에 볼수 있습니다.
위에 넣었던 정보와 동일하게 넣고 dependency로 동일하게 추가한 후에 GENERATE 버튼을 누르면 zip 파일로 생성된 project를 떨어뜨려 줍니다.
이처럼 spring boot를 이용하면 정말 간단하게 프로젝트를 생성할 수 있습니다.
Project의 구조
- MyLittleWorldApplication.kt: Spring boot의 main class 입니다. 따라서 나중에 project를 빌드하여 jar를 실행 시키면 이 클래스의 main이 시작점이 되어 수행됩니다.
- resources/static: 웹페이지에 제공할 이미지, css, js등 말 그대로 resource를 담습니다.
- resources/templates: 브라우저에 컨텐츠를 보여주는 템플릿 파일이 위치합니다.
- test: test 코드가 위치하는 폴더 입니다.
- mvnw, mvnw.cmd: Maven wrapper 스크립트 입니다.
- pom.xml: Maven의 빌드명세 (버전, dependency등을 정의) 가 들어 있습니다.
상세한 구조
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>sia</groupId>
<artifactId>mylittleworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>My Little World</name>
<description>My Little World Example</description>
<properties>
<java.version>1.8</java.version>
<kotlin.version>1.3.72</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
...
pom.xml에는 기본적인 project의 정보와 관련 library를 정의합니다.
먼저 <parent> 내부에 artifactId를 보면 아래와 같이 정의됩니다.
<artifactId>spring-boot-starter-parent</artifactId>
이를 지정함으로써 2.3.0.RELEASE 버전을 기준으로 관련된 라이브러리들이 의존성을 갖습니다.
또한 <dependencies> 태그안에 선언된 추가 라이브러리들도 artifactId란에 spring-boot-starter-...가 선언되면서 사용하기 위해 추가한 라이브러리들의 버전을 따로 명시하거나, 명시된 라이브러리를 사용하기 위해 추가해야하는 다른 라이브러리들을 알아서 관리해 줍니다.
- MyLittleWorldApplication
@SpringBootApplication
class MyLittleWorldApplication
fun main(args: Array) {
runApplication(*args)
}
내부 코드는 위와 같습니다.
@SpringBootApplication은 아래 세개의 annotation의 내용을 포함하고 있습니다.
- @SpringBootConfiguration: 현재 클래스를 configuraion class로 지정 -> 다른 configuration 추가 가능
- @EnableAutoConfiguration: component들을 자동 구성하도록 합니다.
- @ComponentScan: 선언된 component를 검색하고 spring application context에 등록.
/**
* Top level function acting as a Kotlin shortcut allowing to write
* `runApplication(arg1, arg2)` instead of
* `SpringApplication.run(FooApplication::class.java, arg1, arg2)`.
*
* @author Sebastien Deleuze
* @since 2.0.0
*/
inline fun runApplication(vararg args: String): ConfigurableApplicationContext =
SpringApplication.run(T::class.java, *args)
Main 웹페이지 요청 처리
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
@Controller
class HomeController {
@GetMapping("/") //루트 경로에 대한 처리
fun mainHome(): String {
return "index" // View 이름을 반환
}
}
@Controller: Spring이 controller로 인식하고 HomeController의 intance를 bean으로 생성하게 합니다.
@GetMapping: root 경로에 HTTP GET이 요청되면 해당 function이 담당하도록 명시 합니다.
controller를 작성했으니, 이를 보여줄 view를 Thymeleaf를 사용하여 작성해 봅니다.
- index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
lang="en">
<head>
<meta charset="UTF-8">
<title>My Little World</title>
</head>
<body>
<h1>Welcome to my world!!</h1>
<img th:src="@{/images/kotlin_2.png}"/>
</body>
</html>
이미지도 하나 보여주기 위해서 상대경로를 의미하는 @{...}를 사용하여 thymeleaf의 src 속성을 지정합니다.
두 파일의 위치는 resource 아래 존재합니다.
다됐으니 이제 구동만 시키면 됩니다.
IntelliJ 기준으로 run은 Ctrl+Shift+F10 입니다. 아니면 Run -> run 을 수행해도 됩니다.
그럼 콘솔창에 구동됨을 알려주는 로그들이 쭈~~욱 뜹니다.
그리고 나서 웹 브라우저에서 구동시 아래와 같은 화면을 볼 수 있습니다. (localhost:8080)
실제로 jar 파일을 만들어 수행해도 되지만 IDE를 이용하면 쉽게 실행시켜 볼 수 있습니다.
jar로 실행이 필요하다면 아래 글에 방법을 정의해 놓았습니다.
2019/09/18 - [개발이야기/Java] - IntelliJ에서 jar 생성
실제 jar로 추출하면 톰캣서버도 포함되어 배포됩니다.
따라서 톰캣을 설치하지 않았어도 jar 실행만으로 웹을 처리하는 서버가 되는거죠.
'개발이야기 > Spring & Ktor Framework' 카테고리의 다른 글
[Spring] 스프링 DB 접근 및 활용 - JPA (2/2) with kotlin #5 (0) | 2020.12.29 |
---|---|
[Spring] 스프링 DB 접근 및 활용 - JdbcTemplate (1/2) with kotlin #4 (0) | 2020.12.29 |
[Spring] lombok 오류 - java: variable type not initialized in the default constructor (0) | 2020.12.23 |
[Spring] 스프링 - Form 유효성 체크 with kotlin #3 (2) | 2020.05.28 |
[Spring] 스프링 - Web application 구현 with kotlin #2 (0) | 2020.05.27 |