일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 카카오클라우드스쿨2기
- 데이터베이스 개론
- LeNet
- 생활코딩 머신러닝야학
- flatten
- 데이터베이서
- 데이터베이스
- 이것이 자바다
- 머신러닝(딥러닝)
- 연산자
- tensorflow
- 생활코딩 데이터베이스
- 머신러닝
- reshape
- Database
- 파이썬
- 개발자
- JavaScript
- Java
- 딥러닝
- Python
- 생활코딩
- CNN
- 머신러닝야학
- pandas
- MySQL
- 판다스
- 야학
- Today
- Total
IT's 우
[Spring] Annotation 본문
Annotation
- 프로그램에서 추가적인 정보를 제공하는 메타데이터(meta data: 데이터를 위한 데이터)
- 자바 코드에 특별한 의미를 부여한 주석으로 컴파일러를 위한 정보를 제공하기 위한 용도
Annotation 용도
- 컴파일에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행 시(런타임시) 특정 기능을 실행하도록 정보를 제공
동작 순서
👉
- 어노테이션 정의
- 클래스에 어노테이션을 배치
- 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능 실시
1. 어노테이션의 정의
어노테이션을 적용할 때는 어노테이션이 어디에 적용되며 언제까지 어노테이션 소스가 유지될 것인지를 설정하여야 하는데 소스코드에는 다음과 같이 오노테이션을 정의해 주면 된다.
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
public 타입 elementName() [default 값]
...
}
@Target에는 어떠한 값(ex : 클래스, 필드, 메서드 ...)에 어노테이션을 적용할 것이지 나타낼 수 있는데 넣을 수 있는 값은 다음 표와 같다.
ElementType 열거 상수 적용대상
TYPE | 클래스, 인터페이스, 열거 타입 |
ANNOTATION_TYPE | 어노테이션 |
FIELD | 필드 |
CONSTRUCTOR | 생성자 |
METHOD | 메소드 |
LOCAL_VARIABLE | 로컬 변수 |
PACKAGE | 패키지 |
@Retention에는 어노테이션 값들을 언제까지 유지할 것인지 값을 입력하는데 각 값이 가지는 의미는 다음 표와 같다. 보통 어노테이션은 Runtime시에 많이 사용하므로 대부분의 어노테이션의 Retention 값은 RUNTIME으로 되어있다.
RetentionPolicy 열거 상수 설명
SOURCE | 소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 |
때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다. | |
CLASS | 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 |
이용해서 어노테이션 정보를 얻을 수는 없다. | |
RUNTIME | 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 |
런타임에 어노테이션 정보를 얻을 수 있다. |
2. 어노테이션의 배치 및 사용
어노테이션의 사용은 클래스를 참고하는 소스의 흐름상에서 Reflection을 사용하는 방법을 통해서 어노테이션 값을 활용하도록 한다.
- MyAnnotation.java (어노테이션)
- MyService.java (사용되는 클래스)
- MyMain.java (MyService를 사용하는 클래스)
다음 코드는 MyMain 클래스가 MyService 클래스의 메서드에 MyAnnotation어노테이션 설정이 있는지 확인하고 각 메서드에 설정된 어노테이션에 삽입된 값에 따라 특정값을 일정한 숫자만큼 출력하는 예제이다.
[MyAnnotation.java]
package myannotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "-";
int number() default 15;
}
[MyService.java]
package myannotation;
public class MyService {
@MyAnnotation
public void method1() {
System.out.println("실행내용1");
}
@MyAnnotation("*")
public void method2() {
System.out.println("실행내용2");
}
@MyAnnotation(value = "*", number = 20)
public void method3() {
System.out.println("실행내용3");
}
}
[MyMain.java]
package myannotation;
import java.lang.reflect.Method;
public class MyMain {
public static void main(String[] args) {
Method[] methodList=MyService.class.getMethods();
for(Method m : methodList) {
if(m.isAnnotationPresent(MyAnnotation.class)) {
System.out.println(m.getName());
MyAnnotation annotation=m.getDeclaredAnnotation(MyAnnotation.class);
String value=annotation.value();
int number=annotation.number();
for(int i=0;i<number;i++) {
System.out.print(value);
}
System.out.println();
}
}
}
}
Reflection
프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것이다.
- 프로그래머가 데이터를 보여주고, 다른 포맷의 데이터를 처리하고, 통신을 위해 serialization(직렬화)를 수행하고, bunding을 하기 위해 일반 소프트웨어 라이브러리를 만들도록 도와준다.
- Java와 같은 객체 지향 프로그래밍 언어에서 Reflection을 사용하면
- 컴파일 타임에 인터페이스, 필드, 메소드, 이름을 알지 못해도 실행 중에 클래스, 인터페이스, 필드 및 메서드에 접근할 수 있다.
- 멤버 접근 가능성 규칙을 무시할 수 있다.
- 새로운 객체의 인스턴스화 및 메소드 호출을 허용한다.
- Annotiation 자체는 아무런 동작을 가지지 않는 단순한 표식일 뿐이지만, Reflection을 이용하면 Annotation의 적용 여부와 엘리먼트 값을 읽고 처리할 수 있다.
- Spring 컨테이너(BeanFactory)에서 객체가 호출되면 객체의 인스턴스를 생성하게 되는데 이때 필요하게 된다. 즉, 프레임워크에서 유연성 있는 동작을 위해 쓰인다.
- Reflection을 이용하면 Annotation 지정만으로도 원하는 클래스를 주입할 수 있다.
- Class에 적용된 Annotation 정보를 읽으려면 java.lang.Class를 이용하고필드, 생성자, 메서드에 적용된 어노테이션 정보를 읽으려면 Class의 메서드를 통해 java.lang.reflect 패키지의 배열을 얻어야 한다.
- Class.forName(), getName(), getModifier(), getFields() getPackage() 등등 여러 메소드로 정보를 얻을 수 있다.
Spring Annotation
@Component
개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다. Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다.
@Component(value="myman")
public class Man {
public Man() {
System.out.println("hi");
}
}
@ComponentScan
- @Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean을 등록해 주는 애노테이션
- 전부 다 @Component를 사용하지 않고 @Repository 등으로 분리해서 사용하는 이유는, 예를 들어 @Repository는 DAO에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.
- 또한 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다.
@Bean
@Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용합니다.
@Controller
Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation입니다.****
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
}
@RestController
- view가 필요 없이 API만 지원하는 서비스에서 사용
@SpringBootApplication
- @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나로 합친 애노테이션
@EnableAutoConfiguration
- autoConfiguration도 Configuration중 하나에 해당한다.
- spring.factories 내부에 여러 Configuration들이 있고 조건에 따라 Bean이 등록되게 되는데 메인 클래스 @SpringBootApplication을 실행하면 @EnableAutoConfiguration에 의해 spring.factories 안에 있는 수많은 자동 설정들이 조건에 따라 적용되어 수많은 Bean들이 생성된다.
- 간단하게 정리하면, Application Context를 만들 때 자동으로 빈설정이 되도록 하는 기능이다.
@Configuration
- @Configuration을 클래스에 적용하고 @Bean을 해당 class의 메서드에 적용하면 @autowired로 Bean을 부를 수 있다.
@Autowired
- 스프링이 Type에 따라 알아서 Bean을 주입해준다.
- Type을 먼저 확인한 후 못 찾으면 Name에 따라 주입한다.
- 강제로 주입하고자 하는 경우 @Qulifier을 같이 명시
@Qualifier
- 같은 타입의 빈이 두 개 이상 존재하는 경우 스프링이 어떤 빈을 주입해야 할지 알 수 없어서 스프링 컨테이너를 초기화하는 과정에서 예외가 발생한다.
- @Qualifier는 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있다.
@Resource
- @Autowired와 마찬가지로 Bean 객체를 주입해 주는데 차이점은 Autowired는 타입으로, Resource는 이름으로 연결해 준다.
- 애노테이션 사용으로 인해 특정 Framework에 종속적인 애플리케이션을 구성하지 않기 위해서 @Resource 사용을 권장한다.
참고
https://github.com/backtony/Backend_Interview_for_Beginner/blob/master/Spring %26 JPA.md
https://honeyinfo7.tistory.com/56
'CS > Spring & JPA' 카테고리의 다른 글
[Spring] 람다식(Lambda Expression) (0) | 2023.07.19 |
---|---|
[Spring] IoC, DI (0) | 2023.07.18 |
[Spring] 스프링 컨테이너(Spring Container) (0) | 2023.07.18 |
[Spring] Spring 이란? (0) | 2023.07.08 |
[Spring] MVC 패턴 (0) | 2023.06.27 |