Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240113 [스프링-프레임워크] - 18강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240113 [스프링-프레임워크] - 18강 필기

Jelly-fish 2024. 1. 14. 14:40

18강 - 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> &nbsp;&nbsp; <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) `${객체명.프로퍼티명}` 을 통해 데이터를 가져오도록 처리한 것을 확인.