Byeon's NOTE

스프링 부트 Spring Boot (2) - 프로젝트 구조 본문

스프링(Spring)

스프링 부트 Spring Boot (2) - 프로젝트 구조

SUByeon 2019. 10. 15. 23:15

저번 포스팅에서 스프링 부트 설치 및 프로젝트 생성을 해보았다. 이번에는 스프링 부트 프로젝트 의 구조에 대해 알아보려 한다. 프로젝트를 생성하면 아래와 같은 구조로 프로젝트가 생성된다.

 

 

src/main/java

 

java파일들이 저장되는 폴더이다. 기본적으로 생성되는 OOOApplication.java이외에 MVC모델이라면 Controller, Service, DAO, DTO, Config 등 java파일을 해당 위치에 생성하고 작성해야한다.

 

Controller package

Service package

Repository package  (DAO)

Domain package     (DTO, Model)

Config package

 

src/main/resources

 

해당 애플리케이션에서 사용할 리소스 파일

 

templates - Thymeleaf 와 같은 템플릿, 동적인 뷰 파일

static - CSS, JS, 이미지 등 정적인 파일

application.properties - 애플리케이션에서 사용할 속성들. 예) 사용할 데이터베이스 정보

 

 

스프링 프레임워크 MVC프로젝트와 비교해보면 resources가 다르고 src에 webapp과 하위 폴더들이 없다는 것이다.

스프링 부트는 jsp보다는 템플릿 엔진 사용을 권장한다고 한다. 

 

Spring Boot는 기본적classpath는 src/main/resources/ 디렉터리라 한다.
Spring Boot에서는 classpath상에서 /static, /resources, /public, /META-INF/resources/ 경로를 기본으로 탐색한다.

 

/WEB-INF/resources의 경우, jar 파일로 배포할 경우에는 인식하지 않기 때문에 사용하지 않도록 주의한다.
정적 자원들은 /static 디렉터리 사용을 권장한다.


Spring Boot에서는 기존의 전통적인 웹 어플리케이션 방식에서 필수로 관리되어야 하는 Tomcat 설정 및 web.xml 파일 등은 스프링부트의 내부 모듈에 의해서 구동시 자동으로 설정된다.
(default로 web/ 디렉터리가 없음)

 

최근에는 프론트엔드는 Vue, React, Angular 등 프론트엔드 프레임워크, 플랫폼을 많이 사용하고 Spring은 API서버로 많이 사용하는것 같다. spring boot 프로젝트의 구조에 대해 알아보았고 이번에는 html파일 그리고 jsp를 한번 사용해 보려고 한다.

 

과연 html파일은 어디에 위치해야 할까?? 위의 내용대로라면 정적은 static, 동적은 templates에 위치해야 한다. 한번 테스트 해보자. 먼저 static에 hello.html 파일을 하나 생성한다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>Hello ~~</h3>
	<h3>First HTML File</h3>
</body>
</html>

 

이전 포스팅에서는 BoardApplication.java 파일에서 @RestController를 사용했다. 별로 좋은 방법이 아니다. Controller패키지를 따로 만들고 BoardController를 생성해준다. 여기서는 html파일을 리턴해줘야함으로 @Controller어노테이션을 사용한다. (@RestController는 @Controller와 @ResponseBody를 함께 사용하는것과 같다.)

package com.example.board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BoardController {

	@RequestMapping("/")
	public String hello() {
		return "hello";
	}
}

 

URL맵핑이 이루어지지 않아 에러 페이지가 뜨는 것을 확인할 수 있다. 

 

이번에는 조금 다르게 Controller를 주석처리하고 html파일을 static에 저장하고 주소창에 localhost:8080/hello.html를 입력해보자. 제대로 뜨는 것을 확인할 수 있다.

 

이 결과를 보면 서블릿 url 맵핑이 이루어지지 않았다. 어떻게 보면 당연한것이다. 위에서 말한것 처럼 스프링 부트는 기본적으로 classpath상에서 /static, /resources, /public, /META-INF/resources/ 경로를 기본으로 탐색한다고 했다. 또한, spring mvc 프로젝트에서는 서블릿 설정을 해주었다. 하지만 지금은 서블릿 설정을 해주지 않았다. 그 이유는 스프링 부트의 장점인 자동 설정 때문이다. 프로젝트를 처음 생성하고 Application.java를 확인하면 @SpringBootApplication 어노테이션을 볼 수 있다. 이 어노테이션은 세 개의 어노테이션으로 구성되어 있다. 

 

@EnableAutoConfigration - 스프링의 다양한 설정이 자동으로 완료된다.

@ComponentScan - 컴포넌트 검색 기능을 활성화해서 자동으로 여러 가지 컴포넌트 클래스를 검색하고 등록한다.

@Configuration - 해당 컴포넌트가 붙은 자바 클래스는 자바 기반 설정 파일임을 의미한다.

 

@SpringBootApplication 어노테이션이 @Configuration을 직접적으로 포함하지는 않고 @SpringBootConfigration어노테이션을 포함한다고 한다. @SpringBootConfiguration어노테이션이 @Configuration 어노테이션을 포함한다고 한다.

 

어쨋든 해당 어노테이션을 통해 우리는 자동으로 설정을 한 것이다. 그렇다면 스프링 부트는 서블릿 설정을 할 수 없는가?? -> 할 수 있다. 스프링 레퍼런스 가이드에 나와있다. 자세한건 다음에.......

 

이번에는 templates에 뷰 파일을 넣고 테스트를 하려고 한다. templates에는 Thymeleaf과 같은  템플릿 엔진을 사용하는 뷰가 저장된다고 했었다. Themeleaf를 사용하기 위해 gradle에 의존 라이브러리?를 추가해 준다.

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

 

새로운 의존 라이브러리?를 추가해 주었기 때문에 프로젝트를 업데이트 시킨다.

build.gradle 우클릭 -> gradle -> Refresh Gradle Project

 

 

이제 주석 처리했던 컨트롤러의 주석을 풀어준다. 그리고 프로젝트 다시 실행하고 http://localhost:8080으로 접속해본다.

그러면 우리가 작성한 html 화면이 보여지는 것을 확인할 수 있다.

 

 

이번에는 그럼 jsp를 사용해 보자. 스프링 부트 초기 버전에서는 jsp를 지원하지 않았다고 한다. 이후에 추가 되었다고 한다. 스프링 부트는 템플릿 엔진을 사용을 권장하기 때문에 의존성만 추가해주면 나머지는 알아서 설정되지만 jsp를 사용하려면 우리가 몇가지 설정을 더 해주어야 한다. 그리고 많은 제한이 있다고 한다. jsp를 사용하기 위한 설정을 해보자.

 

먼저 스프링 mvc 프로젝트와 같이 src에 몇가지 폴더를 더 만들어 주어야 한다.

src/main/webapp/WEB-INF/views 와 같은 형태로 폴더를 생성해 준다. 마지막 views 폴더의 이름은 아무렇게 지정해도 된다. 대신 webapp/WEB-INF/는 꼭 있어야 한다..

 

main.jsp파일을 만든다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>jsp 테스트 페이지~~</h2>
</body>
</html>

컨트롤러를 수정해준다. (jsp파일을 hello로 하고 안바꿔도 된다.)

 

package com.example.board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class BoardController {
	
	@RequestMapping("/")
	public String mainPage() {
		
		return "main";
	}
}

 

다음으로 jsp를 이용하기 위해 의존성을 하나 추가한다. 그리고 Thymeleaf의 의존성을 삭제 또는 주석 처리한다.

compile('org.apache.tomcat.embed:tomcat-embed-jasper')

 

 

gradle refresh를 해주고 재실행 한다. http://localhost:8080으로 접속한다. 화면이 잘 나오는것을 확인할 수 있다.

 

 

스프링 부트 프로젝트의 디렉터리 구조, 정적인 html, 템플릿 엔진을 이용한 뷰, jsp를 이용한 뷰 3가지 방법을 알아보았다.

 

 

 

 

참고 및 출처

https://docs.spring.io

https://gmlwjd9405.github.io/2019/01/05/spring-directory-structure.html

 

 

 

 

Comments