본문 바로가기

TIL

2022.12.23 @Annotation

빈(Bean) vs 컴포넌트(Component)

빈(Bean) 이란?

애플리케이션에서 빈(Bean)이라는 이름으로 객체를 미리 생성해놓고 돌려쓰는것을 얘기한다. (한번만 생성하고 쓰레드들이 다같이 쓴다. = 싱글톤)

스프링앱에 여러 번 빈을 요청하더라도 매번 동일한 객체를 돌려준다는 것이다. (스프링이 빈을 관리한다.) 애플리케이션 컨텍스트(컨테이너) 가 싱글톤으로 빈을 관리하는 이유는 대규모 트래픽을 처리할 수 있도록 하기 위함이다. (메모리는 한정적이기 때문)

 

컴포넌트(Component) 란?

개발자가 직접 작성한 Class를 Bean으로 등록한 것을 얘기한다. (Bean 과 동일하게 한번만 생성하고 쓰레드들이 다같이 쓰게 하려고)

@Component -> (구체화) -> @Controller, @Service, @Repository

 

 

@Component vs @Bean

  • @Component 는 개발자가 지금 개발중인 직접 컨트롤이 가능한 클래스들의 경우 Bean으로 등록하기 위해 사용된다.
  • **@Bean**의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 에 사용된다. 라이브러리에 있는 클래스에 **@Component**를 선언할수는 없기 때문에 인스턴스를 생성하고 해당 메소드에 @Bean을 붙여주어 빈(Bean)으로 등록한다.

그럼 개발자가 생성한 Class에 @Bean은 선언이 가능할까? 정답은 No 이다.

@Bean과 @Component는 각자 선언할 수 있는 타입이 정해져있어 해당 용도외에는 컴파일 에러를 발생시킨다

 

Annotation 이란?

  • Annotation은 Java5부터 새롭게 추가된 문법요소
    • 나는 쌔삥~! 모든게 다 쌔삥? (2004년 발표)
    • Spring 뿐만 아니라 Java 생태계 전체에서 쓰이고 있다.
  • 주석과 같은 의미를 가진 기호
    • // ∽ @
    • //주석 은 사람이 보는 주석, @주석 은 컴파일러가 보는 주석
  •  컴파일러에게 일을 시키기 위한 주석
    • 컴파일러가 내 코드에 초능력을 부여해준다
    • 프로그램의 소스코드 안에 컴파일 메타정보를 미리 약속된 형식으로 포함시킨 것

 

Annotation 의 종류

 

  • Built-in Annotation : 자바에서 기본적으로 제공하는 어노테이션 (ex. @Override)
  • Meta Annotation : 커스텀 어노테이션을 만들수 있게 제공된 어노테이션. (ex. @Target)
  • Custom Annotation : 사용자가 직접 정의한 어노테이션 (java 외 spring, junit 등.. 모두 포함) (ex. @Test)

Annotation 만들기

  • Meta Annotation 을 사용해서 만든다.
  • @Target
    • 말 그대로 어노테이션의 타겟을 지정하는 것입니다.
      • FIELD : 해당 어노테이션을 Feild에 붙일때
      • METHOD, TYPE : Class나 Enum 등의 어떤 대상을 위한 어노테이션인지 타입에 붙일 때
      • 그외 PARAMETER, CONSTRUCTOR …
  • @Retention
    • 어노테이션의 지속기간입니다. (어디까지 영향을 미칠지 = 용도와 관련)
      • SOURCE : 소스 코드(.java)까지 남아있는다.
        • 컴파일 과정에서 어노테이션 정보는 사라짐
      • CLASS : 클래스 파일(.class)까지 남아있는다.(=바이트 코드)
        • 런타임시 유지안됨
      • RUNTIME : 런타임까지 남아있는다.(=사실상 안 사라진다.)
        • Reflection API 로 어노테이션 정보 조회 가능

Annotation 의 목적과 용도

  • Annotation 의 목적
    • 클래스, 메서드, 변수가 포함된 프로그램 코드 자체에는 아무런 영향을 미치지 않으면서 중복코드를 줄이고 싶다.
      •  중복코드 줄이기는 개발자의 생산성에 직접적인 영향을 미친다.
      • 예를들어 소스코드 중 특정 메서드만 테스트하길 원할 경우, 해당 코드에 @Test라는 어노테이션을 붙이면 테스트 프로그램에게 해당 메서드는 테스트를 해야한다는 것을 알릴 뿐 메서드가 포함된 전체 프로그램 자체에는 해당 어노테이션이 아무런 영향을 미치지 않는다.

Annotation 의 용도

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
    • RetentionPolicy.SOURCE
      • ex. @Override, @Deprecated
  • 빌드 시 코드를 자동으로 생성할 수 있도록 정보를 제공
    • RetentionPolicy.SOURCE
      • ex. @RequiredArgsConstructor , @Getter, @Setter
    • RetentionPolicy.CLASS
  • 실행시(런타임시)특정 기능을 실행하도록 정보를 제공
    • RetentionPolicy.RUNTIME
      • ex. @Test , @Controller , @GetMapping

'TIL' 카테고리의 다른 글

2022.12.26 RESTful API  (1) 2022.12.27
[WIL] 2022.12.19~12.23  (0) 2022.12.26
2022.12.22 DAO, DTO, VO  (0) 2022.12.23
2022.12.20 IntelliJ tips  (0) 2022.12.21
2022.12.19 애자일 방법론  (0) 2022.12.20