어노테이션 개념 정리

힐링코더·2023년 8월 20일

어노테이션이 뭘까

어노테이션(Annotation)은 프로그래밍 언어나 마크업 언어에서 메타데이터를 나타내는 방법 중 하나다. 주석과 비슷한 역할을 하지만, 주석이 프로그램 실행에 영향을 미치지 않고 소스 코드의 설명이나 문서화를 위해 사용되는 반면, 어노테이션은 소스 코드에 메타정보를 첨부하여 컴파일러나 런타임 환경에서 특정 동작이나 처리를 수행하도록 지시할 수 있습니다.

어노테이션은 "@" 기호를 사용하여 표시하며, 클래스, 메서드, 필드 등에 적용할 수 있습니다. 어노테이션을 정의하거나 사용할 때, 특정 기능을 활성화하거나 설정을 변경할 수 있습니다. 예를 들어, 자바 프로그래밍에서는 @Override 어노테이션을 사용하여 상위 클래스의 메서드를 오버라이드한다고 명시하거나, @Deprecated 어노테이션을 사용하여 해당 요소가 더 이상 권장되지 않는다고 표시할 수 있습니다.

어노테이션은 주로 자동화된 코드 생성, 런타임 동작 제어, 문서화 등 다양한 목적으로 활용됩니다. 어노테이션을 사용하면 프로그램의 가독성을 높이고, 코드의 의도나 정보를 명확하게 전달할 수 있습니다.

사용하면 안 되는 어노테이션이라는 게 있다?

사용하면 안 되는 어노테이션이 있다는 이야기를 들었다.
정말 그런 것이 있나 싶어 찾아 보았더니

어떤 어노테이션은 상황에 따라 사용하면 문제를 야기할 수 있거나 사용이 권장되지 않는 경우가 있을 수 있다고 한다.
일부 어노테이션은 오용될 수 있거나 코드의 가독성을 저하시킬 수 있으며, 불필요한 복잡성을 추가할 수도 있다고 한다.

다음은 ChatGPT가 알려 준 관련 어노테이션들이다.
어떤 것은 이해가 되는데 어떤 것은 이해가 되지 않는다.
따라서 해당 부분에 대해 아는 분은 댓글로 알려 주셔도 좋을 것 같다.

  1. @Deprecated: 이 어노테이션은 해당 요소가 더 이상 권장되지 않음을 나타내는 역할을 합니다. 사용자에게 더 좋은 대안이 제공되는 경우에 주로 사용됩니다. 하지만 이 어노테이션을 남용하면 유지보수성이 떨어지거나 혼란을 야기할 수 있습니다. => 납득

  2. @SuppressWarnings: 이 어노테이션은 컴파일러의 경고 메시지를 억제하도록 지시합니다. 경고 메시지를 무시하고 넘어가는 것은 문제의 근본 원인을 해결하지 않을 수 있으며, 실제로 문제를 야기할 수 있는 상황이 발생할 수 있습니다. => 납득

  3. @Override: 이 어노테이션은 상위 클래스의 메서드를 오버라이드한다고 명시적으로 표시하는 역할을 합니다. 하지만 메서드 시그니처가 잘못되었을 경우에도 컴파일되어 버그를 발생시킬 수 있습니다. => 약간 안 납득

@Deprecated와 @Override 이외에도 프레임워크나 라이브러리에서 제공하는 어노테이션을 무분별하게 사용하는 것은 코드를 복잡하게 만들 수 있고, 유지보수를 어렵게 할 수 있습니다. 따라서 어노테이션을 사용할 때는 해당 어노테이션의 의미와 사용 사례를 잘 이해하고 신중하게 사용하는 것이 중요합니다.

오늘 내 리서치의 핵심

롬복 내에서 사용하면 안 되는(사용이 권장되지 않는) 어노테이션은?

롬복 리서치를 하면서 내가 생각했던, 사용이 권장되지 않는 어노테이션은
@SneakyThrows랑 experimental였다.

@SneakyThrows는 에러 잡기를 어렵게 만들 것 같았고
experimental은 정규로 사용되고 있는 것도 아니고 stable하지도 않아서
쓰면 안 될 것 같았다.

그런데 ChatGPT가 뱉은 답변이 내 생각과 사뭇 다르다.
참고로 나는 ChatGPT의 답변을 모두 믿지 않는다. 얘랑 함께 에러를 고치는 수준이다.

아래는 ChatGPT의 답변

롬복(Lombok) 라이브러리에서도 사용이 권장되지 않거나 조심해야 할 어노테이션이 있을 수 있습니다. 롬복은 편의성을 제공하는 동시에 오용될 수 있는 기능을 제공하기도 하기 때문에, 이를 사용할 때 주의가 필요합니다. 다음은 롬복 내에서 사용이 권장되지 않거나 주의가 필요한 어노테이션의 몇 가지 예시입니다:

@Getter와 @Setter: 롬복의 @Getter와 @Setter 어노테이션은 필드의 접근자와 설정자 메서드를 자동으로 생성해주는데, 이는 기본적으로는 편리하지만 클래스 내의 모든 필드에 대해 사용하는 것은 필요하지 않은 접근자와 설정자를 생성할 수 있으며, 데이터 은닉을 약화시킬 수 있습니다. 따라서 필요한 필드에만 사용하고, 불필요한 접근자와 설정자를 생성하지 않도록 주의해야 합니다. => 약간 납득

@Data: @Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 한꺼번에 사용하는 편리한 어노테이션입니다. 그러나 모든 필드에 대해 위의 기능들을 적용하는 것은 필요하지 않은 메서드가 생성될 수 있고, 일부 필드만을 고려한 동등성 비교와 해시 코드 생성이 이루어지기 때문에 주의가 필요합니다. => 아주 약간 납득

@AllArgsConstructor, @RequiredArgsConstructor, @NoArgsConstructor: 이들 어노테이션은 생성자를 자동으로 생성해주는데, 모든 필드를 고려한 생성자를 만들 경우, 불필요한 생성자가 생성될 수 있습니다. 특히 @AllArgsConstructor를 사용할 때는 필요한 필드만을 선택하여 생성자를 생성하도록 주의해야 합니다. => 아주 약간 납득, 근데 여기까지 읽으면서 '이러면 롬복 왜 사용하나?'란 생각이 듬

@Cleanup: @Cleanup은 자원 관리를 자동으로 해주는데, 이를 오용하거나 잘못 사용할 경우 자원 누수와 같은 문제가 발생할 수 있습니다. 사용 시 자원의 올바른 해제를 확인하는 것이 중요합니다. => 안 납득, 자원 해제 편하게 잘 하려고 @Cleanup 쓰는 거 아닌가?

이처럼 롬복은 편의성을 제공하지만 오용될 수 있는 기능도 포함하고 있기 때문에, 어노테이션을 사용할 때는 신중하게 고려하고 적절하게 활용하는 것이 중요합니다.

본 포스팅은 관계자의 피드백을 받고 차후 내용을 수정할 것이다.

profile
여기는 일상 블로그, 기술 블로그는 https://yourhealingcoder.tistory.com/

0개의 댓글