티스토리 뷰

728x90
반응형

마이크로 서비스 아키텍처가 인기를 얻으면서 보다 빠르고 보다 가벼운 애플리케이션을 원하는 수요가 점점 늘어나고 있습니다.

기존의 WAS POC에서는 엔터프라이즈 급 기능을 검증하고 사용하든 않하든 일단 돼? 안돼?를 검증했던 시대에서 지금은 가능한 사용하는 기능만 플러그인 된 상태로 메모리를 얼마나 적게 사용하고 얼마나 작은 디스크 용량을 차지하는지가 관건이 된 시대로 탈바꿈되었습니다.

그 모든 요구사항이 한번에 적용될 수 있는 Spring Boot는 마이크로 서비스 아키텍처를 설계하는데 필수적인 프레임워크로 자리잡았습니다.

 

Kubernetes의 중요도에 따라 모든 csp 3사는 한결같이 k8s 추종 container managedment를 개발하였듯이 Spring Boot의 중요도가 높아지자 최근 대기업의 자체 프레임워크나 전자정부 프레임워크 등도 모두 Boot 버전을 출시하고자 노력하고 있습니다. 물론 이미 베타 버전이 나온 제품도 있구요.

 

지금부터 살펴볼 내용은 앞서 살펴본 Spring Boot의 구조를 기반으로 REST API를 작성해 보도록 하겠습니다.

지난 포스팅은 다음을 참고하시기 바랍니다.

 

[Spring Boot] git clone을 활용한 Spring Boot 프로젝트 repository 이관

[Spring Boot] gitlab & Eclipse 연동을 통한 Spring Boot 개발 프로젝트 구축

[Spring Boot] Spring Boot Maven Repo 구축(Nexus2 OSS 내부 저장소)

[Spring Boot] Spring Boot Maven Repo 연동(Nexus2 OSS 내부 저장소)

[Spring Boot] Spring Boot Structure

 

이번 시간에는 Spring Boot를 처음 시작하는 과정이라 할 수 있는 Hello World를 출력하는 과정에 대해 알아보겠습니다.

Spring Boot Project 생성

Spring Boot 프로젝트를 생성하는 개발 IDE로 사용하기 용이한 제품으로는 대표적인 Eclipse가 있고 STS나 인텔리J IDEA등이 있지만 본 포스팅에서는 가장 대중적인 이클립스를 활용하여 테스트를 진행하도록 하겠습니다.

1) Spring Boot 프로젝트를 생성합니다.

File → New → Spring Starter Project

Name, Group, Artifact, Package 등 Spring Boot Description 정의

Spring Boot Dependencies 추가 (본 포스팅에서는 추가하지 않음) → Finish

아래는 생성이 완료 된 프로젝트의 디렉토리 구성입니다.

src/main/java 자바 소스 경로
src/test/java Spring Boot 테스트 코드 경로
src/main/resources application.properties 등 Spring Boot property 경로
src/main/resources/static 정적 파일 경로
src/main/resources/templates thymeleaf, freemarker 및 추가 템플릿 파일의 경로

Hello Spring Boot 작성

Spring Boot에서 Dependency를 관리해 주는 매니저로는 크게 Maven Builder와 Gradle Builder가 있습니다.

이중 Maven Builder를 선택하여 Dependency 모듈을 관리하도록 하겠습니다.

1) pom.xml 작성

<?xml version="1.0" encoding="UTF-8"?>
<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 http://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.1.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.nrson.spring.boot</groupId>
	<artifactId>SpringBoot_Start</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>SpringBoot_Start</name>
	<description>Microservice for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

기본으로 추가되어 있는 pom.xml에 Spring Boot Sample 작성 및 junit Test에 필요한 Dependency 모듈을 추가합니다.

spring-boot-starter-web, org.projectlombok Dependency가 기본 pom.xml에서 추가 된 것을 확인할 수 있습니다.

 

2) application.yml 작성

server:
  port: 8000
---
spring:
  profiles: local
server:
  port: 8080
---
spring:
  profiles: dev
server:
  port: 8090
---
spring:
  profiles: prod
server:
  port: 80

Spring Boot의 property를 관리하는 방법은 크게 두가지 방법이 있습니다.

하나는 기존과 동일한 방식인 application.properties에 환경 변수를 등록하는 방식과 application.yml을 사용하는 방식입니다.

ex) application.properties

server.port=8080

application.properties의 경우 간단하게 나열하는 방식으로 손쉽게 작성이 가능하지만 가독성이 떨어지고, application.yml의 경우 Tab을 잘 사용하여 properties의 하이어라키를 정확히 지켜줘야 하지만, 가독성이 높다는 장점이 있습니다.

본 포스팅에서는 yml 파일을 사용하여 정의하도록 하겠습니다.

application.properties를 복사하여, application.yml을 생성하고 위 코드를 입력합니다.

간단히 위 코드를 설명하자면,

-Dspring.profiles.active=dev

옵션을 활용한 환경 별 configuration을 구분하여 관리하는 방법입니다.

최 상단의 

server: 
  port: 8000

의 경우 default 설정으로 옵션 적용이 되어 있지 않을 경우 embedded server를 8000번으로 기동합니다.

---

의 경우 환경을 구분하는 구분자로 사용됩니다.

spring: 
  profiles: local 
server: 
  port: 8080

의 경우 

-Dspring.profiles.active=local

옵션이 적용된 환경에서 사용 가능하며, 8080 포트로 embedded server를 기동합니다.

마찬가지로 dev, prod 역시 이와 같은 방식으로 동작합니다.

이를 활용하면, 로컬, 개발, 운영 환경의 환경파일을 구분하지 않고 하나로 관리할 수 있습니다.

물론 설정파일을 구분해서 가져 갈 수도 있습니다.

application.yml 파일을 application-local.yml, application-dev.yml, application-prod.yml 등으로 구분하여 각각 관리할 수 있습니다.

여기까지 작성이 완료되면 1차로 Maven Install을 수행합니다.

Spring Boot Project 우클릭 → Run As → Maven Install

BUILD SUCCESS가 떨어지면 이제 Spring Boot를 사용할 준비가 완료되었습니다.

 

3) Spring Boot Test Class 작성

package com.nrson.spring.boot.simpleservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class SpringBootStartApplication {

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

	@GetMapping
	public String HelloWorld() {
		return "Hello World";
	}

}

드디어 Hello World 문구가 보이네요.

기존 Java Class에서 볼수 없었던 어노테이션들이 몇몇 보이지만, 겁먹지 말고 일단 위 그대로 작성해 보도록 합니다.

작성이 완료되면, main class를 실행해 보도록 하겠습니다.

Crtl + F11 → Spring Boot App → OK

위와 같이 출력 되신다면 Spring Boot Sample이 정상적으로 기동된 것입니다.

드레그 되어 있는 부분을 보시면 embedded Tomcat이 기동된 것을 볼 수 있고 포트는 8000 context path는 설정되어 있지 않은 것을 볼 수 있습니다.

여기서 중요한 부분인데 Spring Boot를 왜 사용하냐에 대한 고민거리를 한방에 해결해 줄 수 있는 바로 REST API에 최적화 된 Embedded Tomcat, Jetty, Undertow 등을 별도의 설치 구성 없이도 이렇게 손쉽게 띄울 수 있다는 점입니다.

본 포스팅 시작부분에서도 언급했듯이 마이크로 서비스로 세분화 되는 가벼운 서비스를 위해 Embedded 계열의 was를 사용하는 것은 핵심 포인트로 이후에도 계속 언급되겠지만, 클라우드 환경에 적용하기 매우 효과적입니다.

포트의 경우 앞서 application.yml 파일에 적용한 default 포트인 8000번으로 적용되었으며, Context Path는 별도로 설정하지 않아 기본 /로 적용되었습니다.

자 그럼 Java를 분석하기 전 먼저 Application 호출부터 진행해 보도록 하겠습니다.

 

4) Hello World 호출

http://ip:port/[context_path] → http://localhost:8000/

자 위와 같이 Hello world가 출력되는 것을 확인할 수 있습니다.

이를 기반으로 앞으로 작성될 다양한 Sample의 기본 Template이 될 예정이니 현 시점을 스냅샷으로 저장하시고 이후 포스팅에서도 활용하시기 바랍니다.

 

5) SpringBootStartApplication Class 파일 분석

자 그럼 마지막으로 SpringBootStartApplication 클래스 파일에 대해 분석해 보도록 하겠습니다.

핵심 포인트는 역시 어노테이션이 될 텐데요.

사용된 어노테이션을 기반으로 소스를 살펴보겠습니다.

a) @RestController

@RestController 어노테이션은 Restful Web API의 생성을 손쉽게 제공하기 위해 스프링 프레임워크 4.0에서 도입된 기능입니다. MVC 환경의 @Controller & @ResponseBody를 합쳐 놓은 어노테이션이라고 볼 수 있습니다.

MVC 환경에서 @Controller가 view에 초점을 둔 방식이라면, @RestController는 data에 초점을 두고 접근합니다.

브라우저에 실제 Hello World라는 Spring 문자열을 출력하는 것이 바로 RestController에서 기본적으로 제공하는 기능이라고 볼 수 있습니다.

b) @SpringBootApplication

@SpringBootApplication 어노테이션은 Spring의 성격을 갖고 있는 어노테이션들을 묶어 놓은 어노테이션입니다.

@Configuration(스프링 자바 기반 설정 클래스를 지정) & @EnableAutoConfiguration(root package 정의 및 스프링 설정 자동화) & @ComponentScan(컴포넌트 검색 기능 및 bean 자동 등)을 합쳐 놓은 어노테이션으로 손쉽게 SpringBoot를 사용할 수 있습니다.

c) @GetMapping

get 방식으로 경로를 받는 매핑 어노테이션으로 별도로 지정하지 않으면 " "로 설정되며 @GetMapping("/test")로 설정할 경우 아래와 같이 Context가 지정되어 처리 됩니다.

자 첫번째 Spring Boot REST API - Hello World 클래스를 작성해 보았습니다.

이번 포스팅에서는 직접 Spring Boot 프로젝트를 생성하는 것부터 진행되었고, 이전 포스팅까지는 Gitlab과 연동된 프로젝트를 사용하였습니다. 어떻게 진행하든 상관은 없지만, 무엇인가 작성하고 관리해야 할 필요성이 있다 싶을때는 Gitlab이나, Github 또는 SVN 등과 연계하여 항상 관리하는 습관을 갖는 것이 중요합니다.

앞으로 진행되는 다양한 소스 코드 등을 직접 어디서든 테스트 및 관리할 수 있도록 형상관리 툴에 Push 하시기 바랍니다.

다음 포스팅에서는 Spring Boot / Controller, Service, Mapper Class등을 살펴보고, 구현해 보는 시간을 갖도록 하겠습니다.

728x90
반응형