Java & Spring Boot

자원을 반납하자 (부제: try-catch-finally 멈춰!)

둘기덕 2023. 2. 26. 15:06
반응형

다 사용하고 난 자원을 반납하기 위해서 어떤 방법을 채택하시나요? 혹시, try-catch-finally 구문을 사용하지는 않으신가요? 맞다면, 축하드립니다! 더 간편한 방법을 사용할 수 있는 기회를 잡으셨습니다!

try-catch-finally를 사용한다면 

사용 후에 반납해야 하는 자원들은, 대부분 close 형태의 메서드를 가지고 있습니다. 사용 후에 자원을 해제하지 않는다면, 메모리 누수 및 성능 저하의 문제를 일으킬 수 있기 때문에 프로그램이 예상과 다르게 작동할 수 있습니다.

 

그렇다면 이제, 흔히 사용하는 try-catch-finally 형태의 자원 해제 예시를 살펴볼까요?

 

그림 1-1. try-catch-finally 자원 해제

어떤가요? 꽤 괜찮아 보이지 않나요? 예외 처리가 발생하든 안하든 상관 없이 항상 자원을 해제할 수 있으니, 나쁘지 않아 보입니다. 

 

하지만 해제해야 하는 자원이 더 많아지면 어떻게 될까요? 이렇게 한개가 아니라 두개, 세개, 혹은 몇십개라면... 항상 메서드의 끝에 finally문을 붙여야 합니다. 안그래도 귀찮은 것을 싫어하는 개발자들인데, 감당할 수 있을까요? 

 

그림 1-2. 많은 자원을 해제할 경우(try-catch-finally)

하나의 메서드에 finally문 7줄이 추가되고, 자원이 더 많을 수록 그만큼 늘어나게 됩니다. 물론 7줄이라는 것은 최소한이고, 로깅이나 기타 다른 로직을 추가하게 될 경우 기하급수적으로 더 많아지게 됩니다. 

 

이렇게 잠깐 살펴본 것만으로 try-catch-finally 자원해제 문의 몇몇 문제점이 발견되었습니다.

  • 코드가 복잡해진다.
  • 작업이 번거롭다.
  • 실수로 finally 문을 누락할 수 있다.

덜 번거롭고, 덜 복잡하고, 실수를 방지할 수 있는 그런 방법은 없을까요?

그 때 구세주처럼 등장한 try-with-resources  

오라클 자바 7 문서에서, try-with-resources 를 다음과 같음과 같이 설명하고 있습니다. 

그림 2-1. 오라클 자바 try-with-resources 문서 스니펫

try-with-resources를 사용하면, 해당 문장이 끝난 뒤에 자원 해제를 보장한다고 쓰여 있습니다. 물론 closeable을 구현한 자원들에 한정해서 말입니다.

 

언뜻 보기에도 try-catch-finally 보다 덜 복잡해 보입니다. 이제 그림 1-2의 예제를 try-with-resources를 사용해서 구현해 보겠습니다. 

 

그림 2-2. 많은 자원을 해제할 경우(try-with-resources)

훨씬 간결해 보이고, 실수로 finally문을 누락할 일도 없어졌습니다. try-with-resources는 try에 자원을 할당한 후, try문이 끝나면 알아서 자원해제를 해줍니다. catch문에 진입하기 전에 이미 close를 한다고 하네요.

 

이제 자원 해제를 할 때는, try-with-resources를 써보는 것이 어떨까요?

참고

https://hianna.tistory.com/546

https://mangkyu.tistory.com/217

반응형