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 파일) 보여준다.
간략하게 정리하자면 @Controller
는 View
를 반환하고, @RestController
는 json
형태로 데이터를 반환한다는 것.
@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'가 아닌 다른 것으로 한 상태)
참조
- https://mangkyu.tistory.com/49
- https://velog.io/@yh20studio/CS-Http-Method-란-GET-POST-PUT-DELETE
- https://memostack.tistory.com/161
- https://ek12mv2.tistory.com/125
Author And Source
이 문제에 관하여(Java/Spring 조각 기록(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ivorrr987/JavaSpring-조각기록2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)