Basic

50. [ JAVA ] 어노테이션(Annotation) 개념 및 종류

천재단미 2025. 1. 9. 00:45
728x90
반응형

 

     

    1. 어노테이션 이란

    Annotation은 사전적 의미로는 주석이라는 뜻입니다. 

    프로그래밍에서 주석은 개발자가 코드를 더 직관적으로 이해하고 다른 사람에게 설명하기 쉽도록 상세한 정보를 제공하는 코드 내 설명문입니다. 주석은 코드의 목적, 동작 방식, 주의사항 등을 문서화하는 데 사용됩니다. 어노테이션은 주석과 외형적으로 유사해 보일 수 있지만, 그 본질적인 역할과 용도가 매우 다릅니다. 주석이 개발자와 같은 사람에게 코드에 대한 설명과 문서화된 정보를 제공하는 것이 목적이라면, 어노테이션은 프로그램 실행 과정에서 특정 동작이나 처리를 지시하는 메타데이터로서 프로그램에 직접적인 정보를 전달하는 도구입니다.

     

     

    2. 어노테이션역할

    • 컴파일러에게 문법 에러를 체크하도록 정보를 제공합니다.
    • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공합니다.
    • 런타임에 특정 기능을 실행하도록 정보를 제공합니다.

    어노테이션은 @ 기호를 사용하여 작성하며, 지정된 대상 프로그램에만 영향을 미치는 특징이 있습니다. 이러한 어노테이션은 그 용도와 특성에 따라 크게 세 가지 카테고리로 구분됩니다: 자바 언어에서 기본적으로 제공하는 표준 어노테이션, 다른 어노테이션을 정의하고 설명하는 데 사용되는 메타 어노테이션, 그리고 개발자가 직접 필요에 따라 정의하여 사용하는 사용자 정의 어노테이션입니다.

     

    3. 어노테이션의 종류

     

    어노테이션은 크게 세 가지 종류로 나눌 수 있습니다

    • 표준 어노테이션
    • 메타 어노테이션
    • 사용자 정의 어노테이션

     

    1) 표준 어노테이션

     

    자바에서 기본적으로 제공하는 어노테이션입니다:

    • @Override: 메서드가 오버라이딩되었음을 나타냅니다.
    • @Deprecated: 더 이상 사용되지 않을 대상임을 알립니다.
    • @FunctionalInterface: 함수형 인터페이스임을 나타냅니다.
    • @SuppressWarnings: 컴파일러의 특정 경고 메시지를 억제합니다.
    • @SafeVarargs: 제네릭 타입의 가변인자 매개변수 사용 시 경고를 억제합니다.

     

    2)메타 어노테이션

     

    어노테이션을 정의하는 데 사용되는 어노테이션입니다:

    • @Target: 어노테이션의 적용 대상을 지정합니다.
    • @Retention: 어노테이션의 유지 기간을 지정합니다.
    • @Documented: Javadoc 문서에 어노테이션 정보를 포함시킵니다.
    • @Inherited: 어노테이션이 하위 클래스에 상속되도록 합니다.
    • @Repeatable: 어노테이션을 반복해서 적용할 수 있게 합니다.

     

    3)사용자 정의 어노테이션

     

    개발자가 직접 정의하여 사용하는 어노테이션입니다.

    . 이는 특정 목적에 맞게 커스텀하여 만들 수 있습니다.어노테이션은 그 용도에 따라 다음과 같이 분류할 수도 있습니다:

    • Marker Annotation: 멤버 변수가 없는 단순 표식용 어노테이션.
    • Single Value Annotation: 단일 멤버 변수를 갖는 어노테이션.
    • Full Annotation: 둘 이상의 멤버 변수를 갖는 어노테이션.

    이러한 어노테이션들은 코드에 메타데이터를 추가하여 컴파일러나 런타임 환경에 추가 정보를 제공하고, 코드의 가독성과 유지보수성을 향상시키는 데 도움을 줍니다.

     

     

    아래의 표와 같이 어노테이션은 많은 종류를 가지고 있습니다.

    어노테이션 설명
    @SuppressWarnings 컴파일러가 일반적으로 경고하는 내용   내용은 제외시킬  사용
    @Entity 퍼시스턴스화  클래스를 선언
    @Table DB 있는 테이블과 맵핑 
    @Data  필드의 setter, getter 자동 생성
    @EqualsAndHashCode Equals  hashCode 함수를 만들어 
    @JsonIgnoreProperties 클래스 내에 없는 필드가 json 존재할  에러 방지 설정 
    @GeneratedValue primary 컬럼에 고유값을 자동으로 생성 부여
    @Id  클래스의 어느 속성이 유일한 식별자 인지를 가리킴
    @Enumerated Java Enum class를 표현
    @Column 컬럼 길이 제약과 같은 세부사항을 지정할  있게 
    @Repository 해당 클래스에서 발생하는 DB 관련 예외를 spring DAOException으로 전환
    @Service 비즈니스 로직이 들어가는 Service 등록이 
    @Autowired Spring 의존관계(DI) 자동으로 설정타입(by type)으로 연결
    @Qualifier 동일한 타입의  객체들 중에서 특정 빈을 사용하도록 설정
    @PostConstruct 의존하는 객체를 설정한 이후에 초기화 작업을 수행할 메서드에 수행
    @PreDestory 컨테이너에서 객체를 제거하기 전에 호출  메서드에 적용
    @Target 어디에 어노테이션을 넣을  있는지를 서술
    @Retention 지속성을 설정어떻게 저장할 것인지
    @Documented 어노테이션이 기본으로 javadoc  유사한 툴에 의해 문서화 되는 것을 나타냄
    @AllArgsConstructor 모든 인자의 생성자를 자동으로 생성
    @NoArgsConstructor 인자 없는 생성자를 생성
    @MappedSuperclass 해당 어노테이션이 정의된 class 상속받은 entity에는 해당 컬럼이 자동으로 생성/매핑
    @JsonSerialize Annotation use for configuring serialization aspects, by attaching to "getter" methods or fields, or to value classes
    @Value 프로퍼티값을 파라미터에 적용
    @Configuration 스프링 IoC 컨테이너가 해당 클래스를  정의의 소스로 사용
    @EnableAsync 스프링 XML 설정의 <task:annotation-driven> 대신해서 자바에 설정
    @EnableScheduling 스프링 스케줄 task 실행을   있게 
    @EnableTransactionManagement 스프링 XML 설정의 <tx:annotation-driven/> 대신해서 자바에 설정
    @PropertySource Property 파일을 Environment로 로딩
    @EnableJpaRepositories JPA repositories   있게 
    @EnableAspectJAutoProxy 스프링 XML 설정의 <aop:aspectj-autoproxy/> 대신해서 자바에 설정
    @ComponentScan 스프링 XML 설정의 <context:component-scan> 대신해서 자바에 설정
    @Resource 어플리케이션에서 필요로 하는 자원을 자동 연결할  사용이름(by name)으로 연결
    @Bean 스프링 XML 설정의 <bean /> 동일한 기능을 제공
    @EnableTransactionManagement 스프링의 annotaion-driven 트랜잭션 관리기능을   있게 
    @MapperScan Mybatis mapper 등록을 자바에 설정
    @ControllerAdvice 예외 발생시 작업을 처리할  있게 스프링 프레임워크 3.2에서 추가
    @Controller Spring MVC Controller 클래스 선언을 단순화 시켜줌
    @RequestMapping Url class 또는 method 맵핑 시켜주는 역할
    @ResponseBody HTTP body 부분만 전달 XML, JSON으로 출력   사용
    @Api Api 어떤 역할을 하는  표시
    @ApiOperation Api 기능을 표시
    @ApiParam Api에서 사용할 파라미터를 표시
    @Aspect Spring은 자동적으로 @Aspect 어노테이션을 포함한 클래스를 검색하여 Spring AOP 설정에 반영
    @Pointcut pointcut은 결합점(Join points)을 지정하여 충고(Advice)가 언제 실행될지를 지정하는데 사용 @Pointcut 어노테이션을 사용
    @Before 메소드가 수행 전에 수행 된다.Before advice는 @Before 어노테이션을 사용
    @After 메소드 수행 후 무조건 수행된다. After (finally) advice는 @After 어노테이션을 사용
    @AfterThrowing 메소드가 수행 중 예외사항을 반환하고 종료하는 경우 수행된다. After throwing advice는 @AfterThrowing 어노테이션을 사용
    @RestController @Controller + @ResponseBody 
    @JsonInclude @JsonInclude(JsonInclude.Include.NON_EMPTY) 필드가 empty이거나 null 일 때 json으로 변환되지 않도록 함 
    @Transactional DB 트랜잭션관리를 위해 사용

    @Transactional 을 붙였는 데 사용하지 못하는 경우,
    1. innoDB 가 아닌 경우,
    2. interface 가 없는 경우,
    3. method 에 사용하였는 데, 해당 method를 같은 class 내부에서 호출하는 경우,
    2, 3번 -> @Transactional을 사용하면 해당 class를 spring에서 다시 proxy 형태로 실행/관리 하기 때문.

     

    4. 예시 

    @Data
    @Entity
    @Table(name = "users")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        public Long id;
        @Column(length = 100, unique = true)
        public String email;
        @Column(length = 256)
        public String password;
        @Column(length = 30)
        public String nickname;
        @Column
        public Instant createdAt;
    
        @PrePersist
        public void prePersist(){
            createdAt = Instant.now();
        }

     

    1) @Data

    • 설명: Lombok 라이브러리의 어노테이션으로, 클래스에 대해 getter, setter, toString(), equals(), hashCode(), requiredArgsConstructor() 메서드를 자동 생성합니다.
    • 주요 이점:
      • 반복적인 코드를 줄여줌.
      • 코드 가독성과 유지보수성 향상.
    • 주의사항: 모든 필드에 대해 자동으로 생성되므로, 민감한 데이터(password 등)의 getter나 setter를 직접 제어하려면 별도의 처리가 필요합니다.

    2) @Entity

    • 설명: 이 클래스가 JPA 엔터티임을 선언합니다. 즉, 이 클래스는 데이터베이스 테이블과 매핑됩니다.
    • 주요 역할:
      • 해당 클래스의 인스턴스는 JPA에서 관리되는 객체가 됩니다.
      • 데이터베이스 작업(삽입, 업데이트, 삭제, 조회 등)을 JPA가 처리할 수 있도록 지원합니다.

    3) @Table(name = "users")

    • 설명: 엔터티가 매핑될 데이터베이스 테이블의 이름을 지정합니다.
    • 사용 이유:
      • 클래스 이름과 테이블 이름이 다를 경우 명시적으로 매핑할 수 있습니다.
    • 예시:
    • java 코드 복사 @Table(name = "users") // 데이터베이스 테이블 이름은 "users"

    4) @Id

    • 설명: 해당 필드가 엔터티의 기본 키(primary key)임을 지정합니다.
    • 필수 조건:
      • 모든 엔터티에는 반드시 하나의 @Id 필드가 있어야 합니다.

    5) @GeneratedValue(strategy = GenerationType.IDENTITY)

    • 설명: 기본 키 값이 자동으로 생성되도록 설정합니다.
    • 전략 설명:
      • GenerationType.IDENTITY: 데이터베이스가 기본 키 생성을 담당합니다(예: MySQL의 AUTO_INCREMENT).
      • 다른 전략:
        • AUTO: JPA 구현체가 자동으로 생성 전략을 선택.
        • SEQUENCE: 데이터베이스 시퀀스를 사용하여 키 생성.
        • TABLE: 별도의 테이블을 생성하여 키 관리.

    6) @Column

    • 설명: 필드와 데이터베이스 테이블의 컬럼을 매핑합니다.
    • 속성 설명:
      • length: 문자열의 최대 길이 지정.
      • unique: 컬럼 값의 고유 여부 지정.

    7) @PrePersist

    • 설명: 엔터티가 persist(저장)되기 전에 실행될 콜백 메서드를 지정합니다.
    • 사용 이유:
      • 데이터 저장 전 특정 로직(예: 생성 시간 설정)을 실행하고 싶을 때 사용합니다.

    전체 어노테이션 활용

    이 코드는 JPA와 Lombok을 활용해 데이터베이스와 객체를 효율적으로 매핑하고, 추가 로직(@PrePersist)으로 데이터 무결성을 유지합니다. 추가적으로 Lombok 어노테이션을 활용해 코드를 간결하게 작성했습니다.

     

    728x90
    반응형
    home top bottom
    }