본문으로 바로가기
반응형

어떤 기능을 하는 어플리케이션을 제작할때, 전체의 기능을 각각의 기능으로 쪼개어 담당하도록 합니다.

따라서 이런 세부적인 기능을들 담당하는 component를 알맞게 생성하고 연관지으며 프로그램이 동작하게 됩니다.


Spring 이란?

스프링은 위에서 언급한 component들을 생성하고 연관시켜 주는 작업을 합니다.
Spring application context라는 container를 제공하여 이 container가 각 기능을 담당하는 component를 생성하고 의존성 있는 것들끼리 연결하며, DI(Direct injection) 기법을 이용하여 bean을 상호 연결합니다.

따라서 각 컴포넌트간 어떤 관계에 있는지를 나타내도록 XML 또는 java 로 나타냅니다.
학생 component와 과목 component가 있고, 학생 component가 생성될때 생성자로 subject가 넘어가야 한다면 아래와 같이 표기 됩니다.

- XML 방식

<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 project를 생성하는 방법은 여러가지가 존재하지만 여기서는 Spring Tool Suite IDE를 이용하는 방법과 https://start.spring.io 의 웹페이에서 생성하는 방법만 사용해 봅니다.

개인적으로 IntelliJ를 사용하여 개발을 하고 있어 IntelliJ를 선호하지만 무료버전인 community 버전에서는 spring boot 프로젝트 생성을 지원하지 않습니다. (Ultimate에서만 지원해요..)
 

Spring Tool Suite IDE의 사용

먼저 하기 링크에서 tools을 다운 받습니다.

https://spring.io/tools

흠..저는 Eclipse plugin으로 다운받았습니다.

(그나마 제일 만만한 IDE네요)

설치후에 상단메뉴에서 아래와 같이 선택합니다.

File -> New -> Spring Starter Project


그럼 아래와 같이 프로젝트 정보를 넣는란이 나옵니다.



  1. Name: 생성할 프로젝트 이름을 넣습니다.

  2. 빌드 타입은 Maven으로 하겠습니다. (gradle이 편한신 분은 그래들을 써도 무방합니다.

  3. 또한 Packaging은 jar로 합니다.

  4. 그리고 전 Language를 Kotlin으로 선택했습니다. 물론 기본은 Java이나, 좀더 간결한 Kotlin으로 앞으로 개발을 진행할 예정이기 때문입니다. 이것도 기호에 따라..

  5. 나머지 정보는 자신의 프로젝트 정보에 맞게 넣어줍니다.

  6. Next!!

  1. 최신 Spring Boot Version을 사용합니다. (딱히 특정 버전이 필요한게 아니라면..)

  2. 그리고 필요 라이브러리를 선택해서 추가합니다.

  3. 저는 Selected: 란에 있는 네개의 라이브러리를 기본으로 추가했습니다.

  4. Finish!!

Tool에서 기본 프로젝트를 생성해서 보여줍니다.
Eclipse를 확장하여 생성한 이 Tool을 써도 되지만 개발은 IntelliJ를 이용해서 할꺼라서 전 IntelliJ에서 import 해봤습니다.


참고로 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등을 정의) 가 들어 있습니다.

상세한 구조

- pom.xml
<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의 내용을 포함하고 있습니다.

  1. @SpringBootConfiguration: 현재 클래스를 configuraion class로 지정 -> 다른 configuration 추가 가능
  2. @EnableAutoConfiguration: component들을 자동 구성하도록 합니다.
  3. @ComponentScan: 선언된 component를 검색하고 spring application context에 등록.

실제 jar를 파일을 구동시키면 main함수가 수행되고 runApplication()이 실행됩니다.
사실 runApplication()은 kotlin의 extension 함수 입니다. 그 내부를 들여다 보면 아래와 같이 SpringApplication.run() 함수를 호출하는걸 볼 수 있습니다.
/**
 * 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 웹페이지 요청 처리

스프링은 스프링 MVC에 따라서 정의합니다.
여타 MVC 패턴과 마찮가지이므로 설명은 생략합니다.

일단 웹 main page로 들어왔을때 어떤 페이지를 보여줄지를 결정할 controller를 아래와 같이 작성합니다.


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 실행만으로 웹을 처리하는 서버가 되는거죠.


반응형