본문 바로가기

Server Programming/Spring Boot Backend Programming

5장-1. 스프링 부트의 시작 (+Thymeleaf, RESTful, JSON, API Server)

반응형

  • 요구사항

스프링 프레임워크 기반 개발에서 스프링 부트 기반 개발로의 전환

 


스프링 부트의 특징

 

스프링 + 자동설정 = 스프링 부트

 

톰캣이 내장되어 있고, 단독 실행 가능하다

-> 스프링 부트 프로젝트를 jar파일로 만들어 다른 운영체제에서 실행 가능

 

서블릿 -> 스프링의 경우, 기존 코드 재활용 불가

스프링 -> 스프링 부트의 경우, 코드 재활용 가능

 

 

스프링

  • JSP
  • MyBatis
  • log4j2
  • HikariCP

  • 버전 관리가 필요한 build.gradle
  • XML 설정
    • root-context.xml
    • servlet-context.xml
    • web.xml

스프링 부트

  • 템플릿 엔진인 Thymleaf을 이용해 화면을 구성하거나
    혹은 API 서버 형태로 화면을 구성하지 않고 데이터만 제공하기도 한다.
  • JPA (별도의 SQL 개발이 필요없는 ORM 프레임워크)
  • 기본 내장된 log4j2
  • 기본 내장된 HikariCP
  • 버전을 자동으로 관리해주는 build.gradle
  • application.properties / application.yml
  • 자바 설정

스프링 부트 프로젝트 생성

  • spring initializr을 이용해 기본 템플릿 구조를 자동 생성
  • 빌드 도구인 Maven/Grade를 이용한 직접 생성

 

사용할 라이브러리를 프로젝트 생성시 추가

  • Spring Boot DevTools
  • Lombok
  • Spring Web
  • Thymeleaf
  • Spring Data JPA
  • MariaDB Driver

실행

  • 서버를 내장한 프로젝트이므로, 설정 필요없이 main()메서드로 프로젝트 실행

 

자바 8을 사용하는 경우 버전 문제

Spring - JDK 간 버전 호환

Spring Framework 5.3.x with JDK 8 - 19 (expected)
Spring Framework 5.2.x with JDK 8 - 15
Spring Framework 5.1.x with JDK 8 - 12
Spring Framework 5.0.x with JDK 8 - 10
Spring Framework 4.3.x with JDK 6 -  8 (its official EOL(end-of-life))


Spring Boot - JDK 간 버전 호환

Spring Boot 2.3↑ with Java 9 and above
Spring Boot 2.1↓ with Java 8 - 11

 

application.properties를 이용해 DB 설정

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/webdb
spring.datasource.username=webuser
spring.datasource.password=webuser

-> HikariCP 객체 자동 생성


 

편의성 높이는 설정

  1. 자동 리로딩 설정
  2. 테스트 환경에서 Lombok 사용하기 위한 build.gradle 설정
  3. application.properties에서 로그 레벨 설정
  4. Spring Data JPA 설정

 

  • 자동 리로딩 설정
    • Build and run - On frame deactivation - Update classes and resources
  • 테스트 환경에서 Lombok 사용하기 위한 build.gradle 설정
testCompileOnly 'org.projectlombok:lombok:'
testAnnotationProcessor 'org.projectlombok:lombok:'
  • application.properties에서 로그 레벨 설정
logging.level.org.springframework=info
logging.level.org.zerock=debug
  • DataSource 설정
  • 테스트 환경과 의존성 주입 테스트

스프링 부트에는 테스트 관련 설정과 테스트 코드가 미리 설정되어 있는데,

DataSourceTests 테스트 코드 작성해 HikariCP와 Lombok 확인

package org.zerock.b01;

import lombok.Cleanup;
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootTest
@Log4j2
public class DataSourceTests {
    @Autowired
    private DataSource dataSource;

    @Test
    public void testConnection() throws SQLException{

        @Cleanup
        Connection con = dataSource.getConnection();

        log.info(con);
        Assertions.assertNotNull(con);
    }
}

-> @Log4j2 어노테이션을 이용해 테스트 환경에서의 Lombok 사용 테스트

-> DataSource : application.properties에 설정된 DataSource 관련 설정을 통해 생성된 빈으로, 별도 설정없이 스프링에서 사용

 

  • Spring Data JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
  • spring.jpa.hibernate.ddl-auto : DDL 설정
  • spring.jpa.properties.hibernate.format_sql : SQL 포맷팅 설정
  • spring.jpa.show-sql : JPA 실행하는 SQL 출력
ddl-auto 속성값 의미
none DDL 수행 하지 않음
create-drop 실행시 DDL 수행 후, 종료시 만들어진 모든 테이블 삭제
create 실행할 때마다 새롭게 테이블 생성
update  변경된 부분 존재할 때만 새로 생성
validate 변경된 부분만 알려주고 종료

 


스프링 부트에서 웹 개발

web.xml, servlet-context.xml과 같은 XML 설정 파일을 대신하는 클래스

 

Thymeleaf를 이용한 컨트롤러 

(1) 기존의 스프링 MVC와 동일한 컨트롤러 작성

package org.zerock.b01.controller;

import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
@Log4j2
public class SampleController {
    @GetMapping("/hello")
    public void hello(Model model){
        log.info("hello...");
        
        model.addAttribute("msg", "HELLO WORLD");
    }
}

 

(2) hello.html 작성

-'th' 속성을 이용하기 위해 Thymeleaf 네임스페이스를 추가해야한다.

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="${msg}"> </h1>

</body>
</html>

 

 

JSON 데이터를 전송하는 REST 컨트롤러

JSON : 객체 표기법으로 표현한 문자열

스프링 프레임워크 사용시에는 jackson-databind 라이브러리를 추가해야한다.

스프링 부트 사용시에는 sprinb-web 라이브러리에 기본으로 내장되어있다.

데이터 교환시 프로그램 언어에 독립적이다.

 

package org.zerock.b01.controller;

import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Log4j2
public class SampleJSONController {
    @GetMapping("/helloArr")
    public String[] helloArr(){
        log.info("helloArr...");

        return new String[]{"AAA", "BBB", "CCC"};
    }
}
반응형