2019. 4. 16. 21:34
반응형

https://start.spring.io/

Spring Initializr 홈페이지에서 프로젝트 생성을 할 수 있다.

이클립스에 sts tool을 설치하면 이클립스에서도 가능하다.

 

주요 목표는 기존에 사용하던 스프링 MVC 프레임워크를 스프링부트에서도 그대로 사용하는 것이다.

참고로 jsp를 쓰지 않고 타임리프 템플릿을 이용할 것이기 때문에 html 파일을 사용하게 되고 이것은 일반 브라우저에서도 열리기 때문에 jsp에 비해 더 좋을 것이라고 판단된다.

 

Group, Artifact, Name 등을 자신이 원하는 것으로 바꾸고 프로젝트를 생성한다.

Packaging은 Jar에서 War로 변경한다.

 

그리고 Dependencies를 몇개 추가한다.

Web, DevTools, MyBatis, JDBC, Thymeleaf 를 추가했다.

그리고 여기서 추가할 수 없는 mariadb, thymeleaf-layout 등은 나중에 pom.xml에 따로 추가할 예정이다.

참고로 Gradle이 아닌 나에게 좀더 익숙한 Maven 프로젝트로 만드는 중이다.

참고로 언어는 그대로 Java로 두고 스프링부트나 자바 버전은 각각 2.1.4, 8로 원래 선택된 것을 바꾸지 않고 진행했다.

 

설정을 다 했으면 Generate Project 버튼을 눌러 생성된 프로젝트를 다운받을 수 있다.

demo.zip 형식의 압축파일이 다운로드 폴더에 다운될 가능성이 매우 높다.

 

다운받은 압축 파일을 이클립스 워크스페이스로 가져와 압축을 풀고 import 시켜주면 이클립스 Package Explorer 에서 볼 수 있다.

참고로 import - General - Projects from Folder or Archive 를 선택해서 프로젝트를 가져왔다.

하지만 지금 상태로는 아마 외부 톰캣 실행이 아니라 프로젝트를 Run As - Spring Boot App 을 통해 실행할 수 있을 것이다.

아무것도 건드리지 않고 실행을 누르면 일단 오류가 난다.

db 설정을 하지 않았다는 내용을 볼 수 있기 때문에 db 접속 정보를 설정파일에 넣어줘야 한다.

application.properties 파일에 datasource 관련 정보를 넣어주면 된다.

그런데 properties보다는 yaml로 하는 것이 훨씬 좋아보이기 때문에 확장자를 properties에서 yml로 일단 바꿔준다.

 

yml로 바꾼 다음 다음과 같이 db 접속 정보를 추가한다.

참고로 driver-class-name을 아래와 같이 추가하려면 pom.xml에 mariadb 디펜던시를 추가해줘야 한다.

이건 별로 어려운 일이 아니기 때문에 따로 설명하지는 않는다.

하지만 굳이 설명을 하자면 구글에 mariadb maven을 검색하고 mvnrepository 사이트에 들어가서 Maven을 복사해서 pom.xml에 붙여넣고 버전은 삭제해주면 된다. (스프링부트에서 알아서 버전관리를 해주는 것으로 추정된다.)

spring:
  datasource:
    url: jdbc:mariadb://127.0.0.1:3306/juragi
    username: juragi
    password: 1111
    driver-class-name: org.mariadb.jdbc.Driver

 

여기까지 해서 Run As Spring Boot App으로 실행하면 이제 실행이 되고 8080 포트까지 점유하게 된다.

하지만 여전히 페이지를 열 수는 없다.

 

페이지가 열리는 모습을 보고싶다면 src/main/resources/templates 폴더에 index.html을 추가해주면 된다.

index.html은 간단하게 다음과 같이 만들어준다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <div th:text="'Hello, ' + ${name}"></div>
</html>

컨트롤러 없이 index.html만 추가했는데도 페이지가 열리는 것을 확인할 수 있다.

아마 Hello, null 이라고 뜰 것이다.

name에 해당하는 것이 지금 없기 때문에 null로 나온다.

 

어쨌든 이제 컨트롤러를 만든다.

우선 패키지를 하나 만드는 것이 좋겠다.

com.juragi.demo 아래에 com.juragi.demo.controller 와 같이 만들어준다.

그리고 HomeController.java를 하나 만든다.

 

package com.juragi.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
	
	@GetMapping("/")
	public String index(Model model) {
		model.addAttribute("name", "index");
		return "index";
	}
}

이렇게 한 다음 실행하고 localhost:8080 페이지로 가보면 Hello, index가 출력될 것이다.

 

우선은 이까지만 해줘도 아주 기본적인 토대는 만들어진 셈이다.

about 페이지를 추가하고 싶으면 templates 폴더에 about.html을 추가하고 컨트롤러에서 매핑해주면 된다.

 

 

이제 데이터베이스를 이용하도록 하면 좋을 것 같다.

우선 기존의 스프링에서 dao로 이용하는 파일들을 위한 패키지를 만든다.

나는 com.juragi.demo.mapper 이렇게 만들었다.

패키지 안에 TestMapper.java 인터페이스를 하나 만든다.

그리고 @Mapper 어노테이션을 붙여준다.

이렇게 하고 다음과 같이 @Select 어노테이션을 이용해서 간단히 쿼리를 실행가능하게 할 수도 있다.

 

package com.juragi.demo.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface TestMapper {
	
	@Select("select now()")
	public String getNow();
	
}

 

간단한 쿼리는 위처럼 Select 어노테이션으로 처리해도 되겠지만 좀 복잡해지게 되면 기존의 스프링 프레임워크에서 사용하던 mapper.xml 파일에 쿼리를 작성하는 것이 좋다.

 

그러기 위해서는 설정파일에 mapper 파일을 스캔할 위치를 정해주어야 할 것 같다.

다음과 같이 application.yml 파일에 추가한다.

mybatis:
  mapper-locations: mapper/*.xml

mapper 폴더를 src/main/resources 폴더 안에 생성하고 test.xml 매퍼 파일을 하나 생성한다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="com.juragi.demo.mapper.TestMapper">

  <select id="getNow" resultType="String">
  	select now()
  </select>
  
</mapper>

이렇게 하면 아까 만든 TestMapper.java 안에서 @Select 부분을 삭제하고 실행해도 제대로 쿼리가 실행 된다.

이렇게 만든 매퍼를 컨트롤러에 @Autowired 시켜주면 컨트롤러에서 사용할 수 있다.

또는 Service를 만들어서 그안에 넣어주고 서비스를 컨트롤러 안에 주입해서 사용할 수도 있다.

 

일단은 귀찮기 때문에 서비스는 만들지 않고 진행했다.

컨트롤러는 다음과 같아질 것이다.

 

package com.juragi.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.juragi.demo.mapper.TestMapper;

@Controller
public class HomeController {
	@Autowired
	TestMapper testMapper;
	
	@GetMapping("/")
	public String index(Model model) {
		model.addAttribute("name", "juragi");
		model.addAttribute("now", testMapper.getNow());
		return "index";
	}
	
}

 

이정도만 해놓으면 웬만한 주요 사항은 다 한 것 같다.

 

 

이제 페이지를 만들 때 공통적인 요소를 레이아웃 파일로 만들어주면 좋을 것 같다.

이건 기존 jsp에서는 타일즈(tiles)를 이용했었다.

여기서는 thymeleaf-layout을 이용한다.

참고로 pom.xml에는 다음의 디펜던시를 추가해야 한다.

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>

그리고 templates 폴더 안에 layout 폴더를 만들고 그 안에 layout.html 파일을 하나 생성한다.

또 frament 폴더를 layout 폴더 안에 만들고 그 안에 head.html을 생성한다.

layout.html 안에 html 상의 head에 들어갈 내용을 head.html로 만들어서 넣어줄 계획이다.

 

layout.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" 
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<head th:replace="layout/fragment/head :: fragmentHead"></head>

<body>
  <section class='container'>
    <div layout:fragment="content"></div>
  </section>
</body>

</html> 

 

head.html (static 폴더 내에 css, js 폴더와 파일을 각각 만들었다고 가정한다.)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<head th:fragment="fragmentHead">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <title>title</title>

  <link rel="stylesheet" th:href="@{/css/main.css}"/>
  <script type="text/javascript" th:src="@{js/main.js}"></script>

</head>

</html> 

이제 index.html을 다음과 같이 바꿔주면 된다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  layout:decorator="layout/layout">
  <div layout:fragment="content">
    <div th:text="'Hello, ' + ${name}"></div>
  </div>
</html> 

이제 다른 페이지를 생성할 때 content div 안에 있는 내용만 바꿔주면 나머지 공통부분은 동일하게 적용된다.

이렇게 했을 때 장점은 디자인이 복잡해져도 각 페이지의 코드는 비교적 간단하고, 레이아웃으로 쓰는 파일만 바꿔주면 전체 페이지의 디자인이 한번에 바뀐다는 점으로 볼 수 있을 것이다.

 

일단 이까지 그럭저럭 잘 따라온다면 스프링 부트를 통한 웹 프로젝트가 어느정도 나올 것이다.

그리고 Run on Server를 통해 톰캣으로 실행할 수 있다.

참고로 나는 Tomcat 8.5로 잘 안되길래 Tomcat 9로 실행했다.

War파일로 배포한 다음에 외부 톰캣8.5로 실행했을 때는 실행되는 걸 확인했다.

 

잘 안될 때는 구글에 열심히 찾아보고 이런저런 시도를 해보는 것이 좋을 것 같다.

 

참고로 다음 링크에 진행했던 내용과 거의 비슷한 소스를 통째로 올려두었다.

적절한 커밋 버전을 다운받아서 실습해보면 좋을 것 같다.

https://github.com/juragi/spring-boot-demo

 

juragi/spring-boot-demo

Contribute to juragi/spring-boot-demo development by creating an account on GitHub.

github.com

 

반응형