2023-12-18-TIL
2023-12-18-TIL
Today I Learned
Docker Volume Mounts with Cached Option
docker run -v ./src:/app/src:cached처럼 바인드 마운트 뒤에 붙는 cached, delegated는 macOS의 Docker Desktop에서 호스트와 컨테이너 사이 파일 동기화의 일관성 수준을 낮춰 성능을 얻는 옵션이었다. Stack Overflow 질문의 답변은 당시 Docker 문서를 인용해 이 옵션이 macOS 외의 호스트에서는 완전히 무시된다고 설명한다. 이후 댓글에 따르면 Docker Desktop 2.4.0.0부터 gRPC FUSE 파일 공유가 기본이 되면서 두 옵션은 의미가 없어졌다. 오래된 docker-compose.yml에서 이 옵션을 보면 지워도 동작에는 차이가 없다고 보면 된다.
- https://stackoverflow.com/questions/50120722/docker-volume-mounts-with-cached-option
@Transactional
Spring 레퍼런스의 @Transactional 문서에서 자주 헷갈리는 부분을 정리했다.
- 프록시 모드: 기본 모드에서는 프록시를 거쳐 들어오는 외부 호출만 가로챈다. 같은 객체 안의 자기 호출은 호출되는 메서드에
@Transactional이 있어도 트랜잭션이 시작되지 않는다. 자기 호출까지 적용하려면 AspectJ 모드를 써야 한다. - 메서드 가시성: 보통
public메서드에 붙인다. Spring 6.0부터는 클래스 기반 프록시에서protected나 패키지 가시성 메서드도 트랜잭션을 적용할 수 있다. 인터페이스 기반 프록시에서는 여전히public이어야 한다. - 속성:
propagation(전파),isolation(격리 수준),timeout,readOnly,rollbackFor/noRollbackFor등을 지정할 수 있다. 문서는isolation,timeout,readOnly가 새 트랜잭션을 시작하는REQUIRED나REQUIRES_NEW에서만 적용된다고 명시한다.
롤백 규칙은 롤백 문서에 있다. 기본 설정은 RuntimeException과 그 하위 클래스, 그리고 Error에서만 롤백하고, 트랜잭션 메서드에서 던진 체크 예외는 롤백하지 않는다. 체크 예외에서도 롤백하려면 rollbackFor로 롤백 규칙을 지정한다.
- https://imiyoungman.tistory.com/9
- https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/
- https://velog.io/@betterfuture4/Spring-Transactional-%EC%B4%9D%EC%A0%95%EB%A6%AC
- https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html
- https://sasca37.tistory.com/267
- https://data-make.tistory.com/738
- https://blogshine.tistory.com/291
Unchecked Exception vs Checked Exception
Java 언어 명세(JLS 11장)는 예외를 두 종류로 나눈다. 언체크 예외는 RuntimeException과 그 하위 클래스, Error와 그 하위 클래스이고, 나머지 Throwable 하위 클래스는 모두 체크 예외다. 언체크 예외는 컴파일 시점 검사에서 빠진다. 체크 예외는 메서드가 throws로 선언하거나 try-catch로 처리하지 않으면 컴파일 오류가 난다.
1
2
3
4
void read() throws IOException { ... } // 체크 예외: 선언 또는 처리 필수
void check(int age) {
if (age < 0) throw new IllegalArgumentException("age"); // 언체크 예외: 선언 불필요
}
커스텀 예외를 어느 쪽으로 만들지에 대해 Oracle Java 튜토리얼이 내놓는 기준은 단순하다. 호출한 쪽이 예외에서 회복할 수 있다고 합리적으로 기대할 수 있으면 체크 예외로, 아무것도 할 수 없다면 언체크 예외로 만든다. 위의 Spring 롤백 규칙과 연결하면 실무적인 함의가 하나 더 생긴다. 체크 예외로 만든 비즈니스 예외는 기본 설정에서 트랜잭션을 롤백하지 않으므로, 롤백이 필요한 예외는 언체크로 만들거나 rollbackFor를 지정해야 한다.
- https://rollbar.com/blog/how-to-handle-checked-unchecked-exceptions-in-java/#:~:text=unchecked%20exception%20is%3A-,A%20checked%20exception%20is%20caught%20at%20compile%20time%20whereas%20a,t%20required%20to%20be%20handled.
- https://devlog-wjdrbs96.tistory.com/351
- https://www.tutorialspoint.com/how-can-we-decide-that-custom-exception-should-be-checked-or-unchecked-in-java
- https://www.scaler.com/topics/custom-exception-in-java/
- https://www.baeldung.com/java-new-custom-exception
- https://stackify.com/java-custom-exceptions/
댓글
아직 댓글이 없습니다