강의/Java Spring Boot

Spring Boot 시작하기

studylida 2025. 1. 26. 03:11

Spring Boot 있기 전에는 Spring Project 설정하는 작업이 쉽지 않았다.

 

REST API 만든다고 가정하면, 이를 위해서 Spring Framework, Spring MVC, 그리고 JSON 바인딩 프레임워크 로깅이 필요하다. 따라서 이와 관련된 모든 의존성과 버전을 xml 파일을 통해 관리해야 했다.

 

뿐만 아니라 각각의 설정도 고려해야 하지, 단위 테스트 해야지, 비기능 요구사항도 고려해야 하지, 오류 처리 기능도 괜찮아야 하지, 그리고 모니터링도 해야 하고....

 

놀랍게도 Spring Boot 없을 때는 모든 수동으로 구현해야 했다. 때문에 프로젝트 설정이 쉽지 않았다. 게다가 이걸 하면 끝이 아니라, 프로젝트를 만들 때마다 반복해야 했다.

 

그리고 이런 것들을 해결해주는 바로 Spring Boot이다. 어떻게 해결하는지는 앞으로 배워나갈 것이다.

 

일단 이전 시간에 Spring Project 만들때 사용했던 start.spring.io 사이트를 통해 Spring Boot Project 만들어볼 것이다.

 

왼쪽에 프로젝트, 스프링부트 버전, 메타데이터 등은 이전에 스프링 프로젝트 만들 때처럼 하면 되고, 중요한 Dependencies 란이다. 어떤 의존성을 추가할 것이냐인데, 일단 Spring Web이라는 의존성을 추가해볼 것이다.

 

  • Spring Web

 

Generate 눌러 생성하고, 압축을 해제한 다음에 사용하는 IDE에서 연다.

 

이렇게 해서 프로젝트를 만들었다.

 

이제 Spring Boot 이해하기 위한 간단한 REST API 작성해볼 것이다.

 

어떤 REST API 하면, 특정 URL - /course - 입력하면 수강 중인 과목에 대한 정보를 반환하는 API이다.

 

사용자가 URL 입력했을 , id, name, author 반환한다고 가정하자.

 

일단 반환할 정보를 저장하기 위해 List 만들고, 이를 반환하는 클래스를 만들어보자.

 

```

public class CourseController {

 

    public List<Course> retrieveAllCourse() {

        return Arrays.asList(

                new Course(1, "Learn AWS", "in28minutes"),

                new Course(2, "Lean DevOps", "in28minutes"),

                new Course(3, "Learn Azure", "in28minutes")

 

        );

    }

}

```

 

만드는 김에 정보도 추가했다. Course 클래스는 이제 알아서 만들자. 게터, 세터, 생성자, 그리고 toString 인텔리제이의 코드 생성 기능을 이용해 만들면 된다.

 

그런데 이렇게 만들긴 만들었는데, 사용자가 특정 URL 입력했을 정보를 반환하게 하려면 어떻게 해야 할까? 우리는 이를 위해 @RestController @RequestMapping 어노테이션을 사용할 있다.

 

@RestController 해당 어노테이션이 적용된 클래스를 REST API 엔드포인트로써 작동하도록 한다. , HTTP 요청을 받아서 처리하고, 그에 대한 응답을 반환하는 역할을 하도록 한다.

 

이때 @RestController 내부적으로 @ResponseBody 포함하고 있기 때문에 메서드에서 반환하는 객체는 자동으로 JSON으로 변환되어 클라이언트에 전송된다.

 

@RequestMapping 특정 URL 경로와 HTTP 메서드(GET, POST )를 지정하여 요청을 처리하는 메서드를 매핑하는 데 사용되는 어노테이션이다.

 

클래스 레벨과 메서드 레벨 가지 경우 모두에 대해 설정할 있는데, 클래스 레벨에서 설정하는 경우 해당 클래스의 모든 메서드에 기본 URL 경로를 적용할 있다. 메서드 레벨에서는 HTTP 메서드를 정할 있다.

 

방금 소개한 어노테이션은 아래 코드와 같이 사용할 있다.

 

```

@RestController

public class CourseController {

 

    @RequestMapping("/courses")

    public List<Course> retrieveAllCourse() {

        return Arrays.asList(

                new Course(1, "Learn AWS", "in28minutes"),

                new Course(2, "Lean DevOps", "in28minutes"),

                new Course(3, "Learn Azure", "in28minutes")

 

        );

    }

}

```

 

보면 알겠지만 매우 간단하다. REST API 만든다고 했지만 어떤 대단한 것을 아니라 Spring Boot 백그라운드에서 알아서 작업할 있도록 코드가 무엇을 의미하는지 어노테이션을 붙여 알려준 뿐이다.

 

하여 이제는 체감할 있을 Spring Boot 특징 하나는 프로덕션 환경에서 사용 가능한 어플리케이션을 빠르게 빌드할 있도록 돕는다는 것이다.

 

애플리케이션을 프로덕션 환경에서 빠르게 빌드하기 위해서는 많은 기능을 갖추어야 한다. 이는 Spring initializer, Spring Boot Starter Projects, Spring Boot Auto Configuration, Spring Boot DevTools 이용해 가능해진다.

 

  • Spring Boot Starter Projects: 의존성을 빠르게 갖춤
  • Spring Boot Auto Configuration: 의존성에 따라 자동으로 설정이 이루어짐
  • Spring Boot DevTools: 수동으로 서버를 다시 시작하지 않아도 애플리케이션을 변경할 있음

 

그리고 이를 사용 가능하게 하기 위해서는 다른 여러 것도 필요하다. 로깅이 필요하고, 여러 환경 - dev 환경, qa 환경, stage 환경 - 맞는 다양한 설정을 제공할 있어야 하며, 모니터링을 있어야 한다.

 

환경에 맞는 설정을 제공하는 profiles, ConfigurationProperties 통해 이루어지며, 모니터링은 Spring Boot Actuator 통해 이루어진다.

 

지금부터는 위에서 언급한 기능들을 차례대로 간략하게 알아볼 예정이다.

 

가장 먼저 Spring Boot Starter Projects 대해 알아보자.

 

Spring Boot Starter Projects 개발할 필요한 의존성을 빠르고 쉽게 설정할 있도록 도와주는 기능으로, 특정 기능을 구현하기 위해 필요한 라이브러리와 의존성을 모아둔 POM(프로젝트 오브젝트 모델) 파일(pom.xml)이다.

 

pom.xml에서 모든 Maven 의존성을 정의한다. 지금까지 게시글에서 것을 따라왔다면 아마 spring-boot-starter-web spring-boot-starter-test 적혀있을 것이다. spring-boot-starter-web 있어 REST API 애플리케이션을 빌드할 있게 하고, spring-boot-start-test 있어서 단위 테스트를 작성할 있다.

 

이렇게 정의된 의존성 위에 커서를 두고 Control + Click 하면 의존성의 내용이 보인다.

 

외에도

 

  • JPA, JDBC: 데이터베이스를 사용하고 통신하기 위해서 사용하는
  • Spring Boot Starter Security: 애플리케이션, REST API 보호하기 위해 사용

 

같은 의존성이 있다.

 

그런데 사실 이렇게 하고 끝이 아니라 의존성을 설정해줘야 한다.

 

 

여기서도 Spring Boot 도움을 받을 있는데, 만약 도움을 받지 않는다고 가정해보자.

 

그러면 컴포넌트 스캔을 위해 DispatcherServlet 설정해야 하고, 데이터베이스와 통신하기 위해 데이터 소스를 설정해야 한다. Bean에서 JSON, JSON에서 Bean으로의 변환을 설정해야 한다.

 

복잡하지 않은가? 그래서 우리는 위에서 언급한 Spring Boot Auto Configuration 도움을 받는다.

 

자동 설정은 클래스 경로에 있는 프레임워크에 따라 생성된다. pom.xml에서 여러 Starter Project 추가하고, 이에 따라 클래스 경로에 있는 프레임워크에 따라 많은 자동 설정할 있다.

 

Spring Boot 디폴트 자동 설정을 제공한다. 대신 자체 설정을 제공하여 이를 오버라이드 있다.

 

이런 Auto Configuration 로직은 어디에서 정의될까? 정답은 특정 jar에서 정의된다, 이다. Maven Dependencies에서 org.springframework.boot.autoconfig 패키지를 보면 확인할 있다.

 

자동 설정을 자세히 알아보려면 src/main/resources/application.properties 열면 된다.

 

여기서 로깅 설정을 있다.

 

예를 들어 `logging.level.org.springframework=debug`라고 입력하면 특정 패키지, org.springframework 디버그 수준에서 로깅하라는 뜻이다.

 

디폴트 로깅 수준은 INFO.

 

debug 해놓고 로그를 자세히 살펴보면, CONDITIONS EVALUATION REPORT 있는데, 여기에는 Positive matches Negative matches 있다. Negative 자동 설정되지 않은 , Positive 자동 설정된 항목이다.

 

DispatcherServlet, ErrorMvc, Tomcat 자동설정되어 있는데, 이러한 모든 자동 설정은 특정 jar(spring-boot-autoconfigure.jar)에서 확인한 코드에 기반한다.

 

확인해보자. double shift 통해 클래스명을 검색하면 나오는데, 보면 알겠지만 spring-boot-autoconfigure.jar 있다는 확인할 있다.

 

DispatcherServlet에서 특정 자동 설정이 사용 설정되는 시점에 관한 설정을 확인할 있다.

 

ErrorMvcAutoConfiguration 디폴트 오류 페이지를 설정한다.

 

 

다음으로는 DevTools 대해 배울 건데, 이것에 대해서는 별로 없다. 그냥 설정 만지작거리면 끝난다.

 

아까 말했듯이, DevTools 이용해서 수동으로 서버를 다시 시작하지 않아도 애플리케이션을 변경할 있다고 했다. 이게 무슨 소리냐면, 코드를 다시 작성했을 , 프로그램을 수동으로 재시작하지 않아도 바꾼 코드의 내용이 알아서 적용된다는 이야기다.

 

DevTools 도움을 받기 위해서는 pom.xml

 

```

<dependency>

<groupId>org.springframework.boot></groupId>

<artifactId>spring-boot-starter-devtools</artifactId>

</dependency>

```

 

추가하면 된다.

 

다만, devtools 추가해도, pom.xml 변경하는 경우에는 자동으로 적용되지 않으니 주의하자.

 

 

다음으로는 프로필 기능에 대해 알아보자.

 

프로필 기능은 환경에 따라 다른 설정을 제공하기 위한 기능이다.

 

이는 src/main/resources/application.properties에서 설정 가능하다. 아까 로깅 수준을 설정했던 파일 맞다.

 

코드로 설명하는 빠를 같으니 먼저 코드를 보여주겠다. 순서대로 application.properties, application-dev.properties, 그리고 application-prod.properties 내용이다.

 

```

spring.application.name=learn-spring-boot

 

logging.level.org.springframework=warning

spring.profiles.active=dev

```

 

 

```

spring.application.name=learn-spring-boot

 

logging.level.org.springframework=trace

```

 

 

```

spring.application.name=learn-spring-boot

 

logging.level.org.springframework=info

```

 

이때 만약 application.properties 사용하기로 프로필의 로깅 수준이 다를 , 특정 프로필을 사용하면 특정 프로필의 설정이 우선시 되어 적용된다.

 

잠깐 로깅 수준에 대해 설명하자면

 

```

trace

debug

info

warning

error

off

```

 

있고, 위로 갈수록 많은 정보를 표시한다. 위에 있는 로깅 수준은 아래에 있는 로깅 수준에서 표시하는 정보를 포함하여 표시한다.

 

어쨋든 이렇게 프로필을 사용해서 복잡한 설정도 가능하다. 어떤 설정을 관리하는 클래스가 있다고 가정해보자. 클래스의 이름은 CurrencyServiceConfiguration이라고 하자.

 

클래스에서는 currency-service.url, currency-service.username, 그리고 currency-service.key 값을 설정하고 한다.

 

```

@Component

@ConfigurationProperties(prefix = "currency-service")

public class CurrencyServiceConfiguration {

 

private String url;

private String username;

private String key;

}

 

// getter and setter

 

```

 

그리고 값들을 프로필을 통해 아래와 같이 설정할 있다.

 

```

spring.application.name=learn-spring-boot

 

logging.level.org.springframework=warning

spring.profiles.active=dev

 

currency-service.url=https://default1.in28minutes.com

currency-service.username=defaultUsername

currency-service.key=defaultKey

```

 

그리고 이렇게 설정한 값으로 아까 했던 것처럼 REST API 만들어보자. 이번에는 /currency-configuration이라 입력하면 사용자에게 정보가 반환되도록 하자. REST API 클래스의 이름은 CurrencyConfigurationController라고 하자.

 

```

@RestController

public class CurrencyConfigurationController {

 

    @Autowired

    private CurrencyServiceConfiguration configuration;

 

    @RequestMapping("/currency-configuration")

    public CurrencyServiceConfiguration retrieveAllCourse() {

        return configuration;

    }

}

```

 

여기서 환경에 따라 다른 값을 반환하고 싶다면 아까와 같이 프로필을 통해 변경할 있다.

 

아래는 application-dev.properties 내용이다.

 

```

spring.application.name=learn-spring-boot

 

logging.level.org.springframework=trace

 

currency-service.url=https://dev.in28minutes.com

currency-service.username=devUsername

currency-service.key=devKey

```

 

다음으로는 Embedded Server 대해 알아보자.

 

Embedded Server 배포의 간소화와 관련 있다.

 

아까 언급했듯이 여러 환경을 가지고 있기 때문에 배포 프로세스가 복잡해지면 곤란하다. 때문에 최대한 배포 프로세스를 간단히 만드는 것이 좋다.

 

하지만 이전까지 사용한 WAR 방식은 그리 간단하지는 못하다.

 

자바를 설치하고, 어플리케이션 서버를 설치해야 하며, 다음 WAR 파일을 배포해야 한다.

 

배포하기 전에 거치는 과정이 있기 때문에 번거롭다.

 

Embedded Server 이에 대한 대안이다.

 

Embedded Server 사용하면 Tomcat 같은 서버가 이미 JAR 파일(zip 비슷한 거라 생각하면 편하다) 포함되어 있다. 따라서 자바를 설치하기만 하면 JAR 파일을 실행할 있다.

 

실제로 확인해보자.

 

이클립스라면 learn-spring-boot 패키지를 우클릭하고, Run As, Maven build... 선택한 clean install 입력하자.

 

인텔리제이라면 우측의 Maven 카테고리에서 생명주기 - clean 더블 클릭해서 실행하고, package 더블클릭 해서 실행하자.

 

F:\Download\learn-spring-boot\learn-spring-boot\target\learn-spring-boot-0.0.1-SNAPSHOT.jar 같은 로그를 찾을 있을텐데, 이게 jar 파일의 이름과 jar 파일이 들어있는 폴더다. 경로명은 다를 있다.

 

터미널을 켜고 ls 또는 dir 이용해 폴더를 검색해보는 걸로 폴더 안에 jar 파일이 있음을 확인할 있다.

 

이제 jar 파일을 실행해보자. `java -jar learn-spring-boot-0.0.1-SNAPSHOT.jar`라고 입력하면 된다.

 

만약 실행되지 않는다면 자바 버전이 17이상이 아닌 아닌지, 이미 8080포트에 실행하고 있는 프로그램이 있는 아닌지 확인해보자.

 

만약 이미 실행중인 프로그램이 있다면, `netstat -a -o` 통해 8080 포트 번호에 실행되고 있는 프로그램의 PID 확인한 뒤에, `Ctrl + C` 통해 화면에서 나온 , `taskkill /f /pid PID번호` 명령어를 통해 kill 하고 실행하면 된다.

 

cd 못해서 경로를 옮기겠다면 `java -jar F:\Download\learn-spring-boot\learn-spring-boot\target\learn-spring-boot-0.0.1-SNAPSHOT.jar` 같이 절대경로를 입력해서 실행하자.

 

어쨋든 이렇게 jar 파일을 이용하면 아까 말했던 가지 과정을 거치지 않고도 간단하게 프로그램을 실행할 있다.

 

spring boot 사용하여 빌드된 어플리케이션을 사용하려면 java 설치하고, jar 파일을 만든 실행하면 끝이라는 것이다.

 

웹서버는 jar 일부이므로 따로 설치하지 않아도 된다.

 

이렇게 설명한 embedded server spring-boot에서 default 사용되는 것이 우리가 앞서 보았던 tmcat이다. 물론 Git이나 undertow 같은 다른 서버도 있으며, 지원도 된다.

 

다음으로는 모니터링 기능인 Spring Boot Actuator 대해 알아보자.

 

프로덕션 환경에서 주로 사용하는데, 어플리케이션이 백그라운드에서 어떤 일을 하는지 확인하고 싶을 사용할 있다.

 

Spring Boot Actuator 여러 개의 엔드 포인트를 제공하는데, 예를 들어

  • beans: 어플리케이션에 포함된 모든 bean 확인할 있다.
  • health: 어플리케이션의 상태 정보를 확인할 있다.
  • metrics: 어플리케이션과 관련된 여러 metrics 제공한다.
  • mappings: 요청 매핑 관련 세부 사항을 확인할 있다.

 

이제 직접 사용해보자.

 

`pom.xml` 가서 `spring-boot-starter-actuator` 추가한 , maven 카테고리에서 모든 maven 프로젝트 다시 로드를 해주면  종속성이 추가된다.

 

이제 어플리케이션을 실행하고, `localhost:8080/actuator` 입력해보자. 기본적으로 표시되는 health 엔드포인트를 확인할 있다.

 

만약 Actuator 많은 기능을 사용하고 싶다면, application.properties 가서 `management.endpoints.web.expourse.include=*`라는 코드를 추가하면 Actuator에서 제공하는 모든 엔드포인트가 노출된다.

 

이제 새로고침하고 여기서 중요한 가지만 살펴보자.

 

beans 보면 로드된 모든 Spring beans 표시된다. 자동 설정된 것들을 확인하고 싶을 때는 여기 표시된 bean 확인하면 된다. 특정 항목이 자동 설정되었는지 아닌지 확인하기 위해서도 사용할 있다.

 

configprops 보면 어플리케이션의 application.properties에서 설정할 있는 모든 항목이 표시된다.

 

env 보면 환경에 관한 세부 사항을 모두 표시한다. 포트나 자바 버전, 사용 중인 인코딩 등이 여기 포함된다.

 

metrics 보면 반환된 metrics 목록이 표시된다. 어플리케이션 시작 시간, 디스크 여유 공간, pool 대한 등이 포함된다.

 

여기서 http.server.requests라는 특정 metrics 살펴보겠다. `localhost:8080/actuator/metrics/http.server.requests` 입력하자. 그러면 http.server.requests 관한 모든 metrics 표시되는 확인할 있다.

 

이외에도 여러 정보를 제공하지만, 기억하고 주의해야 점은, 어떤 엔드포인트를 사용하겠다 설정하면 사용하겠다 설정한 엔드포인트의 정보를 수집하기 때문에, 많은 엔드포인트를 사용할수록 많은 정보를 수집하느라 CPU 메모리가 그만큼 사용된다는 점이다. 때문에 일반적으로는 엔드포인트를 포함하려면 명시적으로 설정하는 것이 좋다.

 

예를 들어 health, metrics 대한 것만 확인하겠다면 `management.endpoints.web.exposure.include=health, metrics`라고 입력할 있다.

 

 

마지막으로는 Spring Boot, Spring MVC, 그리고 Spring 비교해보며 각각을 알아가보려고 한다.

 

Spring Framework 의존성 주입이 기능이다. 다양한 어노테이션을 사용해 의존성을 정의하고, 컴포넌트 스캔을 통해 의존성을 식별하고, 자동으로 연결한다.

 

하지만 이것만으로는 어플리케이션을 빌드하기에는 어려움이 있다. 때문에 다른 프레임워크가 필요하다. 데이터베이스와 통신해야 한다면 Hibernate JPA 필요하고, 단위 테스트를 작성한다면 Junit Mockito 필요할 것이다.

 

이를 위해 사용하는 Spring Modules Spring Projects Spring 생태계를 확장하여 다른 프레임워크와 쉽게 통합할 있도록 지원한다. Spring MVC 방금 언급한 Spring Module 의미한다.

 

Spring MVC 핵심은 @Controller, @RestController, @RequestMapping 같은 어노테이션을 통해 어플리케이션과 REST API 빌드 과정을 간소화하여 앱과 REST API에만 집중할 있게끔 한다.

 

그렇게 이들을 사용하다 보면 여러 가지 설정이 pom.xml, web.xml, 그리고 applicationcontext.xml 적혀있는 것을 확인했을 것이다. 이때 필요한 것이 Spring Boot 필요하다.

 

Spring Boot Spring Project 일종으로 프로덕션 환경에 사용 가능한 어플리케이션을 빠르게 빌드하도록 지원한다. 주요 기능은 Starter Projects Auto Configuration으로 Starter Projects 어플리케이션을 개발하는데 필요한 모든 의존성을 간편하게 가져오고, Auto Configuration으로 수동으로 설정할 필요가 없게끔 한다. 클래스 경로에 있는 항목에 따라 디폴트 설정을 자동으로 제공하기 때문이다.

 

또한 Spring Boot Actuator Embedded Server 같은 여러 비기능 요구사항도 제공한다.

 

, Spring Boot Spring MVC Spring 쉽게 사용할 있게끔 하는 wrapper라고 있다.

 

finish.

 

 

 

'강의 > Java Spring Boot' 카테고리의 다른 글

Spring MVC 작동원리  (0) 2025.01.26
JSP 시작하기  (0) 2025.01.26
Spring과 Spring Boot로 JPA와 Hibernate 시작하기  (0) 2024.07.30
CDI, XML 겉핣기  (0) 2024.07.29
Sterotype Annotation  (0) 2024.07.29