빈(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 로 어노테이션 정보 조회 가능
- SOURCE : 소스 코드(.java)까지 남아있는다.
- 어노테이션의 지속기간입니다. (어디까지 영향을 미칠지 = 용도와 관련)
Annotation 의 목적과 용도
- Annotation 의 목적
- 클래스, 메서드, 변수가 포함된 프로그램 코드 자체에는 아무런 영향을 미치지 않으면서 중복코드를 줄이고 싶다.
- 중복코드 줄이기는 개발자의 생산성에 직접적인 영향을 미친다.
- 예를들어 소스코드 중 특정 메서드만 테스트하길 원할 경우, 해당 코드에 @Test라는 어노테이션을 붙이면 테스트 프로그램에게 해당 메서드는 테스트를 해야한다는 것을 알릴 뿐 메서드가 포함된 전체 프로그램 자체에는 해당 어노테이션이 아무런 영향을 미치지 않는다.
- 클래스, 메서드, 변수가 포함된 프로그램 코드 자체에는 아무런 영향을 미치지 않으면서 중복코드를 줄이고 싶다.
Annotation 의 용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- RetentionPolicy.SOURCE
- ex. @Override, @Deprecated
- RetentionPolicy.SOURCE
- 빌드 시 코드를 자동으로 생성할 수 있도록 정보를 제공
- RetentionPolicy.SOURCE
- ex. @RequiredArgsConstructor , @Getter, @Setter
- RetentionPolicy.CLASS
- RetentionPolicy.SOURCE
- 실행시(런타임시)특정 기능을 실행하도록 정보를 제공
- RetentionPolicy.RUNTIME
- ex. @Test , @Controller , @GetMapping
- RetentionPolicy.RUNTIME
'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 |