본문 바로가기

개발 지식/SpringBoot

[SpringBoot] 주요 Annotation 정리 2

반응형

[SpringBoot] 주요 Annotation 정리 2

SpringBoot로 개발을 하면서 자꾸 헷갈렸던 어노테이션들의 정리가 필요했다. 이전 포스팅에서도 정리를 한번 하긴 했지만 그럼에도 불구하고 계속 헷갈렸던 것들은 중복으로 내용이 들어갈 것 같다. 뭐 어때 내 공부 내가 정리하는건데 ㅎㅎ

 

@Bean

bean 등록을 위한 어노테이션으로 주로 다음 두 가지 경우에 사용이 된다.

  • 개발자가 직접 제어를 못하는 라이브러리를 활용할 때
  • 초기 configuration 을 위해 활용할 때

위 두 가지 경우를 포함한 케이스를 아래 @ConfigurationProperties 에서 다루고 있으니 참고하면 될 것 같다.

 

@Configuration

1개 이상의 @Bean을 제공하는 클래스의 경우에 명시해야하는 어노테이션

 

@Component

개발자가 직접 개발한 클래스를 Bean으로 등록하고자 하는 경우에 사용하는 어노테이션이다. 다음과 같은 예시가 있겠다.

  • 시간값 관련된 처리를 해주는 클래스 혹은 파일 입출력 같은 기능을 담당하는 클래스를 직접 개발자가 작성을 했다면, 이러한 클래스에 @Component 어노테이션을 붙여 bean으로 등록하여 사용한다.

 

@ComponentScan

현재 패키지의 위치 아래로 @Component 어노테이션이 붙어있는 클래스들을 찾아서 bean으로 등록하는 역할을 한다.

 

@ConfigurationProperties

properties 파일의 key 값이 아래와 같이 같은 값으로 시작할 때, 그것을 묶어서 bean으로 등록할 수 있다. 해당 어노테이션을 사용하려면 아래와 같은 dependency를 추가해줘야 한다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  • application.properties(my.full-name 이나 my.full_name으로 정의한다고 해도 알아서 바인딩 해줌)

    my.name=hochoon
    my.age=${random.int}
    my.fullName=${my.name} Lim
  • MyProperties.java => binding 될 변수를 정의하고 getter/setter 메소드를 만들어준다.

    @Component
    @ConfigurationProperties("my")
    public class MyProperties {
        private String name;
        private int age;
        private String fullName;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getFullName() {
            return fullName;
        }
    
        public void setFullName() {
            this.fullName = fullName;
        }
    }
  • spring에서는 main 메소드가 있는 클래스에 @EnableConfigurationProperties(MyProperties.class) 를 작성을 해줘야하는데 spring-boot 에서는 자동으로 등록되어 있기 때문에 작성을 안해줘도 된다. 대신, MyProperties 클래스에 @Component 등의 bean으로 등록해주는 어노테이션 작업을 해줘야 한다.

  • properties가 어플리케이션 안에 있지 않고, jar 파일에 있거나 다른곳에 위치해 있는 경우에는 클래스 위에 @Component를 붙여 bean으로 만들수 없다. 따라서 이러한 경우에는 @Bean(개발자가 직접 제어가 불가능한 외부 라이브러리를 Bean으로 등록하는 annotation) + @ConfiruationProperties("prefix값") 어노테이션을 붙여 사용한다.

    @SpringBootApplication
    public class SpringInitApplication {
        @ConfigurationProperties("server")
        @Bean
        public ServerProperties serverProperties() {
            return new ServerProperties();
        }
    
        public static void main(String[] args) {
            SpringApplication app = new SpringApplication(SpringInitApplication.class);
            app.setWebApplicationType(WebApplicationType.NONE);
            app.run(args);
        }
    }



@RequiredArgsConstructor

초기화 되지 않은 상태의 final 키워드가 붙은 필드나, @NonNull 어노테이션이 붙은 필드에 대해 생성자를 생성해준다. 처음에 Spring 에서 제공하는 어노테이션인줄 알았으나, Lombok에서 제공하는 어노테이션이다. 부끄럽다 촤하

스프링과 관련되어 주로 DI(Dependency Injection)를 위해 사용이 되는데, 다음과 같은 특징이 한 가지 있다.

  • 어떠한 Bean에 Constructor가 하나만 있고, Constructor의 파라미털 타입이 bean 으로 등록 가능한 존재라면 해당 Bean은 @Autowired 어노테이션 없이도 DI가 가능하다.

 


Reference

반응형