[우아한 세미나]Spring-Boot-Admin & 외부 파일 위치 관리 본문

백앤드 개발일지/스프링부트

[우아한 세미나]Spring-Boot-Admin & 외부 파일 위치 관리

giron 2021. 10. 4. 00:26
728x90

팔을 잃었다..😳

백신 2차까지 맞고 팔을 잃었지만 아직 나에겐 다른 한쪽 팔이 남았다 🤫🤫

귀와 팔 한쪽이 멀쩡하기 떄문에 우아한 세미나에서 기선님의 강의를 듣고 직접 적용해보고 정리해보려고 한다. 멋있음ㅋ

META-INF/spring.factories 에서

이렇게 자동 설정을 한다. 이러한 자동설정들이 제공되어 있는 게 스프링 부트이다.

  • 순서는 애플리케이션 설정한 빈이 먼저 등록되고 그 후에 자동 설정으로 제공하는 빈이 등록된다.
  • 만약 앞에서 애플리케이션에서 설정한 빈 등록이 있고, 자동 설정으로 제공하는 빈의 빈 아이디가 중복이 되있다면 충돌 나서 애플리케이션이 뜨지 않는다.
  • 또한 자동 설정으로 제공하는 빈끼리도 중복되면 충돌나서 애플리케이션이 뜨지 않는다고 한다.

application.properties/ application.yml 위치에 따라 우선순위가 달라진다.

즉, 우선순위에 따라 계속 오버라이딩 된다.

  • config디렉토리를 만들고 그 안에 yml을 만들면 우선순위가 가장 빠르다.
  • 파일 시스템에서 정의해둔 값들이 오버라이딩되서 적용된다. 
  • 기본값으로 애플리케이션 안에 두고 특정 값들만 변경할 때 활용 가능하다.
  • 4번에 yml파일이 있을 때, 1번에서 2번에서 yml파일을 오버라이딩하면 적용된다.

application.properties
설정파일 불러오기
적용 성공

 

스프링부트가 도커 이미지 만들어주는 것을 지원해준다.

왼쪽의 JVM위에 올라가 있는 fat-jar: 라이브러리까지 만들어져 있는 jar (약 20MB)를 오른쪽처럼 계층으로 나눠준다.

자세히는 4계층으로 나눠져있다고 한다.

스프링 빌드 플러그인에 있다..!

 위처럼 스프링 빌드 플러그인을 통해서 도커 이미지를 만들어 줄 수 있다. 그리고  dive 툴을 이용해서 파일들을 분석할 수 있다.

실행되고 확인하면 라이브러리 설치 순서와 같이 언제 축적되는지 확인할 수 있다고 한다.. (근데 너무 어지럽다..ㅎㅎ)

배포 후 관리!!

actuator를 통해서 로거의 레벨을 디버그 모드로 바꿀 수 있다.

디버그 모드로 출력된다.!!

이러한 Actuator를 보기 좋게 보면서 관리할 수 있도록 Spring-boot-admin을 이용해 보자!

Springboot-starter-Admin

Server 애플리케이션 설정

로컬에 어플리케이션 2개를 띄우기 때문에 서버 애플리케이션의 포트를 18080으로 설정한다.

@EnableAdminServer 추가

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
728x90
Comments