[우아한 세미나]Spring-Boot-Admin & 외부 파일 위치 관리
백신 2차까지 맞고 팔을 잃었지만 아직 나에겐 다른 한쪽 팔이 남았다 🤫🤫
귀와 팔 한쪽이 멀쩡하기 떄문에 우아한 세미나에서 기선님의 강의를 듣고 직접 적용해보고 정리해보려고 한다. 멋있음ㅋ
META-INF/spring.factories 에서
이렇게 자동 설정을 한다. 이러한 자동설정들이 제공되어 있는 게 스프링 부트이다.
- 순서는 애플리케이션 설정한 빈이 먼저 등록되고 그 후에 자동 설정으로 제공하는 빈이 등록된다.
- 만약 앞에서 애플리케이션에서 설정한 빈 등록이 있고, 자동 설정으로 제공하는 빈의 빈 아이디가 중복이 되있다면 충돌 나서 애플리케이션이 뜨지 않는다.
- 또한 자동 설정으로 제공하는 빈끼리도 중복되면 충돌나서 애플리케이션이 뜨지 않는다고 한다.
application.properties/ application.yml 위치에 따라 우선순위가 달라진다.
즉, 우선순위에 따라 계속 오버라이딩 된다.
- config디렉토리를 만들고 그 안에 yml을 만들면 우선순위가 가장 빠르다.
- 파일 시스템에서 정의해둔 값들이 오버라이딩되서 적용된다.
- 기본값으로 애플리케이션 안에 두고 특정 값들만 변경할 때 활용 가능하다.
- 4번에 yml파일이 있을 때, 1번에서 2번에서 yml파일을 오버라이딩하면 적용된다.
스프링부트가 도커 이미지 만들어주는 것을 지원해준다.
왼쪽의 JVM위에 올라가 있는 fat-jar: 라이브러리까지 만들어져 있는 jar (약 20MB)를 오른쪽처럼 계층으로 나눠준다.
자세히는 4계층으로 나눠져있다고 한다.
위처럼 스프링 빌드 플러그인을 통해서 도커 이미지를 만들어 줄 수 있다. 그리고 dive 툴을 이용해서 파일들을 분석할 수 있다.
실행되고 확인하면 라이브러리 설치 순서와 같이 언제 축적되는지 확인할 수 있다고 한다.. (근데 너무 어지럽다..ㅎㅎ)
배포 후 관리!!
actuator를 통해서 로거의 레벨을 디버그 모드로 바꿀 수 있다.
이러한 Actuator를 보기 좋게 보면서 관리할 수 있도록 Spring-boot-admin을 이용해 보자!
Springboot-starter-Admin
Server 애플리케이션 설정
로컬에 어플리케이션 2개를 띄우기 때문에 서버 애플리케이션의 포트를 18080으로 설정한다.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'de.codecentric:spring-boot-admin-starter-server:2.4.1'
implementation 'org.springframework.boot:spring-boot-starter-security'
...
}
application.yml
server:
port: 18080
spring:
security:
user:
name: admin
password: admin
SecurityConfig.java
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecurityConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
http.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**")
.permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler)
.and().logout().logoutUrl(adminContextPath + "/logout").and().httpBasic()
.and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);
}
}
security를 설정한 후 localhost:8081에 들어갔을 때 모습이다.
Client 애플리케이션 설정
build.gradle
//Client 의존성 주입 client-damin
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'de.codecentric:spring-boot-admin-starter-client:2.4.1'
application.yml
spring:
profiles:
active: local
boot:
admin:
client:
url: http://localhost:18080 #server url
username: admin
password: admin
instance:
#name: giron-app # 어플리케이션 명을 설정할 수 있다.
metadata: # 어플리케이션 (스프링 시큐리티)로그인 정보
user:
name: admin
password: admin
service-url: http://localhost:8080 #clientUrl
endpoint:
health:
show-details: always
endpoints: #admin에서 모니터링 가능하도록 앤드포인트 모두 열어두기
web:
exposure:
include: "*"
이렇게만 하면 설정은 끝난다. 이후 admin에 들어가면 잘 작동할 것이다.
잘 작동하는 것을 확인할 수 있다. 처음 사용해본 기술이라 재밌었다..! 나중에 프로젝트에서 적용해 보려고 한다!
우아한세미나 좋아요😚🤟
Reference
- https://www.youtube.com/watch?v=z0EaPjF3pCQ&t=6493s