본문 바로가기

java9

예외 처리 베스트 프랙티스(체크/언체크, 경계 설계) 예외 처리 베스트 프랙티스(체크/언체크, 경계 설계)예외 처리는 “무엇을 어디서 잡고, 무엇을 어디까지 전파할지”의 설계 문제입니다. 특히 체크 예외 vs 언체크 예외의 역할을 구분하고, 경계(boundary)에서 번역(translate)하는 규칙만 잡아도 안정성과 가독성이 확 올라갑니다.1) 체크 vs 언체크: 차이와 기본 원칙체크 예외(checked): 메서드 시그니처에 throws로 드러나고, 호출자가 처리/전파를 강제당합니다. 대표: IOException, SQLException.언체크 예외(unchecked): RuntimeException 계열. 보통 버그/계약 위반이거나 호출자가 처리할 근거가 약한 상황. 대표: IllegalArgumentException, IllegalStateExcept.. 2025. 9. 29.
CompletableFuture allOf/anyOf로 외부 API 병렬화 CompletableFuture allOf/anyOf로 외부 API 병렬화외부 API를 여러 개 호출할 때 CompletableFuture는 단순한 쓰레드 풀보다 표현력이 좋습니다.이 글은 allOf로 “모두 끝나면” 합치기, anyOf로 “가장 빠른 것” 받기,그리고 타임아웃/예외/취소까지 한 번에 다룹니다.준비: 전용 ExecutorExecutorService httpPool = Executors.newFixedThreadPool(64, r -> { Thread t = new Thread(r, "http-" + System.nanoTime()); t.setDaemon(true); return t;});1) allOf: 모두 끝난 뒤 결과 모으기CompletableFuture u = supp.. 2025. 9. 29.
ExecutorService 스레드풀 사이즈/큐 전략 ExecutorService 스레드풀 사이즈/큐 전략스레드풀을 잘못 잡으면 지연 폭증, OOM, CPU 과다가 순식간에 옵니다. 이 글은 풀 사이징 방식과 큐 선택 전략, 거부 정책까지 한 번에 정리합니다. 실무에서 바로 쓸 수 있는 설정 코드도 함께 제공합니다.1) 스레드 수 산정 공식CPU 바운드: N_threads ≈ CPU코어 수 (또는 코어 수 + 1)I/O 바운드: N_threads ≈ 코어 수 × (1 + W/C)- W: 대기 시간(블로킹 I/O), C: 계산 시간. 예) 대기:계산=4:1이면 코어×5서비스별로 분리 풀을 권장(웹 요청, 배치, 백그라운드 등)2) 큐 선택 가이드큐는 대기 전략을 결정합니다. 상황에 따라 아래 중 하나를 고릅니다.SynchronousQueue: 대기열 없이 바.. 2025. 9. 29.
NIO.2로 폴더 스캔/감시 구현(FileVisitor/WatchService) NIO.2로 폴더 스캔/감시 구현(FileVisitor/WatchService)파일 시스템 작업은 두 가지가 핵심입니다.한 번 훑기(스캔)와 계속 지켜보기(감시).NIO.2는 이 두 가지를 각각 Files.walkFileTree(FileVisitor)와 WatchService로 제공합니다.이 글에서는 실무에서 바로 쓰는 템플릿 코드와 운영 팁을 정리했습니다.1) 폴더 스캔: FileVisitor대량 파일을 일괄 처리하거나, 특정 확장자만 모아 통계를 낼 때 유용합니다. 심볼릭 링크 순회 여부, 최대 깊이, 예외 처리 등을 세밀하게 제어할 수 있습니다.import java.io.IOException;import java.nio.file.*;import java.nio.file.attribute.BasicF.. 2025. 9. 29.
Java Record vs Lombok DTO 선택 기준: 언제 무엇을 쓸까 Java Record vs Lombok DTO 선택 기준: 언제 무엇을 쓸까DTO를 만들 때 record로 갈지, Lombok으로 클래스를 만들지 고민이 잦습니다. 한 방에 끝나는 정답은 없지만, “무엇을 언제 쓰는지”를 분명히 하면 팀 품질과 유지보수가 훨씬 좋아집니다. 아래 기준과 예제를 참고해 실무에 맞게 결정하세요.빠른 요약불변 데이터 전송용(API 응답, 설정 스냅샷, 캐시 키) → Record 우선가변 DTO / 빌더 DSL / JPA 엔티티 → Lombok 우선(@Getter, @Setter, @Builder, @NoArgsConstructor)Jackson 직렬화: record는 2.12+에서 자연스럽게 동작. Lombok DTO는 no-args 또는 builder 구성이 흔함Record로.. 2025. 9. 28.
java.time 제대로 쓰기: 타임존/포맷 실수 7가지와 안전한 사용법 java.time 제대로 쓰기: 타임존/포맷 실수 7가지와 안전한 사용법java.time 패키지는 시간대를 포함한 날짜·시간을 타입으로 구분합니다. 문제는 “어떤 타입을 언제 써야 하는지”를 헷갈리기 쉽다는 점입니다. 아래에서 현업에서 자주 발생하는 실수 7가지를 정리하고, 각 상황에서의 안전한 코드를 제시합니다.한 줄 요약: 보관/전송은 UTC의 Instant, 표시는 ZonedDateTime, 연산은 상황에 따라 Period/Duration을 고르세요.자주 하는 실수 7가지1) Date/Calendar/SimpleDateFormat 계속 사용SimpleDateFormat은 스레드 안전하지 않습니다. 병렬 환경에서 포맷터를 공유하면 간헐적 오류가 납니다. DateTimeFormatter는 불변이므로 재.. 2025. 9. 28.