스프링 입문

🍀 스프링 Get Controller

King of Silicon Valley 2021. 10. 23. 12:35
728x90

이번 시간에는 스프링 Get Controller에 대해서 알아 보겠습니다. 

 

Get 요청이 왔을 때 Controller에서 데이터를 내려 주는 여러가지 방식과 각종 어노테이션을 소개합니다. 

 

단순 문자열 반환 

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // 해당 class는 REST API 처리하는 Controller
@RequestMapping("/api") // Requestmapping URI 를 지정해주는 Annotation
public class ApiController {

    @GetMapping("/hello")   // http://;ocallgjost:9090/api/hello
    public String hello() {
        return "hello spring boot";
    }
}

 

 스프링 부트 프로젝트에 ApiController라는 클래스를 만들어 주었습니다. 

 

어노테이션부터 살펴 보겠습니다. 

 

@RestController 

REST API 처리하는 class라고 알려주는 어노테이션 입니다. 

 

@RestController는 Spring MVC Controlle에 @ResponseBody가 추가된 것입니다. 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것입니다.
출처: https://mangkyu.tistory.com/49 [MangKyu's Diary]

 

@ResponseBody를 붙여주지 않아도 됩니다.

 

@RequestMapping

요청 엔드포인트를 지정해주는 어노테이션 입니다. 

예제에서는 'api'라고 지정 했는데 주소+/api규칙으로 호출 되면 어노테이션을 지정한 클래스가 실행 됩니다. 

 

@GetMapping

HTTP메소드가 GET 요청일 경우 실행되는 메소드에 붙여 줍니다. 

인자로 엔드포인트를 넣어줄 수 있습니다. 

예제에서는 api/hello로 get 요청을 보내면 @GetMapping어노테이션을 단 hello()메소드가 실행 됩니다. 

 

문자열 반환 

문자열을 반환하려면 return문에 문자열을 적어주면 적어준 문자열을 반환합니다. 

 

 

Path 파라미터

Controller에서 path파라미터를 받는 방법을 알아보겠습니다. 

 

@RestController
@RequestMapping("/api/get")
public class GetApiController {

    @GetMapping(path = "/hello") // http://localhost:9090/api/get/hello
    public String Hello() {
        return "get hello";
    }

    @RequestMapping(path = "/hi", method = RequestMethod.GET) // get htto://localhost:9090/api/hi
    public String hi () {
        return "hi";
    }
}

 

위의 예제와 같은 경우는 패스파라미터를 변수로 받는 경우가 "아닌" 지정한 규칙대로 실행하게 하는 예제 입니다. . 

 

@GetMapping은 위에서 설명했고 

 

@RequestMapping을 사용해서 @GetMapping과 같은 방식으로 사용할 수 있습니다. 

method = RequestMethod."HTTP메소드" 를 넣어주면 해당하는 HTTP메소드를 지정해줄 수 있습니다. 

 

 

path파라미터를 변수로 받는 방법은 아래와 같습니다. 

// http://localhost:9090/api/get/path-variable/{name}
    // {} 안의 이름과 인자의 이름을
    @GetMapping("/path-variable/{id}/{name}")
    public String pathVariable (@PathVariable(name = "id") String pathName, @PathVariable(name = "name") String name) {
        System.out.println("Pathvariable : "+pathName+name);
        return pathName+name;
    }

@GetMapping 어노테이션에 url규칙을 정할 때 path파라미터 변수가 될 부분을 {}안에 넣어 줍니다. 

위의 예제에는 id와 name이 패스파라미터의 변수가 될 수 있습니다. 

 

그 다음은 메소드의 인자에 @PathVariable을 집어넣어서 path파라미터로 들어온 변수 값을 메소드내에서 인자로 사용할 수 있습니다. 

예제를 보며 설명해보자면 

(@PathVariable(name = "id") String pathName

{id}에 들어온 변수는 pathName이라는 이름으로 받는다 라는 뜻입니다. 

 

@PathVariable(name = "name") String name

또한 {name}안에 들어온 변수는 name이라는 이름으로 받는다는 뜻 입니다. 

 

예제의 경우는 {}안의 값과 다른 이름으로 받을 때 사용하는 방법이고 

{}안의 값과, 인자의 값과 이름이 같으면  (name= '')옵션은 생략해도 됩니다. 

그냥 @PathVariable("name") String name 이런식으로 사용할 수 있습니다. 

 

쿼리 파라미터 

이번에는 쿼리 파라미터를 받는 방법에 대해서 알아보겠습니다. 

 

@GetMapping(path = "query-param")
    public String queryParam(@RequestParam Map<String, String> queryParam){
        StringBuilder sb = new StringBuilder();

        queryParam.entrySet().forEach(entry -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
            System.out.println("\n");

            sb.append(entry.getKey()+" = "+entry.getValue()+"\n");
        });

        return sb.toString();
    }

    @GetMapping("query-param02")
    public String queryParam02(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam int age
    ){
        System.out.println(name);
        System.out.println(email);
        System.out.println(age);
        return name+" "+email+" "+age;
    }

위 에제는 쿼리파라미터를 받는 방법중 두가지 입니다. 

 

하나는Map으로 받아서 반목문을 돌려서 키값과 벨류를 뽑아내는 방법이고 

 

다른 하나는 지정한 쿼리 파라미터 변수값으로 값을 뽑아내는 방법입니다. 

 

실무에서는 위 두가지의 방법 보다는 아래에서 소개 해주는 방법을 사용한다고 합니다. 

 

@GetMapping("query-param03")
    public String queryParam03(
            UserRequest userRequest
    ){
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAge());
        return userRequest.toString();
    }

 

 

인자에 UserRequest라는 클래스를 받아서 get메소드로 정보를 조회 합니다. 

 

이 방식을 사용하려면 DTO(data access object)를 정의 해야 합니다. 

 

public class UserRequest {

    private String name;
    private String email;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserRequest{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

인자에 사용할 DTO object는 각 멤버변수를 private로 선언하고 

getter setter를 만들어서 사용해 줍니다. 

toString을 만들어주면 Json으로 나가는 형식을 지정해 줍니다. 

 

 

'스프링 입문' 카테고리의 다른 글

🍀 @JsonProperty  (0) 2021.10.23
🍀 스프링 PostController  (0) 2021.10.23
🚀 장고와 🍀스프링  (0) 2021.10.11
🍀 스프링 welcome page 연결하기  (0) 2021.10.06
🍀 스프링 프로젝트 시작하기  (0) 2021.10.05