본문 바로가기
PlayGround/AWS 연습

[Project] mini1 - View 구현을 위한 JSP 설정

by HJ0216 2023. 10. 3.

이 글은 향로님의 [스프링부트로 웹 서비스 출시하기] 참고하며 프로젝트를 만들며 정리한 글입니다.

 

3) 스프링부트로 웹 서비스 출시하기 - 3. SpringBoot & Handlebars로 화면 만들기

이번 시간엔 SpringBoot & Handlebars로 간단한 화면을 만들 예정입니다. (모든 코드는 Github에 있습니다.) Handlebars는 흔히 사용하시는 Freemarker, Velocity와 같은 서버 템플릿 엔진입니다. JSP는 서버 템플릿

jojoldu.tistory.com

 

 

👉 기본 환경

- Language: Java

- DB: MySQL

- IDE: IntelliJ

 

 

😮 게시글에서는 Handlebars를 사용하고,

Spring에서는 Thymeleaf를 권장하지만,

JSP와 연동하려는 이유는

    - 1차 프로젝트에서 view를 jsp로 사용했는데, jsp는 유지하고 JPA만 변경해볼까에 대한 생각이 있고,

    - Front를 배우고자 하는 프로젝트가 아니므로, 익숙한 JSP를 사용해보고자 했습니다.

 

 

1. 의존성 추가

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.4'
    id 'io.spring.dependency-management' version '1.1.3'
}
 
group = 'com.project'
version = '0.0.1-SNAPSHOT'
 
java {
    sourceCompatibility = '17'
}
 
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
 
repositories {
    mavenCentral()
}
 
dependencies {
 
    // Actuator: 스프링 부트에서 제공하는 컨텍스트 빈, 환경 설정, JVM 상태 등을 모니터링하기 쉽게 해주는 기능
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
 
    // JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
 
    // WEB
    implementation 'org.springframework.boot:spring-boot-starter-web'
 
    // .jsp
    // implementation 'javax.servlet:jstl' //스프링부트 3.0 미만
    implementation 'jakarta.servlet:jakarta.servlet-api' //스프링부트 3.0 이상
    implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' //스프링부트 3.0 이상
    implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //스프링부트 3.0 이상
    implementation "org.apache.tomcat.embed:tomcat-embed-jasper"
 
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
 
tasks.named('test') {
    useJUnitPlatform()
}
 
 

jstl 및 tomcat-embed-jasper 추가

- jstl: JSP Standard Tag Library

- tomcat-embed-jasper: JSP 파일을 servlet으로 변환하는 컴파일러

* 톰캣 서버는 servlet을 실행하는 서버이므로 JSP 파일은, 먼저 servlet이로 변환(컴파일)된 후 실행돼야 함

 

⭐ jstl은 springboot 버전에 따라 build.gradle이 다르니 유의

 

 

2. 프로젝트 구조 변경 및 View 경로 수정

main 폴더 하위에 webapp/WEB-INF 폴더 추가

* Package Structure

 

application.properties

1
2
3
4
# .jsp 설정
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
 
 

 

취향에 따라 prefix를 /WEB-INF/views로 설정해도 되고,

WEB-INF를 제거하고 /만 설정해도 되지만,

WEB-INF까지는 추가하는 것을 권장

    - WEB-INF 폴더안은 일반 사용자가 브라우저에 패스를 넣어서 접근할 수 없음
    - 요청이 들어오는것과 진짜 자원이 있는 곳을 분리시켜야만 보안상 안전 

    - jsp 직접 접근 가능시 코드 오픈의 위험이 있으니 직접 접근을 막음

 

 

3. 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Controller
@RequiredArgsConstructor
public class WebRestController {
 
    private final PostService postService;
 
    @GetMapping("/hello")
    public String hello(){
        return "Hello, IT World!";
    }
 
    @GetMapping("/main")
    public String main(){
        return "main";
    }
 
}
 
 

Controller에 @Controller 추가

@RestController = @Controller + @ResponseBody

 

@RestController를 사용하는 이유

    - Json 형태로 객체 데이터를 반환

    - REST API를 개발할 때 주로 사용

    - 객체를 ResponseEntity로 감싸서 반환

 

@ResponseBody

    - 자바 객체(VO)를 데이터(JSON객체)로 바꿔 Response Body 안에 넣어주는 어노테이션

cf. @RequestBody

    - Request Body 안의 데이터(JSON객체)를 자바 객체(VO)로 변환

 

main()은 jsp와의 연동을 보고자, hello()는 String을 출력하고자 하므로 hello()는 다음과 같이 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Controller
@RequiredArgsConstructor
public class WebRestController {
 
    private final PostService postService;
 
    @ResponseBody
    @GetMapping("/hello")
    public String hello(){
        return "Hello, IT World!";
    }
 
    @GetMapping("/main")
    public String main(){
        return "main";
    }
 
}
 
 

 

 

4. 🤹 결과 확인

 

 

 

🔗 소스 코드

 

GitHub - HJ0216/mini1: SpringBoot+JPA Board Mini Project

SpringBoot+JPA Board Mini Project. Contribute to HJ0216/mini1 development by creating an account on GitHub.

github.com

 

📚 참고 자료

 

[Spring Boot] 스프링 부트에서 JSP 사용하기(JSP파싱)

이번 글에서는 Spring Boot에서 JSP를 사용하는 방법에 대해 정리할 것이다. 추가로 Spring Boot + JSP를 사용해서 게시판을 작성할 것이다. 해당 글 상단부에서는 SpringBoot에서 JSP 사용하는 방법에 대해

backendcode.tistory.com

 

JSP

tomcat-embed-jasper 의존성에 역할은 다음과 같다. 스프링 부트 앱에는 톰캣 서버가 내장되어 있다. 톰캣 서버는 servlet container 이다. 톰캣 서버는 servlet을 실행하는 서버이다. 톰캣에서 JSP 파일은, 먼

kimjye.tistory.com

 

[JSTL] JSTL(JSP Standard Tag Library)란?

0. JSTL(JSP Standard Tag Library)란? JSTL이란 JSP 표준 라이브러리(JSP Standard Tag Library)의 약어이다. 즉, JSP를 사용하는 여러 프로그램이 공통으로 사용할 수 있도록 JSP태그를 라이브러리 형태로 만들어놓

yanacoding.tistory.com

 

Web-INF에 VIEW를 넣어야 하는 이유

브라우저 주소창에 쓰는것과 실제 파일이 있는 위치가 다르다. 요청이 들어오는것과 진짜 자원이 있는 곳을 분리시켜야만 보안상 안전하다. 즉 자원이 어디 있는지 Client 측에선 예측을 못하도

dalpenglow.tistory.com

 

WEB-INF에 JSP 파일을 놓는 이유

문득 프로젝트를 보다가 왜 jsp 파일을 WEB-INF 밑에 두는 걸까? 하고 궁금해서 구글링을 해보았는데 마침 이와 관련되어서 okky에서 핫하게 논쟁을 벌였던 흔적의 게시글을 찾았다. https://okky.kr/artic

data-study-clip.tistory.com

 

[Spring] @Controller와 @RestController 차이

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 주요한 차이점

mangkyu.tistory.com