어노테이션이란?
- 프로그램에게 코드에 대한 정보를 전달하기 위한 메타데이터
- 사람에게는 주석을 이용하여 정보를 전달한다면, 프로그램에게는 어노테이션을 이용하여 정보를 전달한다
- 컴파일 또는 런타임시 코드를 어떻게 컴파일하고 처리 할 것인지 알려주는 정보
어노테이션의 사용이유?
어노테이션이 아래 기능을 수행하는 것이 아닌 어노테이션과 리플렉션을 이용하여 수행
- 컴파일시에 코드문법 체크 ex) @override
- 빌드시 코드를 자동으로 생성 ex) lombok라이브러리의 @getter, @setter
- 런타임시에 특정기능 수행 ex) Spring 프레임워크의 @Component, @Controller등등
리플렉션이란?
클래스의 구체적인 타입을 알지 못해도 그 클래스의 정보(타입, 메소드, 변수, 어노테이션 등)에 접근할 수 있도록 해주는 API
- 자바의 Class클래스를 이용하여 리플렉션 기능을 이용가능
- 예를들어 Spring에서 @Component가 붙은 클래스를 Bean으로 등록 하는 경우 어느 클래스에 @Component 어노테이션이 붙어 있는지 알지 못한다. 따라서 모든 클래스를 리플렉션을 이용하여 Scan후에 해당 어노테이션이 붙은 클래스만 bean으로 등록 가능하다
Spring의 @Component 구현
- @Component가 붙은 클래스를 bean으로 등록 해야한다. 하지만 어느 클래스에 @Component가 붙어 있는지는 바로 알 수 없다. 따라서 리플렉션(Class객체)을 이용하여 모든 클래스를 scan(for문과 if문)하면서 @Component가 붙은 클래스에 한해 bean객체를 생성하고 컨테이너에 저장한다.