티스토리 뷰

Spring

Spring Custom Annotation 만들기

Shmoon 2019. 12. 11. 17:50

오늘은.. 커스텀 어노테이션을 만들 것이다..

만들고자 마음먹은 이유

 

1. 인텔리제이에서 프로젝트를 각각 모듈화 해서 사용중인대 각각 프로젝트마다 유틸성 클래스들을 만들기 싫다.

2. 임포트는 가능하나 매번 체크하기 힘들다

3. 스태틱 메소드 말고 스프링 빈으로 띄워서 사용하고 싶다.

5. 고로 @Configuration 에서 설정 + 다른 프로젝트 클래스를 임포트하여 Bean으로 설정하는 통합 유틸리티 빈을 띄우는 어노테이션을 만들 것이다.

 

단점은.. 해당 모듈 안에 있는 클래스들이 아니면 생성할 때 오류가 날 것...?

규칙을 모르면 이어노테이션이 뭔지 모르는것..?

이정도 있을 것 같다.

 

1차 고비

로직처리를 하는것이 아니다...

 

어노테이션은 특정 '기능'을 약속해둔것이라 봐도 무방하다고 생각한다.

 

문제는 이걸 스프링 빈에 등록하는 동작을 하는건데

우린 보통 이걸 DI라고 하고... 머리 터질뻔했음.

 

https://blog.woniper.net/336?category=699184

 

요기 글을 읽고..

 

만들어 보았다

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(UtilBeans.class)
public @interface UtilBeanConfiguration {
    @NonNull
    String[] basePackages() default {};
}

 

짜잔... 만들었다. 이 어노테이션에 달린 어노테이션들은 다른 블로그에 설명이 잘 되어있다.

@Rentention RUNTIME 일 경우에만 JVM런타임시에 구동되니 이곳만 참고하자.

 

이제 Import 된 UtilBeans 클래스를 보자.

해당 클래스는 스프링에 빈을 등록하기 위한 클래스이다

 

public class UtilBeans implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registr){
        AnnotationAttributes annoAttrs = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(UtilBeanConfiguration.class.getName()));
        searchPackage((String [] ) annoAttrs.get("basePackages"), registr);
        
        ...
        ...
        ...
    }
}

 

ImportBeanDefinitionRegistrar 인터페이스를 상속받은 클래스를 구현해야 한다.

해당 설명은..

 

 

@ {@ link Configuration} 클래스를 처리 할 때 추가 Bean 정의를 등록하는 유형으로 구현할 인터페이스입니다. Bean 정의 레벨 ({@code @Bean} 메소드 / 인스턴스 레벨과 반대)에서 작동 할 때 유용하거나 필요합니다.

 

라고 적혀있다.  해당 인터페이스를 상속받아 구현하면 어떻게 스프링에서 읽어가는 지는 다음 포스팅에서 찾아봐야겠다.

 

이게 구조 파악이 힘들지

결국엔 스프링에 빈 넣으려면

registr.registerBeanDefinition(c.getName(), BeanDefinitionBuilder.genericBeanDefinition(c.getName()).getBeanDefinition());

이것만 넣으면 되어서.. 고생했던 3일보다 엄청 간단하게 글을 마치게 될 것 같다.

 

사실 registerBeanDefinition 은 빈 등록하는거라 어렵지는 않은데

ApplicationContext를 스프링 구동 후에 Autowired로 가져와서 빈을 넣는것은

 

처음에 빈이 등록 안되었기 때문에 다른 곳에서 의존성을 불러와 사용할 수 없기 때문에 컴파일 오류가 난다.

 

결국 스프링이 뜨기 전에 빈을 올릴 클래스를 정의하는 방법만 알면 누구나 쉽게 커스텀 빈을 등록 할 수 있는데..

 

이게 생각해보니

특정 패키지에 Bean붙여놓고 Component-Scan 하면 끝이라

아쉽내....

'Spring' 카테고리의 다른 글

Docker(Jenkins) + Docker(Spring Boot) Ci/CD  (2) 2019.12.26
Docker swarm 적용  (0) 2019.12.02
Docker 적용하기 (Spring Boot)  (0) 2019.11.27
Docker 적용하기 (Mariadb)  (0) 2019.11.26
Project Module  (0) 2019.11.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함