try-catch 리소스관리

jb-developer·2023년 9월 13일

업무중공부

목록 보기
3/3

🐔내가 대충 알던 try-catch🐔

트라이 캐치문은 예외가 발생할 확률이 어느정도 있는 코드에서

예외상황을 처리하는데 사용되거나

혹은 일부러 예외상황을 발생시켜 커스텀한 예외처리로 이동시키고

하나의 로직처럼 사용하기도 한다

근데 리소스 관리가 뭘까❓

회사 자체적으로 돌리는 검출 프로그램에서

try-catch를 사용한 메소드들이 이슈리스트로 올라왔고

finally 블록에 할당된 리소스들을 해제하는

close() 메소드를 넣으라는 지시사항이 나왔다.

그동안 별 생각 없이 try 블록 안에서 해제했고

심지어 왜 해제해야 했는지도 정확히 모르고

그냥 쓰라니까 쓰는가보다 습관적으로 넣고 있었는데...

갑자기 궁금해졌다

그리고 리소스 관리는 무슨 리소스를 말하는걸까

close() 메소드는 왜 필요할까

리소스를 관리한다고 했을때

막연하게 메모리에 할당되는 자원이라고 생각하고 있었는데 아니였다

close() 메모리로 관리한다는 리소스는 운영체제의 자원이라고 한다

보통 close를 쓰는 경우는 파일전송을 위해 스트림을 연결할때, 커넥션을 만들 때였는데

파일을 옮길 경우 우리가 아는 기존 객체처럼

메모리 자원 할당 -> 가비지 콜렉터에 의한 할당 해제

의 경우가 아니라 운영체제에 의해 쭈욱 연결되어있다고 한다

디비 커넥션도 마찬가지

https://okky.kr/questions/401102

우리가 프로그래밍 하고 있는것들은 memory를 제어하고 있는것입니다.
우리가 작업하고 있는 변수나 instance들은 memory에 있는 value와 address를 제어하는 것인데
File 은 hdd에 존재하는것 이므로 외부에 있는 자원이고 이 자원을 쓰려면 외부 자원을 open을 해서
메모리로 가지고 와야하며 다 사용하고 나면 다시 연결을 해제(close)해줘야 합니다.
마찬가지로 Connection도 외부 자원이고 쓰고나면 close를 해줘야합니다.

서버를 내리기 전까지 계속 불필요한 연결이 이어진다는 것이고

이를 막기 위해서 코드로 끊어줘야 한다는 것이다.

추가로 close 메소드 실행 전에 예외가 발생할 경우엔

당연히 생겨난 스트림이 없어지지 않은 채로 catch 블록으로 이동할 것이고

close를 하지 않은것과 다름없어지게된다

그동안 어차피 예외가 발생해봤자 알아서 할당 해제되는줄 알고 크게 신경쓰지 않았는데...

근데 flush는 그럼 뭘까

close는 스트림을 닫는 것, flush는 버퍼를 비우는 기능을 한다. 함께 써야 하는 이유는 스트림에서 에러가 발생해서 종료가 되더라도 버퍼에 데이터가 남아 있을 수 있기 때문이다. close의 경우, 내부적으로 flush를 호출하지만 꼭 flush를 해주는 것이 좋다고 한다.

어렴풋이 기억에 남아있는 flush()

근데 회사코드에는 없었는데... 아마 붙여주는게 더 좋은 코드인것 같음

그리고 단순히 버퍼를 비워내는 것 뿐만 아니라 버퍼 안에 있는 것들을 전송시키면서 비워버린다 함

그냥 try with resources를 쓰자😊😊

자바 7부터 사용할 수 있는 try-with-resources 구문은

트라이 블록을 열기 전에 미리 해제할 버퍼를 지정해주고

번거롭게 닫을 필요도 없도록 해준다.

또 finally문에서 버퍼를 사용했을때

먼저 객체를 null로 지정하고 바깥쪽 스코프에 돌도록 신경써야했던 귀찮음이 사라지고

코드도 더 가독성있고 이쁘게 사용할 수 있게 해준다

기존 코드

FileInputStream input = null;

try{
	input = ......
    /////로직/////
}catch(예외){
	///로깅///
}finally{
	if(input != null){
    	try{
        	input.close();
        }catch(){
        	........
        }
    }
}

이 더러운 코드가

try (FileInputStream input = new FileInputStream("파일 경로")) {
    ///// 로직 /////
} catch (예외) {
    /// 로깅 ///
}

이렇게 깔끔하게 끝이 난다...

깔끔하고 가독성 좋은 코드

➕ 상세한 주석 항상 생각하면서 코딩하자

➕➕➕ 참고로 try리소스구문은 AutoCloseable을 지원하는 객체에 한해서만 수거해준다고함

profile
개발자호소인

0개의 댓글