온 코딩

[Spring] (게시판예제) Spring MVC 모델 - @annotation 이용 본문

복습 ARCHIVE/모델별 프로젝트

[Spring] (게시판예제) Spring MVC 모델 - @annotation 이용

SummerON 2021. 6. 23. 16:33
  • 어노테이션을 사용하는 이유 : XML 설정을 최소화하기 위해

: 컨트롤러를 고정해서 사용하는 경우, 특히 특정 기업에 대한 어플리케이션 개발 시 많이 사용 

 + xml 문서 : 컨트롤러가 수시로 변경되는 경우 => 주로 솔루션 개발 업체에서 많이 사용 

 + 어노테이션과 xml을 혼용 시

     : 향후 추가 될 여지가 있는 경우에 혼용, 거의 어노테이션으로 작업해놓고 추가되는 부분은 xml로 처리

 

MVC 어노테이션 설정 방법 

  1. 설정파일 문서에 context xml namespace를 추가
  2. 설정 파일 내부에 <bean>객체들 대신 <context:component-scan>으로 대체하여 지정한 패키지의 하위까지 검색하여 자동으로 객체들을 등록할 수 있도록 설정 
  3. 컨트롤러 역할을 담당하는 모든 클래스 선언부에 @Controller 어노테이션을 추가하여 DispatcherServlet이 인식할 수 있는 컨트롤러 객체로 만듦.  
  4. 사용자 요청에 따른 호출 메서드 설정 @RequestMapping(value="")를 각 컨트롤러 클래스의 해당 메서드 위에 어노테이션으로 설정 
  • 만약 @Controller 어노테이션을 사용하지 않을 경우, 스프링이 제공하는 Controller 인터페이스를 구현받고 HandlerRequest() 메서드에 대한 재 정의 필요
  • @RequestMapping의 value 속성은 생략할 수 있지만 생략할 시, 검색을 수행해야하기 때문에 속도가 떨어짐 
  • 스프링 컨테이너가 자동으로 생성하는 Command객체를 통해 VO값 자동 맵핑하여 매개변수로 받을 수 있음
  • VO / DAO / Model(화면전환 할 때 보내야 하는 객체가 있을 경우 주로 사용) 모두 매개변수로 객체를 받을 수 있음
  • 반환 타입은 일반적으로 String이고, 화면 전환 시 return값에 따라 "redirect:" 접두사를 추가하여 재요청 실행 

 

Command 객체

=> insertBoard()등 메서드의 매개변수 타입을 BoardVO 타입으로 변경하여 스프링 컨테이너가  insertBoard()를 호출할 때 사용자 입력 값들을 Command 객체에 넘겨주고 이 Command 객체를 insertBoard(BoardVO vo)의 매개변수인 vo 변수에 전달하여 자동 맵핑되도록 한다. 

: 매번 다르게 넘어오는 파라미터 값들을 가져오고 세팅할 필요없이 Command 객체를 통해 기존 vo에서 사용자 입력 부분을 자동으로 추출하고 값을 설정해서 다시 메서드 매개변수 vo로 넘어온다.

  • BoardVO 내부의 멤버 변수 명과 사용자 입력을 받는 파라미터 name 값이 일치해야 사용 가능 
  • BoardVO 객체의 멤버변수는 반드시 private이어야 하고 getter/setter 메서드가 있어야 함 

예시 )

package com.hhw.view.board;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.hhw.biz.board.BoardVO;
import com.hhw.biz.board.impl.BoardDAO;

@Controller
public class InsertBoardController{

	public InsertBoardController() {
	}
	
	@RequestMapping(value="/insertBoard.do")
	public String insertBoard(BoardVO vo, BoardDAO boardDAO){
		System.out.println("어노테이션 컨트롤러 : 글 등록 처리");
		
		//1. 사용자 입력 정보 추출  - Command 로 자동 등록 

		//2. DB 연동처리
		boardDAO.insertBoard(vo);
		
        	//3. 화면 전환 - 요청보내기
       	 	return "redirect:getBoardList.do";
		
	}//POJO 스타일

}
  • Controller 메서드가 실행되고 View 경로를 "getBoardList.do"로 리턴하면 기본적으로 포워딩 방식이므로 브라우저 URL 변경이 이루어지지 않아 요청을 보낼 수 없다. URL을 변경하고 싶으면 "redirect:getBoardList.do"로 리턴하여 리다이렉트를 해야 함 
  • 재요청 없이 화면 전환만 필요한 경우는 리다이렉트 할 필요 없음

 

컨트롤러 예시)

package com.hhw.view.user;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.hhw.biz.user.UserVO;
import com.hhw.biz.user.impl.UserDAO;

@Controller
public class LoginController{

	public LoginController() {
	}

	@RequestMapping(value="/login.do", method=RequestMethod.POST)
	public String login(UserVO vo, UserDAO userDAO,HttpSession session){
		System.out.println("어노테이션 컨트롤러 : 로그인 처리");
		
		if (userDAO.getUser(vo) != null) {
			
			session.setAttribute("name", userDAO.getUser(vo).getName());
			return "redirect:getBoardList.do";   
			
			
		} else {
			return "login.jsp";              
		}
	}
	
	@RequestMapping(value="/login.do", method=RequestMethod.GET)
	public String loginView(@ModelAttribute("user") UserVO vo){
		System.out.println("로그인 화면으로 이동");
		vo.setId("test");
		vo.setPassword("test");
		return "login.jsp"; 
		//login.jsp 화면에서 UserVO 객체의 값이 스프링 컨테이너에 의해 자동으로 전달 됨 
		//Command로 생성되는 객체명은 userVO => JSP에서 사용 시, EL태그를 통해 userVO.id이렇게 쓰기 가능
		//매개변수 앞에 @ModelAttribute("user")이렇게 지정하면 객체명이 user가 됨
	}
}

 

기타 어노테이션 

1. @RequestParam

  • VO에 없는 변수를 사용할 경우 VO 클래스의 수정 없이 @RequestParam을 이용하여 파라미터 사용 가능 
  • HttpServletRequest.getParameter()메서드와 같은 기능 
  • @RequestParam(value="파라미터 이름" ) String 사용 할 변수명 <- 가장 간단한 버전
  • @RequestParam(value="파라미터 이름", defaultValue="기본값", required=false/true) String 사용 할 변수명
@RequestMapping(value = "/getBoardList.do")
	public String getBoardList(@RequestParam(value = "searchCondition", defaultValue = "TITLE") String condition,
			@RequestParam(value = "searchKeyword", defaultValue = "") String keyword, BoardVO vo, BoardDAO boardDAO,
			Model model) {
		System.out.println("어노테이션 컨트롤러 : 글 목록 검색 처리");
		System.out.println(condition +"  :  "+ keyword);
		model.addAttribute("boardList", boardDAO.getBoardList(vo)); // model정보
																	// 저장
		return "getBoardList.jsp";
	}

2. @ModelAttribute

  • Command 객체 이름 변경할 때사용
  • View(JSP)에서 사용할 데이터를 설정하는 용도로 사용 - 자동으로 Model에 저장됨
  • 만약 @RequestMapping보다 위에(먼저) 호출 되었으면 @RequestMapping 메서드들 내부에서 @ModelAttribute값 사용 가능 
//검색 조건 목록
	@ModelAttribute("conditionMap")
	public Map<String, String> searchConditionMap(){
		Map<String, String> conditionMap = new HashMap<String, String>();
		
		conditionMap.put("제목", "TITLE");
		conditionMap.put("내용", "CONTENT");
		
		return conditionMap;
	}
    
    // 글 목록검색 - 여기 Model객체에 이미 conditionMap 저장 완료
	@RequestMapping(value = "/getBoardList.do")
	public String getBoardList(@RequestParam(value = "searchCondition", defaultValue = "TITLE") String condition,
			@RequestParam(value = "searchKeyword", defaultValue = "") String keyword, BoardVO vo, BoardDAO boardDAO,
			Model model) {
		System.out.println("어노테이션 컨트롤러 : 글 목록 검색 처리");
		System.out.println(condition +"  :  "+ keyword);
		model.addAttribute("boardList", boardDAO.getBoardList(vo)); // model정보
																	// 저장
		return "getBoardList.jsp";
	}
  • getBoardList 컨트롤러 내 Model객체에 boardList뿐 아니라 conditionMap까지 저장이 되어있기 때문에 getBoardList.jsp에서 두 값 모두 접근 가능

3. @SessionAtrributes

  • Command객체에 값들이 선택적으로 저장 되어 있는데, 모든 값들을 다 저장해 사용하고 싶을 경우 사용
  • 메서드선언부가 아닌 클래스 선언부에 @SessionAttributes("board") 설정
  • 애플리케이션 동작 시 Model에 "board"라는 값으로 저장되는 데이터를 세션에 자동으로 저장해놓으라는 의미
  • 세션에 저장된 값을 다른 컨트롤러에서 사용하고 싶으면 컨트롤러 매개변수 앞에 @ModelAttribute("board") BoardVO vo 이런 형식으로 매개변수 수정 -> 세션에 저장된 board를 vo에 할당 한 후, 사용자 입력 파람을  vo 객체에 할당 => vo에서 사용자 입력 값만 수정 됨 
@Controller
@SessionAttributes("board")
public class BoardController {

	public BoardController() {
	}

	// 글 상세조회
	@RequestMapping(value = "/getBoard.do")
	public String getBoard(BoardVO vo, BoardDAO boardDAO, Model model) {
		System.out.println("어노테이션 컨트롤러 : 글 상세조회 처리");
		// 리턴 - 검색 결과는 model에 저장
		model.addAttribute("board", boardDAO.getBoard(vo)); // model정보 저장
		return "getBoard.jsp";
	}
    
	// 글 수정
	@RequestMapping(value = "/updateBoard.do")
	public String updateBoard(@ModelAttribute("board") BoardVO vo, BoardDAO boardDAO) {
		System.out.println("어노테이션 컨트롤러 : 글 업데이트 처리");
		System.out.println("글쓴이 : " + vo.getWriter());
		boardDAO.updateBoard(vo);
		return "redirect:getBoardList.do";

	}



}
  • 글 상세보기에서 updateBoard.do 컨트롤러를 불러와 사용할 경우 이미 Model에 board 객체를 저장했기 때문에 이 값이 세션에 저장되어 있음
  • 따라서, updateBoard 컨트롤러에 전달되는 매개변수는 board값에 사용자 입력값이 업데이트 된 객체!
  • 객체 안에 각 변수가 null값 없이 저장되어 있음

 

 

지금까지 어노테이션 모음 

현재포스팅 

@Controller

@RequestMapping(value="/login.do", method=RequestMethod.POST)

@ModelAttribute("user") UserVO vo / @ModelAttribute("conditionMap")

@RequestParam(value="파라미터 이름" ) String 사용 할 변수명 

@sessionAttributes("board")

 

2021.06.16 - [복습 ARCHIVE/모델별 프로젝트] - [Spring] DI 설정 - 어노테이션

 

[Spring] DI 설정 - 어노테이션

DI 설정 방법 1. 설정 파일 내의 으로 설정 2. 설정 파일 내에서 검색하는 방법  1) 조건 의 xmlns 추가 (context) xmlns:context="http://www.springframework.org/schema/context"  2) 검색 될 컴포넌트(클래..

on-coding.tistory.com

@AuroWired

@Qualified

@Inject

@Resource

 

2021.06.18 - [복습 ARCHIVE/모델별 프로젝트] - [Spring] 어노테이션을 활용한 AOP

 

[Spring] 어노테이션을 활용한 AOP

xml을 사용할 경우 어노테이션을 활용할 경우 - 어드바이스 파일 내에 생성 : 이때 만들어지는 메서드는 기능로직이 없는 포인트 컷만을 위한 메서드 package com.hhw.biz.common; import org.aspectj.lang.JoinPo.

on-coding.tistory.com

@Service

@Aspect

@Before 등 어드바이스 

@pointcut

 

 

Comments