Annotation  어노테이션

원래는 HadlerMapping , Controller, ViewResolver 같은 여러 클래스를 스프링 설정파일에 bean 등록을 해서

스프링 컨테이너가 Controller 클래스를 생성했다면

 

어노테이션을 설정하여 XML 설정을 최소화할 수 있다. 

 

 

 

 

xml 파일에 어노테이션 설정방법

 

먼저 <beans> 엘리먼트 안에 context 네임스페이스 추가

: Eclipse의 Source다음에 있는 Namespaces탭을 클릭 후 context를 체크함.

 

xmlns:context="http://www.springframework.org/schema/context"  

 

 

 

 

 

두번째 <context:component-scan> 엘리먼트의  base-package 속성에 Controller 클래스들이 있는 가장 상위 패키지 등록

<context:component-scan base-package="com.spring.view"/>

위와 같이 설정하면 base pacakage 하위의 @Controller, @Service @Repository, @Component 클래스가 모두 빈으로 등록

 

 

 

 

 

1. @Controller 어노테이션 

 

기존에 여러 Controller 클래스를 스프링 설정파일에 bean 등록할 필요가 없이

@Controller를 클래스 선언부 위에 붙이면  xml 에 설정해둔 <context:component-scan> 이 스프링 컨테이너가

컨트롤러 객체들을 자동으로 생성(메모리에 생성하는 기능)해준다.

 

그리고 DispaterServlet 이 인식하는 Controller로 객체를 만들어준다.

이 말은 클라이언트 요청을 DispaterServlet이 받아 HandlerMapping 에게 주면 요청을 처리할 Controller를 검색해

hadleRequest() 메소드를 호출할 필요없다

 

그럼 바로 검색 된 Controller로 바로 매핑된다는 말??

 

 

@Controller
public class InsertBoardController {
	public void insertBoard(HttpServletRequest request){
		~
	}
}

InsertBoardController 클래스 객체는 스프링 컨테이너가 자동으로 생성. = Controller 객체로 인식

 

 

 

 

 

2. @RequestMapping 어노테이션

 

앞에서 Controller 어노테이션을 쓰면 컨트롤러 객체는 생성하여  Controller 인식이 가능하지만 

클라이언트 요청에 대해 해당 Controller의 메서드가 실행될 순 없다.

이 어노테이션을 쓰면 HandlerMapping 을 대체할 수 있다.

 

HandlerMapping 이란? 

: 클라이언트 요청(예를 들어 로그인 버튼 login.do 클릭 )을 DispaterServlet이 먼저 받아 HandlerMapping 에게 주면

요청을 처리할 Controller를 검색(LoginController)하여 매핑시켜주는 역할 

 

 

 

@RequestMapping(value="/login.do")  ▶ 클라이언트의 /login.do 요청이 들어오면  insertBoard() 메소드와 매핑하겠다.

* value 속성은 생략가능

@Controller
public class InsertBoardController {

	@RequestMapping(value="/insertBoard.do")
	public void insertBoard(HttpServletRequest request){
		~
	}
}

 

 

 

 

 

 

3. Command 객체

 

Command 객체는 Controller 메소드 매개변수로 받은 VO 객체이다.

@Controller
public class InsertBoardController {

   @RequestMapping(value="/insertBoard.do")
    public void insertBoard(BoardVO vo){   → command 객체
         ~
    }
}

 

 

Command 객체 구현과정

 위와 같이 매개변수로 사용자가 입력한 값을 매핑할 BoardVO 클래스를 선언한다면? 

 

1. 클라이언트가 글 등록할 정보를 입력하고 "/insertBoard.do" 요청 전달

 

2. 스프링 컨테이너가 @Controller가 붙은 모든 컨트롤러 객체 생성하고 insertBoard() 메서드를 실행

 

3. insertBoard() 메서드의 매개변수에 해당하는 BoardVO 객체 생성

public class BoardVO {
	publiv void setTitle(String title) {..}  	// 제목
	publiv void setWriter(String writer) {..} 	// 작성자
	publiv void setContent(String content) {..} // 내용
}

 

4. 사용자가 입력한 파라미터 값(title,writer,content) 들을 추출하여  BoardVO 객체에 저장

이때 BoardVO 클래스의 Setter 메소드 이름과 반드시 일치해야함!! (name ="title") = (setTitle) 

 

[insertBoard.jsp]

<form action="insertBoard.do" method="post">
~생략
    <input type="text" name="title"
    <input type="writer" name="writer">
    <input type="content" name="content">

 

5. 이제 insertBoard() 메서드 호출시 사용자 입력값이 설정된BoardVO 객체가 public voidinsertBoard(BoardVO vo) 인자로 전달된다.

<form action="insertBoard.do" method="post">
~
	<input type="text" name="title">

 

 

 

 

4. @ModelAttribute

 

@ModelAttributed 은 두가지 기능이 있다.

1. Command 객체 이름변경을 위해 사용

2. View 페이지에서 사용할 데이터를 설정하기 위해 사용

 

 

 

우선 첫번째

 

기존에는 Command 객체 이름의 첫 글자를 소문자로 변경하여 뷰화면에 UserVO 객체의 변수에 접근할때 사용

 

[LoginController]

@Controller
public class LoginController {

   @RequestMapping(value="/login.do")
    public String loginView(UserVO vo){   → command 객체
         ~
        return "login.jsp";
    }
}

[login.jsp]

<input type="text"name="id" value="${userVO.id}" > 

 

 

 

 

4-1. @ModelAttributed("") 어노테이션을 썼을때

 

[LoginController]

@Controller
public class LoginController {

   @RequestMapping(value="/login.do")
    public String loginView(@ModelAttributed("user"), UserVO vo){   → command 객체
         ~
        return "login.jsp";
    }
}

[login.jsp]

<input type="text"name="id" value="${user.id}" 

 

 

 

 

4-2.   @ModelAttributed("conditionMap")  

 

우선 클라이언트의 요청시

@ModelAttributed 는 @RequestMapping 어노테이션이 적용된 메소드보다 먼저 호출된다(우선권을 가짐)

 

@ModelAttributed 이 붙은 메서드가 리턴한 값을 model 객체에 저장하고

@RequestMapping가 붙은 다음 메소드가 실행 될 때 리턴된 jsp파일에 사용가능하다.

 

 

 

검색기능을 만들어보자

이미지 예

 

 

[BoardController]

@ModelAttributed("conditionMap")  
public Map searchConditionMap(){
	Map conditionMap = new HashMap(),
	conditionMap.put("제목","TITLE");
	conditionMap.put("내용","CONTENT");
    
	return conditionMap;
}

@RequestMapping("/getBoardList.do")
public String getBoardList(BoardVO vo, BoardDAO dao, Model model){
	model.addAttribute("boardList", dao.getBoardList(vo));
    
	return "getBoardList.jsp";
}

 

 

@ModelAttributed 동작순서

1. 클라이언트가 "/getBoardList.do" 요청시

 

2. @ModelAttributed 이 붙은 메서드가 붙은 searchConditionMap() 메서드가 먼저 우선권을 가져서 실행된다.

searchConditionMap() 메서드는 다양한 검색 조건이 저장된 conditionMap 리턴하여 getBoardList() 가 리턴한 뷰페이지에 사용가능하다.

 

3.  searchConditionMap() 메서드가 리턴한 값을 model 객체에 저장

 

4. 이제 클라이언트가 호출한 getBoardList() 메서드 실행

 

5.  getBoardList() 메서드에서 "boardList" 이름을 가진 Model에는 (model.addAttribute("boardList", dao.getBoardList(vo));)

searchConditionMap() 메서드에서 리턴 된 값인 "conditionMap" 이름을 가진 map 도 있다. 

즉 Model 에는 총 두개의 컬렉션이 저장됨.

 

 

 

 

[getBoardList.jsp]

~~생략
<c:forEach items="${conditionMap}" var="option">
     <option value="${option.value}">${option.key}
</c:forEach>
~~

뷰화면에서는 model 에 저장된 검색목록(내용,제목)과 글목록 모두 사용가능.

 

 

 

 

 

반응형
LIST

+ Recent posts