스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 섹션3. 서블릿, JSP, MVC 패턴
CS/김영한 스프링 강의

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 섹션3. 서블릿, JSP, MVC 패턴

 

이제 서블릿이 HTTP 응답을 알아서 만들어준다는 것을 확인했으니, 서블릿으로 해보고 JSP, MVC로 바꿔가며 왜 MVC를 쓰는지 확인하는 섹션이다.

특이한건 html을 서버쪽에서 직접 주고 있다는 것. Content-Type을 text/html로 했기 때문에 웹 브라우저는 html 그대로 그린다. 거기다 자바로 했기 때문에 안의 내용에 for iterator를 돌린다던가 할 수도 있다.

 

 

이런 servlet으로 자바 코드 안에서 html를 짜는건 불편하다. 그래서 jsp를 사용했었던 시기가 있었다.

 

jsp는 html 안에 자바코드를 넣는 방식이다. 맨 위의

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

줄이 jsp라는 표시이며, <%%>안에는 자바코드 넣고 <%= %>안에는 출력할 것을 내놓는다.

 

단점은 뷰를 위한 html안에 자바코드도 들어가며 너무 많은 것이 들어간다는 것. servlet도 자바 코드 안에 html를 string 형태로 써내야 하니 너무 복잡하다.

즉 근본적인 문제는 뷰와 코드가 같이 있을 수 밖에 없다 보니 하나의 파일에 코드가 너무 방대해지는 것이다. 그래서 MVC가 나옴.

물론 현재는 바닥에 만드는 것이기 때문에 뭔가 특별하게 사용하는건 아니고, 함수 써놓고 '이제부턴 이게 controller다'라고 생각하는거.

핵심은 위에서 자바코드에 html까지 다 있든, html에 자바코드까지 다 있든 한다는 것이 문제. 코드 양이 많아져서 복잡해지는 것도 있지만, 더 문제인 것은 무언가를 변경할 때 각각이 독립적으로 분리되어 있지 않기 때문에 서로 영향이 너무 크다. 예를들어 뷰만 바꾸고 싶었는데 자바의 내부 로직을 변경해야 한다던지..

그래서 그것들을 독립적으로 분리시키기 위해서 MVC가 나온 것.

 

'이제부터 우리가 만드는 클래스는 controller 클래스다'라고 우리끼리 정하고 만든다. 만약 위의 url로 이동했을 경우, 저 views 폴더 안에 있는 jsp를 뷰로써 불러와 사용한다.

여기서 핵심은 웹 브라우저는 분명 저 위의 url로 가는데 보이는 것은 저 service 함수 안에서 지정한 url 파일 화면이 보인다는 것. 서버에서 내부적으로 뷰를 다른 곳으로 보여주는 것이다. 즉 redirect와는 조금 다르다 (서버 내의 redirect라고 생각하면 편함).

참고로 웹 정적 파일에 접근할지라도 폴더 명에 views가 있으면 정적으로 접근안됨.

 

url은 controller 클래스에서 정의한 url.

 

 

정보를 주고받을 때 데이터 전달, 참조해주는 모델이 그 역할을 함. setAttribute로 뷰에서 불러올 변수를 모델로써 저장하는 것. 이로써 자바안에서 html는 사용할 필요 없이 필요한 변수는 모델에 저장하여 뷰로 보여주고자 하는 파일 경로만 전달해주면 되고, 뷰 역할을 하는 해당 파일 경로 안에는 자바를 사용할 필요 없이 자신이 사용할 변수는 모델에서 가져와 사용한다. 이로써 자바코드와 html를 분리할 수 있었다.

 

for문 쓰고 하는것도 쉽다. 반나절이면 익힌다고 함.

 

 

 

.. 이 MVC의 단점은 여기서조차 controller 안에서 중복되는 코드가 많다는 것. 예를 들면

저 viewPath만 필요한데 dispatcher 만들고 forward해주는 코드들은 모두 똑같이 들어간다 이걸 없애고 싶다.

근데 이게 생기는 이유는 근본적인 구조 문제 때문인데, 각각의 클래스들이 각각의 url을 직접 맡아 처리하기 때문이다. 즉 /servlet-mvc/members로 가는 url는 오로지 저 클래스 하나가 다 관리해서 처음부터 해주는 함수를 사용해야 하고, servlet-mvc/members/save로 가는 url도 해당 클래스 하나가 처음부터 url을 받아 모두 처리해야 하기 때문이다. 그럼 공통된 코드니 함수로 하나 빼서 하면 낫지 않겠냐? 하면 그 공통된 함수를 어차피 또 똑같이 쓴다는 것 자체가 문제.

 

그래서 근본적인 구조 문제이기 때문에 무언가 하나 더 필요한데, 수문장 같은 거라고 한다. 즉, 각각의 url를 하나씩 직접 만든것이 아니라, 하나의 클래스가 모든 url를 얻고, 처리하는 저 클래스들을 호출하고, 마지막에 뷰 url를 보내면 된다는 것. 약간 데코레이터 느낌.

 

그래서 다음에 만들것이 구조적인 것을 슬슬 만들기 때문에 간단한 MVC 프레임워크라고 함.