
이번에는 Spring Legacy Project로 프로젝트를 만들고 실행해보도록 하겠습니다.
먼저 Project Explorer에 new - other - spring을 검색하면

Spring Legacy Project를 선택해줍니다.

그다음 프로젝트명을 임의로 정해서 적어주고(저는 SpringMVC01로 했습니다.) Templates에 Spring MVC Project를 누르고 Next를 눌러줍니다.

그럼 보기와 같은 창이 나오는데 top-level 패키지를 지정해달라고 합니다. 우선 com.mvc.hello로 만들어줍니다.
이 부분은 패키지가

이렇게 자동으로 설정되게 도와줍니다.
여기서는 다른 설정 없이 바로 실행해보면

이렇게 왜인지 모르겠지만 한글이 깨져서 나옵니다.
하지만 코드를 조금만 손보면 한글이 깨지지 않은 상태로 잘 나오게 됩니다.

이걸 어떻게 해야 한글이 안 깨져서 잘 나오게 될까요??
방법은 간단하게 3가지가 있습니다.
1. 화면이 출력되는 /WEB-INF/views/home.jsp에 코드를 두줄 추가해주면 됩니다.

2. 아까 만들어졌던 com.mvc.hello 패키지의 HomeContoller.java에 역시 코드를 두줄 추가해주면 됩니다.

3. web.xml에 filter태그를 추가해줍니다. (이게 보통 많이 사용된다고 합니다.)

위의 3개의 방법 중 하나만 해도 한글이 깨지지 않고 정상적으로 잘 출력이 됩니다.
이제 Spring Legacy Project에 대해 간단히 설명해보도록 하겠습니다.
Spring Legacy Project는 템플릿으로 만들어놓은 것을 가져다가 사용하는 게 용이하게 되어있지만 Spring 버전 3.9까지 사용이 가능합니다. 4.0 이상부터는 Spring Boot를 사용하여 legacy를 사용할 수 없습니다.
프로젝트 생성 후 한번 구조를 보면 여러 가지가 만들어져 있는데요 여기서 눈여겨볼 것은
pom.xml, web.xml, root-context, servlet-context.xml, HomeController, home.jsp 입니다.
그중 몇 가지만 설명해보자면
pom.xml
여기의 dependency들은 템플릿이 자동으로 만들어준 것이니 그냥 읽어만 보세요
web.xml
여기는 뭔가 못 보던 게 생겼죠?

ContextLoaderListener는 어떤 xml을 실행해야 하는지를 파악해서 열어줍니다. 이때 db관련은 context-param으로 일반적인 요청은 servlet으로 넘어갑니다.
그 아래 Dispatcher servlet은 그걸 받아서 Handlermapping을 통해 @controller를 호출합니다.
HomeController
앞에 요청에 맞게 넘어오면 이쪽으로 넘어옵니다. 이후 -> service -> Repository -> DB -> Repository -> Service -> Controller로 다시 값을 가져오면 model에다가 담아서 string("뷰", 이름)을 리턴하는데 이 부분이 MAV(Model And View)객체에 담아서 넘어가게 됩니다.

servlet-context
이걸 servlet-context의 viewResolver라는 애가 MAV를 받아온 것을 가지고 jsp를 만들어서 응답시킬 건데, 위의 return값인 "home" + 뷰를 받아서 앞에 prefix, 뒤에 surfix를 붙여줘서 경로를 완성시킵니다.

따라서 여기서의 경로는 "/WEB-INF/views/home.jsp"가 되겠죠
이제 이 경로의 jsp를 찾아서 model에 담겨있는 값을 넘겨주고 그렇게 만들어진 데이터를 응답시켜줌으로써 화면에 출력되게 됩니다.
'Java > Spring' 카테고리의 다른 글
[Spring] 13 -* Spring MVC ( Task tag를 이용한 TODO주석 표시) (0) | 2021.07.13 |
---|---|
[Spring] 13. Spring MVC (4) | 2021.07.08 |
[Spring] 12 -3 AOP 적용하기 (Component + 심화) (2) | 2021.07.06 |
[Spring] 12 -2 AOP 적용하기 ( Annotation - Before, After, AfterReturning, AfterThrowing) (0) | 2021.07.05 |
[Spring] 12 -1 AOP 적용하기 ( Namespace - aop) (0) | 2021.07.04 |