REST API - GET:
Read 기능을 한다.
리소스 취득.
특정 위치에 서버가 올라가 있다고 한다면, 이 서버로 클라이언트가 요청을 해줘야 한다. 클라이언트가 특정 요청을 보내주기 위해서는 진입점이 어떤 주소를 가지는지 작성해야 한다.
RestApiController클래스를 만들어 어떤 주소를 받을 것인지 설정해보자.
스프링부트는 어노테이션 기반으로 작성하도록 설계되어있다. 이 어노테이션을 통해 XML 설정이 아닌, 어노테이션 설정으로 각 클래스, 메서드에 역할을 부여할 수 있따.
@RestController //RestApi를 처리하는 컨트롤러
@RequestMapping("/api") //api로 시작하는 주소를 받겠다.
RequestController: 특정 컨트롤러 기능을 하는 특정 클래스를 지칭하기 위해 쓰는 Rest controller
@GetMapping(path = "/hello")
GET 메서드 어노테이션.
path : 어떠한 주소 (현재는 /hello) 를 처리하겠다.
@GetMapping(path = "/hello")
public String hello(){
var html = "<html> <body> <h1>Hello spring boot </h1> </body> </html>";
return html;
}
"http://localhost:8080/api/hello"
라는 주소를 검색하면, Hello spring boot 를 리턴하겠다. (현재 8080 포트 사용 중)
GET 은 path variable을 취득 할 수 있다.
path variable ? 주소 내 정보를 전달하는 방법.
//http://localhost:8080/api/echo/hello/age/24/is-man/false
@GetMapping(path ="/echo/{message}/age/{age}/is-man/{isMan}")
{} 중괄호를 사용한다.
get에서 특정한 리소스를 가져올 때 사용한다.
path variable을 사용하려면 매개변수에 @PathVariable 이라는어노테이션을 지정해야한다.
@GetMapping(path ="/echo/{message}") //Path variable 있다면 중괄호가 들어감
public String echo(@PathVariable String message){
System.out.println("echo message" + message);
return message;
}
}
매개변수 이름은 중괄호 안 이름과 동일하게 맞춰 쓰면 된다. - > 매개변수 이름을 msg 로 쓴다면 ?
-> 주소값과 다르기 때문에 매칭되지 않음
해결 방법: @PathVariable(name = " " ) 네임에 주소 값을 넣어줘 어떤 것과 매칭시킬지 지정한다.
(@PathVariable(name = "message") String msg
@GetMapping(path ="/echo/{message}/age/{age}/is-man/{isMan}") //Path variable 있다면 중괄호가 들어감
public String echo(@PathVariable(name = "message") String msg,//주소에는 대문자를 넣지 않아서 _ 사용
@PathVariable int age, //PathVariable: 경로에서 값을 추출할 때 사용.
@PathVariable boolean isMan){
System.out.println("echo message" + msg);
System.out.println("age" + age);
System.out.println("or not" +isMan);
System.out.println();
return msg.toUpperCase(); // 대문자로 변환해 리턴
//String 타입 변수 외 다른 타입 받기, boolean, integer
//int : null 불가. 기본 값이 0
//Integer : null 할당 가능
//이 경우엔, int 가 어울린다.
}
Query Parameter로 데이터를 받는 방법
query parameter: 특정 정보의 필터링을 걸 때 사용한다.
?로 시작하고, 키 값 형태로 이루어져있다. 이어주는 형태는 & 로 묶어준다.
ex:
http://localhost:8080/api/book?category=IT&issuedYear=2023&issued-month=01&issued_day=31
category, issuedYear, issued-month, issued_day 가 쿼리 파라미터이고,
각각의 값은 IT, 2023, 01, 31 이다.
수동 파싱 방법:
// http://localhost:8080/api/book?category=IT&issuedYear=2023&issued-month=01&issued_day=31
//category 부터 파싱.
@GetMapping(path = "/book")
public void queryParam( @RequestParam String category, // RequestParam: 쿼리 매개변수에서 값을 추출할 때 사용.
@RequestParam String issuedYear,
@RequestParam (name = "issued-month")String issuedMonth, //카멜 케이스 맞춰주려고
@RequestParam (name ="issued_day")String issuedDay){
System.out.println(category );
System.out.println(issuedYear);
System.out.println(issuedMonth);
System.out.println(issuedDay);
}
@RequestParam : 리쿼스트 파라미터로 들어오는 것을 매칭 시키겠다.
자바에선 issued-month, issyed_day 는 컨벤션에 어긋나는 변수 이므로
카멜 케이스 작성 후, 맵핑 시켜준다. @RequestParam (name = "issued_month") String issuedMonth
하지만 이런 수동 파싱 방법은 객체가 많아지면 귀찮아진다.
파싱 방법 2. 객체를 통한 방법
모델을 생성한다.
@Data //롬복 사용할 때 쓰는 어노테이션
@AllArgsConstructor //전체 파라미터를 가진 생성자 추가
@NoArgsConstructor //기본 생성자
public class BookQueryParam {
private String category;
private String issuedYear;
private String issuedMonth;
private String issuedDay;
}
@Data, @AllArgsConstrutor, @NoArgsConstructor를 사용해 setter, getter, construtor을 작성하지 않아도 된다.
/http://localhost:8080/api/book2?category=IT&issuedYear=2023&issuedMonth=01&issuedDay=31
@GetMapping(path ="/book2")
public void queryParamDto( BookQueryParam bookQueryParam){
System.out.println(bookQueryParam);
}
}
매개변수에 모델 클래스 이름을 넣으면 된다.