Everything has an expiration date
[inflearn] 20240113 [스프링-프레임워크] - 18강 필기 본문
[inflearn] 20240113 [스프링-프레임워크] - 18강 필기
Jelly-fish 2024. 1. 14. 14:4018강 - Controller 객체 구현
컨트롤러의 URL 맵핑과 파라미터 처리 방법에 대해서 학습한다.
18-1 웹 어플리케이션 준비
18-2 @RequestMapping 을 이용한 URL 맵핑
18-3 요청 파라미터
18-2 @RequestMapping 을 이용한 URL 맵핑
메소드에 `@RequestMapping` 적용
클라이언트가
`http://localhost:8090/lec18/memJoin` URL 을 요청하면
컨트롤러의 `memJoin()` 메소드가 맵핑되어 실행된다.
클래스에 `@RequestMapping` 적용
MemberController.java
// 기능에 따른 컨트롤러 클래스 제작
@RequestMapping("/member")
public class MemberController
{
@RequestMapping("/memJoin")
public String memJoin()
{
// 컨트롤러 안의 세부 기능 작성
}
@RequestMapping("/memLogin")
public String memLogin()
{
// 컨트롤러 안의 세부 기능 작성
}
}
① `<form>` 태그에 의해서, 클라이언트가 회원 정보를 입력한 후,
`<input type="submit" value="Join">` 버튼을 클릭하게 되면
클라이언트는 `http://localhost:8090/lec17/memJoin` url을 요청하게 된다.<form action="/lec17/memJoin" method="post">
memJoin.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Member Join</h1>
<form action="/lec17/memJoin" method="post">
ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
MAIL : <input type="text" name="memMail" ><br />
PHONE : <input type="text" name="memPhone1" size="5"> -
<input type="text" name="memPhone2" size="5"> -
<input type="text" name="memPhone3" size="5"><br />
<input type="submit" value="Join" >
<input type="reset" value="Cancel" >
</form>
<a href="/lec17/resources/html/login.html">LOGIN</a> <a href="/lec17/resources/html/index.html">MAIN</a>
</body>
</html>
② `HandlerMapping` 이 클라이언트가 `/memJoin` URL을 요청 했을 때, 동작해야 할 컨트롤러를 찾아준다.
③ `HandlerAdapter` 가 `/memJoin` URL에 맞는 메소드를 찾아준다.
`/memJoin` URL 을 클라이언트가 요청했을 때, 최종적으로 동작하는 컨트롤러와 메소드
→ `MemberController.java`, `String memJoin()`
@Controller
public class MemberController
{
@Resource(name="memService")
MemberService service;
@RequestMapping(value="/memJoin" method=RequestMethod.POST)
public String memJoin(Model model, HttpServletRequest request)
{
// 클라이언트로부터 입력받은 정보를 받아오기.
String memId = request.getParameter("memId");
String memPw = request.getParameter("memPw");
String memMail = request.getParameter("memMail");
String memPhone1 = request.getParameter("memPhone1");
String memPhone2 = request.getParameter("memPhone2");
String memPhone3 = request.getParameter("memPhone3");
// 입력받은 값을 데이터베이스의 테이블에 입력하는 처리.
service.memberRegister(memId, memPw, memMail, memPhone1, memPhone2, memPhone3);
// 입력받은 값을 View 페이지에 보여주기 위해 model 객체에 입력값 저장하기.
model.addAttribute("memId", memId);
model.addAttribute("memPw", memPw);
model.addAttribute("memMail", memMail);
model.addAttribute("memPhone", memPhone1 + "-" + memPhone2 + "-" + memPhone3);
// 위의 처리를 모두 끝낸 후에 memJoinOk.jsp 뷰 페이지로
// 클라이언트를 이동시키기 위해 뷰 페이지의 파일명을 String 형태로 return.
return "memJoinOk";
}
}
[ ★ 참고 사항 ★ ]
①
클라이언트로부터 정보 입력을 받는 View 페이지에서의
`<form>` 태그 `method` 속성과
사용자가 `<form>` 태그의 `action` 과 일치하는 URL 요청을 보냈을시 동작하는
컨트롤러의 `method` 속성을 일치시켜 주도록 하자.
`method` 가 달라도 에러가 발생하진 않고, `value`를 참고해서 메소드를 실행시켜 주기는 한다.
[memJoin.html]
<form action="/lec17/memJoin" method="post">
 ̄ ̄ ̄ ̄ ̄ ̄ ̄★
[MemberController.java]
――――――――――――――――――――――――★
@RequestMapping(value="/memJoin" method=RequestMethod.POST)
public String memJoin(Model model, HttpServletRequest request)
{
....
}
②
GET 방식의 요청일 경우 (`<form action="URL" method="get">` )
`@RequestMapping`의 `method` 속성을 생략할 수 있다.
@RequestMapping("/memJoin")
// 요청 방식 : GET 일 경우 위와 같이 생략하여 작성 가능.
③
공통된 부분을 클래스 상단에 명시해 줄 수 있다.
클라이언트가 요청하는 URL이 `/memJoin`이 아니라, `/member/memJoin` 과 같이
하나의 폴더를 상위에 두고 있을 경우, 공통된 부분인 `/member`를 컨트롤러 상단에 명시해 주면
컨트롤러 내부에 있는 메소드들은 모두 `/member/memJoin` 과 같은 요청을 받았을 때
동작하도록 구성 된다.
package com.bs.lec17.member.controller;
import javax.annotation.Resource;
@Controller
@RequestMapping("/member") //-- check~!!!
public class MemberController
{
// 이 메소드는,
// 클라이언트가 『/member/memJoin』URL을 요청했을 경우에
// HandlerAdapter에 의해 실행된다~!!!
@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Model model, HttpServletRequest request)
{
....
}
}
18-3 요청 파라미터
HttpServletRequest 객체를 이용한 HTTP 전송 정보 얻기
[login.html]
ID : <input type="text" name="memId" >
PW : <input type="password" name="memPw" >
MemberController.java
@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, HttpServletRequest request)
{
// check~!!!
//***************************************************
// 클라이언트로부터 입력받은 『memId』 받아오기
String memId = request.getParameter("memId");
// 클라이언트로부터 입력받은 『memPw』 받아오기
String memPw = request.getParameter("memPw");
//***************************************************
Member member = service.memberSearch(memId, memPw);
try
{
model.addAttribute("memId", member.getMemId());
model.addAttribute("memPw", member.getMemPw());
}catch (Exception e)
{
e.printStackTrace();
}
return "memLoginOk";
}
`request.getParameter("http 파일 name 명")` 을 사용하지 않고 클라이언트의 입력 값을 받아오기
→ `@RequestParam` 어노테이션 사용
@RequestParam("받아올 input 객체 name") String(받아올 객체 타입) memId(저장할 변수명) → @RequestParam("memId") String memId
@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, @RequestParam("memId") String memId
, @RequestParam("memPw") String memPw)
{
// 매개변수에 @RequestParam 어노테이션을 사용함으로써
// 더이상 [request.getParameter()] 메소드를 사용하지 않아도 된다!
//String memId = request.getParameter("memId");
//String memPw = request.getParameter("memPw");
Member member = service.memberSearch(memId, memPw);
try {
model.addAttribute("memId", member.getMemId());
model.addAttribute("memPw", member.getMemPw());
} catch (Exception e) {
e.printStackTrace();
}
return "memLoginOk";
}
클라이언트로부터 입력 값을 받지 못했을 경우, Exception 발생시키기
필수적으로 넘어와야 하는 값임을 명시하는 속성 : `required`
→ `required=true` : 입력 값이 넘어오지 않았을 경우 Exception
→ `required=false` : 입력 값이 넘어오지 않아도 예외 발생시키지 않음. (묵인)
@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, @RequestParam("memId") String memId
, @RequestParam("memPw", required=true) String memPw)
// memPw 입력값이 넘어오지 않았을 경우, Exception 발생
{
....
}
( * 자주 사용하지 않음. javaScript 에서 처리하는 사항이므로...)
이때, 값이 넘어오지 않았을 때 특정 기본값으로 치환하여 읽어들이는 속성은 `defaultValue` 이다.
→ `defaultValue="1234"` : `required=true` 인 값이 넘어오지 않았을 때, 기본값 `1234`로 설정한다.
@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, @RequestParam("memId") String memId
, @RequestParam("memPw", required=true, defaultValue="1234") String memPw)
// memPw 입력값이 넘어오지 않았을 경우, "1234"로 설정.
{
....
}
`Command` 를 이용하여 클라이언트로부터 입력값 받아들이기
① View 페이지(`.jsp`)의 input 객체의 `name`과 일치하는 프로퍼티명으로
DTO 클래스를 생성한다. ( * 이때, 반드시 getter / setter 가 구성되어 있어야 한다.)
② 그리고, Controller의 메소드에서 매개변수로 그 DTO 객체(`Member`)를 받게끔 처리해 주면 된다.
@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Member member)
{
//***********************************************
// Member 객체를 매개변수로 받음으로써,
// 더 이상 getParameter() 메소드는 필요치 않다!
//***********************************************
// String memId = request.getParameter("memId");
// String memPw = request.getParameter("memPw");
// String memMail = request.getParameter("memMail");
// String memPhone1 = request.getParameter("memPhone1");
// String memPhone2 = request.getParameter("memPhone2");
// String memPhone3 = request.getParameter("memPhone3");
service.memberRegister(member.getMemId(), member.getMemPw(), member.getMemMail()
, member.getMemPhone1(), member.getMemPhone2(), member.getMemPhone3());
//*******************************************************************
// 모델에 데이터를 넣어주는
// model.addAttribute() 구문도 필요치 않다!
// View 페이지(memJoinOk.jsp)에서
// Member 커맨드 객체를 이용할 수 있기 때문에!
//*******************************************************************
// model.addAttribute("memId", memId);
// model.addAttribute("memPw", memPw);
// model.addAttribute("memMail", memMail);
// model.addAttribute("memPhone", memPhone1 + " - " + memPhone2 + " - " + memPhone3);
return "memJoinOk";
}
`Command` 객체 `Member`를 사용하여, `model.addAttribute()` 를 생략했을 때
View 페이지 `memJoinOk.jsp` 에서 값을 받아오는 방법
이전 : `model.addAttribute()`를 사용했을 때
MemberController.java
@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Model model, HttpServletRequest request)
{
String memId = request.getParameter("memId");
String memPw = request.getParameter("memPw");
String memMail = request.getParameter("memMail");
String memPhone1 = request.getParameter("memPhone1");
String memPhone2 = request.getParameter("memPhone2");
String memPhone3 = request.getParameter("memPhone3");
service.memberRegister(memId, memPw, memMail, memPhone1, memPhone2, memPhone3);
model.addAttribute("memId", memId);
model.addAttribute("memPw", memPw);
model.addAttribute("memMail", memMail);
model.addAttribute("memPhone", memPhone1 + " - " + memPhone2 + " - " + memPhone3);
return "memJoinOk";
}
memJoinOk.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1> memJoinOk </h1>
ID : ${memId}<br />
PW : ${memPw}<br />
Mail : ${memMail} <br />
Phone : ${memPhone} <br />
<a href="/lec17/resources/html/memJoin.html"> Go MemberJoin </a>
</body>
</html>
`model.setAttribute()` 를 통해 데이터를 저장했으므로
EL(JSTL) `${객체명}` 을 통해 데이터를 가져오도록 처리한 것을 확인.
이후 : `model.addAttribute()`를 사용하지 않고, `Command` 객체 (`Member`)를 사용했을 때
MemberController.java - `memJoin(Member member)`
@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Member member)
{
service.memberRegister(member.getMemId(), member.getMemPw(), member.getMemMail()
, member.getMemPhone1(), member.getMemPhone2(), member.getMemPhone3());
return "memJoinOk";
}
Command 객체인 `Member` 를 매개변수로 받음으로써
`request.getParameter()` 와, `model.setAttribute()` 구문이 삭제된 것을 확인할 수 있다.
memJoinOk.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<!-- EL에서는, getXxx() 가 아니라, 프로퍼티 명으로 바로 접근! -->
<h1> memJoinOk </h1>
ID : ${member.memId}<br />
PW : ${member.memPw}<br />
Mail : ${member.memMail} <br />
Phone : ${member.memPhone1}-${member.memPhone2}-${member.memPhone3} <br />
<a href="/lec17/resources/html/memJoin.html"> Go MemberJoin </a>
</body>
</html>
Command 객체인 `Member`를 받았으므로
EL(JSTL) `${객체명.프로퍼티명}` 을 통해 데이터를 가져오도록 처리한 것을 확인.
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240114 [스프링-프레임워크] - 20강 필기 (1) | 2024.01.14 |
---|---|
[inflearn] 20240114 [스프링-프레임워크] - 19강 필기 (1) | 2024.01.14 |
[inflearn] 20240113 [스프링-프레임워크] - 17강 필기 (2) | 2024.01.13 |
[inflearn] 20240110 [스프링-프레임워크] - 13강 필기 (1) | 2024.01.11 |
[inflearn] 20240108 [스프링-프레임워크] - 12-2강 필기 (0) | 2024.01.10 |