개발/Lombok

@Cleanup

함수형 인간 2025. 3. 11. 17:48

@Cleanup은 롬복(Lombok) 라이브러리에서 제공하는 어노테이션 중 하나로, 자원(resource) 관리를 자동화하여 코드의 가독성과 유지보수성을 향상시킴.

주요 기능:

  • 자동 자원 해제: @Cleanup 어노테이션을 변수 선언 앞에 붙이면, 해당 변수가 참조하는 자원(예: 파일 스트림, 데이터베이스 연결 등)을 자동으로 닫아줌. try-catch-finally 블록을 명시적으로 작성하지 않아도 된다.
  • close() 메서드 호출: 기본적으로 @Cleanup은 해당 자원의 close() 메서드를 호출하여 자원을 해제한다.
  • 다른 메서드 지정 (선택 사항): close() 메서드 외에 다른 메서드를 사용하여 자원을 해제하고 싶다면, @Cleanup 어노테이션의 값을 지정하여 다른 메서드를 호출하도록 할 수 있다.

동작 방식:

  1. @Cleanup 어노테이션이 붙은 변수가 선언된 블록(scope)이 종료될 때, 롬복은 자동으로 try-finally 블록을 생성.
  2. finally 블록 내에서 해당 자원의 close() 메서드(또는 지정된 다른 메서드)를 호출하여 자원을 해제.
  3. 예외 발생 여부와 관계없이 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 블록을 사용하여 예외를 처리해야 한다.