다 사용하고 난 자원을 반납하기 위해서 어떤 방법을 채택하시나요? 혹시, try-catch-finally 구문을 사용하지는 않으신가요? 맞다면, 축하드립니다! 더 간편한 방법을 사용할 수 있는 기회를 잡으셨습니다!
try-catch-finally를 사용한다면
사용 후에 반납해야 하는 자원들은, 대부분 close 형태의 메서드를 가지고 있습니다. 사용 후에 자원을 해제하지 않는다면, 메모리 누수 및 성능 저하의 문제를 일으킬 수 있기 때문에 프로그램이 예상과 다르게 작동할 수 있습니다.
그렇다면 이제, 흔히 사용하는 try-catch-finally 형태의 자원 해제 예시를 살펴볼까요?
어떤가요? 꽤 괜찮아 보이지 않나요? 예외 처리가 발생하든 안하든 상관 없이 항상 자원을 해제할 수 있으니, 나쁘지 않아 보입니다.
하지만 해제해야 하는 자원이 더 많아지면 어떻게 될까요? 이렇게 한개가 아니라 두개, 세개, 혹은 몇십개라면... 항상 메서드의 끝에 finally문을 붙여야 합니다. 안그래도 귀찮은 것을 싫어하는 개발자들인데, 감당할 수 있을까요?
하나의 메서드에 finally문 7줄이 추가되고, 자원이 더 많을 수록 그만큼 늘어나게 됩니다. 물론 7줄이라는 것은 최소한이고, 로깅이나 기타 다른 로직을 추가하게 될 경우 기하급수적으로 더 많아지게 됩니다.
이렇게 잠깐 살펴본 것만으로 try-catch-finally 자원해제 문의 몇몇 문제점이 발견되었습니다.
- 코드가 복잡해진다.
- 작업이 번거롭다.
- 실수로 finally 문을 누락할 수 있다.
덜 번거롭고, 덜 복잡하고, 실수를 방지할 수 있는 그런 방법은 없을까요?
그 때 구세주처럼 등장한 try-with-resources
오라클 자바 7 문서에서, try-with-resources 를 다음과 같음과 같이 설명하고 있습니다.
try-with-resources를 사용하면, 해당 문장이 끝난 뒤에 자원 해제를 보장한다고 쓰여 있습니다. 물론 closeable을 구현한 자원들에 한정해서 말입니다.
언뜻 보기에도 try-catch-finally 보다 덜 복잡해 보입니다. 이제 그림 1-2의 예제를 try-with-resources를 사용해서 구현해 보겠습니다.
훨씬 간결해 보이고, 실수로 finally문을 누락할 일도 없어졌습니다. try-with-resources는 try에 자원을 할당한 후, try문이 끝나면 알아서 자원해제를 해줍니다. catch문에 진입하기 전에 이미 close를 한다고 하네요.
이제 자원 해제를 할 때는, try-with-resources를 써보는 것이 어떨까요?
참고
'Java & Spring Boot' 카테고리의 다른 글
자주 쓰이는 디자인 패턴을 알아보자(with Java) (0) | 2023.03.19 |
---|---|
스프링 빈 중복 에러 해결하기 (0) | 2023.03.07 |
당신이 Raw type을 지양해야 하는 이유 (0) | 2023.02.12 |
실전, MVC 패턴! (1) | 2022.10.01 |
DTO와 VO의 차이를 알아보자 (0) | 2022.09.18 |