본문 바로가기

spring/spring

Step03_MyBatis ( @service )

 

컨트롤러에 대한 이해

 

컨트롤러에서는 dao 를 이용한 비즈니스 로직 혹은 복잡한 비즈니스 로직 처리는 하지 않는게 원칙이다.

- 컨트롤러에서 dao 에 의존하고 있다는 것은 바람직한 구조가 아니다.
dao 를 활용한 비즈니스 로직처리를 서비스 객체를 이용해서 처리 해야한다.

컨트롤러도 dao 에 의존하지 말고 서비스에 의존하도록 해야 한다.
컨트롤러에서는 클라이언트의 어떤 경로 요청에 대해서  어떤 서비스로 비즈니스 로직을 처리하고 어디로 어떻게 이동해서 응답해야 할지에 대한 작업만 하면 된다. 

 

 

MemberService.java

package com.gura.step03.member.service;

import org.springframework.web.servlet.ModelAndView;

import com.gura.step03.member.dto.MemberDto;

public interface MemberService {
	//회원 정보를 추가 해 주는 메소드
	public void addMember(MemberDto dto);
	//회원 정보를 수정 해 주는 메소드
	public void updateMember(MemberDto dto);
	//회원 정보를 삭제 해 주는 메소드
	public void deleteMember(int num);
	//회원 한명의 정보를 인자로 전달한 ModelAndView 객체에 담아주는 메소드
	public void getMember(int num, ModelAndView mView);
	//회원 전체의 정보를 인자로 전달한 ModelAndView 객체에 담아주는 메소드
	public void getListMember(ModelAndView mView);
}

 

MemberServiceImpl.java

package com.gura.step03.member.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;

import com.gura.step03.member.dao.MemberDao;
import com.gura.step03.member.dto.MemberDto;

@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(int num, ModelAndView mView) {
      MemberDto dto=dao.getData(num);
      mView.addObject("dto", dto);
   }

   @Override
   public void getListMember(ModelAndView mView) {
      List<MemberDto> list=dao.getList();
      mView.addObject("list", list);
   }

}

 

 

기존 MemberController2

package com.gura.step03.member.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.gura.step03.member.dao.MemberDao;
import com.gura.step03.member.dto.MemberDto;

@Controller
public class MemberController2 {
   
   // spring bean container 로 부터 MemberDao 인터페이스 type 의 참조값을 DI 받는다. 
   @Autowired
   private MemberDao dao;
   
   @RequestMapping("/member/update")
   public String update(MemberDto dto) {
      //MemberDao 객체를 이용해서 회원정보를 수정 반영하고 
      dao.update(dto);
      //view page 로 forward 이동해서 응답 
      return "member/update";
   }
   
   
   @RequestMapping("/member/updateform")
   public ModelAndView updateform(int num, ModelAndView mView) {
      //MemberDao 객체를 이용해서 수정할 회원의 정보를 DB 에서 불러온다.
      MemberDto dto=dao.getData(num);
      
      //ModelAndView 객체를 직접생성하지 않고 컨트롤러의 메소드 인자로 받아서 사용할수도 있다. 
      //ModelAndView mView=new ModelAndView();
      
      mView.addObject("dto", dto);
      mView.setViewName("member/updateform");
      
      return mView;
   }
   
   @RequestMapping("/member/delete")
   public String delete(int num) {
      //MemberDao 객체를 이용해서 DB 에서 삭제하고
      dao.delete(num);
      /* /member/list.do  요청을 다시 하도록 리다일렉트 이동 시킨다
            리다일렉트 이동은 특정경로로 요청을 다시 하라고 강요하는 응답이다.
            
         "redirect: context 경로를 제외한 요청을 다시할 절대경로 " 
      */
      return "redirect:/member/list.do";
   }
   
   @RequestMapping("/member/insert")
   public ModelAndView insert(MemberDto dto) {
      //MemberDao 객체를 이용해서 추가하기 
      dao.insert(dto);
      
      // ModelAndView 객체의 생성자의 인자로 view page 의 정보를 넣어줄수도 있다.
      return new ModelAndView("member/insert");
   }
   
   
   @RequestMapping("/member/insertform")
   public ModelAndView insertform(ModelAndView mView) {
      
      //모델은 담지 않고 view page 정보만 담아서 리턴할수도 있다 
      mView.setViewName("member/insertform");
      return mView;
   }
   
   @RequestMapping("/member/list")
   public ModelAndView list() {
      
      //view page 에 전달할 모델(data) 
      List<MemberDto> list=dao.getList();
      
      // Model 과 view page 의 정보를 동시에 담을 객체를 생성해서 
      ModelAndView mView=new ModelAndView();
      // view page 에 전달할 모델을 list 라는 키값으로 담고 
      mView.addObject("list", list);
      // view page 의 정보도 담고 
      mView.setViewName("member/list");
      // ModelAndView 객체를 리턴해주면 동일하게 동작한다. 
      return mView;
      
   }
}

 

service 적용 MemberController2

package com.gura.step03.member.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.gura.step03.member.dao.MemberDao;
import com.gura.step03.member.dto.MemberDto;
import com.gura.step03.member.service.MemberService;
/*
 *  컨트롤러에 대한 이해
 *  
 *  - 컨트롤러에서는 dao 를 이용한 비즈니스 로직 혹은 복잡한 비즈니스 로직 처리는 하지 않는게 원칙이다.
 *  - 따라서 컨트롤러에서 dao 에 의존하고 있다는 것은 바람직한 구조가 아니다.
 *  - 그럼 dao 를 활용한 비즈니스 로직처리는 어떻게 해야 하나 ?  
 *    답: 서비스 객체를 이용해서 비즈니스 로직을 처리 해야한다.
 *  - 따라서 컨트롤러는 dao 에 의존하지 말고 서비스에 의존하도록 해야 한다.
 *  - 그럼 컨트롤러에서는 무엇을 해야 하나 ?
 *    답: 클라이언트의 어떤 경로 요청에 대해서  어떤 서비스로 비즈니스 로직을 처리하고 
 *        어디로 어떻게 이동해서 응답해야 할지에 대한 작업만 하면 된다. 
 */   
@Controller
public class MemberController2 {
   
   @Autowired
   private MemberService service;
   
   @RequestMapping("/member/update")
   public String update(MemberDto dto) {
      
      //MemberService 객체를 이용해서 회원 정보 수정 반영
      service.updateMember(dto);
      
      //view page 로 forward 이동해서 응답 
      return "member/update";
   }
   
   
   @RequestMapping("/member/updateform")
   public ModelAndView updateform(int num, ModelAndView mView) {
      
      //MemberService 객체를 이용해서 ModelAndView 에 회원 한명의 정보가 담기도록 한다. 
      service.getMember(num, mView);
      
      //view page 의 정보를 ModelAndView 에 담기 
      mView.setViewName("member/updateform");
      
      return mView;
   }
   
   @RequestMapping("/member/delete")
   public String delete(int num) {
      
      //MemberService 객체를 이용해서 회원 정보 삭제하기
      service.deleteMember(num);
      
      /* /member/list.do  요청을 다시 하도록 리다일렉트 이동 시킨다
            리다일렉트 이동은 특정경로로 요청을 다시 하라고 강요하는 응답이다.
            
         "redirect: context 경로를 제외한 요청을 다시할 절대경로 " 
      */
      return "redirect:/member/list.do";
   }
   
   @RequestMapping("/member/insert")
   public ModelAndView insert(MemberDto dto) {
      //MemberService 객체를 이용해서 회원 한명의 정보 추가하기
      service.addMember(dto);
      
      // ModelAndView 객체의 생성자의 인자로 view page 의 정보를 넣어줄수도 있다.
      return new ModelAndView("member/insert");
   }
   
   
   @RequestMapping("/member/insertform")
   public ModelAndView insertform(ModelAndView mView) {
      
      //모델은 담지 않고 view page 정보만 담아서 리턴할수도 있다 
      mView.setViewName("member/insertform");
      return mView;
   }
   
   @RequestMapping("/member/list")
   public ModelAndView list() {
      
      // Model 과 view page 의 정보를 동시에 담을 객체를 생성해서 
      ModelAndView mView=new ModelAndView();
      
      //MemberService 객체를 이용해서 ModelAndView 객체에 회원목록을 담아온다.
      service.getListMember(mView);
      
      // view page 의 정보도 담고 
      mView.setViewName("member/list");
      // ModelAndView 객체를 리턴해주면 동일하게 동작한다. 
      return mView;
      
   }
}

'spring > spring' 카테고리의 다른 글

Step03_MyBatis (typeAliases)  (0) 2022.09.02
스프링 프레임 워크 개념 정리  (0) 2022.09.02
Step03_MyBatis (ModelAndView, redirect)  (0) 2022.09.01
Step03_todo list 만들기  (0) 2022.08.31
Step03_MyBatis (Member 회원목록)  (0) 2022.08.31