본문으로 바로가기







개요



  • 소스코드는 하단의 깃허브 링크를 통해서 다운로드 할 수 있습니다.

  • 직접 따라 해보실 분들은 패키지나 폴더의 구조, 이름을 동일하게 하는게 좋습니다.





  • com.github.study.ex01.controller : 컨트롤러 예제 패키지

  • ex01 : 컨트롤러 예제 JSP 파일을 모아둘 폴더




1. void 타입



com.github.study.ex01.controller 패키지에 아래 SampleController1를 작성한다.



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
package com.github.study.ex01.controller;
 
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
@RequestMapping("/ex01")
public class SampleController1 
{
    private static final Logger logger = LoggerFactory.getLogger(SampleController1.class);
    
    @RequestMapping("/doA")
    public void doA(){
        logger.info("doA 실행..........");
    }
    
    @RequestMapping("/doB")
    public void doB(){
        logger.info("doB 실행..........");
    }
    
    // void 타입일 경우 접근하는 URL 경로에 해당하는 jsp를 찾아 실행한다.
    // 예를 들어 /ex01/doB로 접근했다면 ex01 폴더 아래 doB.jsp를 찾아 실행시킨다.
    
}
cs



ex01 폴더에 doA.jsp, doB.jsp 파일을 작성한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>doA.jsp</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  Do A 실행.... </P>
</body>
</html>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>doB.jsp</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  Do B 실행.... </P>
</body>
</html>
 
cs



@Controller 는 SampleController1 클래스를 컨트롤러로 설정하는 애노테이션이다. 


@RequestMapping 은 특정 URL에 매칭되는 클래스나 메소드를 명시하는 애노테이션이다.  SampleController1 의 경우 /ex01 로 접근하는 URL을 처리한다는것을 명시한다.


SampleController1에 있는 두개의 메소드에도 @RequestMapping 이 되어있다. doA( ) 메소드를 보면 @RequestMapping("/doA") 이라고 되어 있는데 이는 /doA 로 접근할 경우 doA( ) 메소드가 이에대한 처리를 하겠다는 것을 명시한 것이다.


그런데 클래스에도 @RequestMapping이 사용되었기에 doA( )가 처리하는 URL은 /ex01/doA 로 된다. 즉 /ex01/doA 로 요청이 들어올 경우 doA( ) 메소드가 해당 요청을 처리하는 것이다.





스프링 MVC의 라이프사이클을 보면 컨트롤러에서는 브라우저에 보여줄 뷰의 이름을 전달한다고 되어있다. 그런데 아무것도 리턴을 하지않는 void 타입의 경우 어떻게 뷰의 이름을 전달하는 것일까?


void 타입의 경우 리턴값이 없는 대신 @RequestMapping에 지정한 URL에 해당하는 뷰 이름을 전달한다. @RequestMapping("/doA") 라고 되어 있을 경우 doA라는 뷰 이름을 전달하는데, 클래스에도 @RequestMapping이 지정되어 있으므로 최종적으로 전달하는 뷰 이름은 /ex01/doA 가 된다.


그러면 프로젝트를 실행해 보자.




프로젝트가 실행될 때 콘솔창에 로그를 보면 /ex01/doA, /ex01/doB 의 URL이 매핑된것을 확인할 수 있다.





/ex01/doA 로 요청이 들어올 경우 doA( ) 메서드가 요청을 처리하게 되고, /ex01/doA 라는 뷰 이름을 전달한다. 전달된 뷰 이름은 servlet-context.xml에 설정된 InternalResourceViewResolver에 의해 최종적으로 /WEB-INF/views/ex01/doA.jsp 가 되고 해당 경로에 있는 doA.jsp가 실행된다.




2. 리턴 타입이 String



com.github.study.ex01.controller 패키지에 SampleController2를 작성한다.



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
31
package com.github.study.ex01.controller;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
@RequestMapping("/ex01")
public class SampleController2 {
    
    private static final Logger logger = LoggerFactory.getLogger(SampleController2.class);
    
    @RequestMapping("/doC")
    public String doC(@ModelAttribute("msg"String msg){
        
        logger.info("doC 실행..........");
        
        System.out.println("doC 메시지 : "+msg);
        
        return "result";  // 문자열이 사용될 경우 문자열.jsp 파일을 찾아서 실행한다.
    }
    
    /*
     * @ModelAttribute("msg") 는 주소창에 msg라는 파라미터 값을 가져온다.
     * 주소창 : http://localhost:8080/ex01/doC?msg=aa
     * 이렇게 되어있을경우 자동적으로 msg의 값인 aa를 가져온다.
     */
}
 
cs



이번에는 리턴 타입이 String일 경우이다. SampleController2의 doC( )는 /ex01/doC라는 URL을 처리한다. 


doC( ) 메소드를 보면 파라미터에 @ModelAttribute("msg") 라는 애노테이션이 사용된 것을 볼 수 있다. @ModelAttribute는 브라우저의 요청시 지정한 파라미터를 문자열로 처리해 주고, 뷰로 전달하는 역할을 한다. 이에 대한 것은 아래에서 다시 보도록 하자.





프로젝트를 실행 시키고, 주소창에 /ex01/doC 를 입력하면 위와 같이 페이지를 찾을 수 없다는 404에러가 나타난다. 여기서 404 옆에 표시된 부분을 보자. /WEB-INF/views/result.jsp 라고 되어있는데, 자세히 보면 doC( ) 메소드에서 리턴하는 result가 포함된 것을 알 수 있다. 


void 타입과 달리 리턴 타입이 String일 경우 리턴하는 문자열이 바로 뷰 이름이 되는 것이다.





그러면 views 폴더 아래에 result.jsp 를 생성해 준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>result.jsp</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  Do C 실행....   </P><br>
<span>메시지 : ${msg}</span>
</body>
</html>
 
cs



views 폴더에 생성한 이유는 리턴한 result에 /WEB-INF/views 와 .jsp가 붙어 결과적으로 /WEB-INF/views 아래에 있는 result.jsp 파일을 찾아 실행하기 때문이다.





result.jsp를 생성한 후 다시 실행시키면 이번에는 정상적으로 실행된다. 





다음으로 @ModelAttribute("msg")에 의해 msg 파라미터가 처리되는지 확인을 해보자. 주소창에 위와 같이 /ex01/doC?msg=Hellow 라고 입력을 하면 JSP 파일에 입력한 메시지가 출력되는 것을 확인할 수 있다.





그리고 STS 콘솔창에 로그를 보면 주소창에 입력한 Hellow가 출력되는 것을 알 수 있다. ModelAttribute에 의해 msg 파라미터 값이 문자열로 처리되어 doC( ) 메소드에서 사용할 수 있고, result.jsp 에서도 사용할 수 있는것을 확인할 수 있다.





3. 리턴 타입이 String - 데이터를 전달할 경우



먼저 com.github.study.ex01.vo 이란 패키지를 생성하여 MemberVO를 만든다. MemberVO는 데이터 전달 테스트에 사용할 클래스이다.



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
package com.github.study.ex01.vo;
 
public class MemberVO {
    
    private String userid;
    private String userpw;
    
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUserpw() {
        return userpw;
    }
    public void setUserpw(String userpw) {
        this.userpw = userpw;
    }
 
    @Override
    public String toString(){
        return "MemberVO [User Id = " + userid + ", User Pw = " + userpw + "]";
    }
}
 
cs



다음으로 com.github.study.ex01.controller 패키지에 SampleController3를 작성한다.



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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.github.study.ex01.controller;
 
import java.util.HashMap;
import java.util.Map;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.github.study.ex01.vo.MemberVO;
 
@Controller
@RequestMapping("/ex01")
public class SampleController3 {
    
    private static final Logger logger = LoggerFactory.getLogger(SampleController3.class);
    
    @RequestMapping("/doD")
    public String doD(Model model){
        
        logger.info("doD 실행...........");
        
        MemberVO member = new MemberVO();
        member.setUserid("userid-01");
        member.setUserpw("userpw-01");
        
        model.addAttribute("member", member);
        //model.addAttribute(member);
        
        logger.info("MemberVO : "+member.toString());
        
        return "ex01/data";  
    }
    
    @RequestMapping("/doE")
    public String doE(Model model){
        
        logger.info("doE 실행...........");
        
        Map<String,String> map = new HashMap<String,String>();
        map.put("userid""userid-02");
        map.put("userpw""userpw-02");
        
        model.addAttribute("map", map);
    
        return "ex01/data";  
    }
}
 
cs



SampleController3에 있는 두개의 메소드를 보면 리턴 타입이 String이다. 메소드가 실행되면 data.jsp 가 보여지게 된다.


doD( )를 보면 MemberVO 객체를 만들고 거기에 userid와 userpw 값을 각각 세팅한다. 그리고 그것을 Model 객체에 담는다. Model 객체에 데이터를 담을 경우 이것을 뷰에 전달하는게 가능하다. 


Model에 데이터를 담을 때 addAttribute( ) 메소드를 사용하는데, 2가지 사용 방법이 있다.


  • addAttribute("이름", 객체) : 이름을 이용해 객체를 사용할 수 있다.

  • addAttribute(객체) : 이름을 지정하지 않을 경우 자동적으로 객체의 클래스명 앞글자를 소문자로 처리해서 이름으로 사용한다.


위에서는 addAttribute("이름", 객체) 를 사용하였기 때문에 뷰인 data.jsp 에서는 member 라는 이름으로 MemberVO 에 담긴 값을 사용할 수 있다.


다음으로 doE( )를 보자. doD( )와 차이점은 Map을 사용했다는것인데 기본적으로는 동일하다. doE( )가 실행되면 data.jsp에서 map 이라는 이름으로 Map에 담겨있는 값을 사용하는게 가능하다.



MemberVO 와 SampleController3 를 작성 후 테스트를 위해  ex01 폴더에 data.jsp 를 생성하자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>data.jsp</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  data.jsp 실행.... </P>
 
    <h4>MemberVO 아이디 : ${member.userid }</h4>
    <h4>MemberVO 비밀번호 : ${member.userpw }</h4>
 
    <h4>==========================================</h4>
 
    <h4>Map 아이디 : ${map.userid }</h4>
    <h4>Map 비밀번호 : ${map.userpw }</h4>
</body>
</html>
 
cs



data.jsp를 보면 위에는 MemberVO 의 값을 사용하고, 아래에는 Map의 값을 사용한다. 


doD( ) 메소드에서 model.addAttribute("member", member) 로 데이터를 담았으므로 data.jsp 에서는 member 이란 이름으로 MemberVO 의 값을 사용하는게 가능하다.


마찬가지로 Map의 경우 map란 이름으로 담겨있는 값을 가져와 사용할 수 있다.





ex01/doD 로 실행할 경우 위와 같이 나타난다.





ex01/doE 로 실행할 경우 Map에 담긴 값이 출력된다.




소스코드 다운로드



RSS구독 링크추가 트위터 이메일 구독