본문 바로가기
BOOKS/Spring Boot

spring에서 사용하는 주요 Annotation

by IT여행자 2022. 7. 14.
728x90

안녕하세요. IT 이곳 저곳을 여행하고 있는 IT여행자입니다. 이번 여행자 수첩에서는 스프링에서 주로 사용하고 있는 어노테이션 몇가지를 정리해 보려 합니다. 그럼 시작해 볼까요~~


 

spring에서 사용하는 어노테이션들은 굉장히 다양하다. 그중에 자주 사용하는 어노테이션을 정리하였다. annotation이란 자바의 메타데이터로 컴파일할 때 그 기능을 주입하는 역활을 한다.

 

1. @Bean

이미 만들어진 클래스를 빈으로 등록하기 위해 지정한다.

 

@Bean
@Bean(name="id명")
  • name이 지정되면 지정된 "id"으로 빈을 등록할 수 있다.

아래의 코드는 Config 클래스에서 빈을 등록하고 있는 모습이다.

 

@Configuration
public class AppConfig {
   @Bean(value = "myBean")
   public BeanInterface getMy() { return new MyBean(); }
	
   @Bean(value = "yourBean")
   public BeanInterface getYour() { return new YourBean(); }
}

----------------------------

@Component
public class BeanTest {
   @Autowired()
   BeanInterface myBean;

   public BeanTest() {
	   System.out.println("BeanTest.....");
   }
	
   @PostConstruct
   public void output() {
	   myBean.msg();
   }
}
  • 출력 결과는 MyBean안에 있는 msg()메서드가 실행되는것을 알 수 있다.

2. @Component

자바클래스를 스프링이 사용할 수 있는 빈으로 등록시켜준다. 클래스를 정의할 때 지정한다.

 

@Compoment
@Compoment(value="myBean")

 

@Component
public class BeanTest {
   String id;
   int age;

   public BeanTest() {
      System.out.println("BeanTest.....");
   }
}
  • 스프링이 시작되면 빈이 등록되어 콘솔창에 생성자에 쓰여진 내용이 출력된다.

 

하나의 interface를 구현한 두 개 이상의 클래스를 구분하여 주입받는 예이다.

 

public interface BeanInterface {
   public void msg();
}

--------------------
@Component(value = "myBean")
public class MyBean implements BeanInterface{
   public MyBean() {
      System.out.println("MyBean.....");
   }

   @Override
   public void msg() {
      System.out.println("MyBean.msg()....");
   }

}

----------------------------
@Component(value = "yourBean")
public class YourBean implements BeanInterface{
   public YourBean() {
      System.out.println("YourBean.....");
   }

   @Override
   public void msg() {
      System.out.println("YourBean.msg()....");		
   }
}

--------------------------------
public class BeanTest {
   @Autowired()
   BeanInterface yourBean;
	
   public BeanTest() {
      System.out.println("BeanTest.....");
   }
	
   @PostConstruct
   public void output() {
      yourBean.msg();
	
   }
}

 

YourBean안에 있는 msg()가 실행되는것을 확인할 수 있다. @PostConstruct 어노테이션은 사용하려는 빈의 생성자가 실행된후 해당 메서드가 실행되도록 조치해 주는 어노테이션이다.

 

3. @CompomentScan

@Compoment, @Serivce, @Repository, @Controller, @Configuration으로 설정된 클래스들을 찾아 빈으로 등록한다. , @CompomentScan 어노테이션이 붙은 클래스의 패키지 하위에 존재하는 클래스들을 대상으로 한다.

 

4. @Configuration

spring에서 사용하는 빈들을 등록하는 config 클래스를 만들어 준다.

 

@Configuration
public class AppConfig {

   @Bean(value = "myBean")
   public BeanInterface getMy() { return new MyBean(); }
	
   @Bean(value = "yourBean")
   public BeanInterface getYour() { return new YourBean(); }
}

5. @Controller , @RestController

해당 클래스를 컨트롤러로 등록한다. 컨트롤러 클래스들은 사용자의 요청처리를 전달받는 클래스들을 의미한다. @RestController는 웹과 관련하여 보다 편리한 기능들을 추가로 제공한다.

 

6. @RequstMapping

사용자의 요청처리와 같은 값일 때 해당 클래스나 메서드가 실행된다.

 

@RequestMapping("요청값")
@RequestMapping(value="요청값")
@RequestMapping(value="요청값", method={RequestMethod.POST , RequestMethod.GET})

 

사용자로부터 "/"가 요청되면 MyClass가 실행된다.

 

@RequestMapping("/")
public class MyClass{ ... }

 

사용자로 부터 "/"가 요청되면 myMethod()가 실행된다.

@RequestMapping("/")
public void myMethod(){ ... }

 

7. @RequestBody

클라이언트가 보낸 데이터의 형식을 JSON이나 XML 또는 기타 Object 타입으로 받을 수 있도록 해준다. 그러나 실제로 spring boot에서는 @Controller보다 @RestContoller를 사용하게 되면 따로 @RequestBody를 선언할 필요가 없다.

 

@Controller
@RequestBody
public class MyController{ ... }

 

8. @ModelAttribute

클라이언트로 부터 multipart/form-data 형태로 값이 전달되었을 때 데이터를 지정된 객체에 연결해 준다.

 

public void multi(@ModelAttribute AttFile attFile)
public void multi(@ModelAttribute("myFile") AttFile attFile)

"myFile" 처럼 이름이 지정된 경우 "myFile" 속성값으로 사용자에게 리턴된다.

 

9. @RequestParam

웹에서 전달한 파라메터변수값을 다른 이름의 객체에 전달하고자 할 때 사용.

 

public void method(@RequestParam("abc") String name){ ... }
  • 파라메터 abcname변수로 바꾸어서 사용하도록 한다.

 

10. @Autowired

등록된 bean을 자동으로 주입받게 하는 기능을 한다. 빈을 주입하는 방법은 먼저 클래스의 유형이 같은것( byType)을 주입하고 같은게 없으면 변수명과 같은 빈(byName)을 주입하게 된다.

 

11. @GetMapping | @PostMapping

각각 @RequestMapping(method='GET') @RequestMapping(method='POST') 와 같은 의미이다.

 

12. @Order

빈의 생성 순서를 정할 수 있다.

 

@Order(1) or @Order(value=1)
public class First{ ... }
@Order(2)
public class Second{ ... }
  • First 클래스가 먼저 생성되고 Second 클래스가 나중에 생성된다.

 

13. @PostConstruct

@Autowire등으로 참고하고 있는 빈이 생성되었을 때 실행되는 메서드를 만들수 있다. 빈을 주입받는 클래스의 생성자에는 사용할 수 없고, 일반 메서드에 붙여 사용한다.

 

Other o;
@PostConstruct
public void method(){
   o.msg();
}
  • method()를 실행하기전 Other 클래스의 생성자를 먼저 실행하여 객체가 생성되도록해 준다.

 

14. @Qualifier

주입되는 빈의 모호성을 해결하기 위해 사용된다.

빈을 등록할 때

 

@Qualifier("my")
public class My implements Human{ ... }

@Qualifier("you")
public class You implements Haman{ ... }

 

등록된 빈을 사용하려 할 때

 

@Qualifier("my")
@Autowired
Haman my; // My 클래스가 주입됨


15. @Primary

빈 생성시 어느 한쪽이 다른한쪽의 빈의 기반이 될 때 항상 먼저 생성되어야 할 빈에 붙여준다.

 

 

16. @SpringBootTest

spring boot test에 필요한 의존성을 제공해 준다.

 

17. @Test

jUnit에서 테스트할 대상을 표시한다.

 


이상으로 주로 많이 사용되는 어노테이션들의 종류와 특징을 간단히 알아보았다. 계속해서 즐거운 IT여행이 되시길 바랍니다.