Spring Boot를 쓰면서 보게될 주요 어노테이션들

Workwork·2022년 8월 8일
0

React.Boot.Aws

목록 보기
9/19
post-thumbnail

<React.js, 스프링 부트, AWS로 배우는 웹 개발 101>(김다정 지음)을 따라 TO-DO 앱을 하나 만들 예정이다.

앞으로 쓸 대부분의 포스팅(이미지/글)은 위의 서적을 참고/출처로 작성되었음을 미리 밝힌다.

스프링의 중요 기능 중 하나 - 의존성 주입 컨테이너로서의 기능

  • 스프링은 베이스 패키지와 그 하위 패키지에서 자바 빈을 찾아 스프링의 의존성 주입 컨테이너 오브젝트, ApplicationContext에 등록한다.

  • 그리고 앱 실행 중 오브젝트가 필요한 경우 다른 오브젝트를 찾아 연결해준다.

  • @Autowired - 자동으로 다른 오브젝트를 찾아 연결해줌.

  • @Component - 애플리케이션 컨텍스트에 등록할 자바 빈을 설정

    @Component

    @Component는 스프링에게 이 클래스를 자바 빈으로 등록시키라고 알려주는 어노테이션이다.

예를 들어,
@Service 어노테이션의 내부를 확인하면 @Component 어노테이션이 있다는 것을 알 수 있다.

  • @Service 어노테이션의 내부
public @interface Service {
...
}

@Component를 클래스에 달기만 하면 무조건 스프링이 검색해서 등록해 주는 것은 아니다.
@ComponentScan 어노테이션이 어떤 클래스에 있어야지만 컴포넌트를 스캐닝할 수 있다. 이 어노테이션은 프로젝트 내부에서 사용하지는 않았지만 DemoApplication 클래스의 @SpringBootApplication이 이미 @ComponentScan을 포함하고 있어서 굳이 추가해 주지 않아도 됐던 것이다.

스프링을 이용해 관리하고 싶은 빈의 클래스 상단에 @Component를 추가하면 자동으로 이 오브젝트를 스프링에 빈으로 등록할 수 있음.

그리고 @Autowired와 함께 이용하면 스프링이 필요할 때 알아서 이 오브젝트를 생성해 줌.

@Bean

@Bean 어노테이션을 이용한 스프링 빈 등록

@Configuration
public class ConfigClass {
	
    @Bean
    public Controller getController() {
    	if(env == 'local') { // 환경이 로컬일 경우
        	return new LocalController(...); // 로컬용 빈을 써라 
        }
        
        return new Controller(...); // 자동으로 연결된 빈을 써라
    }
}

엔터프라이즈 어플리케이션의 경우 @Autowired를 사용하지 않는 경향이 있다.
엔지니어가 오브젝트를 어떻게 생성하고 어느 클래스에서 사용하는지 정확히 알아야 하는 경우가 많기 때문이다.
또는 로컬 환경에서 애플리케이션을 실행하는 경우 자동으로 연결될 빈이 아닌 다른 빈을 사용하고 싶을 때가 있다.
또 우리가 라이브러리를 사용할 때 이 라이브러리 클래스가 스프링 기반이 아니라서 @Component를 추가하지 못하는 경우도 있다.

이런 경우 스프링으로 빈을 관리하려면 직접적으로 "이 빈은 이렇게 생성해라."라고 말해줄 필요가 있다. 그걸 위한 어노테이션이 @Bean.

<정리>
1. 스프링 부트 어플리케이션 시작
2. @ComponentScan 어노테이션이 있는 경우 베이스 패키지와 하위 패키지에서 @Component가 달린 클래스를 찾는다.
3. 필요한 경우 @Component가 달린 클래스의 오브젝트를 생성한다. 이때 생성하려는 오브젝트가 다른 오브젝트에 의존한다면, 즉 멤버 변수로 다른 클래스를 갖고 있다면 그 멤버 변수 오브젝트를 찾아 넣어줘야 한다.
@Autowired를 사용하는 경우 스프링이 그 오브젝트를 찾아 생성해준다.
a. 이 때 @Autowired에 연결된 변수 클래스가 @Component가 달린 클래스인 경우 스프링이 오브젝트를 생성해 넘겨준다.
b. 만약 @Bean 어노테이션으로 생성하는 오브젝트인 경우 @Bean이 달린 메서드를 불러 생성해 넘겨준다.

profile
나만 알아보면 된다는 마음으로 작더라도 조금씩

0개의 댓글