S E P H ' S

[Spring] 8. Annotation & 스프링(Spring)에서 자주 사용하는 Annotation 본문

Programing & Coding/Spring

[Spring] 8. Annotation & 스프링(Spring)에서 자주 사용하는 Annotation

yoseph0310 2023. 6. 11. 18:39

Annotation

어노테이션은 Spring에서 많이 사용되기는 하지만 Java 자체 기술이다. 스프링을 사용하면서 자연스럽게 많이 사용하거나 심지어는 그냥 그러려니 하고 지나가지만 동작 원리에 대해서는 제대로 생각해보지 않았던 사람들이 많을 것이다. (나도 마찬가지..) 

 

어노테이션은 사전적의미로는 주석이라는 뜻이다. 자바에서 사용될 때 어노테이션은 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에 추가적인 정보를 제공해주는 메타데이터(데이터를 위한 데이터)라고 볼 수 있다.

 

어노테이션에 대한 자세한 설명은 [Java] 6. Annotation 에서 확인할 수 있다.

 


Spring의 대표적인 Annotation과 역할

@Component

개발자가 생성한 클래스를 Spring의 Bean으로 등록할 때 사용한다. Spring은 해당 어노테이션을 보고 Spring의 Bean으로 등록한다.

@Component(value="myman")
public class Man {
    public Man() {
    	System.out.println("hello.");
    }
}

 

@ComponentScan

Spring 프레임워크는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면 Context에 bean으로 등록합니다. 스프링 컨테이너와 빈을 공부했으니 다시 정리해보자. 스프링 컨테이너 즉, BeanFactory 인터페이스와 여러 인터페이스를 상속하여 다양한 기능을 가진 ApplicationContext가 컴포넌트 스캔을 통해 @SpringBootApplication이 붙은 클래스에서부터 모든 하위 클래스들을 확인하면서 해당 어노테이션들을 확인하고 Bean으로 등록한다.

 

 

@Bean

개발자가 제어 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들때 사용한다.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http... (생략)

    return http.build();
}

SpringSecurity Config를 구현할때 이전에는 WebSecurityConfigurerAdapter 클래스의 configure 메소드를 사용했었는데 Deprecated 됨에 따라서 따로 필터 체인을 Bean으로 사용하는 코드를 예시로 가져와봤다.

 

 

@Controller

@Controller				// 이 클래스는 Controller 역할을 한다.
@RequestMapping("/test") 		// 이 클래스는 /test 로 들어오는 요청을 모두 처리한다.
public class TestController {
	
    @GetMapping()
    public ResponseEntity<String> test() {
    	return ...;
    }
}

스프링에게 해당 클래스가 컨트롤러의 역할을 한다고 명시하기 위해 사용한다.

 

 

@RequestHeader

Request의 header 값을 가져올 수 있으며, 해당 어노테이션을 사용한 메서드의 파라미터에 사용된다.

@Controller                   // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user")      // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
    @RequestMapping(method = RequestMethod.GET)
    public String getUser(@RequestHeader(value="Accept-Language") String acceptLanguage) {
        //  GET method, /user 요청을 처리
    }
}

 

@RequestMapping

@RequestMapping(value="") 와 같은 형태로 작성하며 요청이 들어온 URI의 요청과 어노테이션 value가 일치하면 해당 클래스나 메소드가 실행된다. Controller 객체 안의 메소드와 클래스에 적용 가능하며 주로 아래와 같이 사용된다.

 

@Controller
@RequestMapping("/user")
public class UserController {
	
    @RequestMapping(method = RequestMethod.GET)
    public String getUser(Model model) {
    	...
    }
}

 

위 코드는 클래스와 메소드에 어노테이션을 적용한 모습이다. 클래스에는 주로 URI를 명시하여 예시와 같다면 '/user' 로 들어오는 요청은 해당 클래스가 컨트롤러 역할을 하여 수행을 한다. 메소드에는 method = value 를 사용하여 어떤 요청으로 받을지 정의하는데 주로 메소드에는 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 과 같이 사용한다. 추가적인 url을 지정하려면 다음과 같이 사용하면 된다.

 

@Controller
@RequestMapping("/user")
public class UserController {
	
    @GetMapping()
    public String getUserList(Model model) {
    	...
    }
    
    @GetMapping("/detail/{userNickname}")
    public String getUserList(Model model) {
    	...
    }
}

 

@RequestParam

URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜 파라미터를 받아서 처리할 수 있는 어노테이션이다. Json 형식의 Body를 MessageConverter를 통해 Java 객체로 변환시킨다.

 

@GetMapping("/alarm")
public ResponseEntity<?> getMediAutoSearchList(@RequestParam String searchKeyword){

    List<MediGetRes> mediList = medicineService.getMediAutoListInfo(searchKeyword);

    return ResponseEntity.status(200).body(mediList);

}

 

 

@RequestBody

Body에 전달되는 데이터를 메소드의 인자와 매칭시켜 데이터를 받아 처리 할 수 있는 어노테이션이다. 클라이언트가 보내는 HTTP 요청 본문 (JSON, XML 등)을 Java 객체로 변환한다.

 

@PostMapping()
public ResponseEntity<?> insertAlarm(Authentication authentication, @RequestBody AlarmPostReq alarmPostReq) {

    int result = alarmService.insertAlarm(authentication, alarmPostReq);

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("alarmId", result);

    return ResponseEntity.status(200).body(map);

}

 

@ModelAttribute

클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1 객체에 데이터를 연결(바인딩)한다. RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구한다. JSON을 받아 처리하는 것은 불가능하다.

 

 

@ResponseBody

메소드에서 리턴되는 값이 View로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 된다. return 시에 json, xml과 같은 데이터를 리턴한다.

 

 

@Autowired

Spring Framework에서 Bean 객체를 주입받기 위한 방법은 크게 3가지가 있는데 그 중 하나의 방법이 @Autowired(필드 주입방식)를 사용하는 것이다. 스프링이 클래스를 보고 타입에 맞게 Bean을 주입한다.

 

@SpringBootTest 

Spring Boot Test에 필요한 의존성을 제공.

 

@Test

JUnit에서 테스트할 대상을 표시.