try-catch-finally 문을 try-with-resource 문으로 변경할 수 있는 방법이 있을까요?
567
작성한 질문수 17
버퍼스트림이나 파일스트림같은 경우에는 자동으로 `try()` 내부에 선언되어 있을 경우 `close()`를 호출해주는 것으로 알고 있습니다.
public static void main(String args[]) {
try (
FileInputStream is = new FileInputStream("file.txt");
BufferedInputStream bis = new BufferedInputStream(is)
) {
int data = -1;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
제가 궁금한 점은 TheadLocal.remove() 메서드가 위와같이 호출이 되는지와 만약 안되면 따로 이 처리에 대한 메서드를 구현시켜서 동작시켜야하는지가 궁금합니다.
답변 2
1
안녕하세요. 제로입니다.
JDK 7 이상부터 지원하는 try-with-resource 는
try-catch-finally 의 복잡함을 해소시켜주는 구문입니다.
문의하신 내용을 가지고
try-with-resource 동작하도록 만들어보면 아래 코드가 되는데요.
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"))) {
// bis
// 1 bis.close()
} catch (Exception ex) {
// 2 ex.printStackTrace();
ex.printStackTrace();
}
bis 객체 사용중 Exception 이 발생되면
1. bis.close() 처리후
2 ex.printStackTrace() 구문이 실행되어
개발자가 명시적으로
자원에 대한 close 를 신경쓰지 않아도 되는
장점이 있습니다.
그런데
BufferedInputStream 객체와 다르게
첫번째로 추상화된 공통기능인 객체 Box 는
유틸성 클래스인 ThreadLocal 를 사용해
Box 를 다른 모듈에 전달합니다.
그래서 try-with-resource 가 동작하기 위해선
Box 가 아닌 static 메소드로 구성된 ThreadLocal 클래스에
AutoCloseable 를 구현해야 하는데
static 메소드로 나열된 ThreadLocal 에 적용하는건 모호합니다.
그리고 remove() 처럼 다른 개발자에게 감춰야 하는 메소드에
public 으로 표현되는 close() 메소드를 적용하는것도 객체지향원칙에 맞지 않구요.
그리고 가장 중요한 문제가 있습니다.
try-with-resource 처리흐름과 try-catch-finally 처리흐름은 다릅니다.
섹션 2 에서 사용된 코드를 간단하게 표현하면 아래와 같은데
ThreadLocal.set(new BoxHttp(request));
try (
} catch (Exception ex) {
// 1 오류가 발생했을때 에러 표현
// err.jsp 호출
errView(ex);
} finallay{
// 2 쓰레드에서 Box 객체 제거
ThreadLocal.remove();
}
프레임워크는 서비스 로직에서 발생된 예외(Exception)도
개발자가 신경쓰지 않도록 표현하거나 처리해줘야 합니다.
만약
try-with-resource 를 사용해 예외(Exception)를 표현하기전
Box 객체가 ThreadLocal 에서 제거된다면 (ThreadLocal.remove() 호출)
에러를 표현하기 위해 호출되는 뷰에선
Box 를 사용할 기회가 없어지게 되는 문제가 생깁니다.
따라서 AOP 관점으로 제공되는 공통기능인 Box 와 Transaction 2가지 객체는
try-with-resource 구문을 사용하기 보단
try-catch-finally 를 사용해
예외처리시 Box 와 Transaction 객체를 사용할 기회를 준다고 생각하면 됩니다.
쓰다보니 어렵게 표현을 했는데
쉽게 정리하면 2가지로 압축할 수 있네요.
1. 자동으로 close 를 하기 위해 구현해야 하는 AutoCloseable 인터페이스 를 ThreadLocal 에 적용하는건 애매하고
2. ThreadLocal 을 통해 제공하는 공통기능은 try-catch-finally 처리흐름이 필요합니다.
따라서 ThreadLocal 를 사용할 경우
try-with-resource 보단
try-catch-finally 를 사용해 finally 구문에 ThreadLocal.remove() 를 호출하는게 맞습니다.
0
와 매우 친절한 답변 감사드립니다.
try-catch-finally와 비교해서 try-with-resource가 좋다는 얘기만 들었지 이렇게 비교하면서 적재적소에 활용한다는 개념이 부족했던 것 같습니다.
위에 말씀하신대로 try-catch-finally와 try-with-resource의 처리 흐름이 다르니 저런 케이스를 염두해가면서 사용하는게 좋겠네요.
AutoCloseable 인터페이스 관련한 답변도 매우 상세하게 해주셔서 감사합니다 :)
챌린지 시작일 문의
0
14
0
26년2회 실기기출은 언제쯤...
0
29
2
진짜화면이랑달라서못해먹겟어요먹겟어요
0
21
1
네이버 API | '검색 - 책' API 제공 중단
0
26
2
ArticleReadService 관련 질문
0
19
1
kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.
1
52
1
이론 공부법 요약본 버전 업데이트 문의
0
28
2
domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다
1
37
1
해당 프로젝트를 똑같이 따라하려니 spring installer가 버전이 17부터 가능하네요.
0
19
1
Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.
0
37
2
테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.
0
22
1
Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면
1
61
1
리뉴얼 시기
0
39
2
스크립트에 대해 질문 있습니다.
1
57
1
같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!
2
66
1
조건 검색 질문
0
39
1
JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문
0
53
3
클로드코드 명령어-대화&세션관리 수업 자료
0
40
1
다섯번째 생각해볼 문제에 대한 제 생각입니다. 피드백 가능할까요?
0
633
2
네번째 생각해볼 문제 제 생각을 적어보았습니다. 피드백 가능하실까요?
0
339
2
세번째 생각해볼 문제에 대한 제 생각입니다. 피드백 부탁드려도될까요?
0
618
4
생각해볼 문제에 대한 제 생각입니다. 피드백 부탁드려도될까요?
0
408
2
sqllite 관련
0
286
2
첫 번째 실습 질문입니다.
0
3558
1





