개발/Spring Boot

우아한 스프링 부트 공부 기록

Debin 2022. 7. 30.
반응형

스프링 부트

스프링 부트는 스프링을 쉽게 제공하기 위해 제공되는 툴이다.

참고로 스프링이란 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크다.

스프링 부트가 제공하는 3가지 큰 영역

  • 빌드 : 프로젝트 생성, 의존성 관리, 애플리케이션 패키징 및 실행
  • 코딩 : 개발 툴 제공, 자동 설정, 외부 설정
  • 배포 및 관리 : 도커 이미지 생성, Actuator, 스프링 부트 어드민

빌드

프로젝트 생성

https://start.spring.io/ 여기에서 스프링 프로젝트를 만든다. 들어가면 다음과 좌측면에 같은 화면이 나온다.

start.spring.io 좌측면 이미지

스냅샷(SNAPSHOT)은 개발 중인 버전. 가급적이면 사용하지 말자.

M(Milestone) 버전 배포는 했지만 바뀔 수 있는 버전. 공부하지 않는 이상 사용하지 않는 것이 좋다.

현재 기준으로 2.7.2 GA(General Availability) 버전을 사용할 것.

 

  • Group : 중요하다. 보통 도메인 네임이어야 한다.
  • Artifact : 중요하다. 패키지의 이름이며 버전 정보를 생략한 jar 파일 이름이다.
  • Name : 별로 안중요하다. 
  • Description : 별로 안중요하다.
  • Package name : 별로 안중요하다.
  • 버전도 중요한데 1.0.0 스냅샷으로 자동으로 만들어진다.

jar(Java Archieve) vs war(Web Application Archive)

어떻게 배포할지에 따라 다른다. 잘 모르면 jar로 시작하면 된다. 

 

  • Jar: JAR은 Java Archive의 약자로 자바에서 사용되는 압축 파일의 한 형태.
    .jar파일들은 일반적으로 라이브러리, 자바 클래스 및 해당 리소스 파일 (텍스트, 음성, 영상 자료 등), 속성 파일들을 담는다.
  • War: WAR은 Web Archive의 약자로 웹 애플리케이션을 압축하고 배포하는데 사용되는 파일 형태이다.
     WAR는 자바 클래스, 자바 서버 페이지, XML, 자바스크립트, 정적 웹 페이지 등의 자원을 한데 모아 웹 애플리케이션의 배포를 가능케 한다는 점에서 차이가 있다. 또한 .jar 파일과 달리 .war 파일은 배포 서술자라고도 불리는 web.xml을 통해 경로를 반드시 지정해줘야 웹 애플리케이션 서버가 이를 실행할 수 있다.

이후 필요한 의존성을 넣어서 GENERATE를 누르면 내 컴퓨터에 .zip으로 다운로드 된다.

스프링 부트가 편하게 필요한 패키지 구조(test 패키지, main 패키지, resources 패키지 등)를 만들어준다.

의존성 관리

스프링 부트를 통해 프로젝트에 필요한 의존성을 쉽게 관리한다.

직접적인 의존성의 버전을 적지 않아도, 구체적인 의존성의 버전을 가져온다. 이게 어떻게 가능할까?

강의에서는 pom.xml 파일에서 parent가  버전을 알고 있기 때문이라고 말씀하셨다.

그러므로 자식의 pom.xml이 버전을 알고 있지 않아도 된다.

 

gradle에서는 다음과 같은 좋은 글이 있어서 가져와봤다.

https://www.inflearn.com/chats/227298

plugins {
	id 'org.springframework.boot' version '2.7.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE' //이 코드를 통해 버전을 신경쓰지 않는게 가능.
	id 'java'
}

적절한 버전을 찾아서 의존성을 넣는 것은 생각보다 굉장히 번거로운 일이다. 

그러므로 편리하게 스프링 부트가 알아서 스프링 부트 버전에 최고로 적절한 라이브러리 버전들을 넣어주는 것이다.

그러나 스프링이 공식적으로 버전을 관리하지 않는 라이브러리들은 버전을 넣어줘야 한다.

애플리케이션 실행

자바 스프링 애플리케이션 실행 방법으로는 다양한 방법들이 있다.

  • mvn spring-boot:run 
    스프링 부트 메이븐 플로그인을 사용하며, 메이븐을 사용해서 실행한다.
  • main 클래스 실행: 가장 평범한 자바 애플리케이션 실행 방법이며, IDE 사용해서 실행한다.
  • JAR 패키징 & java -jar 
    스프링 부트 플로그인을 사용해 특수한 실행 가능한 형태의 JAR 파일을 만들 수 있다.
    서버에 배포하는 용도로 주로 사용한다.

참고로 gradlew == gradle wrapper이다. 즉  줄임말이다.

우리는 배포할 때 흔히 ./gradlew  build로  패키징을 진행한다. 

원래 자바 스펙에서는 jar 파일 1개로 애플리케이션을 뭉치게 만드는 스펙이 없다고 한다. 우버 자르(uber jar)라고 부르는 듯?

jar 파일 1개에 모든 라이브러리와 소스 코드가 들어가는데, 이는 모두 스프링 부트가 임의로 만든거라고 한다.

알고 보니 이것도 스프링 부트가 해주던 것..!!! 정말 편리하다.

코딩

개발 툴 제공

대표적으로 Spring--Boot-Devtools

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

뷰파일을 바꿨는데 애플리케이션 재시작 안해도 빌드를 하면 바로 적용된다.

필자도 사용해봤는데 애플리케이션을 재시작 안해도 뷰 파일에 변화가 적용되서 정말 편리했다.

 

여기서 질문!! 그럼 배포할 때 Devtools를 의존성을 빼야할까?

기본적으로 패키징을 한 상태에서 실행을 할 때 Devtools가 하는 설정이 전부 무시가 된다고 한다. 따라서 그냥 실행해도 된다고 한다.. 
역시 굉장히 편리하다. 넣고 배포해도 상관없다!

스프링 부트의 꽃 자동 설정

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

  • META_INF/spring.factories
  • EnableAutoConfiguration
  • @Configuration && @ConditionOnXxx

spring-boot-autoconfigure 패키지 안에 자동 등록할 빈들이 있다.

애플리케이션에서 정의한 빈들이 먼저 정의된다.(우리 소스코드가 우선)

이후에는 자동으로 등록하는 빈들이 등록된다.

최근 스프링부트에서는 빈 오버라이딩이 막혀서 중복되는 빈들이 있다면 충돌이나서 뜨지 않는다.

외부 설정

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

 

  • application.properties 또는 application.yml, 환경 변수, java 명령어 아규먼트 등 키/값의 형태로 정의되어 있는 다양한 외부 설정을 지원한다.
  • application.properties: 가장 구체적이고 가까운 위치에 있는 설정의 우선 순위가 높다.

참고

자바 스펙상 properties 파일을 UTF-8이 아닌 다른 인코딩으로 읽어들인다.

그래서 인코딩 설정을 하지 않고 진행하면 한글이 깨진다. 따라서 별도의 인코딩 설정이 필요하다.

 

우선 순위가 많다지만 발표에서 정리해주신 부분은 다음과 같다.

보통 필자는 빌드를 한 jar 파일을 프로젝트/build/libs 경로에 둔다. 이제 libs를 예시로 들면,

 

1. libs 디렉토리 내부에 config 디렉토리 내부 application.properties.

2. 빌드하는 경로에 위치한 application.properties.

3. jar 내부 application.properties.

4. jar 내부 config 디렉토리.

 파일이 아예 덮이는게 아니라 파일의 값들이 덮어진다?라는 의미로 이해했다. 이것도 정말 꿀팁 같다.

배포

도커 이미지 빌드 

계층형 이미지 빌드를 지원한다.

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

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

아래 이미지는 굉장히 단순화한것. 필자가 도커를 몰라서 자세한 내용은 잘 모르겠다. 

다만 도커 다이브 관련 내용은 기억하면 좋겠다.

단순화한 계층형 이미지

관리: Actuator

Spring-Boot-Starter-Actuator를 사용해 애플리케이션 관련 데이터 및 모니터링 정보를 제공한다.

  • 웹(JSON)과 JMX 지원
  • 여러 엔드포인트 제공
    • /beans “빈” 정보 조회.
    • /configprops “프로퍼티” 정보 조회.
    • /logger “로거” 정보 조회 및 변경 가능.
    • /heapdump 메모리의 현재 상태를 내려 받을 수 있다.
    • /threaddump 쓰레드의 현재 상태를 내려 받을 수 있다.
    • 이밖에도 /metrics, /mappings 등 여러 엔드포인트를 제공한다.

관리: 스프링 부트 어드민

스프링 부트 Actuator 기반 UI

정말 꿀팁인 것 같다. 물론 실무에서는 사용하기 힘들 수도 있다고 말씀하셨지만, 개인 프로젝트나 소규모 프로젝트에서는 좋을 듯.

아래에 해당 프로젝트의 깃허브 주소를 남기겠다.

https://github.com/codecentric/spring-boot-admin

 

이상으로 포스팅을 마칩니다. 감사합니다.

 

참고 자료

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

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

https://hleee.medium.com/jar%EA%B3%BC-war%EA%B3%BC-ear-9eef55f610e7

반응형

댓글