- ModelAndView
- Model(데이터)과 View(jsp페이지)를 모두 담을 수 있는 객체
- Controller의 메소드에서 return 값으로 사용@RequestMapping("/member/list.do") public ModelAndView getList() { List<MemberDto> list = dao.getList(); // ModelAndView 객체 생성 ModelAndView mView = new ModelAndView(); // ModelAndView 객체에 전달 Model(데이터) 담기 mView.addObject("list", list); // ModelAndView 객체에 forward 이동할 View의 경로를 지정하여 동작시킴 mView.setViewName("member/list"); return mView; } @RequestMapping("/member/list.do") public ModelAndView getList(ModelAndView mv) { List<MemberDto> list = dao.getList(); // ModelAndView 객체에 전달 Model(데이터) 담기 mv.addObject("list", list); // ModelAndView 객체에 forward 이동할 View의 경로를 지정하여 동작시킴 mv.setViewName("member/list"); return mv; } @RequestMapping("/member/update.do") public ModelAndView update(MemberDto dto) { dao.update(dto); return new ModelAndView("member/update"); }
- Redirect
- 'redirect:' 키워드를 사용하여 redirect할 수 있다.
- 형식
- mv.setViewName("redirect:이동경로/요청이름.do");
- "redirect:이동경로/요청이름.do"@RequestMapping("/member/delete.do") public String delete(int num) { dao.delete(num); // 형식 = "redirect:이동할 경로/요청.do" return "redirect:/member/list.do"; }
- 컴포넌트 스캔
- servlet-context.xml 파일 마지막에 명시한 component-scan 태그을 통해 지정한 패키지 하위의 모든 파일을 스캔 대상 파일로 지정한다.
- scan을 하는 도중 @Controller, @Service, @Repository, @Component 등의 어노테이션이 붙어 있는 클래스의 객체를 생성하여 Spring Bean Container에서 관리한다.<context:component-scan base-package="com.aa.step03" />
- 컨트롤러 업무
- 모델(데이터)의 이동 경로 지정
- 어떤 서비스로 비즈니스 로직을 처리할 지에 대한 컨트롤즉, Controller는 서비스 로직에 의존적인 객체이다.
- 기존에 있던 DI 받은 Dao 객체를 삭제한다.
- Service interface type 객체를 DI 받는다.@Controller public class MemberController { @Autowired private MemberService service; @RequestMapping("/member/list.do") public ModelAndView getList(ModelAndView mav) { service.getListMember(mav); mav.setViewName("member/list"); return mav; } @RequestMapping("/member/insertform.do") public String insertform() { return "member/insertform"; } @RequestMapping("/member/insert.do") public String insert(MemberDto dto) { service.addMember(dto); return "member/insert"; } @RequestMapping("/member/updateform.do") public ModelAndView updateform(ModelAndView mav, int num) { service.getMember(mav, num); mav.setViewName("member/updateform"); return mav; } @RequestMapping("/member/update.do") public String update(MemberDto dto) { service.updateMember(dto); return "member/update"; } @RequestMapping("/member/delete.do") public String delete(int num) { service.deleteMember(num); return "redirect:/member/list.do"; } }
- @Service
- Controller에서 하지 않는 비즈니스 로직을 처리한다.Dao에 의존적인 객체
@Service public class MemberServiceImpl implements MemberService { @Autowired private MemberDao dao; @Override public void addMember(MemberDto dto) { dao.insert(dto); } @Override public void updateMember(MemberDto dto) { dao.update(dto); } @Override public void deleteMember(int num) { dao.delete(num); } @Override public void getMember(ModelAndView mav, int num) { MemberDto dto = dao.getData(num); mav.addObject("dto", dto); } @Override public void getListMember(ModelAndView mav) { List<MemberDto> list = dao.getList(); mav.addObject("list", list); } }
- 전체 흐름
1. 요청명.do을 요청
2. Controller : 서비스 로직 지정 (service 이용)
3. Service [interface, class] : 비즈니스 로직 처리 (dao 이용)
4. Dao [interface, class] : DML 문법 처리 (session 이용)
5. MyBatis Mapper [Configuration, Mapper] : DB와 직접 통신
6. jsp 페이지로 응답
- JSON으로 응답 조건
1. jackson-databind 라이브러리가 dependency 에 명시가 되어 있고
2. servlet-context.xml 에 <.annotation-driven/> 이 명시가 되어 있고
3. 컨트롤러의 메소드에 @ResponseBody 어노테이션이 붙어 있으면
→ Map or Dto or List 객체에 담긴 내용이 json 문자열로 변환되어 응답한다.
- 특징
- Map, Dto : Key, Value 형식으로 응답
- List : Array 형식으로 응답
@Controller public class JSONTestController { // Map 으로 응답 @RequestMapping("/send.do") @ResponseBody public Map<String, Object> send(String msg) { Map<String, Object> map = new HashMap<String, Object>(); map.put("num", 1); map.put("name", "aa"); map.put("isWoman", true); return map; } // Dto 로 응답 @RequestMapping("/send2.do") @ResponseBody public MemberDto send2(String msg) { MemberDto dto = new MemberDto(2, "aa", "aaaa"); return dto; } // List 로 응답 @RequestMapping("/send3.do") @ResponseBody public List<String> send3(String msg) { List<String> list = new ArrayList<String>(); list.add("a1"); list.add("a2"); list.add("a3"); return list; } }