우아한테크세미나 / 백기선님의 우아한 스프링부트

https://www.youtube.com/watch?v=z0EaPjF3pCQ
우아한테크세미나, 백기선님의 우아한 스프링부트를 보고 개인적으로 정리한 내용입니다.

빌드

  1. 프로젝트 생성
  • start.spring.io 에서 생성한다.
    • snapshot : 개발중
    • M2 : 공식적으로 배포했지만 수정될 수 있기 때문에 쓰는거 추천x
    • 아무것도 안 붙어있는거 사용하는게 좋음
  • 메이븐, 그래들
  • 자바, 코틀린, 그루비
  • 의존성 추가
  • 프로젝트 기본 정보 입력
  • 패키징 방법 선택
  • 자바 버전 선택
  1. 의존성 관리
  • 프로젝트에 필요한 의존성을 쉽게 관리하게 도와줌
  • 버전을 적지 않았는데 스프링 버전 5.*가 의존성으로 들어온 이유?
    • dependency management 는 dependency의 버전을 명시하는 곳. 폼의 자식의 자식인 pom파일에서 버전을 명시하지 않아도 됨. 클릭해서 어디에 속해있는지 확인 가능.
  • 메이븐의 parent, DependencyManagement, properties를 활용한 의존성 관리
  • 즉 버전을 적지 않아도 자동으로 스프링부트가 현재 버전과 가장 잘 맞는 라이브러리 버전을 가져와준다. 부트에서는 이미 버전과 기본 의존성들이 추가되어 있기 때문에.
  • 단 스프링부트가 관리 해주지 않는 라이브러리일 경우엔 버전을 직접 명시해줘야 한다
  1. 애플리케이션 패키징 및 실행
  • mvn spring-boot:run
    • 인텔리제이 같은 툴로 로딩해서 사용하는게 아니라 소스코드만 받은 상태에서 바로 실행(빌드툴을 통해)
    • 스프링 부트 메이븐 플러그인 사용
    • 메이븐을 사용해서 실행한다
    • mvn spring-boot:run
  • main 클래스 실행
    • 가장 평범한 자바 애플리케이션 실행하는 방법
    • IDE 사용해서 실행
  • jar 패키징 & java -jar
    • 스프링 부트 플러그인을 사용해 특수한 실행 가능한 형태의 jar 파일을 만들 수 있다
    • 서버에 배포하는 용도로 주로 사용
    • uber jar, fat jar : jar파일 안에 애플리케이션 안의 라이브러리를 다 담고 있음. 이 기능을 스프링부트가 해줌.

코딩

  1. 개발 툴 제공

Spring-Boot-Devtools 은 아래 세가지 문제를 해결해준다. (변경된 최소한의 부분만 재시작해서 핸들러가 동작가능하게 만들어준다.)

  • 개발 중에 뷰 리소스 또는 템플릿에 적용되는 캐시는 오히려 불편하다
    • 뷰는 템플릿 파일이고 Timeleaf 라는 엔진이 스프링 mvc를 통해 변환하는 과정을 거침. 소스코드를 변경해도 바로 적용이 안 되는 이유… 빌드해도 안 됨. 애플리케이션을 재기동 해야함.
  • 개발 중에 애플리케이션을 자주 재시작한다
  • 개발 중에 웹 브라우저를 자주 리로딩한다
  1. 자동 설정

Convention over Configuration : 스프링부트의 꽃!

  • 애플리케이션에서 설정한 빈 등록 (우선적용)
    • @ComponentScan
    • @Component, @Service, @Controller, @Repository
    • @Configuration
    • @Bean
  • 자동 설정으로 제공하는 빈 등록 (애플리케이션 빈 등록 후에 적용됨, 빈 등록과 중복되는 게 있다면 애플리케이션이 뜨지 않음(오버라이딩이 막혀있기 때문))
    • META-INF / spring.factories
    • EnableAutoConfiguration
    • @Configuration && @ConditionalOnXxx
  • 애플리케이션에 의존성만 추가하여 내가 직접 설정하지 않은 설정을 적용할 수 있음. 어떤 jar 파일에도 spring.factories 안 EnableAutoConfiguration에 정의해놓으면 모든 게 다 적용가능. 자동설정을 로딩해서 제공하는 매커니즘을 구현한 게 스프링부트.
  1. 외부 설정

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

  • application.properties 또는 application.yaml, 환경 변수, java 명령어 아규먼트 등 키/값의 형태로 정의되어 있는 다양한 외부 설정을 지원
  • application.properties
    • 가장 구체적이고(config 디렉토리) 가까운 위치에 있는(jar 안에 들어있으면 먼 거고 애플리케이션 커멘드라인 파일 시스템에 있는 properties는 jar보다 더 가까움) 설정의 우선 순위가 높다
    • 우선순위 높은 순으로 디렉토리 안 config > 디렉토리 안 > jar 안의 config > jar 순서

배포 및 관리

  1. 도커 이미지 생성

계층형 이미지 빌드 지원

  • 원랜 JVM 이미지 위에 JAR 파일을 얹어 fat jar 하나가 매번 만들어졌다. 수정하는 부분은 조금이고 온갖 라이브러리는 바뀌지가 않기 때문에 비효율적임.
  • 부트에선 JVM 위에 LIBRARY 위에 APP 계층으로 나눠짐. (실제론 더 복잡)
  • 도커 이미지는 다른 이미지를 기반으로 새로운 이미지를 만들 수 있다
  • 계층형 이미지를 만든다면 기존 계층은 캐시로 재사용할 수 있어 효율적이다
  1. Actuator

애플리케이션 관련 데이터 및 모니터링 정보 제공
Spring-Boot-Starter-Actuator

  • 웹(JSON)과 JMX 지원
  • 여러 엔드포인트 제공
    • /beans “빈” 정보 조회
    • /configprops “프로퍼티” 정보 조회
    • /logger “로거” 정보 조회 및 변경 가능
    • /headdump 메모리의 현재 상태를 내려받을 수 있음
    • /threaddump 쓰레드의 현재 상태를 내려받을 수 있음
    • 이밖에서 /metrics, /mappings 등 여러 엔드포인트를 제공함
  • application.properties 파일에 management.endpoints.web.exposure.include=*
    • 모든 엔드포인트 확인 가능
    • properties가 어디서 온지 확인할 수 있음
    • 로거 런타임 중에 debug 모드로 변경 가능
  1. 스프링 부트 어드민(spring boot admin)

스프링 부트 Actuator 기반 UI
Admin Server(Admin) <-> Application(Client)

  • 어드민 서버가 따로 있고 애플리케이션에서 내보내는 Actuator 정보를 admin 서버로 보내서 admin 서버에서 모니터링 할 수 있는 기능 만들 수 있음
  • 위 기능 더 편하게 관리 할 수 있음

태그:

카테고리:

업데이트:

댓글남기기