세미나

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

향찡 2021. 4. 4. 16:02

www.youtube.com/watch?v=z0EaPjF3pCQ&t=39s

✍ <내용 정리>

스프링부트를 알기 위해서는 스프링과 JEE에 대한 기술을 알아야 한다. (왜 스프링부트가 편리한지..)

오늘 살펴볼 내용

프로젝트 생성

  • start.spring.io
  • SNAPSHOT 버전 : 개발 중인 버전
  • M2, M3 : 마일스톤으로 배포한 버전 (공식적으로 배포하였으나 바뀔 수 있다, 얼리어답터가 아니면 권장하지 않는다.)
  • GA(Generally Available) : 정식 배포 버전
  • Group, Artifact, version정보를 가지고 프로젝트를 식별하게 된다.
  • Description, Package name : 부가정보
  • Packaging 
  • Jar : Java Archive
  • War(Web Application Archive) : 톰캣에 배포 가능한 형태 / 압축된 상태로 배포하거나, 압축을 풀어서 배포하거나 할 수 있다. 

의존성 관리

1. 버전을 적지 않았는데 어떻게 스프링 버전 5.*가 의존성으로 들어와 있을까?

2. 메이븐의 <parent>, <DependencyManagement> 그리고 <properties>를 활용한 의존성 관리.

  • 의존성들의 parent가 spring-boot-start-parent이고 또 그 부모는 spring-boot-dependencies(컨트롤+마우스클릭) 부모인데
  • 그 안에 dependencyManagement 블럭으로 버전이 명시되어 있다.
  • 예전에는 예를 들어 spring과 logback이 있으면 적합한 버전을 찾는 것 자체가 일이었다. 하지만 스프링 부트가 지금은 알아서 찾아준다.
  • dependencyManagement에서 관리 대상이 아닌 라이브러리들은 버전을 명시해줘야 한다.

애플리케이션 실행

1. mvn spring-boot:run (빌드 툴을 이용)

  • IDE에서도 실행 가능하다
  • ./mvnw를 이용하여 실행 가능하다. (메이블이 설치되어 있지 않더라도 mvnw 스크립트를 활용하여 실행하게끔 도와줌)

2. main 클래스 실행: ide를 이용한

3. JAR 패키징 & java -jar

  • 스프링 부트 플러그인을 사용해 특수한 실행 가능한 형태의 JAR 파일 만들 수 있다.
  • 서버에 배포하는 용도로 주로 사용한다.

스프링부트 포트 변경

  • application.properties에서
  • server.port=xxxxx로 변경하면 된다.

개발 툴

Spring-Boot-Devtools

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

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

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
  • 타임리프라면 : spring.thymeleaf.cache=true를 false로 바꾸면 된다.
  • -> 사실 devtools를 추가해도 캐시가 먹기 때문에 build를 해야 한다.

재기동 메커니즘 

  • watcher가 특정한 디렉터리의 클래스들이 변경이 되었는지 확인한다
  • 변경이 되었으면 재기동, 재기동하려면 즉 빌드를 해서 바뀌었는지 알려줘야 된다.

💡 브라우저 reload는 : live-reload라는 플러그인 추가하면 된다.

RemoteLiveReload

🔍 spring-boot-devtools는 패키징 할 때 빼야 될까?

  • 기본적으로 패키징 할 때 무시되기 때문에 그냥 하면 된다.

자동 설정

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

  1. @ComponentScan
  2. @Component, @Service, @Controller, @Repository
  3. @Configuration
  4. @Bean

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

  1. META-INF/spring.factories
  2. EnableAutoConfiguration
  3. @Configuration && @ConditionalOnXxx

애플리케이션에서 설정한 빈과 자동 설정으로 설정된 빈이 중복되어 있다면 애플리케이션이 뜨지 않는다.

외부 설정 파일

  • application.properties 또는 application.yaml, 환경 변수, java 명령어 아규먼트 등 키/값의 형태로 정의되어 있는 다양한 외부 설정을 지원한다.
  • application.properties : 가장 구체적이고 가까운 위치에 있는 설정의 우선순위가 높다.
  • 구체적 뜻 : config안에 있는 디렉터리 안에 있는 설정
  • 가까운 뜻 : jar파일 안에 있으면 멀다, 현재위치에 있는 filesystem이라면 가깝다.

도커 이미지 빌드

  • 도커 이미지는 다른 이미지를 기반으로 새로운 이미지를 만들 수 있다.
  • 계층형 이미지를 만든다면 기존 계층은 캐시로 재사용할 수 있어 효율적이다.

Actuator

  • 웹(JSON)과 JMX 지원
  • 여러 엔드포인트 제공
    • /beans “빈” 정보 조회.
    • /configprops “프로퍼티” 정보 조회.
    • /logger “로거” 정보 조회 및 변경 가능. (런타임중에 바꿀수도 있다.)
    • /heapdump 메모리의 현재 상태를 내려받을 수 있다.
    • /threaddump 쓰레드의 현재 상태를 내려받을 수 있다.
    • 이밖에도 /metrics, /mappings 등 여러 엔드포인트를 제공한다.
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

스프링 부트 어드민

github.com/codecentric/spring-boot-admin

 

codecentric/spring-boot-admin

Admin UI for administration of spring boot applications - codecentric/spring-boot-admin

github.com