Java/Spring 조각 기록(2)

@Controller@RestController

Java/Spring 조각 기록(1)에 이어 공부하던 중 궁금한 점이 생겼다.

@Controller@RestController의 차이는?

@RestController
public class Controller{
  
  @RequestMapping("/")
  public String index(){
  
    return "mainPage";
  }
}
@Controller
public class Controller{
  
  @RequestMapping("/")
  public String index(){
  
    return "mainPage";
  }
}

위의 두 코드는 다른 결과를 보여준다. @RestController는 요청된 url 페이지에 "mainPage"라는 문자열을 그대로 보여주는 반면, @Controller는 요청된 url 페이지에 지정된 경로의 파일을 mapping하여(기본값은 resources/templates 디렉토리 속 .html 파일) 보여준다.

간략하게 정리하자면 @ControllerView를 반환하고, @RestControllerjson 형태로 데이터를 반환한다는 것.


@RequestMapping, @GetMapping, @PostMapping

HTTP methods 중 GET, POST에 대한 매핑.

@GetMapping@RequestMapping(method=RequestMethod.GET, value="..."),
@PostMapping@RequestMapping(method=RequestMethod.POST, value="...")와 같다.

회원가입 페이지를 만들려 한다고 가정해보자.

"/member/register" url로 접속하면 회원 가입 페이지가 나타나고, 해당 페이지에서 정보를 입력한 뒤 가입 완료를 누르면 서버로 데이터가 전송되며 '회원 가입 완료' 페이지를 나타내주는 코드를 대강 짠다면 다음과 같을 것이다.

@Controller
public class member{
  @GetMapping("/member/register") //해당 url에 대한 GET method 수행
  public String memberRegister(){
  
    return "/member/register"; // resources/templates/member 디렉토리 속 register.html 파일
    // 해당 파일은 <form>, <input> 등을 이용하여 회원 가입에 필요한 정보를 입력받고 전송하게 되어 있을 것.
  }
  
  @PostMapping("/member/register") //같은 url에 대한 POST method 수행.
  public String memberResiterSubmit(){
  
    return "/member/registerComplete"; // 서버로 데이터 전송 후 registerComplete.html 파일로 '회원가입완료' 페이지 보여줌.
  }
}

request, reponse

request : client → server 객체.
response : server → client 객체.
이 둘을 이용하기 위해서 HttpServletRequest, HttpServletResponse를 이용한다.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequest;

// (중략)

@PostMapping("...")
public String memberRegisterSubmit(HttpServletRequest request, HttpServletResponse response){
  String ID = request.getParameter("ID"); // "register.html" 파일 내 <input name="ID">으로 전송된 문자열. 즉 요청 정보 중 "ID"를 name으로 갖는 값을 ID라는 문자열 변수에 저장하겠다는 뜻.
  String PW = request.getParameter("PW");
  
  System.out.println("ID : " + ID + ", PW : " + PW);
  
  return "...";
  }
  //(후략)

매핑된 url에서 client→server의 요청이 발생할 경우 HttpServletRequest 객체에 요청 정보가 저장된다. 이를 parameter로 받아 메소드 내에서 해당 값들을 변수에 저장하여 사용할 수 있다.

이에 대한 응답 정보는 HttpServletResponse 객체에 저장된다.

위에서는 ID, PW만 사용했지만 만약 입력 받은 값이 많다면 어떨까? 여러 개의 parameter에 대해 각각 다 변수를 선언하고 할당하는 작업을 반복해야 할까?
이를 간단히 할 수 있는 방법으로 lombok@Data가 있다.

@Data
public class MemberInputs{
  private String ID;
  private String PW;
  private String name;
}

위처럼 MemberInputs class를 만들어 그 안에 입력받고자 하는 정보들에 대한 필드를 만들고 Data annotation을 이용하면 다음과 같은 방식으로 각각의 정보를 출력할 수 있다.

@PostMapping("...")
public String memberRegisterSubmit(HttpServletRequest request, HttpServletResponse response, MemberInputs infos){

  System.out.println(infos.toString());
  
  return "...";
}

결과는 다음과 같은 형태로 나타난다.

<input>으로 입력받은 정보 중 해당 input들의 name 속성값과 MemberInputs 클래스 내 변수명을 일치시키는 것이 중요하다. 일치하지 않을 경우 다음처럼 출력된다.

('input' 태그의 'name' 속성값을 'ID'가 아닌 다른 것으로 한 상태)

참조

좋은 웹페이지 즐겨찾기