개발
자바 스프링 개발 시작하기 - 4일차 예외 처리와 CSV 통계 실습
스택큐힙리스트
2025. 7. 10. 07:58
반응형
1️⃣ try-catch-finally 기본기
- try 블록에서 위험 구문을 실행하고, catch 블록에서 구체적 예외를 잡아 사용자 친화적 메시지로 변환합니다.
- finally 블록은 예외 발생 여부와 관계없이 실행돼 스트림·파일·DB 커넥션 같은 자원을 반드시 정리합니다.
- Java 7 이상이라면 try-with-resources 가 더 안전하고 간결합니다. 내부적으로 AutoCloseable.close() 가 호출돼 사실상 finally 역할을 수행합니다.
2️⃣ 도메인에 맞춘 Custom Exception
“사용자에게 정확히 무엇이 잘못됐는지 알려주지 못하면 UX는 무너진다.”
public class InvalidCsvDataException extends RuntimeException {
public InvalidCsvDataException(String message) { super(message); }
public InvalidCsvDataException(String message, Throwable cause) { super(message, cause); }
}
- 장점
- 서비스 계층에서 의미 있는 예외명을 그대로 던져 가독성 & 디버깅 효율↑
- @ControllerAdvice 등으로 전역 처리할 때 타입별 응답 코드 설정이 쉬움
- 팀원·후임이 스택트레이스를 읽지 않고도 문제 원인을 빠르게 파악
3️⃣ CSV 파일 읽어 통계 내기 – 실전 코드
try (BufferedReader br = Files.newBufferedReader(Path.of("sales.csv"));
CSVParser parser = CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.parse(br)) {
double total = 0;
int count = 0;
for (CSVRecord row : parser) {
try {
total += Double.parseDouble(row.get("price"));
count++;
} catch (NumberFormatException e) {
throw new InvalidCsvDataException(
"price 컬럼이 숫자가 아닙니다: " + row, e);
}
}
System.out.printf("평균 가격: %.2f원%n", total / count);
} catch (IOException | InvalidCsvDataException e) {
// 로깅 & 사용자 알림
log.error("CSV 처리 실패", e);
}
- 흐름 이해 포인트
- try-with-resources 덕에 BufferedReader 와 CSVParser 가 자동 닫힘
- 행 단위 파싱 중 데이터 오류가 나면 즉시 커스텀 예외로 감싸 전달
- 최상위 catch 에서 IO 예외와 도메인 예외를 한 번에 관리 → 코드 단순화
- 통계(합계·평균·최빈값 등) 로직을 별도 메서드로 분리하면 재사용성이 높아짐
📚 이번 실습으로 얻는 베스트 프랙티스
- 예외 계층 설계 시 표준 Exception → 도메인 Custom Exception → 글로벌 핸들러 흐름을 고정하라.
- 입출력 작업에는 try-with-resources & 널 처리(Optional, StringUtils)로 방어 코딩.
- CSV 라이브러리는 Apache Commons CSV·OpenCSV 모두 OK. 프로젝트 빌드 도구(Maven/Gradle)에 맞춰 의존성만 추가하면 된다.
- 통계 결과는 DecimalFormat 으로 자리수 맞춰 출력하면 바로 레포트에 붙여넣기 가능.
반응형