Annotation은 메타데이터를 코드에 추가하는 방법 중 하나로, Java, C#, Python 등 많은 프로그래밍 언어에서 지원합니다. 어노테이션은 코드의 동작에 직접적인 영향을 미치지 않지만, 해당 코드에 대한 정보를 제공하거나 특정 동작을 유도하는 데 사용됩니다.

자바에서 어노테이션은 '@' 기호로 시작하며, 클래스, 메소드, 필드, 매개변수 등 다양한 요소에 적용할 수 있습니다. 여러 어노테이션 중 몇 가지 예시를 들면:

  1. @Override: 이 어노테이션은 메소드가 상위 클래스나 인터페이스의 메소드를 오버라이드한다는 것을 나타냅니다. 만약 실제로 오버라이드하는 메소드가 아닌데 @Override 어노테이션을 사용하면 컴파일 에러가 발생합니다.
  2. @Deprecated: 이 어노테이션은 해당 요소(클래스, 메소드 등)가 더 이상 사용되지 않을 것을 권장하며, 다른 방법을 사용하도록 권고하는 의미입니다.
  3. JPA에서의 어노테이션: JPA에서는 엔티티 클래스와 그 필드에 다양한 어노테이션을 사용하여 데이터베이스 스키마와의 매핑 정보를 제공합니다. 예를 들어, @Entity는 해당 클래스가 엔티티 클래스임을 나타내고, @Table은 엔티티가 매핑될 테이블의 이름을 지정합니다. @Id는 해당 필드가 엔티티의 기본 키임을 나타내며, @GeneratedValue는 기본 키의 생성 전략을 지정합니다.

** 어노테이션(Annotation): 어노테이션은 메타데이터를 코드에 추가하는 사용되며, 메타데이터는 컴파일 타임이나 런타임에 처리될 있습니다. 어노테이션은 코드의 동작에 직접적인 영향을 미치지 않지만, 컴파일러, 개발 도구, 런타임 환경 등에게 추가 정보를 제공하거나 특정 동작을 유도하는 사용됩니다. 예를 들어, JPA에서 @Entity 어노테이션은 해당 클래스가 엔티티임을 나타내며, 정보는 JPA 프레임워크에 의해 런타임에 사용됩니다.

 

어노테이션은 일반적으로 다음 세 가지 범주로 분류될 수 있습니다.

  1. Built-in Annotation: 자바에서 기본으로 제공하는 어노테이션입니다. @Override, @Deprecated, @SuppressWarnings 등이 이에 해당합니다.
  2. Meta Annotation: 다른 어노테이션을 위한 어노테이션으로, 주로 어노테이션의 선언과 특성을 정의하는 데 사용됩니다. @Target, @Retention, @Documented, @Inherited 등이 있습니다.
  3. Custom Annotation: 개발자가 직접 정의하여 사용하는 어노테이션입니다. 이를 통해 특정 동작을 유도하거나, 특정 정보를 코드에 첨부할 수 있습니다. 대표적으로 Spring 프레임워크에서는 다양한 사용자 정의 어노테이션(@Controller, @Service, @Autowired 등)을 제공하며, 이는 특정 클래스나 메소드가 프레임워크 내에서 어떤 역할을 하는지를 나타냅니다.

가지 종류의 어노테이션은 자바 프로그래밍에서 코드의 동작을 제어하고, 메타데이터를 첨부하는 유용하게 사용됩니다.

 

** 롬복(Lombok)은 개발자가 직접 만든 라이브러리로, 간단한 어노테이션을 사용해 반복적으로 작성해야 하는 보일러플레이트 코드를 줄이는 데 도움을 줍니다. 따라서 롬복의 어노테이션은 Custom Annotation에 속합니다.

롬복의 어노테이션들은 클래스, 필드, 메소드 등에 대한 getter, setter, 생성자, toString, equals, hashCode 등의 메소드를 자동으로 생성해줍니다. 예를 들어, @Data 어노테이션은 위 메소드들을 모두 자동으로 생성해줍니다.

  1. 보일러플레이트 코드 개발에 있어서 반복적으로 사용되는 코드를 일컫습니다. 이러한 코드는 반드시 필요하지만 구조적인 부분 때문에 반복적으로 작성되어야 하는 코드이며, 이를 최소화하는 것이 유지보수와 가독성 측면에서 좋습니다.
  2. 롬복(Lombok) 이러한 보일러플레이트 코드를 줄이기 위한 라이브러리입니다

이는 개발자가 이러한 메소드를 수동으로 생성하고 유지 관리하는 수고를 덜어주며, 코드의 가독성을 향상시킵니다. 물론, 롬복을 사용함으로써 발생할 있는 가지 단점도 있습니다.

  1. 디버깅 복잡성: 롬복이 자동으로 생성하는 코드는 실제 소스 코드에는 보이지 않습니다. 이는 디버깅 문제를 찾기 어렵게 만들 있습니다.
  2. 코드의 명시성 감소: 롬복 어노테이션을 사용하면 중요한 메소드가 소스 코드에 나타나지 않게 됩니다. 이로 인해 코드의 이해가 어려워질 있습니다. 
더보기
  1. @Component: 어노테이션은 클래스를 스프링 빈으로 등록하는데 사용됩니다. 스프링이 시작될 , @Component 어노테이션이 있는 클래스를 찾아서 인스턴스를 생성하고, 이를 스프링 애플리케이션 컨텍스트의 빈으로 등록합니다.
  2. @Bean: 어노테이션은 메소드에 적용되며, 메소드가 반환하는 객체를 스프링 빈으로 등록하는데 사용됩니다. @Bean 어노테이션이 주로 사용되는 경우는 개발자가 직접 제어할 없는 외부 라이브러리나, 사용자 정의 생성 로직이 필요한 경우입니다.
  3. @Controller: 어노테이션은 해당 클래스가 요청을 처리하는 컨트롤러의 역할을 수행함을 스프링에 알려줍니다. 일반적으로 @Controller 어노테이션이 있는 클래스는 요청과 관련된 메소드를 포함합니다.
  4. @RequestMapping: 어노테이션은 특정 URI 클래스나 메소드에 매핑되어야 함을 나타냅니다. @RequestMapping 어노테이션이 있는 메소드는 해당 URI 요청이 들어올 호출됩니다.

 

Annotiation은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 합니다. Annotation을 이용하여 Spring Framwork는 해당 클래스가 어떤 역할을 할지 정하고, 특별한 의미를 부여하거나 기능을 부여할 수 있고, 이를 통해 코드량이 줄고 유지보수가 쉬워지고 코드 생산성이 증가되는 장점이 있습니다. @Component는 개발자가 생성한 Class를 Spring Bean으로 등록할때 사용하는 Annotation입니다. Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다. @Bean 은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용합니다. @Controller는 Spring에게 해당 class가 Controller의 역할을 함을 명시하기 위해 사용합니다. @RequestMapping은 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드를 실행합니다.

 

더보기

어노테이션과 주석은 서로 다른 목적과 사용 방법을 가지며, 코드에 대한 부가적인 정보를 제공하는 방식도 다릅니다. 주석은 코드를 이해하는 데 도움이 되는 설명을 제공하며, 어노테이션은 코드의 동작을 제어하거나 추가 정보를 제공하는 데 사용됩니다.

 

주석(Comment): 주석은 코드의 동작에 전혀 영향을 미치지 않습니다. 주석은 코드를 읽는 사람(대부분은 개발자)에게 코드의 작동 방식, 목적, 관련된 문제 등에 대한 정보를 전달하기 위해 사용됩니다. 주석은 컴파일러나 인터프리터에 의해 무시되며, 실행 중인 프로그램에는 영향을 미치지 않습니다.

 

* 메타데이터(MetaData) : 

데이터에 대한 데이터라는 의미를 가집니다. 즉, 다른 데이터를 설명해주는 정보를 말합니다.

메타데이터는 다양한 용도로 사용될 수 있습니다. 예를 들어, 웹 페이지의 메타데이터는 해당 페이지의 내용, 작성자, 작성일, 태그 등의 정보를 포함할 수 있으며, 이는 검색 엔진이 웹 페이지를 인덱싱하는 데 도움이 됩니다.

또 다른 예로, 디지털 사진의 메타데이터는 사진의 해상도, 촬영 일시, 카메라 모델, 사용한 렌즈, ISO 속도, 셔터 속도 등의 정보를 포함할 수 있습니다.

데이터베이스에서의 메타데이터는 테이블의 이름, 테이블에 있는 행과 열의 수, 각 열의 데이터 타입, 인덱스 정보, 제약 조건 등을 포함하며, 이는 데이터베이스의 구조와 작동 방식을 이해하는데 필요합니다.

따라서 메타데이터는 데이터를 분류, 관리, 이해하고, 데이터가 어떤 것인지, 어떻게 생성되었는지, 어떻게 사용되어야 하는지에 대한 중요한 정보를 제공합니다.