📌 ModelAndView 객체

  • 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");
}


📌 Spring에서 Redirect

  • 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";
}


📌 Component Scan

  • 컴포넌트 스캔
    - servlet-context.xml 파일 마지막에 명시한 component-scan 태그을 통해 지정한 패키지 하위의 모든 파일을 스캔 대상 파일로 지정한다.
    - scan을 하는 도중 @Controller, @Service, @Repository, @Component 등의 어노테이션이 붙어 있는 클래스객체를 생성하여 Spring Bean Container에서 관리한다.
<context:component-scan base-package="com.aa.step03" />


📌 Controller가 하는 일

  • 컨트롤러 업무
    - 모델(데이터)의 이동 경로 지정
    - 어떤 서비스로 비즈니스 로직을 처리할 지에 대한 컨트롤

    즉, 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 객체

  • @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 응답

  • 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;
	}
}


profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글