2023-08-30-TIL
Today I Learned
Spring Cloud Task
웹 서버처럼 계속 떠 있는 애플리케이션이 아니라, 실행되고 일을 마치면 종료되는 짧은 작업을 위한 프로젝트다. 프로젝트 페이지는 짧게 사는 마이크로서비스를 로컬, 클라우드, Spring Cloud Data Flow에서 개발하고 실행하게 해 준다고 소개한다. 일반 Spring Boot 애플리케이션에 @EnableTask를 붙이면 레퍼런스에 나온 대로 TaskRepository에 작업 이름, 시작 시각, 종료 시각, 종료 코드, 오류 메시지 같은 실행 기록이 남는다. 배치 작업을 컨테이너 하나로 띄웠다가 내리는 구성에서 “이번 실행이 성공했는가”를 추적하는 용도로 쓴다.
- https://spring.io/projects/spring-cloud-task
GraalVM
GraalVM에서 가장 많이 언급되는 기능은 Native Image다. GraalVM 문서에 따르면 Java 바이트코드를 미리(ahead-of-time) 컴파일해서 JVM 없이 실행되는 네이티브 실행 파일로 만든다. 실행 파일에는 런타임에 필요한 코드만 들어가서 시작이 밀리초 단위로 빠르고 메모리를 적게 쓴다.
대가는 빌드 시점의 정적 분석이다. 빌드할 때 도달 가능한 코드를 모두 알아야 한다는 닫힌 세계 가정을 두기 때문에, 리플렉션, JNI, 동적 프록시처럼 실행 중에 정해지는 기능은 분석기가 놓칠 수 있다. 이런 부분은 JSON 메타데이터로 따로 알려 줘야 한다. 리플렉션과 프록시를 많이 쓰는 Spring 애플리케이션에서 Native Image가 까다로운 이유다.
- https://www.graalvm.org/
Transaction Manager
Spring의 트랜잭션 추상화는 PlatformTransactionManager 인터페이스가 중심이다. Spring 레퍼런스에 나온 메서드는 세 개뿐이다.
1
2
3
TransactionStatus getTransaction(TransactionDefinition definition);
void commit(TransactionStatus status);
void rollback(TransactionStatus status);
JDBC를 쓰면 DataSourceTransactionManager, Hibernate를 쓰면 HibernateTransactionManager, 여러 자원을 묶는 전역 트랜잭션이면 JtaTransactionManager처럼 구현체만 바꾸고, 비즈니스 코드의 @Transactional은 그대로 둔다. 리액티브 애플리케이션에는 ReactiveTransactionManager가 따로 있다. 트랜잭션 매니저가 둘 이상이면 @Transactional("order")처럼 빈 이름이나 qualifier 값으로 어떤 매니저를 쓸지 지정한다(Spring 레퍼런스).
- https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
- https://www.marcobehler.com/guides/spring-transaction-management-transactional-in-depth
Social Network Service Architecture
NAVER D2의 “소셜 네트워크 서비스의 아키텍처에 대하여”는 Facebook과 Twitter가 피드를 만드는 방식을 Pull과 Push로 대비한다. Facebook은 게시판에서 출발해서 읽는 시점에 친구들의 글을 모으는 쪽(Pull)으로, Twitter는 메시지 전달에서 출발해서 글을 쓰는 시점에 팔로워의 타임라인으로 배달하는 쪽(Push)으로 발전했다는 설명이다. 글에 따르면 Twitter는 원본 트윗은 하나만 두고 팔로워 타임라인에는 참조 키만 넣는다.
Pull은 쓰기가 싸고 읽기가 비싸며, Push는 반대다. 팔로워가 수천만 명인 계정이 글을 쓰면 Push 쪽은 그만큼 배달해야 한다. 그래서 어느 한쪽이 정답이 아니라 읽기와 쓰기 비율, 관계의 폭에 따라 고르는 문제라는 점을 이 글에서 가져갈 수 있다.
- https://d2.naver.com/helloworld/551588
Spring 6.1 RestClient
Spring Framework 6.1 M2에 동기식 HTTP 클라이언트 RestClient가 추가됐다. Spring 블로그는 RestTemplate이 오버로드된 메서드가 너무 많다는 점을 짚고, RestClient가 WebClient와 비슷한 플루언트 API를 제공하면서도 RestTemplate의 메시지 컨버터와 인터셉터 같은 기반을 그대로 쓴다고 설명한다.
1
2
3
4
String body = restClient.get()
.uri("https://example.com")
.retrieve()
.body(String.class);
같은 블로그 글에 따르면 Spring Boot 3.2 M1부터 RestClient 지원이 들어갈 예정이었다. 두 번째 링크는 인터페이스에 애너테이션을 붙여 HTTP 클라이언트를 선언하는 방식을 다룬다.
- https://spring.io/blog/2023/07/13/new-in-spring-6-1-restclient
- https://medium.com/digitalfrontiers/declarative-rest-clients-with-spring-framework-6-c671be1dfee
댓글
아직 댓글이 없습니다