춤추는 개발자

[우아한테크세미나] 우아한 스프링 부트 본문

Developer's_til/스프링 프레임워크

[우아한테크세미나] 우아한 스프링 부트

Heon_9u 2021. 4. 9. 23:32
728x90
반응형

* 세미나 소개

스프링 부트는 스프링을 통해 자바 엔터프라이즈 애플리케이션 개발을 손쉽게 할 수 있도록 도와주는 툴입니다. 빌드, 개발 배포와 모니터링까지 개발과 관련있는 모든 분야에 도움을 주고 있습니다. 이번 세미나에서 스프링 부트가 어떤 방법으로 어떤 분야에서 자바 엔터프라이즈 애플리케이션 개발을 돕고 있는지 살펴보겠습니다.

 

 

<<강의들으면서 작성>>

 

스프링부트가 다루는 영역

- 빌드

프로젝트 생성, 의존성 관리, 애플리케이션 패키징 및 실행

- 코딩

개발 툴 제공, 자동 설정, 외부 설정

- 배포 및 관리

도커 이미지 생성, Actuator, 스프링 부트 어드민

 

start.spring.io로 프로젝트 생성 가능

 

빌드 툴

maven, gradle (디렉토리 구조의 차이)

 

Spring boot 버전?

Snapshot - 개발 중인 버전 (비추)

M - 배포를 한 버전이지만 바뀔 수 있음, 공부하는 사람이 아니면 사용x

GA - Genarally available

 

Jar(Java Archive)와 War(Web Application Archive)에 대해 공부하기

 

프로젝트에 필요한 의존성 쉽게 관리하기

(groupId, artifactId, version)으로 구분

but, version이 없는 경우가 있음

.pom파일을 보면 parent가 있음

dependencyManagement에 각 디펜던시의 버전이 명시되있음

그래서 굳이 pom파일에서 버전을 명시하지 않아도 됌

즉, dependencyManagement에 있는 디펜던시를 추가할 때는 버전 적을 필요x

boot의 이점: dependencyManagement에 있는 버전들은 해당 spring-boot에 가장 적합한 버전이 있는 것!! (중요)

dependencyManagement에 없는 디펜던시는 반드시 버전 명시

 

 

빌드: 애플리케이션 실행 방법

- mvn spring-boot:run

스프링 부트 메이븐 플러그인 사용

메이븐을 사용해서 실행

- main 클래스 실행

가장 평번하게 자바 실행

IDE 사용해서 실행

- Jar패키징 & Java -jar

스프링 부트 플러그인을 사용해서 특수한 실행 가능한 형태의 Jar파일 실행

서버에 배포하는 용도로 주로 사용

 

spring boot는 내부적으로 tomcat 사용

 

- 배포하는 용도로 패키징할 때,

maven에서 package를 하게되면 jar파일로 뭉쳐짐(우버Jar fat Jar)

이때 spring boot가 많은 일을 해줌

원래는 이런 스펙이 없다, spring boot application boot straper?(라이브러리 참조)

 

- 코딩:개발 툴(디펜덴시: Spring-Boot-Devtools)

개발 중에 뷰 리소스 또는 템플릿에 적용되는 캐시는 오히려 불편하다.

개발 중에 애플리케이션을 자주 재시작한다.

개발 중에 웹 브라우저를 리로딩 한다.

 

Spring-Boot-Devtools를 추가하면 빌드만 눌러서 변경된 코드가 적용됌

애플리케이션이 재시작되는데 이때, 최소한의 부분만 재시작!

 

- 패키징을 할 때, Devtools 디펜덴시를 빼야할까?

Jar패키징을 하게되면 Devtools가 설정된 것들은 자동으로 무시된다.

 

- 코딩:자동설정 (Spring-Boot 의 꽃)

애플리케이션에서 설정한 빈 등록

@ComponentScan

@Component, @Service, @Controller, @Repository

@Configuration

@Bean

 

자동 설정으로 제공하는 빈 등록

META-INF/spring.factories

EnableAutoConfiguration

@Configuration && @ConditionalOnXxx

 

Package 이름을 바꾸는 이유?

ComponentScan 대상이 되면 하위 패키지들을 전부 빈으로 등록할 때 충돌이 발생

@SpringBootApplication에 의해 기본적으로 ComponentScan이 돼버림, 그럼 하위 패키지의 모든 Bean들이 등록됌

이미 Bean으로 등록되어 있는데 자동 설정으로 등록되는 경우로 인해 Bean이 두번 등록돼서 충돌이 발생.

1. ComponentScan으로 RestController이 Bean으로 등록이 됌.

2. SpringFactories에서 자동 설정으로 제공하는 것에 의해 두번 Bean이 등록 됌.

3. 충돌 발생.

4. 이를 피하기 위해 Package 이름을 바꾸는 것.

 

A프로젝트의 .pom파일에 B프로젝트 의존성을 추가하면,

B프로젝트에서 설정한 Bean들을 사용할 수 있다.

이러한 자동설정 메커니즘이 바로 spring-boot가 제공하는 것

이 때, 중복되는 빈이 있는 경우 우선순위는 해당 애플리케이션의 빈이 먼저!

 

만약!! A프로젝트에서의 Bean 아이디와 B프로젝트의 Bean 아이디가 중복되는 경우, 뜨지 않는다.

이러한 Overriding은 Spring-Boot 2.1에서 막힘

의존성 주입 -> 결합도는 낮추고 응집도는 높이는 기능

 

 

- 코딩: 외부 설정 파일

코드에서 값을 밖으로 꺼내는 방법 제공

application.properies 또는 application.yaml, 환경 변수, java 명령어 아규먼트 등 키/값의 형태로 정의되어 있는 다양한 외부 설정을 지원한다.

application.properties (한글 쓰면 깨짐 - 인코딩 문제UTF-8)

가장 구체적이고 가까운 위치에 있는 설정의 우선 순위가 높다. (resources/config 안에 있는 설정은 구체적이다)

비교: (Jar파일에 있는 경우 - 멀다/현재 FileSystem에 있는 경우 - 가깝다)

즉, 오버라이딩이 되는 것

 

어플리케이션을 배포하는 과정에서 특정한 값만 바꾸고 싶은경우, 위처럼 우선순위에 따라 작업한다.

 

 

- 배포 : 도커 이미지 빌드(계층형 이미지 빌드 지원)

도커 이미지는 다른 이미지를 기반으로 새로운 이미지를 만들 수 있다.

계층형 이미지를 만든다면 기존 계층은 캐시로 재사용할 수 있어 효율적이다.

spring-boot.build-image (maven 2.4이상)

application, snapshot-dependencies.springboot-loader, dependencies 4개의 계층

dive -> 도커 이미지가 어떻게 쌓여있는지 확인 가능.

Docker dive - wagoodman

 

- 관리: Actuator (애플리케이션 관련 데이터 및 모니터링 정보 제공)

Spring-Boot-Starter-Actuator

웹(Json)과 JMX 지원

여러 엔드포인트 제공

/beans "빈" 정보 조회.

/configprops "프로퍼티" 정보 조회.

/logger "로거" 정보 조회 및 변경 가능.

/heapdump 메모리의 현재 상태를 내려 받을 수 있다.

/threaddump 쓰레드의 현재 상태를 내려 받을 수 있다.

이밖에도 /metrics, /mappings 등 여러 엔드포인트를 제공한다.

 

REST API hateoas

 

http pi -> 로거의 모드를 DEBUG로 바꿀 수 있다 (01:40:00)

 

- 관리: 스프링 부트 어드민 (스프링부트 Actuator 기반 UI)

github/codecentric/spring-boot-admin

Actuator의 정보들을 시각화

클라이언트의 어플리케이션들을 admin서버에 올리는 것

 

Java Spring Boot를 알려면 Spring에 대해 기본적으로 알아야 하고,

Spring기반에서 코딩을 하려면 Java Enterprise Edition를 알아야 하고,

이를 또 이해하려면 Java를 알아야 한다.

 

728x90
반응형