본문 바로가기

Spring

SpringBoot와 Lombok의 기본 annotation 정리

스프링 프레임워크에서는 다양한 어노테이션 기능을 지원하고 있다. 이 글에서 각 어노테이션이 무슨 의미를 뜻하고 어떠한 기능을 사용자에게 제공해주는지 알아보자!

@RestController

Controller + ResponsBody
기존의 Controller 어노테이션의 Return 값에 ResponseBody를 적용한 것으로 json으로 결과를 반환한다. 기존의 Controller는 View(화면)을 리턴하고 json 형태의 데이터를 반환할 때 @ResponseBody를 추가해줘야 했는데 이러한 기능을 통합시킨 어노테이션이다.

@RequsetMapping

Controller 어노테이션이 클래스 위에 선언되었다면 RequestMapping은 클래스 내의 메서드 위에도 선언될 수 있다. 요청된 URL을 어떤 매서드가 처리할지 결정하는 어노테이션이다.

@GetMapping

RequestMapping 어노테이션은 HTTP method의 get, post 와 같은 매서드 정보를 명시해줘야 했는데, GetMapping은 RequestMapping을 Get Method 요청으로 받고 처리하겠다는 뜻의 어노테이션이다.

@Component

Component는 자바 클래스를 스프링 빈으로 등록하라고 알리는 용도이다. 이 어노테이션을 사용하면 컴포넌트 스캔의 대상이 되어 어플리케이션 컨텍스트에 스프링 빈으로 등록된다.

@Service

Service는 @Component를 상속한 어노테이션으로 ComponentScan의 대상이 되어 런타임 시에 스프링 빈으로 등록된다. 이외에 다른 특별한 기능은 없지만, 이 어노테이션을 본다면 이것이 서비스 레이어로 비즈니스 로직이 작성되어 있는 구간이라고 빠르게 알 수 있을 것이다.

@Configuration

설정 정보 또는 외부 라이브러리를 빈으로 등록해서 사용해야 한다면 직접 Config 클래스를 만들어 Configuration과 Bean 어노테이션을 명시해 빈으로 등록해야 하는데 이때 사용된다.

@SpringBootApplication

SpringBootApplication 어노테이션은 스프링 부트의 동작에서 가장 핵심적인 어노테이션이다. 모두 중요한 기능이겠지만 가장 중요하다고 생각하는 ComponentScan과 EnableAutoConfiguration을 알아보자. 

스프링부트는 빈을 2번 등록한다. 처음에 컴포넌트 스캔으로 등록하고, 이후에 EnableAutoConfiguration을 통해 추가적인 Bean 정보를 읽어 들인다.

ComponentScan은 위에서 설명한 Controller, Component, Service와 같은 어노테이션을 빈으로 등록하는 기능을 수행한다. 컴포넌트 스캔의 시작 지점은 현재 위치의 하위 디렉터리인 것을 명심하자

EnableAutoConfiguration은 Configuration 설정 파일을 자동으로 읽어들여 Bean을 등록한다. spirng.factories라는 내부에 여러 개의 Configuartion 들을, 조건에 따라 빈으로 등록한다고 한다! 이 정도만 알고 있으면 될 것 같다. 즉 스프링부트는 EanbleAutoConfiguation을 통해 수많은 자동 설정을 지원해주고 우리는 쉽게 스프링 프레임워크를 사용할 수 있는 것이다.

@Getter , @Setter

Getter와 Setter 어노테이션은 Lombok 라이브러리에서 지원해주는 것으로, 자동으로 자바 get method와 set method를 등록해준다. 이 어노테이션을 사용하면 클래스 내의 getter, setter 매서드의 코드를 줄일 수 있어 가독성을 높일 수 있다.

@Data

위의 주석의 Getter, Setter .. 등등이 보이는데 이 모든 어노테이션을 포함한다. 즉 저기 있는 모든 어노테이션의 기능을 지원해준다. Getter, Setter는 위에서 설명했으니 중요한 RequiredArgsConstructor에 대해 알아보자

@RequiredArgsConstructor

생성자를 만들어주는 어노테이션으로 final 또는 @Nonnull인 필드 값만 파라미터로 받는 생성자를 만든다. 스프링의 DI 방식에는 크게 3가지가 있는데, Field Injection, Setter Injection, Constructor Injection이 있다. 이 중에 가장 올바른 방법으로 생각되는 것은 생성자를 통한 주입 방법이니까 아무래도 많이 사용하는 어노테이션이다. 단 하나의 생성자만 있다면 자동으로 의존성 주입까지 해주게 되어 코드의 가독성을 높일 수 있다.

@Builder

빌더 패턴을 사용할 때 사용하는 어노테이션이다. 다수의 필드를 가지는 복잡한 클래스의 경우 생성자를 사용할 때, 순서를 헷갈려서 에러가 날 수도 있다. 이럴 때 컴파일 에러가 뜨지 않는다면 추후에 에러가 났을 때 찾기 힘들 수도 있으니 빌더를 사용하여 클래스를 생성할 수 있는데, 빌더 패턴을 직접 사용하면 코딩량이 상당하다고 한다. 저는 사용 안 해봤지만.. 그래서 빌더 어노테이션을 사용하면 자동으로 추가해줘서 편리한 장점이 있다고 한다.