Spring/그 외

Spring(스프링) 주요 어노테이션 정리

ummchicken 2023. 1. 22. 20:33

프로젝트 하다가 파일 업로드가 안 돼서 몇 주를 에러 찾느라 눈이 빠졌었음.

코드 한줄한줄 다시 읽고, 구글링 오지게 해도 발견 안 되던 원인이 

알고보니 @Configuration 어노테이션 안 넣어서 파일을 못 불러오는 거였음.

 

 

아 완전 어이없음. 

내가 이런 기본도 안 되어 있다니...

 

 

암튼 

어이없어서 정리한 스프링 주요 어노테이션 정리이다.

 

 

내가 보려고 정리하는 거라, 충분한 지식 전달이 잘 안 될 수도 있음.

그러면 내가 하단에 남긴 출처 블로그들 가서 읽어보시길...

 

 

 

 

스프링 주요 어노테이션

 

1. @Configuration

@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면, 
@Autowired로 Bean을 부를 수 있다.

 

 

2. @ComponentScan

@Component와 @Service, @Repository, @Contoreller, @Configuration이 붙은
클래스 Bean들을 찾아서 Context에 bean 등록을 해주는 Annotaion이다.

Spring에서 @Component로 다 쓰지 않고
@Service, @Repository, @Contoreller 등을 사용하는 이유는 여러가지가 있지만, 
가독성에서도 해당 어노테이션을 갖는 클래스가 무엇을 하는지 단번에 알 수 있다.

 

 

3. @Bean

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

@Configuration 선언한 빈 설정 클래스에 빈 선언을 담당하는 어노테이션으로, 
메소드에만 넣을 수 있다.
보통은 메소드 이름이 곧 빈 이름으로 탄생한다.

※ 예시

@Configuration
public class ApplicationConfig {    
    @Bean
    public ArrayList<String> array(){
        return new ArrayList<String>();
    }   
}

 

※ Bean이 뭘까?

먼저 Bean을 이해하기 위해 스프링 컨테이너(Spring Container 또는 IoC 컨테이너)에 대해
알 필요가 있다.

자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져 있다.
이때, 객체들은 독립적으로 동작하는 것보다 서로 상호작용하여 동작하는 경우가 많다.
이렇게 상호작용하는 객체를 '객체의 의존성'이라고 표현한다.

스프링에서는 스프링 컨테이너에 객체들을 생성하면, 
객체끼리 의존성을 주입(DI : Dependency Injection)하는 역할을 해준다.

그리고 스프링 컨테이너에 등록한 객체들을 '빈'이라고 한다.

 

※ 스프링 컨테이너에 Bean을 등록하는 두 가지 방법

  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록

 

※ 1. 컴포넌트 스캔과 자동 의존관계 설정

스프링 부트에서 사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법은 
클래스 선언부 위에 @Component 어노테이션을 사용하는 것이다.

@Service, @Repository, @Contoreller는 모두 @Component를 포함하고 있으며, 
해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 
자동으로 생성되어 스프링 빈으로 등록된다.

 

※ 2. 자바 코드로 직접 스프링 빈 등록

수동으로 스프링 빈을 등록하는 방법이다.
수동으로 스프링 빈을 등록하려면, 자바 설정 클래스를 만들어 사용해야 한다.

설정 클래스를 만들고 @Configuration 어노테이션을 클래스 선언부 위에 추가하면 된다.
그리고 특정 타입을 리턴하는 메소드를 만들고, @Bean 어노테이션을 붙여주면 
자동으로 해당 타입의 빈 객체가 생성된다.

 

※ 등록된 스프링 빈을 @Autowired로 사용하기

스프링 부트의 경우 @Component, @Service, @Repository, @Contoreller, @Bean, @Configuration 등으로 
빈들을 등록하고, 필요한 곳에서 @Autowired를 통해 의존성 주입을 받아 사용하는 것이 일반적이다.

 

 

4. @Autowired

속성(field), setter, method, constructor(생성자)에서 사용하며 
Type에 따라 알아서 Bean을 주입해준다.

무조건적인 객체에 대한 의존성을 주입시킨다.

스프링 빈을 가져오는 가장 기본적인 방법이다.

 

※ Bean을 주입받는 방식 3가지

  1. @Autowired
  2. setter
  3. 생성자 (@AllArgsConstructor 사용) : 권장 방식

 

 

5. @Controller

Spring의 Controller를 의미한다.
Spring MVC에서 Controller 클래스에 쓰인다.

 

 

7. @RestController

Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미한다.

method의 반환 결과를 JSON 형태로 반환한다.

API 설계 시 필수 어노테이션이라 보면 된다.

이 어노테이션이 적혀있는 Controller의 method는 
HttpResponse로 바로 응답이 가능하다.
@ResponseBody 역할을 자동적으로 해주는 어노테이션이다.

@Controller + @ResponseBody를 사용하면 @ResponseBody를 모든 메소드에서 적용한다.

 

※ @Controller와 @RestController의 차이

- @Controller : API와 view를 동시에 사용하는 경우에 사용한다.
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
view(화면) return이 주목적이다.

- @RestController : view가 필요없는 API만 지원하는 서비스에서 사용한다.
@RequestMapping 메서드가 기본적으로 @ReponseBody 의미를 가정한다.
data(json, xml 등) return이 주목적이다.

 

 

8. @Service

Service Class에서 쓰인다.
비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도이다.

이 어노테이션을 단 클래스는, 그저 업무 메소드만 정의하면 된다.
다른 빈에서 가져와 처리를 하고, 결과를 제공하는 그저 비즈니스 로직만 정의하면 된다.

 

 

9. @Repository

DAO class에서 쓰인다.
Database에 접근하는 method를 가지고 있는 class에서 쓰인다.

 

 

10. @Lazy

지연로딩을 지원한다.

Class가 로드될 때 스프링에서 바로 Bean 등록을 마치는 것이 아니라, 
실제로 사용될 때 로딩이 이뤄지게 하는 방법이다.

 

 

11. @Value

주로 application.properites 및 스프링이나 자바 property 값을 가져올 때 쓴다.

※ 예시

@Value("${value.from.file}")

 

 

12. @SpringBootApplication

스프링 부트는 기본적으로 이 어노페이션 기준으로 동작하도록 되어있다.

스프링에서 필수적인 초기화를 담당하는
@EnableAutoConfiguration, @ComponentScan, @Configuration 어노테이션이 함축되어 있다. 
이 클래스를 기준으로 빈 스캔을 하게 되며, 
여기다가도 @Bean 어노테이션을 이용한 빈 정의도 가능하다.

 

 

13. @RequestMapping

요청 URL을 어떤 method가 처리할지 mapping 해주는 어노테이션이다.

Controller나 Controller의 method에 적용한다.

요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.
요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정된다.

 

 

14. @Vailid

유효성 검증이 필요한 객체임을 지정한다.

 

 

15. @SessionAttributes

Session에 data를 젛을 때 쓰는 어노테이션이다.

@SessionAttributes("name")이라고 하면, 
Model에 Key값이 "name"으로 있는 값은 자동으로 세션에도 저장되게 한다.

 

 

16. @RequstBody

요청이 온 데이터(JSON이나 XML 형식)를 바로 Class나 model로 
매핑하기 위한 어노테이션이다.

POST나 PUT, PATCH로 요청을 받을때에, 
요청에서 넘어온 body 값들을 자바 타입으로 파싱해준다.

 

 

17. @RequestParam

@PathVariable과 비슷하다.

컨트롤러 메소드 인자에서 요청받을 때, 요청 주소(URL)에 
? 뒤로 시작하는 질의 문자열, POST 전송 시 요청받을 키/값 등을 받을 수 있다.
(http://localhost:8080/home?index=1&page=2)

request의 parameter에서 가져오는 것이다. method의 파라미터에 사용된다.
?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해준다.

※ 예시

@GetMapping("/home")
public String show(@RequestParam("page") int pageNum {
}

 

 

 


 

Lombok Annotation

 

1. @NoArgsConstructor

기본 생성자를 자동으로 추가한다.

 

※ 예시

@NoArgsConstructor(access = AccessLevel.PROTECTED)

→ 기본 생성자의 접근 권한을 protected로 제한한다.

생성자로 protected Posts() {}와 같은 효과.

 

 

2. @AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 추가한다.

 

 

3. @RequiredArgsConstructor

final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가한다.

※ final : 값이 할당되면 더이상 변경할 수 없다.

 

 

 

 

 


출처