프레임워크/Spring

[Spring] 스프링 부트 정리 (우아한 스프링 부트 - 백기선)

pythaac 2022. 6. 20. 20:53

https://www.youtube.com/watch?v=z0EaPjF3pCQ&list=WL&index=1 

 

"스프링 부트"가 다루는 영역

1. 빌드

  • 1-1. 프로젝트 생성
  • 1-2. 의존성 관리
  • 1-3. 애플리케이션 패키징 및 실행

2. 코딩

  • 2-1. 개발 툴 제공
  • 2-2. 자동 설정
  • 2-3. 외부 설정

3. 배포 및 관리

  • 3-1. 도커 이미지 생성
  • 3-2. Actuator
  • 3-3. 스프링 부트 어드민

 

1. 빌드

1-1. 프로젝트 생성

  • Spring initializr
    • 프로젝트는 특정한 디렉토리 구조를 가지며, 이를 자동으로 생성
    • Maven / Gradle 선택
    • Java / Kotiln / Groovy 선택
    • 의존성 자동 추가
    • 패키징 방법 (JAR / WAR) 선택
    • 자바 버전 선택

 

1-2. 의존성 관리

  • 프로젝트에 필요한 의존성을 쉽게 관리
    • 프로젝트를 식별하는 정보는 3가지
      - groupId
      - artifactId
      - version
    • 그러나 Spring 설정에서는 dependency의 version을 생략
      - + 현재 Spring boot에 가장 알맞은 버전으로 자동 설정
    • [Maven] <parent>를 선언
      - spring-boot-starter-parent
      - spring-boot-dependencies : spring-boot-starter-parent의 부모
      - <dependencyManagement>에 버전이 명시되어있음
    • [Gradle] plugins에 'io.spring.dependency-management' 명시

 

1-3. 애플리케이션 패키징 및 실행

  • 다양한 애플리케이션 실행 방법 제공
  • 실행 방법
    • 1. mvn / gradle 을 이용하여 실행
    • 2. IDE를 통해 main 클래스 실행
    • 3. 배포 용도의 JAR 패키지 실행

 

2. 코딩

2-1. 개발 툴 제공

  • Spring-Boot-Devtools
    • 개발 툴을 통해 템플릿 엔진을 수정할 때, caching으로 인해 변경 사항이 바로 적용되지 않음
    • Spring-Boot-Devtools를 통해, 애플리케이션을 재실행하지 않고 빌드만 해도, 코드의 변화를 감지하여 최소한의 변경사항만 적용
    • 실제 애플리케이션을 실행할 때는 Devtools를 빼고 빌드해야하는지?
      - 패키징 후 실행시 Devtools의 설정이 기본적으로 무시됨

 

2-2 . 🌟자동 설정🌟

  • 스프링은 설정해야할 것이 많음
    - 그럼에도 불구하고 어떠한 설정도 없이 프로그램 실행이 편리하게 동작하는 것은 "자동 설정" 기능 덕분
  • org.springframework.boot.autoconfigure.EnableAutoConfiguration
    - 다른 프로젝트에 구현된 내용도 간단한 설정으로 바로 사용 가능

 

2-3. 🌟외부 설정🌟

  • 코드에서 특정한 값을 밖으로 꺼내는 방법
  • [참고] Java spec상 application.properties를 UTF-8이 아닌 다른 인코딩으로 읽게 되어있음
    - 한글로 작성시 깨짐
    - Transparent native to ASCII conversion : 나는 한글을 써서 ASCII로 안바뀐 것처럼 보이지만 바뀌어있음
  • application.properties에 정의
// application.properties
my.message = test
@Component
@ConfigurationProperties("my")
public class MyProperties {
    private String message;
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
}

 

  • application.properties가 위치할 수 있는 4군데
    • 구체적인 = config 디렉토리 안에 있는
      - /resources/config
    • 가까운 = JAR 안이 아닌 파일 시스템에 있는
      - 실행할 때 (java -jar) 해당 디렉토리에 있는 application.properties

 

3. 배포 및 관리

3-1. 도커 이미지 빌드

  • Docker 이미지 만드는 법
    - Intellij > Gradle > Build > bootBuildImage (별도 설치 필요한듯)
  • Library 재사용
    • APP / Libarary 계층을 나눔
    • 계층형으로 이미지를 만들어서 Libarary를 재사용
    • [참고] "dive" tool을 통해 이미지 계층을 볼 수 있음

 

3-2. Actuator

  • [참고] 🌟HATEOAS란?🌟
    • Hypermedia As The Engine Of Application Status
  • Runtime 중에 Logger의 level을 바꾸는 것이 가능

 

3-3. 스프링 어드민

  • actuator에서 가져온 정보를 모니터링 가능