코드프레소 백엔드 개발자 양성 과정

모델 2 방식 개발

MVC 디자인 패턴을 이용해 효율적으로 개발해본다.

H Lee

--

Photo by Brano Hudak from FreeImages

여느 업무와 마찬가지로 웹 애플리케이션을 개발하는 일도 기존에 사용했던 틀이나 방식을 따르면 편리하다. 웹 개발의 경우 표준화된 소스 구조를 이용할 수 있다. 이런 구조를 웹 애플리케이션 모델이라고 한다. 웹 애플리케이션 모델의 종류에는 모델 1과 모델 2 두 가지가 있다. 이 둘을 비교해보고 모델 2 방식의 한 패턴인 MVC에 대해 알아보겠다.

모델 1 방식

비즈니스 로직과 화면 기능을 모두 동일한 JSP에서 수행하도록 개발하는 것을 모델 1 방식이라고 한다. 데이터를 생성하고 표시하거나 저장하는 과정과, 결과를 클라이언트에게 출력해주는 과정이 모두 JSP에서 이루어진다. 이를 도식화하면 아래와 같다.

JSP가 클라이언트로부터 요청을 받는 일, 중간에 데이터베이스를 오가며 자료를 가공하는 일, 처리 결과를 클라이언트에게 반환하는 일을 모두 맡는다. 이렇게 모델 1 개발 방식은 구조가 단순하여 구현이 쉽다는 장점이 있다.

하지만 오늘날의 웹 서비스는 한 곳에서 화면 기능과 비즈니스 로직 기능을 모두 수행할 수 있을 만큼 간단하지 않다. 복잡한 기능을 다수 구현하다 보면 모델 1로는 아래와 같은 문제가 발생할 수 있다.

  • 유지보수 문제 : 자칫 화면 기능과 비즈니스 로직 기능이 섞이며 오류가 발생하기 마련이다.
  • 재사용성 문제 : 기능이 한 덩어리로 묶여 있으면 일부만 떼어 다른 애플리케이션에 부품처럼 끼워넣어 동작시키기 어렵다.
  • 분업화 문제 : 웹 디자이너와 웹 프로그래머가 한 클래스, 한 파일에 매달려 일하면 효율성이 떨어진다.

이런 이유로 모델 1은 실제 개발 환경에서는 널리 쓰이지 않는다.

모델 2 방식

모델 2는 모델 1의 단점을 보완하고자 웹 애플리케이션의 각 기능을 분리하여 구현한다. 클라이언트 요청 처리, 응답 처리, 비즈니스 로직 처리 등의 기능을 모듈화하여 다음과 같은 구조를 띈다.

표면적으로는 모델 2가 모델 1보다 복잡한 구조를 지녔다. 때문에 초보 개발자라면 관련 기술이나 개념을 숙지하는 데에 시간과 노력을 들여야 한다는 단점이 있다. 하지만 조금만 복잡한 서비스를 운영하게 되면 모델 2의 장점은 금세 명백해진다.

  • 편리한 유지보수 : 부분이나 모듈 별로 프로그램을 설계하고 구축하고 작성하므로 오류가 발생할 확률이 낮다. 발생하더라도 훨씬 수월하게 디버깅할 수 있다.
  • 높은 재사용성 : 각각의 기능들이 부품화, 모듈화되어 있어 필요한 부분만 조합하여 다양한 웹 애플리케이션을 빠르게 만들어낼 수 있다.
  • 분업화 : 디자이너나 프로그래머가 전체 기능을 모르더라도 각자의 업무만 처리하면 웹 프로그램이 완성된다.

MVC 디자인 패턴

모델 2 구조에는 여러 하위 개념들이 있는데 가장 많이 사용되는 개념이 MVC이다. MVC는 Model — View — Controller의 약자로 일종의 프로그램 디자인 패턴이다. MVC는 모델 2의 일부로서 위에 기술한 모델 2의 특징과 장점을 그대로 지닌다.

MVC의 구성 요소를 살펴보면 다음과 같다.

  • Controller

우리가 컨트롤러라고 칭하는 것은 사실 서블릿이다. 이 서블릿은 클라이언트의 요청을 받아서 분석한 후, 알맞은 모델을 호출한다. 모델이 요청을 처리해 반환하면 클라이언트에게 결과를 보여주기 위해 JSP를 선택한다. 전체 과정의 흐름을 제어하는 셈이다.

  • Model

모델은 데이터를 저장하거나 수정하거나 데이터베이스 연동과 같은 비즈니스 로직을 수행한다. 일반적으로 DAO나 VO 클래스로 구성되어 있다.

  • View

뷰는 본질적으로 JSP이다. 화면 기능을 담당하여 모델에서 처리한 결과를 화면에 표시한다.

MVC를 이용한 회원 관리 예제

MVC의 특성과 장점을 이용하여 간단한 예제에 적용해보겠다. 회원 정보를 조회하는 기능을 구현해보자.

단계를 도식화하여 흐름을 눈으로 본다.

  1. 브라우저에서 /mem.do로 요청한다.
  2. MemberController 서블릿이 요청을 받고 MemberDAOlistMembers() 메서드를 호출한다.
  3. MemberDAOlistMembers() 메서드에서 SQL문으로 회원 정보를 조회한다.
  4. 조회된 정보를 MemberVO에 설정하여 반환한다.
  5. MemberController가 받은 정보를 listMembers.jsp로 전송한다.
  6. listMembers.jsp가 결과를 클라이언트의 화면에 출력한다.

우선 컨트롤러 역할을 하는 서블릿인 MemberController 클래스에서 MemberDAO 객체를 초기화하고 그의 listMembers() 메서드를 호출하여 회원 정보를 ArrayList로 반환 받는다.

MemberDAO 클래스에서는 listMembers() 메서드 호출 시 SQL문을 이용해 회원 조회 후 결과를 ArrayList로 반환한다.

MemberVO 클래스에서는 인자 네 개를 갖는 생성자와 다섯 개를 갖는 생성자를 만든다.

마지막으로 listMembers.jsp에선 바인딩되어 전달된 회원 정보를 차례대로 표시한다.

결과를 클라이언트 측에서 받아보면 이렇게 출력된다.

이 예제에서 컨트롤러에 해당하는 MemberController 서블릿은 클라이언트의 요청을 받고 관련 메서드를 호출하였으며, 모델에 해당하는 MemberDAO는 SQL문으로 데이터베이스를 접속하였다. VO에 담긴 이 정보를 다시 MemberController가 흐름을 제어하여 뷰로 보내주었고, listMembers.jsp를 통해 성공적으로 브라우저에 출력된 것을 볼 수 있었다.

이렇게 MVC 패턴을 따르면 오류 수정이나 기능 추가, 재사용 등이 용이해짐을 느낄 수 있다.

참고 : 자바 웹을 다루는 기술 (이병승)

--

--