포스트

2022-04-15-TIL

Today I Learned

Health Checks with Spring Boot

Spring Boot Actuator의 /actuator/health 엔드포인트는 애플리케이션과 DB, 디스크, Redis 같은 의존 대상의 상태를 모아 UP/DOWN으로 알려 준다. Actuator 문서에 따르면 상세 정보 노출은 management.endpoint.health.show-details(never, when-authorized, always)로 정하고, 직접 확인하고 싶은 대상이 있으면 HealthIndicator를 구현한 빈을 등록해 health()에서 Health 응답을 돌려주면 된다.

쿠버네티스 환경에서는 애플리케이션 가용성 상태를 /actuator/health/liveness와 /actuator/health/readiness 두 프로브로 나눠 노출할 수 있다. liveness는 프로세스가 살아 있어 재시작이 필요 없는지, readiness는 트래픽을 받을 준비가 되었는지를 뜻한다. 외부 DB 장애를 liveness에 포함하면 DB가 잠깐 끊겼을 때 모든 파드가 재시작되므로, 외부 의존성은 readiness 쪽에서만 보는 편이 안전하다.

  • https://reflectoring.io/spring-boot-health-check/

Apache Tomcat Access Log

액세스 로그는 서버가 받은 모든 HTTP 요청을 한 줄씩 기록한 로그로, 클라이언트 IP, 요청 시각, 메서드와 URL, 상태 코드, 응답 크기, 처리 시간 등을 남긴다. 외부 톰캣에서는 server.xml에 AccessLogValve를 설정하고, Spring Boot 내장 톰캣에서는 속성으로 켠다. server.tomcat.accesslog.enabled의 기본값은 false이고, 로그 디렉터리 기본값은 톰캣 기본 디렉터리 아래 logs, 패턴 기본값은 common이다.

1
2
3
4
5
6
server:
  tomcat:
    basedir: /var/app/tomcat
    accesslog:
      enabled: true
      pattern: "%h %l %u %t \"%r\" %s %b %D"

패턴의 %D는 요청 처리 시간(Tomcat 9 기준 밀리초)이라 느린 요청을 찾을 때 유용하다. 내장 톰캣은 server.xml을 직접 쓰지 않으므로, 속성으로 표현할 수 없는 설정은 WebServerFactoryCustomizer로 코드에서 지정한다.

  • https://m.blog.naver.com/solinsystem/221796167356
  • https://zetawiki.com/wiki/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8war%ED%8C%8C%EC%9D%BC%EB%A1%9C_%ED%86%B0%EC%BA%A3%EC%97%90_%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
  • https://www.baeldung.com/spring-boot-configure-tomcat
  • https://stackoverflow.com/questions/64917200/configuring-tomcat-server-xml-file-inside-of-embedded-apache-tomcat-in-spring

Micronaut

Micronaut는 마이크로서비스와 서버리스 애플리케이션을 위한 JVM 프레임워크다. 가장 큰 특징은 컴파일 시점 의존성 주입이다. 애너테이션 프로세서가 컴파일할 때 의존성 그래프와 빈 정의를 미리 만들어 두기 때문에, 실행 시점에 클래스패스를 스캔하거나 리플렉션으로 빈을 구성하지 않는다. 그 결과 시작이 빠르고 메모리 사용이 적으며, 리플렉션이 적어 GraalVM Native Image로 컴파일하기 쉽다. 의존성 연결 실수도 빌드 단계에서 드러난다. Micronaut Launch는 Spring Initializr처럼 프로젝트 골격을 만들어 주는 페이지다.

  • https://micronaut.io/launch/
  • https://github.com/micronaut-projects/micronaut-core
  • https://www.techtarget.com/searchapparchitecture/definition/Micronaut-framework

Micronaut vs Spring Boot

Spring Boot는 애플리케이션 시작 시 리플렉션과 프록시로 빈을 구성하는 대신 생태계와 자료가 압도적으로 많다. Micronaut는 이 작업을 컴파일 시점으로 옮겨 시작 시간과 메모리에서 유리하지만, 라이브러리 생태계와 커뮤니티가 상대적으로 작다. 서버리스처럼 콜드 스타트가 중요하거나 작은 서비스를 많이 띄우는 환경이라면 Micronaut의 장점이 커진다. Spring 쪽에서도 Spring Native 프로젝트로 GraalVM 네이티브 이미지 지원을 실험하고 있다.

  • https://javasterling.com/spring-boot/spring-boot-vs-micronaut/

Tutorial

Micronaut로 REST API, 데이터 접근, 테스트를 만들어 보는 영상 튜토리얼 모음이다.

  • https://www.youtube.com/watch?v=hnEXOqcNXPs
  • https://www.youtube.com/watch?v=RtjSqRZ_md4
  • https://www.youtube.com/watch?v=KIp9PlyJOjg&t=1355s
  • https://www.youtube.com/watch?v=5gTO_f70hLM
  • https://www.youtube.com/watch?v=fj9QJnIsUjE

GraalVM and JVM

GraalVM은 HotSpot JVM을 기반으로 하면서 자바로 작성된 Graal JIT 컴파일러를 쓰는 JDK 배포판이다. 링크된 Stack Overflow 답변이 설명하듯 일반 JVM처럼 자바 바이트코드를 실행하면서, JavaScript, Python, Ruby, R 같은 다른 언어도 같은 런타임에서 실행할 수 있다. 또 Native Image 기능으로 애플리케이션을 미리(AOT) 컴파일해 JVM 없이 실행되는 네이티브 실행 파일을 만들 수 있다. 네이티브 이미지는 시작이 빠르고 메모리가 적지만, 빌드 시점에 도달 가능한 코드를 분석해야 해서 리플렉션, 동적 프록시, 리소스 사용을 미리 설정해 주어야 한다.

  • https://stackoverflow.com/questions/51489954/difference-between-graalvm-and-jvm-hotspot#:~:text=GraalVM%20is%20a%20JVM%20with,R%2C%20Ruby…)

JAR vs WAR

JAR(Java ARchive)는 클래스 파일과 리소스, META-INF/MANIFEST.MF를 묶은 일반 자바 아카이브다. WAR(Web Application aRchive)는 서블릿 컨테이너에 배포하는 웹 애플리케이션 형식으로, WEB-INF/classes, WEB-INF/lib, WEB-INF/web.xml 같은 정해진 구조를 가진다. EAR는 여러 모듈을 묶어 Java EE 애플리케이션 서버에 배포하는 형식이다.

Spring Boot는 내장 톰캣과 모든 의존성을 포함한 실행 가능한 JAR를 기본으로 만들어 java -jar로 바로 실행한다. 기존 톰캣에 배포해야 한다면 패키징을 war로 바꾸고 SpringBootServletInitializer를 상속한 클래스를 두며, 내장 톰캣 의존성은 provided로 지정한다.

  • https://doing7.tistory.com/39
  • https://hleee.medium.com/jar%EA%B3%BC-war%EA%B3%BC-ear-9eef55f610e7
  • https://vanwolha.tistory.com/107
  • https://stackoverflow.com/questions/5871053/difference-between-jar-and-war-in-java#:~:text=Generally%2C%20a%20JAR%20file%20contains,like%20Servlets%2C%20JSP%2C%20HTML.
  • https://hye0-log.tistory.com/27
  • https://www.baeldung.com/java-jar-war-packaging
  • https://joohoon.tistory.com/96
참고한 자료외부 출처 3

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다