# JSP 연동

## JSP 연동

Controller에서 프로그래밍 로직을 수행한 뒤 JSP 화면으로 포워드(forward) 되도록 설정할 수 있다. Spring Legacy에서는 JSP가 표준이므로 기본 설정되어 있으나 Spring Boot는 View 초기 설정이 존재하지 않는다.&#x20;

Spring Boot에서는 여러 종류의 View 설정이 가능하며, 이 문서에서는 JSP 설정 방법을 살펴본다.

## 의존성 추가

JSP를 사용하기 위해서는 다음 의존성이 필요하다.

* javax.servlet.jstl
* org.apache.tomcat.embed.tomcat-embed-jasper

<mark style="color:blue;">`pom.xml`</mark>의 <mark style="color:blue;">`<dependencies>`</mark>에 다음과 같이 추가한다.

```markup
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
```

## JSP 생성

Spring Boot에서는 <mark style="color:red;">`WEB-INF`</mark>, <mark style="color:red;">`META-INF`</mark> 등의 기존 폴더들을 초기 생성하지 않는다. 따라서 필요한 경우 수동으로 생성해야 한다. <mark style="color:blue;">`JSP`</mark>의 경우 사용자의 직접 접근을 차단하고 컨트롤러와 연결된 경우만 접근이 가능하도록 <mark style="color:red;">`WEB-INF`</mark> 폴더 내부에 보관하는 것이 일반적이다.

Spring Legacy의 기본 JSP 경로와 동일한 위치에 JSP를 보관할 수 있는 폴더를 생성한다.

<div align="left"><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FRF3edRsRLHyrS3wb3Fd5%2Fspring.gif?alt=media&#x26;token=8f505ea7-37ac-4017-85ee-cc35c49fb857" alt=""></div>

생성 메뉴에서 JSP가 보이지 않는다면 다음 문서를 참고하여 플러그인 설치를 해야한다.

{% content-ref url="add-jsp/jsp-select-wizard-issue" %}
[jsp-select-wizard-issue](https://docs.sysout.co.kr/web/back-end/spring-boot/spring-controller/add-jsp/jsp-select-wizard-issue)
{% endcontent-ref %}

생성한 폴더에 연결될 JSP 파일을 생성한다(<mark style="color:blue;">`welcome.jsp`</mark>)

<div align="left"><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FRauL5b9Fv6TjknPPB2qD%2Fspring.gif?alt=media&#x26;token=77c811ce-acc9-4ac6-a034-29ddb48759f8" alt=""></div>

## 컨트롤러 매핑 작성

컨트롤러에 다음 코드를 추가한다.

{% code title="HomeController.java" %}

```java
@RequestMapping("/welcome")
public String welcome(){
    return "/WEB-INF/views/welcome.jsp";
}
```

{% endcode %}

<div align="left"><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2F7sjmHNMjZ3QTb97YEjC4%2Fspring.gif?alt=media&#x26;token=e1a661ce-acd2-4718-8c93-994b83a1a46f" alt=""></div>

<mark style="color:red;">`@ResponseBody`</mark>를 사용하지 않으면 반환되는 값이 View의 경로로 처리된다. 따라서 welcome 메소드 실행 후 welcome.jsp로 이어진다. 이를 **포워드(Forward)**&#xB77C;고 한다. 내부적으로는 DispatcherServlet에서 처리해주며 구조는 다음과 같다.

<div align="left"><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2F4tcGytruZVGCegrf4oYp%2Fimage.png?alt=media&#x26;token=0639a606-42af-4425-99ff-9348192de335" alt=""></div>

## 접속 확인

Spring Boot App이 실행중인지 확인하고 브라우저에서 다음 주소에 접속한다.

{% embed url="<http://localhost:8888/boot02/welcome>" %}

<div align="left"><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FgXj2V2eplF6OMaef6xdN%2Fspring.gif?alt=media&#x26;token=58384a5b-360a-4804-885f-9cbc75bee0d3" alt=""></div>

설정이 잘 되었다면 위와 같이 연결된 JSP 화면이 나오며, 오타 등 코드에 문제가 발생한 경우 다음과 같이 404 Error 화면이 나온다.

<div align="left"><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FxjnNaUxevgd9ZyR1jvRn%2Fimage.png?alt=media&#x26;token=7b43984d-5ee0-4d7b-b28c-ab6dcc9d05ca" alt=""></div>

## View Resolver 설정

JSP를 <mark style="color:blue;">`/WEB-INF/views`</mark> 폴더에 계속 생성할 예정이므로 앞으로 생성될 컨트롤러의 반환 주소는 반드시 <mark style="color:blue;">`/WEB-INF/views/???.jsp`</mark> 형태가 된다. 반복적이고 비효율적인 작업을 피하기 위해 앞부분의 접두사 <mark style="color:red;">`/WEB-INF/views/`</mark>와 뒷부분의 접미사 <mark style="color:red;">`.jsp`</mark>를 자동 입력되도록 설정할 수 있다.

설정하는 방법은 여러 가지가 있으며, <mark style="color:blue;">`application.properties`</mark>에 설정하는 방법으로 진행한다.

{% code title="application.properties" %}

```properties
#view resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
```

{% endcode %}

`/` 혹은 `.` 등을 누락하면 오류가 발생하므로 정확하게 작성해야 한다.

위와 같이 설정을 하고 나면 Controller에서 반환하는 주소에 자동으로 접두사(prefix)와 접미사(suffix)가 추가되므로 주소를 변경해야 한다.

{% code title="HomeController.java" %}

```java
@RequestMapping("/welcome")
public String welcome() {
	return "welcome";
}
```

{% endcode %}

View Resolver를 사용하면 주소의 공용 부분을 효율적으로 처리할 수 있다.
