[Spring Boot] Get 메소드 사용법 (@RequestMapping, @GetMapping, 멀티 파라미터, JSON 리턴)
@RequestMapping
import org.springframework.web.bind.annotation.*;
@RestController // controller임을 알려주는 표시
@RequestMapping("/api") // 이곳으로 들어오는 API주소를 mapping, /api주소로 받겠다(localhost:8080/api)
public class GetController {
// method는 GET타입으로 받고, path는 localhost:8080/api/getMethod
@RequestMapping(method = RequestMethod.GET, path = "/getMethod")
public String getRequest() {
return "Hi getMethod";
}
}
위는 @RequestMapping
localhost:8080/api/getMethod로 접속하면 "Hi getMethod" 값이 화면에 뜨는 것을 확인할 수 있다.
@GetMapping
import org.springframework.web.bind.annotation.*;
@RestController // controller임을 알려주는 표시
@RequestMapping("/api") // 이곳으로 들어오는 API주소를 mapping, /api주소로 받겠다(localhost:8080/api)
public class GetController {
// RequestMapping과 다른 게 path만 설정해주면 됨, localhost:8080/api/getParameter?id=1234&password=abcd
@GetMapping("/getParameter")
public String getParameter(@RequestParam String id, @RequestParam(name = "password") String pwd) {
String password = "bbbb";
System.out.println("id: " + id);
System.out.println("password: "+pwd);
return id + pwd;
}
}
http://localhost:8080/api/getParameter?id=1234&password=abcd로 접속하면 "1234abcd" 값이 화면에 뜨는 것을 확인할 수 있다.
@RequestParam의 (name = "password") 부분이 주소창에 있는 password와 @RequestParam의 pwd를 매칭시켜주는 부분이다.
멀티 파라미터의 경우 객체로 받기
import org.springframework.web.bind.annotation.*;
@RestController // controller임을 알려주는 표시
@RequestMapping("/api") // 이곳으로 들어오는 API주소를 mapping, /api주소로 받겠다(localhost:8080/api)
public class GetController {
// localhost:8080/api/getMultiParameter?account=abcd&email=study@gmail.com&page=10
@GetMapping("/getParameter")
public String getMultiParameter(@RequestParam String account,
@RequestParam String email,
@RequestParam int page) {
// 생략
}
}
파라미터 개수가 여러 개인 경우 위와 같이 @RequestParam으로 일일이 파라미터를 선언하기에는 지저분하고 유지보수에도 힘들다. 이 경우 객체로 파라미터를 받으면 된다.
1) String 값으로 리턴
import lombok.AllArgsConstructor;
import lombok.Data;
@Data // getter, setter 자동 생성
@AllArgsConstructor // 모든 매개변수를 가진 생성자가 추가됨
public class SearchParam {
private String account;
private String email;
private int page;
}
위와 같이 클래스를 하나 생성한 다음에 multi parameter로 받을 값들을 선언해둔다.
import org.springframework.web.bind.annotation.*;
@RestController // controller임을 알려주는 표시
@RequestMapping("/api") // 이곳으로 들어오는 API주소를 mapping, /api주소로 받겠다(localhost:8080/api)
public class GetController {
// localhost:8080/api/getMultiParameter?account=abcd&email=study@gmail.com&page=10
@GetMapping("/getMultiParameter")
public String getMultiParameter(SearchParam searchParam) {
System.out.println(searchParam.getAccount());
System.out.println(searchParam.getEmail());
System.out.println(searchParam.getPage());
return "OK";
}
}
http://localhost:8080/api/getMultiParameter?account=abcd&email=study@gmail.com&page=10로 접속하면 화면에 "OK"가 뜨고, 콘솔창에는 getter로 호출한 account, email, page 값들이 뜰 것이다.
2) JSON 형식으로 리턴
지금까지는 get parameter를 받아서 문자열을 return 해보았는데, 실제 네트워크 통신을 할 때는 json 형식으로 통신한다. 그러므로 이번에는 JSON 형식으로 리턴하도록 처리해보자.
import org.springframework.web.bind.annotation.*;
@RestController // controller임을 알려주는 표시
@RequestMapping("/api") // 이곳으로 들어오는 API주소를 mapping, /api주소로 받겠다(localhost:8080/api)
public class GetController {
// localhost:8080/api/getMultiParameter?account=abcd&email=study@gmail.com&page=10
@GetMapping("/getMultiParameter")
public SearchParam getMultiParameter(SearchParam searchParam) {
System.out.println(searchParam.getAccount());
System.out.println(searchParam.getEmail());
System.out.println(searchParam.getPage());
return searchParam; // 객체를 리턴하면 JSON 형식으로 반환된다.
}
}
크게 바뀐 부분은 없다. getMultiParameter의 return값을 String에서 SearchParam으로 변경했는데, 이는 스프링부트가 잭슨(Jackson) 라이브러리를 통해 JSON 형태로 변환해준다. 추가로 searchParam이 어떻게 생긴 것인지 확인하기 위해 "OK"를 return하던 것을 searchParam 객체를 return 하도록 변경해 보았다.
http://localhost:8080/api/getMultiParameter?account=abcd&email=study@gmail.com&page=10로 접속하면 화면에 {"account" : "abcd", "email" : "study@gmail.com", "page" : 10}이 뜨고, 콘솔창에는 getter로 호출한 account, email, page 값들이 뜰 것이다.
기존에는 spring으로 개발할 때는 잭슨 라이브러리를 maven이나 gradle로 가져온 후 변환해야 했고, servlet으로 직접 개발할 때는 객체를 직접 잭슨 라이브러리를 통해 JSON 형식으로 변경하여 return하는 방식으로 개발했다. 하지만 최근에는 HTTP 통신에서 JSON 형식을 표준처럼 사용하고 있기 때문에 스프링부트에서는 기본적으로 잭슨 라이브러리를 내장하고 있고, 객체를 return한다는 것은 JSON 형식으로 리턴한다는 의미이므로 자동으로 변환을 해준다.
[참고]
@GetMapping에 입력하는 주소가 겹치는 경우는 스프링 부트가 실행되지 않으니 주의해야 한다.
단, 서로 다른 class에 대해 @RequestMapping의 주소가 겹치는 경우는 가능하다. (보통 서로 다른 메소드 방식마다 class를 하나씩 만들기 때문)
Rest Client 툴을 이용한 테스트
개발하면서 테스트를 하기 위해서는 rest client라는 툴을 통해서 request를 요청하고 response가 제대로 오는지 테스트 할 수 있다. 크롬 웹 스토어에서 "rest client"라고 검색해보면 여러 확장 프로그램이 뜰 것이다. 나의 경우 Talend API Tester를 설치했다.
맨 처음에 @RequestMapping으로 작성했던 getMethod를 테스트해보자. 아래와 같이 GET METHOD방식으로 http://localhost:8080/api/getMethod 를 호출하면 정상적으로 response가 뜨며(200 OK), BODY 부분에는 return 값으로 작성했던 메시지인 "Hi getMethod"가 뜨는 것을 확인할 수 있다.
(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)
'Java' 카테고리의 다른 글
Lombok(롬복) & JPA 에 대한 간단한 설명, 기본 애너테이션(@) 몇 가지 (0) | 2022.02.24 |
---|---|
[Spring Boot] Post 메소드 사용법 (@PostMapping) (0) | 2022.02.23 |
[Java] Stream이란? 간단한 설명 (0) | 2022.02.13 |
[Java] Generic이란? 자세한 설명 (+ 동적 파라미터화, 함수형 인터페이스) (0) | 2022.02.13 |
[STS] 자동 주석 설정하기 (ini 파일) (0) | 2022.01.10 |