MVC 패턴이라는 것이 왜 나왔냐
JSP를 보면 이전에 말했듯이 혼자 너무 많은것을 담당하고 있다.
다양한 코드들과 그것들을 보여주는 html까지 있기 때문에,
특히 다른 라이프 사이클을 하나의 jsp에 갖고 있다는 것이 크다.
(서로 다른 기능이 같이 있음)
그렇기 때문에 이러한 책임을 분할하여 관리하는 체계이다.
Model
View
Controller
위의 경우 컨트롤러에서 처음에 서비스와 리포지토리에 접근하여 비즈니스 로직을 해결한 후에 그 데이터를 Model에 담아 전달한다. 그러면 View는 그 Model의 데이터를 참조하여 출력하는 형태를 가진다.
이 클래스는 컨트롤러 역할을 한다.
스프링에서 Get 역할을 한다고 생각하면 된다.
쉽게 말하면 /servlet-mvc/members/new-form
으로 들어오면
/WEB-INF/views/new-form.jsp
를 실행해주는 로직이다.
action에 / 없이 그냥 save라고 쓰면 상대경로로 나오기 때문에
/servlet-mvc/members/save
로 이동하고
/save라고 쓰면 절대경로로 나오기 때문에
/save
로 이동하게 된다.
또 왓스 서버 룰에 있는데 WEB-INF 폴더 안의 파일들은 절대경로로 입력해도 접근할 수 없다.
다른 디렉토리인 jsp, basic 들은 url로 jsp파일 접근이 가능하지만, WEB-INF 디렉토리에 있는 jsp 파일들은 접근이 안되기 때문에 컨트롤러를 통해 접근해야만 한다.
redirect는 실제로 url을 직접 바꿔주기 때문에 호출이 2번 된다.
처음 url -> 다음 url이 직접 호출이 되는 방식이다.
하지만 forward의 경우 서버 내에서 바꾸고 출력되기 때문에
실제 호출은 1번만 일어난다.
먼저 회원등록 폼에서 받아온 파라미터 값들을 넣어주는 member를 새로 만들고
request의 setAttribute를 통해 잠깐 member값을 넣어둔다.
그리고 폼으로 보내준다.
jsp의 기능중에 c:forEach를 사용해서 for문을 돌린것처럼 표현이 가능
위의 코드는 왠지 모르게 3줄이나 써야하는 불편함이 있을 뿐더러,
Thymeleaf같은 다른 뷰를 쓰게되면 전체 코드의 확장자를 바꿔야하는 불편함이 있다.
response를 사용하는 경우가 많이 없다.
기능이 복잡해질수록 컨트롤러에서 공통으로 처리해야할 요소들이 많아진다. 공통처리를 했다 하더라도 결국에는 공통처리의 유틸에 계속 접근해야한다는 것이 문제다.
결론적으로 컨트롤러 호출전에 공통처리해주는 것들이 필요하다.
프론트 컨트롤러(Front Controller) 패턴이 이를 해결해 줄 수 있다. (입구를 하나로 만든다.)