SpringBoot
- SpringBoot
- 스프링 부트 장점
- 스프링 부트의 목표
- spring-boot-starter-parent
- 스타터 프로젝트
- spring-boot-maven-plugin
- 스프링 부트 launch 클래스 생성
- 스프링 부트 기반 애플리케이션 실행 시 특징
- 자동 설정
- 애플리케이션 구성 외부화
- application.properties를 통한 프레임워크 사용자 정의
- 애플리케이션별로 사용자 정의 속성 정의하기
- 다른 환경에 프로파일 생성하기
- YAML 구성
- 전통적인 자바 애플리케이션 배포 vs 임베디드 서버 활용 배포
- JAR대신 기존 WAR 파일 빌드
- 주요 기능
- 장점
- 브라우저에서 실시간 리로드 활성화
- 애플리케이션 모니터링
- HAL 브라우저를 사용해 액추에이터 엔드포인트 찾기
- 액추에이터로 확인 가능한 주요 사항
스프링 부트 장점
개발자는 마이크로서비스의 비즈니스 논리에 집중할 수 있다. 스프링 부트의 목표는 마이크로서비스 개발에 관련된 모든 기술적 세부사항을 관리하는 것이기 때문이다.
스프링 부트의 목표
- 기본 목표
- 스프링 기반 프로젝트를 빠르게 구축할 수 있다.
- 일반적인 설정이 기본으로 적용된다. 기본값과의 차이를 처리하는 설정 옵션은 제공한다.
- 코드 생성과 많은 XML 설정의 사용을 피한다.
- 다양한 비기능적 특징을 제공한다.
- 비기능적 특성
- 광범위한 프레임워크, 서버와 스펙의 버젼 관리 및 설정에 관한 기본 처리
- 애플리케이션 시큐리티를 위한 기본 옵션
- 확장 옵션이 있는 기본 애플리케이션 매트릭스
- 상태 체크로 기본 애플리케이션 모니터링
- 외부 설정의 여러 옵션
스프링 프레임워크 기반 프로젝트 구축 vs 스프링부트 기반 프로젝트 구축
스프링 MVC로 애플리케이션을 구축하고 JPA(하이버네이트로 구현)를 사용해 데이터베이스에 연결한다고 가정하자.
스프링 프레임워크 기반 프로젝트 구축 단계
- 사용할 스프링 MVC, JPA 및 하이버네이트 버젼을 결정한다.
- 모든 다른 레이어를 연결하는 스프링 컨텍스트를 설정한다.
- 스프링 MVC를 사용해 웹 레이어를 설정한다.
- DispatcherServlet, handler, resolvers, 뷰 리졸버 등의 빈 설정
- 데이터 레이어에서 하이버네이트를 설정한다.
- SessionFactory, 데이터 소스 등의 빈 설정
- 다양한 환경에 따라 애플리케이션 설정을 저장하는 방법을 정하고 구현한다.
- 단위 테스트를 어떻게 할 것인지 결정한다.
- 트랜잭션 관리 전략을 결정하고 구현한다.
- 시큐리티를 구축하는 방법을 결정하고 구현한다.
- 로깅 프레임워크를 설정한다.
- 프로덕션 환경에서 애플리케이션을 모니터링 할 방법을 결정하고 구현한다.
- 애플리케이션의 통계를 제공하기 위해 매트릭스 관리 시스템을 정하고 구현한다.
- 웹 또는 애플리케이션 서버에 애플리케이션을 배포하는 방법을 결정하고 구현한다.
비즈니스 로직 구축을 시작하려면 위에 언급된 단계 중 최소 몇 가지는 완료해야 하며, 이것은 적어도 몇 주는 소요되는 작업이다.
스프링부트 기반 프로젝트 구축
- pom.xml 파일에 spring-boot-starter-parent 구성
- 요구되는 스타터 프로젝트(spring-boot starter web, spring-boot-starter-test 등)로 pom.xml 파일 구성
- 애플리케이션을 실행할 수 있도록 spring-boot-maven-plugin 구성
- 첫 번째 스프링 부트 launch 클래스 생성
또는, 스프링 이니셜라이저(http:/start/spring.io) 사용
- 빌드 도구(Maven 또는 Gradle)을 선택
- 사용할 스프링 부트 버젼 선택
- 컴포넌트의 그룹 ID와 아티팩트 ID 설정
- 프로젝트에 원하는 스타터(의존 관계) 선택
- 컴포넌트 패키지 방법 선택(JAR 또는 WAR)
- 자바 버젼 선택
- JVM 언어 선택
스프링부트 기반 프로젝트 구축 관련 주요 개념
spring-boot-starter-parent
- 스프링 부트 기반의 애플리케이션의 의존 관계 및 플러그인 관리를 제공하는 상위 POM이다.
- 사용할 자바 기본 버젼, 스프링 부트가 사용하는 의존 관계 기본 버젼, 메이븐 플러그인의 기본 설정이 포함된다.
- 스프링 버젼을 변경하면 다른 모든 의존 관계가 새 스프링 버젼과 호환되는 버젼으로 업그레이드된다. 개발자가 마주한 의존관계 간 호환성 이슈를 해결해준다.
스타터 프로젝트
- 스타터는 여러 목적으로 사용자 정의가 단순화된 의존 관계 설명자다.
- 스프링 부트 스타터 웹(spring-boot starter web) : 웹 애플리케이션을 구축하는 데 필요한 모든 프레임워크와 함께 제공된다. 스프링 및 스프링 MVC 프레임워크를 사용해 RESTful API를 포함한 웹 애플리케이션을 구축하는 데 사용된다.
- 스프링 MVC
- jackson-databind(바인딩용), hibernate-validator(폼 유효성 검사용)의 호환 가능 버젼
- spring-boot-starter-tomcat(톰캣을 위한 스타터 프로젝트)
- spring-boot-starter-test
- 단위 테스트에 필요한 테스트 프레임워크를 제공
- JUnit : 기본 단위 테스트 프레임워크
- 모키토 : 모킹용
- 스프링 테스트 : 스프링 컨텍스트 기반 애플리케이션을 위한 단위 테스트 프레임워크
- 단위 테스트에 필요한 테스트 프레임워크를 제공
- 스프링 부트 스타터 웹(spring-boot starter web) : 웹 애플리케이션을 구축하는 데 필요한 모든 프레임워크와 함께 제공된다. 스프링 및 스프링 MVC 프레임워크를 사용해 RESTful API를 포함한 웹 애플리케이션을 구축하는 데 사용된다.
spring-boot-maven-plugin
- spring-boot-maven-plugin을 추가하면 스프링 부트 애플리케이션을 실행할 수 있다.
- 아래 두 개의 상황 모두를 위한 기능을 제공한다.
- JAR 또는 WAR을 작성하지 않고 애플리케이션 실행
- 나중에 배포할 수 있도록 JAR과 WAR을 빌드
스프링 부트 launch 클래스 생성
SpringApplication 클래스의 정적 run 메소드를 사용한다.
@SpringBootApplication public class Application { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); } }
SpringApplication 클래스로 자바 main 메소드에서 스프링 애플리케이션을 다음과 같은 단계로 부트 스트랩하고 실행할 수 있다.
스프링의 ApplicationContext 인스턴스를 생성한다.
명령행 인수를 허용하고 스프링 속성으로 표시하는 기능을 활성화한다.
설정에 따라 모든 스프링 빈을 로드한다.
- @SpringBootApplication 어노테이션은 세 가지 어노테이션의 바로가기다.
- @Configuration : 스프링 애플리케이션 컨텍스트 구성 파일이라는 것을 나타낸다.
- @EnableAutoConfiguration : 스프링 부트의 중요한 기능인 자동 설정을 활성화한다.
- @ComponentScan : 클래스의 패키지와 모든 하위 패키지에서 스프링 빈을 스캔한다.
스프링 부트 기반 애플리케이션 실행 시 특징
- 톰캣 서버는 포트 8080에서 시작된다.
- 디스패처 서블릿이 구성된다. 스프링 MVC 프레임워크가 요청을 수락할 준비가 되었음을 의미한다.
- characterEncodingFilter, hiddenHttpMethodFilter, httpPutFormContentFilter, requestContextFilter 이 네 가지 필터가 기본적으로 사용된다.
- 오류 페이지가 기본으로 설정된다.
- WebJar가 자동 설정된다.
- 이것은 부트 스트랩, 쿼리와 같은 정적 의존 관계의 의존 관계 관리를 가능하게 한다.
간단한 pom.xml 파일과 하나의 자바 클래스(Application.java)를 사용해 이 모든 기능이 포함된 스프링 MVC 애플리케이션을 시작할 수 있다.
자동 설정
- 스프링 부트 프로젝트의 의존 관계에 맞게 빈을 자동으로 설정한다.
- spring-bootautoconfigure-{version}.jar에서 대부분이 제공된다.
- 모든 자동 설정 로직은 스프링 부트 애플리케이션이 시작될 때 실행된다.
- 특정 의존 관계나 스타터 프로젝트의 특정 클래스를 클래스 패스에서 사용할 수 있는 경우, 자동 설정 클래스가 실행된다. 자동 설정 클래스는 이미 빈이 구성돼 있는지 확인한다.
- 기존 빈에 기초해 기본 빈을 작성할 수 있다.
애플리케이션 구성 외부화
application.properties
구성 값이 선택되는 기본 파일이다. 스프링 부트는 클래스 패스 어디서나 application.properties 파일을 선택할 수 있다.
application.properties를 통한 프레임워크 사용자 정의
- 로깅 구성
- 로깅 구성 파일의 위치
- 로그 파일의 위치
- 로깅 레벨
- 임베디드 서버 구성 사용자 정의
- 서버 포트
- SSL 지원과 구성
- 접속 로그 구성
- 스프링 MVC 설정
- 스프링 스타터 시큐리티 구성
- 데이터 소스, JDBC와 JPA 사용자 정의
- 기타 구성 옵션
- 프로파일
- HTTP 메시지 변환기(JSON/Jackson)
- 트랜잭션 관리
- 국제화
애플리케이션별로 사용자 정의 속성 정의하기
스프링 부트는 강력한 형식의 ConfigurationProperties 기능을 통해 애플리케이션 구성에 더 나은 접근 방식을 제공한다.
- 사전 정의된 빈 구조에 모든 특성을 보유한다.
- 빈은 모든 애플리케이션 속성의 중앙 저장소 역할을 한다.
- 구성 빈은 애플리케이션 구성이 필요한 모든 곳에 자동 연결될 수 있다.
구성 빈의 예시
@Component
@ConfigurationProperties("application")
public class ApplicationConfiguration {
private boolean enableSwitchForService1;
private String service1Url;
private int service1Timeout;
public boolean isEnableSwitchForService1() {
return enableSwitchForService1;
}
public void setEnableSwitchForService1(boolean enableSwitchForService1) {
this.enableSwitchForService1 = enableSwitchForService1;
}
public String getService1Url() {
return service1Url;
}
public void setService1Url(String service1Url) {
this.service1Url = service1Url;
}
public int getService1Timeout() {
return service1Timeout;
}
public void setService1Timeout(int service1Timeout) {
this.service1Timeout = service1Timeout;
}
}
- 주목해야 할 사항
- @ConfigurationProperties("application") : 외부화된 구성의 어노테이션이다. 어노테이션을 모든 클래스에 추가해 외부 속성에 바인딩할 수 있다. "application"은 빈에 외부 구성을 바인딩하는 동안 접두사로 사용된다.
- 빈에서 여러 구성 가능한 값을 정의한다.
- 바인딩은 자바 빈 속성 설명자를 통해 발생하므로 getter와 seter가 필요하다.
또는 application.properties을 이용해 애플리케이션별로 구성 가능하다.
application.enableSwitchForService1=true
application.service1Url=http://abc-dev.service.com/somethingelse
application.service1Timeout=250
- 주목해야 할 사항
- application : 접두사는 구성 빈을 정의하는 동안 @ConfigurationProperties("application")의 일부로 정의된다.
- 값은 속성 이름에 접두사를 추가해 정의한다.
ApplicationConfiguration을 빈에 자동 연결해 다른 빈에서 구성 등록 정보를 사용할 수 있다.
import com.mastering.spring.springboot.configuration.ApplicationConfiguration;
@Component
public class SomeOtherDataService {
@Autowired
private ApplicationConfiguration configuration;
public String retrieveSomeData() {
// Logic using the url and getting the data
System.out.println(configuration.getService1Timeout());
System.out.println(configuration.getService1Url());
System.out.println(configuration.isEnableSwitchForService1());
return "data from service";
}
}
다른 환경에 프로파일 생성하기
다른 환경에서 같은 속성에 다른 값을 갖게 하고자 한다.
프로파일을 사용하면 환경마다 다른 구성을 제공할 수 있다.
아래와 같이 액티브 프로파일을 구성한다.
spring.profiles.active=dev
액티브 프로파일이 구성되면 appication-{profile-name}.properties에서 해당 프로파일에 고유한 특성을 정의할 수 있다.
// application-dev.properties
application.enableSwitchForService1=true
application.service1Url=http://abc-dev.service.com/somethingelse
application.service1Timeout=250
액티브 프로파일이 dev이면 application-dev.properties 의 값이 application.properties 의 기본 구성을 대체한다.
액티브 프로파일을 기반으로 동적 빈 구성하기
@Component나 @Configuration으로 표시된 모든 클래스는 추가로 @Profile 어노테이션을 표시해 빈이나 구성이 사용 가능한 프로파일을 지정할 수 있다.
예를 들어 애플리케이션마다 다른 환경에서 사용할 수 있는 다른 캐시가 필요하다. dev 환경에서는 매우 간단한 캐시를 사용하며, 프로덕션 환경에서는 분산 캐시를 사용하고자 한다. 프로파일을 사용해 구현할 수 있다.
@Configuration
public class DevSpecificConfiguration {
@Profile("dev")
@Bean
public String cache() {
return "Dev Cache Configuration";
}
}
@Configuration
public class ProdSpecificConfiguration {
@Profile("prod")
@Bean
public String cache() {
return "Production Cache Configuration - Distributed Cache";
}
}
구성된 액티브 프로파일에 따라 각 구성이 선택된다.
YAML 구성
- YAML은 'YAML Ain't Markup Language'의 줄임말로 사람이 읽을 수 있는 구조화된 형식의 파일이며, 보통 설정 파일에 사용된다.
- 더 나은 속성 그룹화를 허용하므로 application.properties 보다 훨씬 읽기 쉽다.
- 단일 구성 파일에서 여러 프로파일의 구성을 할 수 있다는 장점이 있다.
임베디드 서버
전통적인 자바 애플리케이션 배포 vs 임베디드 서버 활용 배포
전통적인 자바 애플리케이션 배포
자바 웹 애플리케이션을 사용해 WAR(Web Application Archive)나 EAR를 빌드해 웹 서버나 애플리케이션 서버, 그리고 자바가 설치된 서버에 배포한다.
계층 :
APP.WAR
톰캣
자바
리눅스 인스턴스
임베디드 서버
스프링 부트는 웹 서버가 애플리케이션 배포 가능한 JAR의 일부인 임베디드 서버 개념을 도입한다. 임베디드 서버를 사용해 애플리케이션을 배포하려면 서버에 자바가 설치되어 있어야 한다.
장점
항상 서버에 톰캣을 설치할 필요가 없게 된다.
스프링 부트로 만들어진 JAR 파일(실행 가능한 Java 패키징 파일)로 프로젝트를 실행하면 된다.
언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있다.
계층 :
APP.JAR와 그 안의 임베디드 톰캣
자바
리눅스 인스턴스
스프링 부트로 모든 애플리케이션을 빌드할 때의 기본값은 JAR를 빌드하는 것이다.
해당 명령어는 다음과 같다.
mvn clean install
JAR대신 기존 WAR 파일 빌드
pom.xml의 패키지를 war로 변경한다.
<pachaging>war</pachaging>
톰캣 서버가 WAR 파일의 의존 관계로 포함되지 않도록 하고 싶다면 임베디드 서버의 의존 관계를 수정한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
이후 WAR로 WAS나 톰캣과 같은 웹 서버에 배포할 수 있다.
개발자 도구를 사용해 생산성 향상
스프링 부트 개발자 도구를 사용하려면 다음 의존 관계를 포함해야 한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
주요 기능
- 뷰 템플릿 및 정적 파일 캐싱을 비활성화하는데, 이로써 변경 사항을 즉시 확인할 수 있다.
- 클래스 패스의 파일이 변경될 때 자동으로 애플리케이션이 다시 시작한다.
- 컨트롤러나 서비스 클래스를 변경할 때
- 속성 파일을 변경할 때
장점
- 개발자는 매번 애플리케이션을 중지하고 재시작할 필요가 없다. 애플리케이션은 변경되는 즉시 자동으로 재시작된다.
- 이때 새롭게 개발된 클래스만 리로드한다. 이것은 애플리케이션의 콜드-스타트보다 훨씬 빠르다.
브라우저에서 실시간 리로드 활성화
브라우저에 표시된 페이지나 서비스의 코드가 바뀌면 새로운 내용으로 자동 새로고침된다.
애플리케이션 모니터링에 스프링 부트 액추에이터 사용하기
애플리케이션 모니터링
- 서비스가 다운되거나 느려지는 경우 즉시 알 수 있다.
- 서버에 충분한 여유 공간이나 메모리가 있는지 즉시 확인 가능하다.
스프링 부트 액추에이터를 사용하려면 다음 의존 관계를 포함해야 한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.properties의 속성을 구성해 모든 액추에이터 URL을 활성화할 수 있다.
management.endpoints.web.exposure.include=*
HAL 브라우저를 사용해 액추에이터 엔드포인트 찾기
액추에이터는 방대한 양의 데이터는 노출시키는 많은 엔드포인트를 노출시킨다.
정보를 더 잘 시각화하기 위해 애플리케이션에 HAL 브라우저를 추가한다.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>
스프링 부트 액추에이터는 스프링 부트 애플리케이션 및 환경에서 캡처된 모든 데이터에 REST API를 제공한다.
HAL 브라우저를 사용하면 스프링 부트 액추에이터 API를 시각적으로 표현할 수 있다.
액추에이터로 확인 가능한 주요 사항
- 애플리케이션 구성 속성
- configprops 엔드포인트는 애플리케이션 등록 정보를 통해 구성할 수 있는 구성 옵션의 정보를 제공한다.
- 환경 세부 정보
- 환경(env) 엔드포인트는 운영체제, JVM 설치, 클래스 패스, 시스템 환경 변수, 다양한 애플리케이션 특성 파일에 구성된 값의 정보를 제공한다.
- 애플리케이션 상태 모니터링
- 상태 서비스는 애플리케이션의 상태를 제공한다.
- 매핑 정보 얻기
- 매핑 엔드포인트는 애플리케이션에 노출되는 여러 서비스 엔드포인트의 정보를 제공한다.
- URI
- 요청 메소드
- 빈
- 서비스를 노출시키는 컨트롤러 메소드
- 매핑 엔드포인트는 애플리케이션에 노출되는 여러 서비스 엔드포인트의 정보를 제공한다.
- 빈 구성으로 디버깅하기
- 빈 엔드포인트는 스프링 컨텍스트에 로드된 빈의 세부 사항을 제공한다. 스프링 컨텍스트와 관련된 문제를 디버깅할 때 유용하다.
- 빈의 이름 및 별명
- 빈의 스코프
- 빈의 종류
- 빈이 작성되는 클래스의 정확한 위치
- 빈의 의존 관계
- 빈 엔드포인트는 스프링 컨텍스트에 로드된 빈의 세부 사항을 제공한다. 스프링 컨텍스트와 관련된 문제를 디버깅할 때 유용하다.
- 중요한 매트릭스 탐색하기
- 서버 : 프리 메모리, 프로세서, 가동 시간 등
- JVM : 힙, 스레드, 가비지 컬렉션, 세션 등의 세부 정보
- 애플리케이션 서비스에서 제공하는 응답
- 디버깅
- /application/heapdump : 힙 덤프를 제공한다.
- /application/httptrace : 애플리케이션에서 처리한 마지막 몇 가지 요청을 추적한다.
- /application/threaddump : 스레드 덤프를 제공한다.
Reference
- 스프링 5 마스터 2/e
'Web_Backend > Spring' 카테고리의 다른 글
6.Spring 개념 기타 (1) | 2024.07.12 |
---|---|
4.Spring MVC (0) | 2024.07.12 |
3.Spring AOP (0) | 2024.07.12 |
2.Spring DI (0) | 2024.07.12 |
1.Spring Framework와 IoC (0) | 2024.07.12 |