MVC 패턴이란???
모델-뷰-컨트롤러(model–view–controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.
출처 - 위키피디아, mvc 패턴
사전적 의미는 위키피디아에서 가져왔지만 감이 아직 안잡힌다... 핵심만 간단히 풀어서 적어보려 한다.먼저 MVC패턴을 설명하기에 앞서 옛날 개발자들의 말을 들어 보면 FrameWork 라는 개념이 없어 사람마다 코드가 뒤죽박죽이었다고 한다. 또한 옛날 개발자들이 많은 고민 중 하나인 '어떻게 하면 좋은 설계를 할 수 있을까?' 하는 고민과 앞서 말했던 FrameWork의 필요성 때문에 나온 것이 바로 MVC 패턴이라고 한다.
개발공부를 하는 사람이라면 어떻게 하면 더 나은 코드를 설계할지 끊임없이 고민하고 생각해야한다.
좋은 설계의 핵심은 두 가지라고 생각한다! 바로 코드의 재사용성과 중복코드 제거!
위 두가지를 충족시켜주려면 바로 분리를 잘해줘야한다!!!
MVC 패턴은 바로 이 분리에서부터 시작이 된다!
자! 그러면 우리는 어떤 것을 어떻게 분리를 해줘야 할까?
OOP 5대 설계 원칙인 SOLID 개념의 S(SRP)에 따르면 이렇다
S(SRP) : 단일책임의 원칙 : 하나의 메서드는 하나의 책임(=관심사)만 진다.
그래서 좋은 설계를 위해서는 '분리'를 잘해야한다!
※ 관심사(concern) : 해야할 작업
분리는 아래 세 가지로 나눌 수 있다.
- 관심사
- 변하는 것과 (자주) 변하지 않는 것(common, uncommon)
- 공통(중복) 코드
그러면 위 세가지의 분리에 대해서 하나씩 알아보도록 하자
1. 관심사의 분리
@Controller
public class YoilTeller {
@RequestMapping("/getYoil") // http://localhost:8080/ch2/getYoil?year=2021&month=10&day=1
// public static void main(String[] args) {
public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1. 입력
// String year = args[0];
// String month = args[1];
// String day = args[2];
String year = request.getParameter("year");
String month = request.getParameter("month");
String day = request.getParameter("day");
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 2. 처리
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm - 1, dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
char yoil = " 일월화수목금토".charAt(dayOfWeek);
// 3. 출력
// System.out.println(year + "년 " + month + "월 " + day + "일은 ");
// System.out.println(yoil + "요일입니다.");
response.setContentType("text/html"); // 응답의 형식을 html로 지정
response.setCharacterEncoding("utf-8"); // 응답의 인코딩을 utf-8로 지정
PrintWriter out = response.getWriter(); // 브라우저로의 출력 스트림(out)을 얻는다.
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println(year + "년 " + month + "월 " + day + "일은 ");
out.println(yoil + "요일입니다.");
out.println("</body>");
out.println("</html>");
out.close();
}
}
위 YoilTeller 클래스는 1. 입력, 2. 처리, 3. 출력 3가지의 관심사로 나눌 수 있다.
2. 공통 코드의 분리 - 입력의 분리
관심사를 분리했으면 관심사에 공통으로 들어가는 부분인 '입력'을 분리할 수 있다.
입력은 보통 @Controller를 사용한다!
이렇게 할 수 있는게 입력 부분은 모든 코드가 비슷하기 때문이다.
위처럼 공통코드 하나를 분리하므로써 하나의 관심사가 사라짐으로 인해
중복코드가 제거 되고 코드가 간결해지므로 유지보수가 쉬워진다!
3. 변하는 것과 변하지 않는 것의 분리 - 출력(view)의 분리
처리와 출력은 같은 메서드 안에 있어서 서로 참조할 수 있지만
서로 별도의 메서드로 분리가 된다면 어떻게 될까??
→ 서로 다른 영역으로 분리되서 참조할 수 없다.
그래서 중간 객체가 필요한데 그 객체가 바로 MODEL이다!!
저 데이터 둘을 주고 받을 수 있는 부분의 객체 Model
→ MODEL을 만들어놓고 그 객체를 출력하는 값을 저장한다!!
그리고 MODEL을 출력하는 부분에 전달한다!!
VIEW에서는 MODEL에서 전달받은 값을 출력한다!
분리된 두 코드간의 데이터를 전달하기 위한 객체 MODEL
출력, 보여주는 부분이 VIEW 이다!!
그래서 MVC 패턴의 Model, View, Controller 의 기능을 간단히 정리하자면
MVC 패턴
전달 MODEL : 데이터 전달
출력 View : 보여주는 부분
처리 Controller : 작업을 처리함
이렇게 MVC 패턴을 이용함으로서 view를 controller와 분리하고 나서
상황에 따른 view를 보여주는게 편리해졌고 코드 관리가 쉬워져 유지보수 또한 수월해졌다.
ex. 은행 거래내역 조회 1년치를 보고 싶다면 pdf, csv, excel 버튼을 누르면 해당 view를 다운받아서 볼 수 있다.
'Programming > Java, Spring' 카테고리의 다른 글
[JAVA] Generic이란?? (0) | 2022.07.16 |
---|---|
[Spring] JSP & Servlet / JSP와 Servlet의 역할 (0) | 2022.06.17 |
[JAVA] 인터페이스란?? 인터페이스의 작성, 구현 / 인터페이스의 상속 / 인터페이스의 다형성 / 인터페이스의 장점 (0) | 2022.06.04 |
[JAVA] 추상 클래스란? / 추상 메서드란?? / 추상 클래스의 작성 (2) | 2022.06.02 |
[JAVA] 다형성(polymorphism)이란?? (0) | 2022.06.01 |