개발/Lombok
@Cleanup
함수형 인간
2025. 3. 11. 17:48
@Cleanup은 롬복(Lombok) 라이브러리에서 제공하는 어노테이션 중 하나로, 자원(resource) 관리를 자동화하여 코드의 가독성과 유지보수성을 향상시킴.
주요 기능:
- 자동 자원 해제: @Cleanup 어노테이션을 변수 선언 앞에 붙이면, 해당 변수가 참조하는 자원(예: 파일 스트림, 데이터베이스 연결 등)을 자동으로 닫아줌. try-catch-finally 블록을 명시적으로 작성하지 않아도 된다.
- close() 메서드 호출: 기본적으로 @Cleanup은 해당 자원의 close() 메서드를 호출하여 자원을 해제한다.
- 다른 메서드 지정 (선택 사항): close() 메서드 외에 다른 메서드를 사용하여 자원을 해제하고 싶다면, @Cleanup 어노테이션의 값을 지정하여 다른 메서드를 호출하도록 할 수 있다.
동작 방식:
- @Cleanup 어노테이션이 붙은 변수가 선언된 블록(scope)이 종료될 때, 롬복은 자동으로 try-finally 블록을 생성.
- finally 블록 내에서 해당 자원의 close() 메서드(또는 지정된 다른 메서드)를 호출하여 자원을 해제.
- 예외 발생 여부와 관계없이 finally 블록은 항상 실행되므로, 자원 누수를 방지할 수 있다.
사용 예시:
Java
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream("input.txt");
@Cleanup OutputStream out = new FileOutputStream("output.txt");
byte[] b = new byte[1024];
while (true) {
int len = in.read(b);
if (len == -1) break;
out.write(b, 0, len);
}
// in.close()와 out.close()를 명시적으로 호출할 필요가 없음.
// main 메서드가 종료될 때 자동으로 호출됨.
}
}
다른 메서드 지정 예시:
Java
import lombok.Cleanup;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CleanupExample2 {
public static void main(String[] args) throws SQLException{
@Cleanup("dispose") Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "user", "password");
}
}
위의 코드에서는 Connection객체의 dispose메서드를 호출하도록 변경했다.
장점:
- 코드 간결성: try-catch-finally 블록을 생략하여 코드를 간결하게 유지할 수 있다.
- 가독성 향상: 자원 관리 로직이 분산되지 않고 한 곳에 모여 있어 코드를 이해하기 쉽다.
- 자원 누수 방지: 예외 발생 여부와 관계없이 항상 자원을 해제하므로, 자원 누수를 예방할 수 있다.
- 유지보수 용이: 자원 관리 로직이 변경되더라도, @Cleanup 어노테이션이 적용된 부분만 수정하면 되므로 유지보수가 용이하다.
주의사항:
- @Cleanup은 try-with-resources 구문(Java 7 이상)과 함께 사용할 수 없다. 둘 중 하나만 사용해야 함.
- @Cleanup은 checked exception을 처리하지 않는다. 만약 자원 해제 과정에서 checked exception이 발생하면, 컴파일 에러가 발생. 이를 해결하려면 @SneakyThrows 어노테이션을 함께 사용하거나, 명시적으로 try-catch 블록을 사용하여 예외를 처리해야 한다.