본문 바로가기
Spring/Spring

day69) annotation 사용하기2 - Controller관련

by code_learner 2022. 4. 7.

@Controller 

컨트롤러 객체를 생성하는 어노테이션, DispatcherServlet에서 @Controller를 참고하여 연결한다.


@RequestMapping

-@Controller를 통해 들어와 @RequestMapping의 value값을 통해 해당 메서드를 찾아갈 수 있도록한다.

-method속성: view에서 요청하는 방식에 따라 맞는 처리를 해준다.


@ModelAttribute

사용용도
1)Command객체 이름변경(변수앞에붙여둠)

 

@Controller
public class MemberController {
	//get방식 요청시
	@RequestMapping(value="/login.do", method=RequestMethod.GET)
	//속성이 2개이상이면 value 생략 불가능
	public String login(@ModelAttribute("user")MemberVO vo) {
    //@ModelAttribute("user")MemberVO vo를 사용해서 경로만 리턴
    // view에서 ${user.id} 이런식으로 사용하면된다.
		System.out.println("Get로 login.do 요청");
		vo.setId("test");
		vo.setPassword("1234");
		return "login.jsp";//리다이렉트 vs 포워드
	}
    
    //post방식 요청시
    @RequestMapping(value="/login.do", method=RequestMethod.POST)
	public String login(MemberVO vo,MemberDAO memberDAO,HttpSession session) {
		System.out.println("POST로 login.do 요청");
		vo=memberDAO.getMember(vo);
		if(vo==null){
			return "redirect:login.jsp";
		}
		session.setAttribute("member", vo);
		return "redirect:main.do";
	}
}

경우에 따라 다르지만 command객체 내에서는 @ModelAttribute보다는 직접적으로 Model객체를 생성해서 많이 쓴다.

   @RequestMapping(value="/main.do")
   public String getBoardList(BoardVO vo,BoardDAO boardDAO,Model model) {
      List<BoardVO> datas=boardDAO.getBoardList(vo);
      model.addAttribute("datas",datas); // Model을 이용하여 전달할 정보를 저장!//☆
      return "main.jsp";//경로만 String으로 보낸다.
   }

 

 


2)View에서 사용할 데이터를 설정 (메서드 앞에 붙여둠)

-@RequestMapping 설정된 메서드 보다 먼저 수행된다.

-selectbox에서 많이 사용되는데
-JSP페이지에서 사용할데이터를 설정하고 view에서는 foreach로 불러내기만 하면된다.
controller에서 반환값은 자동으로 Model에 저장(다음 view에서 볼 수 있다.)

 

BoardController.java

   @ModelAttribute("conMap") // @RequestMapping이 설정된 메서드보다 먼저 수행됨
   public Map<String,String> searchConditionMap() {
      Map<String,String> conMap=new HashMap<String,String>();
      conMap.put("제목", "title");
      conMap.put("작성자", "writer");
      conMap.put("내용", "content");
      return conMap; // 반환값은 자동으로 Model에 저장 == (model.attribute("conMap",conMap))
   }
   
   @RequestMapping(value="/main.do")
   public String getBoardList(BoardVO vo,BoardDAO boardDAO,Model model) {
      // 검색 로직 추가할 예정
      List<BoardVO> datas=boardDAO.getBoardList(vo);
      model.addAttribute("datas",datas); // Model을 이용하여 전달할 정보를 저장!//☆
      return "main.jsp";
   }

main.jsp

	<select name="searchCondition">
			<c:forEach var="v" items="${conMap}">
				<option value="${v.value}">${v.key}</option>
			</c:forEach>
	</select> 
    <input type="text" name="searchKeyword">
    <input type="submit" value="검색">

 


@RequestParam

vo에 없는 멤버변수 들을 자동세팅할 때 사용한다. (getparam)과 같은 역할. 

but, vo를 잘 설계하여 [ex)검색 조건, 검색어같은] 멤버변수들을 잘 설정하였다면 사용할 필요없다.

or, [ex)검색용] vo를 하나더 만드는 방식으로 하여도 사용할 필요 없다.

@RequestMapping(value="/main.do")
   public String getBoardList(@RequestParam(value="searchCondition",defaultValue="title",required=false)String sc,@RequestParam(value="searchKeyword",defaultValue="",required=false)String sk,BoardVO vo,BoardDAO boardDAO,Model model) {
      System.out.println("검색조건: "+sc);
      System.out.println("검색어: "+sk);

      List<BoardVO> datas=boardDAO.getBoardList(vo);
      model.addAttribute("datas",datas); // Model을 이용하여 전달할 정보를 저장!
      return "main.jsp";
   }

 


@SessionAttribute

null 업데이트 이슈를 방지 할때 사용한다.
-> ex) 기존의 writer정보가 존재한다면, 기존의 정보를 유지해 주세요!

1) @SessionAttribute를 등록
2) C는 동작시 "data"라는 이름의 Command객체 존재여부를 확인
 -> ModelAttribute를 통해 data라는 이름 설정해줘서 mapping되게 함
3)기존에 존재하던 data정보를 먼저 set
4) 요청시 새로들어온 정보를 나중에 set

 

@Controller 
@SessionAttributes("data") // 2. data라는 이름의 정보가 Model에 들어온다면, session에 기억해둬라!//☆
public class BoardController {
  
   @RequestMapping(value="/board.do")
   public String getBoard(BoardVO vo,BoardDAO boardDAO,Model model) {
      vo=boardDAO.getBoard(vo);
      model.addAttribute("data", vo); // 1. Model을 이용하여 전달할 정보를 저장!//☆
      return "board.jsp";
   }

   @RequestMapping(value="/updateBoard.do")
   public String updateBoard(@ModelAttribute("data")BoardVO vo,BoardDAO boardDAO) {//3. ☆
      System.out.println(" null 업데이트 이슈 확인: "+vo.getWriter());//session에 저장해둔 정보가 먼저 setter
      System.out.println(" null 업데이트 이슈 확인: "+vo.getTitle());//이후에 파라미터로 들어온 정보가 나중에 setter
      System.out.println(" null 업데이트 이슈 확인: "+vo.getContent());
      boardDAO.updateBoard(vo);
      return "redirect:main.do";
   }
}

댓글