본문 바로가기

프로그래밍/웹

Spring MVC 개발 프로세스

반응형

ி MVC


Model-View-Controller의 약어이고 3가지 역할을 뜻하는 개발 방법론이다.
Model : DB 비즈니스 로직을 수행한다.
View : 이용자가 보게 될 화면을 출력한다.
Controller : 이용자의 입력 처리 및 흐름제어를 담당한다.
비즈니스 로직 : 데이터 처리를 수행하는 응용프로그램의 일부이다.


MVC 모델 종류



Model 1



- 컨트롤러와 뷰를 같이 구현하는 방식이다.
- 이용자 요청을 모두 JSP가 처리한다.
- 쉽고 빠르게 개발 가능하지만 뷰와 컨트롤러가 섞이므로 유지보수가 어렵고 기능 재사용성이 떨어진다.


Model 2



- 컨트롤러와 뷰가 분리된 방식이다.
- 이용자 요청을 컨트롤러(Servlet)가 처리하고 결과를 View나 Model로 전송한다.
- 처리 작업이 분리되므로 유지보수와 확장이 용이하지만 구조 설계 시간이 많이 소요된다.




Service


Service Interface는 기능에 따라 비즈니스 로직을 처리한다.
DAO는 DB 테이블 당 하나씩 연결되지만 Service는 비즈니스 또는 기능 당 하나씩 사용된다.
OOP에서는 클래스를 세부적으로 나누어 다른 클래스와의 의존 관계를 낮추어야한다.
예를들어 게시글 처리와 관련된 기능들중 게시글 조회, 수정, 삭제 등이 있는데
이는 서로 다른 기능이므로 아래 예시처럼 각각의 Service Interface를 만들어 관리하면 유지보수 측면에서 좋다.

BoardSelectService


BoardInsertService


서로 관련있는 기능이 그룹으로 묶여있으므로 관리하기가 용이하다.
그런데 Service 하나 당 하나의 ServiceImpl을 가지는 1:1 구조라면 굳이 Interface를 사용할 필요 없지만
앞으로 기능이 추가될 예정(1:N)이라면 사용하는게 좋다.

Service를 만들 때는 Service를 Interface 파일로, ServiceImpl은 클래스 파일로 작성한다.
ServiceImpl은 구현부로서 기능을 구현하는 역할을 한다.




ி MVC Model2




Model2 개발 방식으로 로그인 프로세스를 구현하는 예제이다.


로그인 페이지 접근


Controller

Controller @RequestMapping(value = "/login.do", method = RequestMethod.GET) public String login() throws Exception { logger.info("로그인 페이지 접근"); return "login"; // Servlet-context에 의해 login.jsp로 이동된다. }




로그인 요청


View -> Controller

@RequestMapping(value = "/login.do", method = RequestMethod.POST) public String login(MemberVO vo, HttpSession session, RedirectAttributes rttr) throws Exception{ logger.info("로그인 요청"); session.getAttribute("member"); // 로그인 세션 확인 MemberVO login = service.login(vo); // service 호출 // 로그인 확인 if(login != null) { session.setAttribute("member", login); } else { session.setAttribute("member", null); rttr.addFlashAttribute("msg", false); } return "redirect:/"; // 로그인 여부에 따라 다른 페이지로 이동 }




Service


Controller -> Service -> serviceImpl


// MemberService public interface MemberService { public MemberVO login(MemberVO vo) throws Exception; } // MemberServiceImpl @Service public class MemberServiceImpl implements MemberService { @Override @Inject MemberDAO dao; public MemberVO login(MemberVO vo) throws Exception { return dao.login(vo); } }



DAO


serviceImpl -> DAO -> DAOImpl

// MemberDAO public interface MemberDAO { public MemberVO login(MemberVO vo) throws Exception; } // MemberDAOImpl @Repository public class MemberDAOImpl implements MemberDAO { @Inject SqlSession sql; @Override public MemberVO login(MemberVO vo) throws Exception { return sql.selectOne("memberMapper.login", vo); } }




Mapper


DAOImpl -> Mapper
Mapper로 DB에 접근하여 데이터를 조회한다.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="memberMapper"> <!-- 로그인 --> <select id="login" resultType="com.sec.secprj.vo.MemberVO"> SELECT userId, userPass, userName FROM MP_MEMBER WHERE USERID = #{userId} and #{userPass} </select> </mapper>


매퍼에서 로그인 결과 값을 MemberVO에 전달하고 DAO -> Service를 거쳐 Controller에 전달된다.
최종적으로 Controller에서 로그인 여부에 따라 세션을 설정하고 JSP 페이지로 Forward 한다.


반응형