2022-03-29-TIL
Today I Learned
JIB
JIB는 구글에서 제공하는 의존 라이브러리로 스프링 부트에서 메이븐이나 그레이들 의존 설정만으로도 도커라이징을 간편하게 해준다.
정확히는 의존 라이브러리가 아니라 Maven/Gradle 빌드 플러그인(jib-maven-plugin, com.google.cloud.tools.jib)이다. Jib README에 따르면 Docker 데몬 없이 이미지를 만들고, Dockerfile을 작성할 필요가 없으며, 애플리케이션을 의존성, 리소스, 클래스 레이어로 나누어 바뀐 레이어만 다시 빌드한다. Maven에서는 다음처럼 플러그인을 추가하고 mvn compile jib:build로 레지스트리에 바로 푸시하거나, 로컬 Docker에 넣고 싶으면 jib:dockerBuild를 쓴다.
1
2
3
4
5
6
7
8
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<from><image>eclipse-temurin:17-jre</image></from>
<to><image>registry.example.com/myapp</image></to>
</configuration>
</plugin>
베이스 이미지, 대상 레지스트리, 인증 정보, JVM 옵션은 <configuration>에서 지정한다.
- https://www.youtube.com/watch?v=2roToBBsmWY&t=357s
- https://www.youtube.com/watch?v=dKXx4O_GIyo
- https://www.youtube.com/watch?v=4lepROopuiw
- https://cloud.google.com/java/getting-started/jib?hl=ko
- https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
- https://alden-kang.tistory.com/1
- https://springboot.cloud/37
Harbor
도커 이미지를 저장하는 저장소로서 도커 이미지용 깃허브라고 생각하면 된다.
Harbor는 CNCF Graduated 오픈소스 레지스트리로, 프로젝트 단위의 역할 기반 접근 제어, 이미지 취약점 스캔, 이미지 서명, 다른 레지스트리와의 복제 기능을 제공한다. 사내망에서 Docker Hub 대신 쓰는 프라이빗 레지스트리로 많이 쓰이며, 링크된 LINE 엔지니어링 블로그 글도 프라이빗 Docker 레지스트리로 Harbor를 도입한 사례다. Jib의 to.image에 Harbor 주소를 지정하면 빌드 결과를 Harbor로 바로 푸시할 수 있다.
- https://goharbor.io/docs/2.4.0/
- https://github.com/goharbor/harbor/tree/main/src/portal
- https://engineering.linecorp.com/ko/blog/harbor-for-private-docker-registry/
- https://velog.io/@tkfrn4799/harbor-private-docker-registry
Spring Boot Dockerizing
Spring Boot Docker 가이드는 Spring Boot 애플리케이션을 컨테이너 이미지로 만드는 여러 방법을 비교한다.
- Dockerfile에서 실행 가능한 JAR를 그대로 복사해
java -jar로 실행한다. 가장 단순하지만 코드가 조금만 바뀌어도 JAR 전체 레이어가 바뀐다. java -Djarmode=layertools -jar app.jar extract로 JAR를 의존성, 애플리케이션 코드 등의 레이어로 풀어서 Dockerfile에서 레이어별로 복사한다. 의존성 레이어가 캐시되어 재빌드와 푸시가 빨라진다.- Spring Boot Maven/Gradle 플러그인의
build-image는 Cloud Native Buildpacks로 Dockerfile 없이 OCI 이미지를 만든다. 다만 Docker 데몬은 필요하다. - Jib 플러그인을 쓴다. Docker 데몬도 필요 없다.
Docker Hub의 tomcat 이미지 태그 링크는 외부 톰캣에 WAR를 배포하는 경우 JRE 17 기반 톰캣 이미지를 찾기 위한 것이다.
- https://hub.docker.com/_/tomcat?tab=tags&page=1&name=jre17
- https://spring.io/guides/topicals/spring-boot-docker/
- https://github.com/spring-guides/top-spring-boot-docker
Java Features by Versions
링크된 글은 Java 8부터 최신 버전까지 버전별로 추가된 기능을 정리한 목록이다. Java 8의 람다와 Stream, Java 9의 모듈 시스템, Java 10의 var, Java 11의 HttpClient, Java 14의 switch 표현식, Java 16의 레코드, Java 17의 sealed 클래스처럼 버전을 올릴 때 쓸 수 있게 되는 기능을 확인할 때 참고한다.
- https://luvstudy.tistory.com/152
@ActiveProfiles and @TestPropertySource
@ActiveProfiles("test")는 테스트 컨텍스트에서 특정 프로파일을 활성화한다. 그 결과 application-test.yml 같은 프로파일별 설정 파일과 @Profile("test")가 붙은 빈이 함께 적용된다. @TestPropertySource는 프로파일과 무관하게 특정 속성 파일이나 properties = "key=value" 값을 직접 추가하며, Spring Boot의 속성 우선순위에서 일반 설정 파일보다 높다. 환경 전체를 바꾸려면 프로파일을, 테스트 하나에서 몇 개 값만 덮어쓰려면 @TestPropertySource를 쓰는 식으로 구분한다.
- https://stackoverflow.com/questions/61107829/the-difference-between-activeprofiles-and-testpropertysource
Blockchain
블록체인으로 거짓뉴스 판별
링크된 글은 Anomus라는 프로젝트를 소개한다. 글에 따르면 Anomus는 누구나 기자가 되어 콘텐츠를 게시할 수 있는 탈중앙화 뉴스 프로토콜이고, 게시된 콘텐츠를 NFT로 발행해 블록체인에 남긴다. 블록체인에 기록하면 게시 이후 내용이 바뀌지 않았다는 것과 누가 언제 게시했는지는 증명할 수 있지만, 그 내용이 사실인지는 별도의 검증 구조(평판, 투표 등)가 있어야 판단할 수 있다.
- https://mychew8314.tistory.com/889
- https://anomus.medium.com/
- https://anomus.io/
Circular Dependencies in Spring
순환 의존성은 빈 A가 B를, B가 다시 A를 주입받는 구조다. 생성자 주입에서는 어느 쪽도 먼저 만들 수 없어 BeanCurrentlyInCreationException이 발생한다. 필드나 setter 주입이면 예전에는 스프링이 생성 중인 빈을 미리 노출해 해결해 주었지만, Spring Boot 2.6 릴리즈 노트에 따르면 2.6부터 빈 사이의 순환 참조가 기본적으로 금지된다. spring.main.allow-circular-references=true로 다시 허용할 수 있지만, 근본적으로는 공통 로직을 별도 빈으로 분리하거나 이벤트를 쓰는 식으로 설계를 바꾸는 것이 맞다. @Lazy로 프록시를 주입해 우회하는 방법도 있다.
- https://www.baeldung.com/circular-dependencies-in-spring
- https://hungrydiver.co.kr/bbs/detail/develop?id=90
- https://jaimemin.tistory.com/2032
Maven Skip Tests
mvn package -DskipTests는 테스트를 컴파일하되 실행하지 않고, -Dmaven.test.skip=true는 테스트 컴파일까지 건너뛴다. 이미지 빌드처럼 테스트를 앞 단계에서 이미 돌린 경우에 쓴다.
- http://blog.iotinfra.net/?p=1707
Setting the Java Version in Maven
Maven에서 컴파일 대상 자바 버전은 maven-compiler-plugin의 속성으로 지정한다. maven.compiler.source와 maven.compiler.target을 쓰거나, JDK 9 이상에서는 maven.compiler.release 하나로 소스, 타깃, 사용 가능한 API 범위를 함께 맞출 수 있다. spring-boot-starter-parent를 상속하면 java.version 속성 하나로 이 값들이 설정된다.
1
2
3
<properties>
<java.version>17</java.version>
</properties>
- https://www.baeldung.com/maven-java-version
댓글
아직 댓글이 없습니다