본문 바로가기

Backend Study/Java

[Spring boot] 스프링부트의 어노테이션들

스프링부트에서 사용되는 어노테이션들을 알아보자! 

1.  Annotation이란?

코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다. 

 

어노테이션의 용도

1) 컴파일러에게 코드 작성 문법 에러 체크

2) 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공

3) 실행시(런타임시) 특정 기능을 실행하도록 정보 제공

 

 

2.  @ComponentScan

@ComponentScan 어노테이션은 @Component 어노테이션 및 streotype(@Service, @Repository, @Controller) 어노테이션이 부여된 class들을 자동으로 scan하여 bean으로 등록해주는 역할을 한다. 

config 등 설정 파일에서 주로 사용한다. 

 

 

위 코드에서는 @Configuration 어노테이션을 이용하여 Bean 설정파일(XML 파일을 대체함)을 알려주고, @ComponentScan 어노테이션을 이용해 빈으로 등록되기 위한 어노테이션이 부여된 클래스들을 자동으로 컨테이너에 등록한다. 

 

ComponentScan의 범위

@ComponentScan 어노테이션은 Scan범위를 지정할 수 있다. 

이렇게 경로를 지정하여 스캔할 위치를 지정한다. 

 

 

3.  @Bean vs @Component

@Bean 어노테이션과 @Component 어노테이션 둘다 Spring Container에 Bean을 등록하도록 하는 어노테이션이다. 둘의 용도는 조금 다르니 살펴보자

 

Bean

@Bean 어노테이션의 경우 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려할 때 사용된다. 

 

참고) Bean이란?

우리가 알던 기존의 자바 프로그래밍에서는 Class를 생성하고 new를 입력하여 원하는 객체를 직정 생성해서 사용하지만, Spring에서는 직접 new를 이용하여 생성한 객체가 아니라, Spring에 의하여 관리당하는 자바 객체를 사용한다. 이 객체가 Bean이다. 

 

위 코드에서는 @Bean 어노테이션을 이용하여 Bean을 생성하고 있고, 이름을 지정해주지 않아 Method 이름을 CamelCase로 변경한 것이 Bean id로 등록된다.

 

Component

@component 어노테이션의 경우 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다. 

@component도 이름을 지정하지 않으면 CamelCase로 변경한 것이 Bean id로 사용된다. 

@Component를 사용한 Bean의 의존성 주입은 @AutoWired 어노테이션을 이용해 할 수 있다. 

 

참고) 의존성 주입이란? 

의존성 주입이란 클래스간 의존성을 클래스 외부에서 주입하는 것이다. 의존성이 있다는 것은 클래스간에 의존 관계가 있다는 것을 뜻하며, 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다. 주입은 클래스 외부에서 객체를 생성하여 해당 객체를 클래스 내부에 주입하는 것이다. 

 

의존성 주입을 받는다면, 클래스간의 결합도가 약해진다. 즉 한 클래스가 변경될 경우 다른 클래스가 변경될 필요성이 적어진다. 
따라서 리펙토링이 쉽고, 테스트하기 쉽고, 확장성이 높다. 

 

 

4.  @Autowired

@Autowired란 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, DI(의존성 주입)을 도와주는 어노테이션이다. 

스프링컨테이너에 빈들을 모두 등록한 후에, 의존성 주입 단계가 이루어진다. 

@Autowired는 총 3가지 방법으로 실현 가능한데, 생성자, 수정자, 필드를 사용할 수 있다.

 

대표적으로 생성자 주입만 살펴보자. 

생성자 주입은 생성자를 통해 의존 관계를 주입하는 방법이다. 객체가 생성될 때 딱 한 번 호출되는 것이 보장되며, 의존 관계에 있는 객체들을 final로 선언하여 생성자에서 무조건 설정하게 할 수 있다. 

+ 추가) @RequiredArgsConstructor
Lombok으로 스프링에서 의존성 주입의 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션이다. 

초기화 되지 않은 final 필드나, @NonNull이 붙은 필드에 대해 자동으로 생성자를 생성해준다. 

 

 

5.  @RestController

스프링프레임워크 4.x 버전 이상부터 사용가능한 어노테이션으로 @Controller에 @ResponseBody가 결합된 어노테이션이다.

RestController를 붙이면, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 Json을 전송할 수 있다. 컨트롤러 클래스의 각 메서드마다 @ResponseBody를 추가할 필요가 없다. 

 

https://galid1.tistory.com/510

https://sddev.tistory.com/225

https://kotlinworld.com/64

'Backend Study > Java' 카테고리의 다른 글

[Java] Collection이란?  (0) 2023.08.19
[Java ] JVM, JRE, JDK 차이점  (0) 2023.08.17
[JAVA] 오토 박싱 & 오토 언박싱  (0) 2023.02.14
[JAVA] 람다와 스트림  (0) 2023.02.13
[JAVA] 힙 메모리 사용률  (0) 2023.02.09