참조한 강의 : Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/)
앞선 포스팅에서 간단하게 MVC 가 뭔지 알아봤으니
이번에는 직접 간단한 MVC 예제를 작성해보자.
예제 1 - "/" 와 연결
: 가장 먼저, 페이지의 가장 메인인 홈 루트에 연결되는 컨트롤러와 뷰 페이지를 만들어보자
- HomeController.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/")
public String showHomePage() {
return "main-menu";
}
}
|
cs |
Spring MVC 에서 이 클래스가 컨트롤러 클래스임을 명시하려면 @Controller 를 붙여줘야하고
(참고로, @Controller 는 @Component 의 하위 어노테이션 이다)
이 컨트롤러가 다룰 URL 에 대해서 매칭을 해줘야 하는데,
이때 사용되는 어노테이션이 @RequestMapping 이다.
괄호 안에는 해당 메소드와 매핑 시킬 URL 을 넣는다.
URL 에 매핑되는, 메소드는 리턴타입과 메소드 이름이 아무거나 사용되도 상관없다
여기서 String 을 리턴타입으로 잡은것은, 이 예제에서 사용할 JSP 파일의 이름을 리턴해주기 위해서이다.
정리를 하면, 유저가 루트페이지("/") 에 접속하면, 컨트롤러가 그 요청을 받아서 main-menu.jsp 를 리턴해주겠다는 의미가 된다.
- main-menu.jsp
<!DOCTYPE html>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Spring Demo Project Home Page</h1>
</body>
</html>
|
cs |
프로젝트 우클릭 후, Run As -> Run On Server 를 해주면 다음과 같이 페이지가 나타난다
* 주의할점
1. 이클립스 프로젝트 내에 톰캣 서버가 추가되어 있어야한다.
(참고 : shuman.tistory.com/116)
2. 윈도우의 경우, 서비스에 있는 아파치 톰캣 서버가 켜 있으면 중복된 포트 번호를 사용하게 되므로, 서비스에 있는 아파치 톰캣은 꺼야 한다.
예제 2. HTML Form tag 데이터 전달
간단한 form 태그를 만들어보고 데이터를 입력받아서 다른 페이지로 넘겨주는 방법을 알아보자
이 예제에선 학생의 이름을 입력을 받아서, 다른 페이지에서 이 학생의 이름을 화면상에 띄워주는 코드를 작성해본다.
먼저 컨트롤러를 하나 만들어준다
- HelloWorldController.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloWorldController {
@RequestMapping("/showForm")
public String showForm() {
return "helloworld-form";
}
@RequestMapping("/processForm")
public String processForm() {
return "helloworld";
}
}
|
cs |
/showForm 주소에는 사용자로부터 입력을 받을 수 있도록, form tag 화면을 보여준다
이를 보여주기 위해서 helloworld-form.jsp 라는 파일로 form tag 를 그려준다.
그리고 /processForm 주소에는 /showForm 주소로 부터 입력받은 값을 넘겨 받아서 화면상에 그 값을 보여주기 위한 URL 이다.
이 결과물을 유저에게 보여주기 위해, helloworld.jsp 라는 파일로 보여준다.
- helloworld-form.jsp
<!DOCTYPE html>
<html>
<head>
<title>Form Page</title>
</head>
<body>
<form action="processForm" method="GET">
<input type="text" name="studentName" placeholder="What's your name?" />
<input type="submit" value="Submit Query"/>
</form>
</body>
</html>
|
cs |
form action 은 결과물을 보여줄 URL 값과 매칭시켜야한다.
DB 의 데이터를 작성하거나 수정하는게 아니라 단순히 데이터조회 이므로, GET 메소드를 사용한다.
- helloworld.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Process Form Page</title>
</head>
<body>
<h1>Process Form</h1>
<p>Student Name : ${param.studentName} </p>
<a href="showForm">Return Form Page</a>
</body>
</html>
|
cs |
이 파일에서 중요한 것은 9번줄이다. JSP 문법에 따라, 다른 페이지로 부터 값을 받아오기 위해서는
${param.tagname} 이런식으로 받아와야 한다
tagname 은 해당 입력 태그의 name 속성값을 말한다.
결과 확인을 위해 실행해보면,
/showForm
form 태그 창이 뜨게 되고 여기에 입력값을 아무거나 넣어서 제출하면
/processForm
정상적으로 값이 나타나는것을 볼 수 있다.
예제 3. HttpServletRequest, Model 을 이용한 데이터 전달
: 이번엔 jsp 끼리 데이터 전달하는게 아닌 Controller 를 거쳐서 데이터를 변환한뒤, 뷰 페이지에 띄워보자
먼저 앞서 만든 HelloWorldController.java 에 다음의 함수를 추가해준다
- HelloWorldController.java
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloWorldController {
@RequestMapping("/processFormVersionTwo")
public String letsShoutDude(HttpServletRequest request, Model model) {
String name = request.getParameter("studentName");
name = name.toUpperCase();
String result = "Yo ! " + name;
model.addAttribute("message", result);
return "helloworld";
}
}
|
cs |
HttpServletRequest 는 이전 페이지인 /showForm 에서 유저가 학생의 이름을 입력할때,
그 입력값을 받아오기 위한 클래스이다.
getParameter 를 사용할때 들어가는 매개변수 값은 input tag 에 정의한 name 속성값이다.
학생의 이름을 대문자로 변경해서 새로운 변수인 result 에 담아둔뒤, 이를 모델에 넣어줘야 한다.
모델에 값을 추가할때는, addAttribute 메소드를 이용하고, 첫번째 인자는 해당값을 찾기위한 key 값, 두번째 인자는 value 값이다.
그리고 나서 Form tag 에 있는 action 속성값을 위의 새로운 메소드에서 매칭시킨 RequestMapping 값과 일치하게 넣는다.
model 에 저장된 message 라는 키값을 갖는 데이터의 결과물을 보기 위해, 아래 구문을 JSP 에 추가해준다.
1
|
<p> new message : ${message} </p>
|
cs |
실행 결과
예제 4. @RequestParam 을 통한 데이터 받아오기
: 예제 3에선 JSP 에 작성된 데이터를 HttpServletRequest 를 통해서 가져왔는데, 이것 대신에 @RequestParam 을 써서 가져오는 방법도 있다.
- HelloWorldController.java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloWorldController {
@RequestMapping("/processFormVersionThree")
public String processFormVersionThree(
@RequestParam("studentName") String name,
Model model
)
{
name = name.toUpperCase();
String result = "Process Version Three : " + name;
model.addAttribute("message", result);
return "helloworld";
}
}
|
cs |
@RequestParam 괄호안에 들어가는 값은 예제 3과 마찬가지로, input tag 의 name 속성값이 들어가면된다.
예제 3과 다른것은, 예제 3은 Request 서블릿을 만들고, 멤버함수인 getParameter() 를 통해 데이터를 가져왔다면,
예제 4는 선언과 동시에 데이터 바인딩이 이뤄진다.
예제 5. 컨트롤러 상단에 @RequestMapping 추가
컨트롤러로 정의한 클래스 이름위에 @RequestMapping 을 하게 되면, 해당 컨트롤러에 소속된 메소드들의 매칭 URL 이 서브 URL 로 들어가게 된다.
- HelloWorldController.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/hello")
public class HelloWorldController {
@RequestMapping("/showForm")
public String showForm() {
return "helloworld-form";
}
@RequestMapping("/processForm")
public String processForm() {
return "helloworld";
}
}
|
cs |
위 코드와 같이 선언했다면,
showForm, processForm 메소드에 접근하려면
/hello/showForm,
/hello/processForm
과 같은 형식으로 바뀌게 된다.
이렇게 그룹핑을 하는 것은, 사이트의 규모가 커졌을때, 중복되는, URL 을 피하기 위해서이다.
* 참고
JS, CSS, Image 같은 정적 웹 리소스를 프로젝트에 추가시키는 방법
: 먼저 사용할 프로젝트에 아래 그림과 같이 폴더를 추가해준다
resources 라는 폴더 이름 대신 아무거나 써도 된다
아래의 css, js, images 폴더 이름들도 마찬가지다.
다음은 spring mvc 설정파일에 해당하는 xml 파일에 가서 다음의 구문을 추가한다
1
|
<mvc:resources mapping="/resources/**" location="/resources/"/>
|
cs |
그리고 나서 이 리소스들을 사용할 뷰 페이지에 가서
다음과 같은 형식으로 작성해야한다.
<!-- css -->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/my-test.css">
<!-- js -->
<script src="${pageContext.request.contextPath}/resources/js/simple-test.js"></script>
<!-- image -->
<img src="${pageContext.request.contextPath}/resources/images/spring-logo.png"/>
|
cs |
파일 경로에 ${pageContext.request.contextPath} 가 꼭 앞에 붙어야 한다.
스프링이 루트 폴더에서 부터 해당 리소스들의 폴더 위치를 찾기 위함이다.
* 참고2
이클립스가 아닌 다른 곳에서 톰캣 실행하기
지금까지는 이클립스 내에서 톰캣 서버를 굴렸는데, 외부에서 자신이 만든 웹 프로젝트를 구동하고 싶으면
이클립스에서 만든 프로젝트에 우클릭후 Export -> WAR File 을 눌러주고
Destination 에 저장될 폴더의 위치와 파일의 이름을 작성해준다
예를들어서 C:\test\mvc-test.war 같이 써줬다면
C:\test 폴더내에 mvc-test.war 파일이 생성되게 된다.
(선택한 이클립스의 폴더들을 하나의 파일로 압축한것이다)
이 파일을 톰캣이 설치된 위치에 webapps 라는 폴더가 있는데 여기에 그 파일을 복사해서 넣어준다
그리고 나서 localhost:8080/mvc-test.war 를 브라우저에치고 들어가면 앞서 만든 프로젝트가 실행되게 된다.
여기까지 기본적인 Spring MVC 예제들을 작성해보았다.
다음은 Spring MVC Form Tag 라는것에 대해서 알아본다.
'Spring' 카테고리의 다른 글
Spring Framework - Validation (0) | 2021.02.01 |
---|---|
Spring Framework - Spring MVC Form Tag (0) | 2021.01.28 |
Spring Framework - Spring MVC Overview (0) | 2021.01.27 |
Spring Framework - XML 파일 없이 스프링 설정하기 (0) | 2021.01.22 |
Spring Framework - Annotation (0) | 2021.01.20 |