ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Selenium] AutoCloseable이 없는 이유
    공부/etc 2023. 2. 19. 23:12
    반응형

    자바의 정석 예외처리 파트를 읽고 있는데, try-with-resources문을 사용하는 것이 좋아보였다. 실제로 이게 좋은 것인가?하고 찾아보니 이펙티브 자바에도 이런 내용이 있어서 개선할 코드가 있으면 직접 수정하는 것도 좋아보였다. 그래서 작년에 했던 산학프로젝트에 ChromeDriver를 try-with-resources로 적용해 PR을 보내려고 했는데, 빨간줄이 나와 내부 코드를 확인해보니 AutoCloseable 인터페이스를 상속하지 않은 상태였다.

     

    기여를 해볼만하다는 생각이 들어서 셀레니움 깃허브에 들어갔는데, 이미 나와 같은 생각을 했던 사람들이 여러명 존재했다.

    사실 별 기대조차 안했다. 내가 이걸 발견할 정도면 이미 다른 사람들이 발견했을테니...

     


     

    이유

     


    1. close() 이름 중복

    내용 요약: ChromeDriver에 이미 close()라는 이름으로 다른걸 사용하고 있음

     

    AutoCloseable 인터페이스에 있는 코드를 살펴보자

    package java.lang;
    
    public interface AutoCloseable {
        void close() throws Exception;
    }

    Java Doc이 너무 길어서 코드만 가져왔다.

    문서 내용은 대충 리소스를 해제하기 위해 close()를 호출한다고 하고, Java 1.7에 추가된 기능이라고 한다. 특징은 InterruptedException이 발생하면 런타임 오작동이 발생할 수 있으니 이게 절대 나오지 말아야 할 때 사용할 수 있고, java.io.Closeable에 있는 close와는 살짝 다르다고 말하고 있다.

     

    InterruptedException은 개발자가 직접 스레드를 조작할 때 발생하는 예외이고, java.io.Cloaseable은 io니까 입출력에 관련된 코드인 것 같다.

     

    아무튼 close가 Webdriver의 close 기능과 이름이 겹쳐서 사용하지 않는다는 것이다.

    AutoCloseable을 상속 받으면 close에 대한 내용을 구현해야한다. 하지만 WebDriver의 close는 현재 다른 역할을 하고 있다.

     

    이것과 정리한 내용이 이미 있었는데, 4달 전 일이라 완전히 잊고 있었다가 이 글을 쓰다가 생각났다.

    WebDriver를 상속한 ChromeDriver의 close()는 현재 크롬탭만 종료하고 있는 기능을 가지고 있다. 이렇기 때문에 구현을 하려면 셀레니움에 있는 close를 다른 이름으로 변경해야한다.

     

    그런데 변경하면 또 다른 문제점이 생겨난다.

     


     

    2. 이름을 바꾸면 지금 잘 사용하고 있는 사람들은?

    요약: close 이름을 변경하게 되면 기존 프로젝트에서 코드를 모두 변경해야 하니 자바의 장점을 무시하는 행동이 되어버림

     

    자바의 큰 장점은 이전 버전과의 호환성으로 예전 기능들을 그대로 지원한다는 것이다.

    당장 Python의 Pandas만 보더라도 새로운 기능 추가로 인해 삭제할 예정이면 FutureWarning으로 알려주다가 나중엔 반영을 하게 된다. 그래서 FutureWarning이 나오게 된다면 계속 사용하는 프로젝트의 경우에는 수정하는 것이 좋다.

     

    하지만 자바는 기존 레거시 코드를 그대로 사용할 수 있으면서 최신 코드도 사용할 수 있도록 업데이트를 한다.

    대표적으로 ArrayList를 사용하는게 표준이지만, Collections 프레임워크가 있기 전까지는 Vector를 사용했다. 그래서 Vector는 나중에 Collections 프레임워크에서 사용할 수 있도록 바꾼 레거시 코드이다. (성능 차이도 있고, 완벽히 동기화 처리가 된 자료구조도 아닌데다가, ArrayList를 Vector처럼 사용하는 방법이 있기 때문에 Vector 사용을 지양한다.)

     

    만약 이렇게 잘 지원하고 있는 close를 고작 autocloseable을 상속 받기 위해 이름을 변경한다면 이걸 잘 사용하고 있는 사람들은 모두 해당 이름을 변경해주어야 한다.

     

    이건 자바의 대표적인 장점을 위배하는 것이니 기존 close()의 메서드의 이름을 바꾸는 것은 아니라고 생각한다.


     

     

    검색해보니 한국어로 된 내용이 없어서 정리해봄

    반응형

    댓글

Designed by Tistory.