Spring 어노테이션
스프링 프레임워크에서 어노테이션(Annotation)은 자바 언어의 기능 중 하나이다. 주석과 같이 어떤 의미가 있는지 알려주는 것으로 사용되지만 주석보다는 더 기능적인 면이 있다. 컴파일러에게 "이렇게 처리해주세요"라고 하는 느낌이라고 이해했다. 그냥 한마디로는 소스 코드에 메타데이터를 추가하는 방법이다.
어노테이션은 @ 기호를 사용하여 특정 요소에 대한 부가 정보를 나타내며, 컴파일러, 프레임워크, 라이브러리 등이 이 정보를 활용할 수 있는데
어노테이션 중 2가지에 대해 이해해보려고 한다.
@RequestParam과 @PathVariable인데 두 어노테이션 모두 요청 매개변수를 받는 것이다.
하지만, 두 어노테이션은 매개변수를 전달하는 방법이 약간 다르다.
@RequestParam은 ?매개변수={매개변수값} 형태로 넘어오고
@PathVariable을 사용했을 때는 @GetMapping("/{매개변수}") 형태인 URI의 경로로 넘어온다.
설명으로는 이해가 쉽지 않으니 아래 소스코드와 예시를 작성했다.
1. @RequestParam
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController //rest컨트롤라는걸 명시함
@RequestMapping("test") // 요청,응답 매핑 해주는 어노테이션
public class TestController {
@GetMapping("/testRP")
public String TestRequestParam(@RequestParam(required = false)String name) {
return "안녕" +name;
}
}
위 코드가 있을 때, Mapping은 해당 주소/요청이 들어왔을 때 처리한다는 것을 알린다.
위 컨트롤러의 메서드는 /test/testRP라는 주소로 Mapping되어있다.
@RequestParam은 [?매개변수={매개변수값]] 이라고 했으니
http://localhost:8080/test/testRP?name= 민민의 하드디스크
라고 입력하면 아래의 출력화면이 나온다.
2. @PathVariable
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //rest컨트롤라는걸 명시함
@RequestMapping("test") // 요청,응답 매핑 해주는 어노테이션
public class TestController {
@GetMapping("/{name}")
public String TestPathVariable(@PathVariable(required = false)String name) {
return "안녕" +name;
}
}
반면 실행해본다면 (http://localhost:8080/test/)로 들어갈 것이다.
@PathVariable은 {매개변수값}을 직접 적어줘도 적용이된다.
예를 들어,
http://localhost:8080/test/ 민민의 하드디스크
를 입력하면 아래와 같은 화면을 볼 수 있다.
결과는 같지만 동작이 다르니, 꼭 매개변수가 필요하지 않다면 PathVariable을 사용하고 매개변수가 필요할 때라면 RequestParam을 사용하여 값을 넘겨주면 될 것 같다.