안녕하세요! Plitche(플리체)입니다.
이번 포스팅의 주제는 [JAVA/JSP] getAttribute()와 getParameter()의 차이점입니다.
intro
jsp에서 데이터를 보내서 컨트롤러로 받는 방법은 여러가지가 있다.
- 대표적으로 HttpServletRequest 클래스를 통하여 name을 꺼내는 방법
- DTO(Data Transfer Object)로 데이터를 오브젝트로 받는 방법
- VO(Value Object)로 이름에서 유추가 가능하듯이 값 오브젝트로 받는 방법
- 어노테이션을 활용한 @RequestParam으로 값 받아오는 방법
- 어노테이션을 활용한 @Pathvariable로 url 경로의 변수를 가져오는 방법
등 위의 여러방법 중 오늘은 HttpServletRequest을 통해 값을 가져오는 방법을 알아보려 한다.
Servlet
- WAS가 웹브라우져(view)로부터 Servlet요청을 받으면
- 요청을 받을 때 전달 받은 정보를 HttpServletRequest객체를 생성하여 저장
- 웹브라우져에게 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체)
- 생성된 HttpServletRequest(정보가 저장된)와 HttpServletResponse(비어 있는)를 Servlet에게 전달
HttpServletRequest
- Http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용
- Header정보, Parameter, Cookie, URI, URL 등의 정보를 읽어들이는 메소드를 가진 클래스
- Body의 Stream을 읽어들이는 메소드를 가지고 있음
위의 설명이 다소 어려울 수 있으나, 그냥 jsp(view단)로 부터 Controller로 데이터를 보냈을 때, HttpServletRequest 객체안에 데이터들이 들어가게 된다는 것이다.
이 객체의 메소드를 통해 값을 반환받아 back단에서 처리하는 것이다.
메소드는 대표적으로 getAttribute()와 getParameter()가 있다.
차이점
- 먼저 가장 큰 차이점은 두 메소드의 리턴 타입이다.
- getAttribute()는 Object타입을 리턴하고, getParameter()는 String타입을 리턴한다.
쉬운 설명을 위해서 아래와 같은 간단한 회원가입페이지를 작성하였다.
jsp
<form action="signUp.do">
<input type="text" name="id" placeholder="아이디"/><br/>
<input type="text" name="password" placeholder="비밀번호"/><br/>
<input type="text" name="name" placeholder="이름"/><br/>
<input type="text" name="email" placeholder="이메일"/><br/>
<button>Sign Up</button>
</form>
Controller
1. getParameter()
(컨트롤러는 바로 확인 할수 있도록 추가처리를 하지않고, 바로 출력하여 결과를 확인하였다.)
- String타입을 리턴한다.
- 클라이언트의 HTML 페이지로부터 전송받은 request영역의 값을 읽어온다.
@RequestMapping(value = "signUp.do", method = RequestMethod.GET)
public String home(HttpServletRequest request) {
String id = request.getParameter("id");
String password = request.getParameter("password");
String name = request.getParameter("name");
String email = request.getParameter("email");
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + password);
System.out.println("이름 : " + name);
System.out.println("이메일 : " + email);
return "loginPage";
}
당연하지만 입력 태그에 값을 작성하여서 버튼을 누르면 console창에 아래 사진과 같은 결과를 볼수 있을 것이다.
입력 태그 속성 name으로 HttpServletRequest클래스의 getParameter()메소드를 이용하여 값을 얻어내는 것이다.
2. getAttribute()
- Object 타입을 리턴한다.
- setAttribute()속성을 통한 설정이 없으면 무조건 null값을 리턴한다.
@RequestMapping(value = "signUp.do", method = RequestMethod.GET)
public String home(HttpServletRequest request) {
String id = (String) request.getAttribute("id");
String password = (String) request.getAttribute("password");
String name = (String) request.getAttribute("name");
String email = (String) request.getAttribute("email");
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + password);
System.out.println("이름 : " + name);
System.out.println("이메일 : " + email);
return "loginPage";
}
(Object타입을 리턴하기 떄문에 원하는 타입으로 캐스팅해줘야 한다.)
메소드만 다르고 똑같이 입력하였지만 아래 사진과 같이 모두 null값을 리턴하는 것을 볼 수 있다.
원하는 값을 얻어내기 위해서는 request.setAttribute("name", "plitche"); 처럼 설정해줘야 하는데, 사실 그럼 굳이 쓸 이유가 없다.
- getAttribute()는 이전에 다른 JSP 또는 Servlet 페이지에 설정된 매개 변수를 가져 오는데 사용된다.
- getAttribute()는 request.setAttribute()를 사용하여 정보를 추가하고, 현재 요청을 다른 자원으로 전달/redirection 할 수 있다.
review
- 아직 저도 getAttribute()의 필수적인 용도나 자세한 사용법에 대해서는 잘 알지 못하지만, 위의 내용으로 현재는 이해하고 있습니다.
- 추가적인 예시나 보다 더 이해하기 쉬운 예제가 있다면, 바로 추가 포스팅하여 공유하겠습니다!^^
오늘도 감사합니다.
'Language > Java' 카테고리의 다른 글
[Java] Socket 통신 간단 예제 (0) | 2023.05.08 |
---|---|
[Java] 실무에서 사용하는 코딩 (0) | 2022.07.28 |
[Java] SimpleDateFormat 사용법 - 날짜 형식 지정 (0) | 2022.02.15 |
[Java] 자바 제곱, 제곱근 구하기(Math 함수) (0) | 2022.02.15 |
[Java] Array(배열)과 ArrayList의 차이, 그리고 정렬(Sort) (0) | 2022.02.15 |