본문 바로가기

SPRING FRAMEWORK

[Spring Boot] 백기선의 우아한 스프링 부트 활용 세미나 요약

영상

https://www.youtube.com/watch?v=z0EaPjF3pCQ&t=2637 

 

참고자료

https://drive.google.com/file/d/10G1qCgdFrVXpxLUTgrSwp5ZMboXlfwmH/view

 

우아한 스프링 부트.pdf

 

drive.google.com

 

 

[백기선의 우아한 Tech] 우아한 Spring Boot 정리

 

스프링 부트(Spring Boot)가 다루는 영역

  1. 빌드(Build)
    1. 프로젝트 생성(Project Creation)
    2. 의존성 관리(Dependency Management) - 라이브러리 버전관리
    3. 애플리케이션 패키징 및 실행(Application Packaging and Running)
  2. 코딩(Coding)
    1. 개발 툴 제공(dev tools)
    2. 자동 설정(Auto configuration)
    3. 외부 설정(Extenal configurarion)
  3. 배포 및 관리(Distribution and Administration)
    1. 도커 이미지 생성(Docker Image)
    2. 액츄에이터(Actuator)
    3. 스프링 부트 어드민(Spring boot Admin)

 

1. 빌드(Build)

1-1. 빌드: 스프링 부트 프로젝트 생성

start.spring.io의 Spring initializer 사용

  • Project: 빌드 툴 선택 (Maven, Gradle - )
  • Language: 언어 선택 (Java, Groovy, Kotlin)
  • Spring Boot: 개발 버전 선택
    • SNAPSHOT: 개발 중인 버전
    • M(Milestone): 공식 배포 버전(변경 사항 있을 수 있음)
    • GA(General Availability): 정식 배포 버전(완성버전) - 추천! *실제 버전 외에 적힌 것 없음
  • Project Metadata
    • Group: 프로젝트가 속한 그룹 설정(일반적으로 회사)
    • Artifact: 프로젝트 이름
    • Name: 프로젝트 이름
    • Description: 프로젝트 설명
    • Package name: 패키지 이름
    • Packaging: 패키징 방법 설정 [Jar(Java Archive), War(Web Application Archive)] -Jar 추천
      • JAR(자바 아카이브): 여러개의 자바 클래스 파일과 클래스 들이 이용하는 관련 리소스(텍스트, 그림) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷
    • Java: 자바 버전 선택(JDK와 동일하게)
  • Dependencies: 사용할 의존성 라이브러리 추가 (Spring Web, Lombok, Thymeleaf …)

 

1-2. 빌드: 의존성 관리

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

  • 버전을 적지 않아도 스프링부트가 알아서 라이브러리 버전 관리
  • pom 형태의 <parent>, <DependencyManagement>, <properties>를 활용한 의존성 관리
  • spring-boot-starter의 부모 → spring-boot-parent의 부모 → spring-boot-dependencie가 의존성을 관리하고 있음
  • 만약 버전을 다른 걸 쓰고 싶거나 라이브러리를 따로 추가 하고 싶으면 mavenrepository.com에서 라이브러리를 찾아 pom을 복사 붙여넣기 <dependency></dependency>

 

1-3. 빌드: 애플리케이션 실행

다양한 애플리케이션 실행 방법

  • mvn(gradle) spring-boot:run
    • 스트링 부트 메이븐(그레이들) 플러그인 사용
    • 메이븐(그레이들) 사용해서 실행
  • main 클래스 실행
    • 가장 평범한 자바 애플리케이션 실행 방법
    • IDE 사용해 실행
  • JAR 패키징 & java -jar
    • 스프링 부트 플러그인을 사용해 특수하게 실행 가능한 형태의 JAR 파일 만들 수 있음
    • 서버에 배포하는 용도로 사용
    • 메이븐(그레이들)의 Lifecycle에 있는 package 사용
    • jar로 패키징 하기 위해서는 main 메서드가 있는 클래스가 필요

* 실행은 임시포트인 8080 Port를 쓰는 경우가 많다. (절대로 WAS는 80포트로 올리지 않는다)

  • Port: 본래 의미로 직역하면 항구라는 뜻으로 컴퓨터 관련 분야 에서의 의미로는 운영체제 통신에서의 종단점을 의미. 컴퓨터의 주변장치와 연결하기 위한 연결 단자나 네트워크 서비스나 특정 프로세스를 식별하는 논리적 단위이다.

** 이미 8080을 run 한 경우엔 다른 프로젝트는 다른 포트에 올리거나, 기존 프로젝트를 꺼주어야 함!

*** Server의 포트를 바꿀 땐 application.properties 내용에 server.port= (원하는 포트 번호) 작성

 

2. 코딩(Coding)

2-1. 코딩: 개발 툴(dev-tools)

개발 할 때 필요한 유용한 기능 제공

개발 중에 뷰 리소스나 템플릿에 적용되는 캐시가 불편하고, 웹브라우저나 애플리케이션을 자주 재시작하는 일이 많은 경우 도움을 주는 툴 존재

Spring-Boot-Devtools

  • 스프링부트에서 제공하는 개발 편의를 위한 모듈. 주로 변경된 코드를 서버 또는 화면에 신속하게 반영해 결과를 확인하기 위해 사용
  • 일반적으로 서버를 내렸다 올리는 식의 재시작 방법보다 더 빠르게 재시작 가능. Devtools는 classpath에 변경이 생기면 이를 감지해 재시작 여부를 판단. 프로그램이 실행되면 polling을 통해 주기적으로 classpath의 변경여부를 확인한다.
  • 즉, 코드를 고친 뒤 빌드만 다시 해도 알아서 applicationContext를 고쳐 서버 재기동
  • 의존성 영역(pom.xml)에 <dependency><groupId>…</groupId></dependency> 형태로 추가
  • live-reload 플러그인을 브라우저에 설치하면 웹 브라우저 리로드 없이 업데이트 확인 가능
  • 실제 패키징할 때 Devtools 관련 기능이 알아서 무시되기 때문에 따로 제외 설정을 할 필요 없음

 

2-2. 코딩: 자동 설정(Convention over Configuration)

스프링부트의 가장 편리한 기능인 빈 자동 설정

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

  • @ComponentScan: 스프링 컨테이너에 빈을 등록하도록 하는 어노테이션 스프링부트에서는 @ComponentScan을 할 때 main 메서드가 있는 클래스의 패키지를 루트경로로 하고 그 루트 하위에 있는 모든 클래스 중에 해당 어노테이션(@Component Scan)이 붙어 있는 클래스를 빈(Bean)으로 잡는다.
  • @Component, @Service, @Controller, @Repository: 각 영역을 선언해주는 어노테이션. Component는 서비스, 컨트롤러, 리포지토리에 모두 해당하지 않을 때 선언해준다. 모두 MVC에서 주로 사용하는 기능
  • @Cofiguration: 어노테이션 기반 환경 구성을 돕는다. 이 어노테이션을 구현함으로써 클래스가 하나 이상의 @Bean 메소드를 제공하고 스프링 컨테이너가 Bean 정의를 생성하며, 런타임 시 그 Bean들이 요청을 처리할 것을 선언하게 된다.
  • @Bean: 스프링 컨테이너가 관리해야할 빈으로 선언

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

  • META-INF/spring.factories (directory → spring file)
  • EnableAutoConfiguration
  • @Configuration && @ConditionalOnXxx

★ RestController와 Controller의 차이? (Spring MVC영역)

  • controller + responsebody
  • RestController는 객체를 반환하고 Controller는 뷰를 반환한다.

★ 설정이 겹치거나 중복된 컨트롤러가 정의된 경우 우선 순위를 가지고 동작하도록 설정 가능한가?

애플리케이션에서 설정한 빈이 먼저 정의가 되고 자동 설정으로 제공하는 빈이 정의됩니다. 만약 애플리케이션에서 설정한 빈과 자동 설정 제공 빈의 ID가 중복된다면 애플리케이션이 실행되지 않습니다. 오버라이딩을 스프링에서 막아 놓았습니다.

 

2-3. 코딩: 외부 설정 파일

외부 설정 파일의 우선순위 제공

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

  • application.properties 또는 application.yaml, 환경 변수, java 명령어 argument 등 키와 값의 형태로 정의되어 있는 다양한 외부 설정 지원
  • application.properties: 가장 구체적이고(config 디렉토리에 있느냐) 가까운 위치(Jar에 있으면 멀고, 커맨드라인에 있으면 가까움)에 있는 설정의 우선순위가 높다.
  • 우선 순위 순으로 덮어쓰면서 동작한다!(오버라이딩)
  • application.properties는 utf로 인코딩하지 않아(아스키 사용) 한글은 깨지는 경우 발생. Editor→ File Encodings의 properties 영역에서 Transparent native-to ascii convention 체크 시 사용 가능
  • properties 파일은 파일이 깨질 수 있으니 인코딩 설정을 utf-8로 미리 바꿔주어야 한다.

 

3. 배포(Distribution)와 관리(Administration)

3-1. 배포: 도커 이미지(docker image) 빌드(계층형 이미지 빌드)

Spring-Boot-Starter-docker

  • 도커 이미지는 다른 이미지를 기반으로 새로운 이미지 작성 가능
  • 계층형 이미지를 만든다면 기존 계층은 캐시로 재사용 할 수 있어 효율적
  • spring-boot 패키지의 spring-boot-image로 이미지 생성 실행
  • 도커 다이브(docker dive)? 도커 이미지의 히스토리 확인 가능
  • ‘dive 이미지이름’ 명령어를 사용하면 이미지를 분석해 어떤 기록을 가지고 있는지 확인 가능
  • 도커는 스프링부트 2.4부터 지원

3-2. 관리: Actuator, 애플리케이션 데이터 및 모니터링 정보 제공

Spring-Boot-Starter-Actuator

  • 웹(JSON)과 JMX 지원
  • 여러 엔드포인트 제공
  • /beans : “빈(bean)”정보 조회
  • /configprops : ”프로퍼티(Property)” 정보 조회
  • /logger : 로거 정보 조회 및 변경 가능. 런타임 중간에 debug레벨로 콘솔 출력을 변경할 수 있음
  • /headump : 메모리의 현재 상태 내려 받음
  • /threaddump : 쓰레드의 현재 상태 내려받음
  • 이밖에도 /metrics, /mappings 등 여러 엔드포인트 제공

Spring Boot Admin(스프링 부트 어드민): 스프링 부트 Acutuator 기반 UI

spring-boot-starter-client, spring-boot-admin

대시보드 형태로 여러 모니터링 정보 확인 가능

어드민 서버에서 클라이언트 어플리케이션 정보를 모니터링 @EnableAdminServer

Admin Server(Admin) ↔ Application(Client)