능글맞은 구렁이

Spring-어노테이션 기반 MVC개발 본문

Framework/Spring

Spring-어노테이션 기반 MVC개발

보라색츄르 2021. 6. 23. 09:58

*어노테이션을 이용한 MVC

 

1. 사용 이유

    과도한 XML설정을 방지하기 위하여 사용한다. 

 

2. 방법 

   1) 설정 파일(xml)문서에 context xml namespace를 추가

   2) 설정 파일 내부에 <bean></bean>으로 등록된 객체들 대신

      <context:component-scan></context:component-scan>으로 대체 하여 자동으로 지정한 패키지의 하위까지

      검색하여 자동으로 객체들을 등록할 수 있도록 설정

      예 ) <context:component-scan base-package="기본패키지"></context:component-scan>

   3) 컨트롤러역할을 담당하는 모든 클래스 선언부 위에 @Controrller 어노테이션을 추가하여 

       DispatcherServlet이 인식할 수 있는 컨트롤러 객체로 만든다.

      만약 @Controller 어노테이션을 사용하지 않을 경우, 스프링이 제공하는 Controller인터페이스를 구현받아야 한다. 

      또한 handlerRequest() 메서드에 대한 재정의가 필요하다. 

   

  4) 사용자 요청에 따른 자동 호출 메서드 설정

      예) "/insertBoard.do" 요청이 들어 왔을 때 -> insertBoard()를 자동 호출 할 수 있도록 설정

            @RequestMapping(value="/insertBoard.do")

              public void insertBoard(HttpServletRequest request){

                   ~~~

               }

 

  @RequestMaping(value="/insertBoard.do")

  "/insertBoard.do"요청이 들어왔을 때 해당 메서드가 호출될 수있도록 매핑

   이때 사용자로부터 입력된 값은 매개변수인HttpSerlvetRequest request의 param영역으로 전달됨

 

※일반적으로 사용자의 입력 값이 고정적일 경우에는 VO 객체를 이용하여 DAO와 주고 받지만.

사용자의 입력값이 다양할 경우 VO객체를 여러가지 선언해야 하는 단점이 발생한다. 

즉, 사용자 입력 값이 4개일 경우 

   request.getParameter()가 4번 호출되어야 하고, 

사용자 입력 값이 3개일 경우 

   request.getParameter()는 3번호출되어야 하기 떄문에

사용자 입력값이 변경될 때마다 

Controller 클래스의 메서드 코드는 매번 수정되어야 한다. 

이 단점을 해결할 수 있도록 제공되는 객체가 Command 객체이다.(곧 VO)

이 단점을 해결하기위해서는 insertBoard()의 매개변수타입을 BoardVO타입으로 변경하여 스프링 컨테이너가 

insertBoard()를 호출할 때 사용자 입력값들을 Commnamd객체에 넘겨주고 이 Command객체를

insertBoard(BoardVO vo)의 매개변수인 vo변수에게 전달하여 자동 매핑이 되도록 한다.

 

이와 같이 사용하려면 반드시 BoardVO내부의 멤버변수명과 사용자 입력을 받는 <input name="">의 

name값이 일치해야한다.

 

또한 BoardVO객체의 멤버변수는 반드시 private 이어야하고

해당 getter / setter 메서드가선언되어 있어야 한다.

 

*Command가 하는 일*

요청 (파라미터) => Spring Container =>command=> 파라미터명의 보유하는VO클래스 검색

=> VO클래스를 이용하여 VO객체 생성->VO객체의 setter메서드를 이용하여 입력값을 저장

=> VO객체를 해당 메서드의매개변수에 전달

(유사한 멤버변수를 가진 VO가 많은 경우 속도가 떨어진다.)

 

 

Spring MVC를 이용한 구현

1. XML 문서를 이용한 설정 방법

   => Controller 가 수시로 변경되어야 하는 경우 (주로 솔루션 개발하는 업체에서 사용)

   => 설정 방법   

         Spring Baen Configuration 설정 파일(~~.xml)

         내부에 HandlerMapping / 각 Controller / ViewResolver 클래스에 대한 등록 필요

         <bean id="" class=""></bean> 과 같은 형식으로 등록

         등록 순서 : 일반적으로 HandlerMapping / 각 Controller / ViewResolver 의 순으로 등록...

          

2. annotation을 이용한 설정 방법

  => Controller  가 고정되어서 사용되는 경우 (특정 기업에 대한 어플리케이션 개발 시)

  => 설정 방법 

       각 Controller 클래스 선언부 위에 @Controller 를 추가 (단, POJO 형식의 클래스)

       Controller 클래스 내부에서 로직을 처리하는 메서드 선언부 위에는 

       @RequestMapping(value="요청사항") 을 추가

       해당 메서드의 매개변수는 각 메서드가 해야 하는 일에 따라 VO 객체 타입만 선언할 수 도 있고,

       VO와 DAO 타입을 모두 선언할 수도 있다.

 

      반환되는 타입은 String 타입,,

      이 때 return 되는 값에 따라 "redirect: "이라는 접두사를 추가할 수도 있다..

      웹 브라우저가 재요청이 필요한 경우에는 "redirect:"접두사를 포함하여 리턴

      단순히 화면이 필요한 경우에는  해당 결과만.....   

 

  => 전송방식에 따라 메서드를 달리 호출할 경우 

      @RequestMapping(value="요청사항",  method="요청방식")

      public String test(){

           ~~~~

      }

      => method="요청방식" 에서 설정할 수 있는 값은 RequestMethod.GET / RequestMethod.POST

           와 같이 상수로 지정되어 있기 때문에 임의로 변결경 불가능..

 

  => JSP  에서 리턴된 객체를 EL 표기법으로 직접 접근하여 해당 데이터를 추출 할 수 있는데..

        만약 UserVO 라면 JSP 에서는 userVO라는 객체명으로 해당 데이터를 추출하여 사용할 수 있다..

 

  => 개발자가 직접 객체명을 지정할 경우에는

      @RequestMapping(value="요청사항",  method="요청방식")

      public String test(UserVO vo){

           ~~~~

      }      

 

  => @RequestMapping(value="요청사항",  method="요청방식")

       public String test(@ModelAttribute("객체명") UserVO vo){

           ~~~~

       }      

       @ModelAttribute("객체명") 와 같이 설정하여 사용 가능!!

 

  => 컨트롤러 내부의 메서드들에 대한 반환 타입을 통일할 경우

       1) 모든 메서드의 반환 타입을 ModelAndView 로 통일

           JSP 에서 사용할 데이터가 없이 화면만 응답할 경우

          public ModelAndView test(~~~, ModelAndView mav){

                mav.setViewName("화면처리");

                return mav;

          }

 

           JSP 에서 사용할 데이터를 포함하여 화면까지 응답할 경우 

          public ModelAndView test(~~~, ModelAndView mav){

                mav.addObject("이름", 전달할 데이터(객체));

                mav.setViewName("화면처리"); 

                return mav;

          }

 

       2) 모든 메서드의 반환 타입을 String 로 통일

           JSP 에서 사용할 데이터가 없이 화면만 응답할 경우

          public String test(~~~){

                return "화면처리";

          }

           JSP 에서 사용할 데이터를 포함하여 화면까지 응답할 경우 

           public String test(~~~, Model model){

                model.addAttribute("이름", 전달할 데이터(객체)); 

                return "화면처리";

          } 

 

======================================================

 BoardVO / UserVO 에 선언되지 않은 값이 전달 될 경우

 

예) getBoardList.jsp 의 검색 부분

<!-- 검색 시작 -->
	<div align="center">
	<form action="getBoardList.jsp" method="post">
		<table border="1" cellpadding="0"  cellspacing="0" width="700">
			<tr>
				<td align="right">
					<select name="searchCondition">
						<option value="TITLE">제목</option>
						<option value="CONTENT">내용</option>
					</select>
					<input type="text" name="searchKeyword" />
					<input type="submit" value="검색">
				</td>
			</tr>
		</table>
	</form>

위와 같이 BoardVO 내에  해당 파라미터에 대한 멤버변수가 없을 경우에는

(name="searchCondition" /name="searchKeyword")

     1) BoardVO 클래스를 수정. 즉, searchCondition, searchKeyword 두 가지 변수를 추가 한 후,

        그에 따른 getter / setter 를 추가하는 방법

     2) @RequestParam 어노테이션을 사용하는 방법

public String getBaordList(BoardVO vo, BoardDAO dao, Model model){

}
 
public String getBaordList(@RequestParam(value="searchCondition") String condition, 
                           @RequestParam(value="searchKeyword") String keyword, 
                           BoardVO vo, BoardDAO dao, Model model){
              ~~~~~
      }
      
      
/**파라미터에 대한 기본값을 설정**/
public String getBaordList(@RequestParam(value="searchCondition", defaultValue="TITLE") String condition, 
                           @RequestParam(value="searchKeyword", defaultValue="") String keyword, 
                           BoardVO vo, BoardDAO dao, Model model){
              ~~~~~
      }
      
/**파라미터에 대한 기본설정 + 필수 입력 확인**/
public String getBaordList(@RequestParam(value="searchCondition", defaultValue="TITLE", required="true/false") String condition,
                           @RequestParam(value="searchKeyword", defaultValue="", required="true/false") String keyword, 
                           BoardVO vo, BoardDAO dao, Model model){
              ~~~~~
      }//defaultValue이 있으면 required를 굳이 사용할 필요가 없다.
  

 

'Framework > Spring' 카테고리의 다른 글

Spring-Mybatis  (0) 2021.06.29
Spring-MVC  (0) 2021.06.23
Spring-Transaction(트랜잭션)  (0) 2021.06.23
Spring-JDBC(Oracle)  (0) 2021.06.22
Spring-AOP(어노테이션 기반)  (0) 2021.06.22
Comments