1. 기존 개발에서 달라진 점들

  • 스프링에서 스프링 부트로 넘어오는 일은 기존의 코드나 개념이 그대로 유지됨(현실적으로 새로운 개념 필요 x)
  • 설정과 관련해 직접 필요한 라이브러리를 기존 build.gradle 파일에 추가하는 설정이 자동으로 처리됨
  • 톰캣이 내장된 상태로 프로젝트가 생성되기 때문에 WAS의 추가 설정이 필요 x
  • Bean 설정은 XML을 대신에 자바 설정으로 이용하는 것으로 약간 변경됨
  • 스프링 MVC에서는 JSP, 스프링 부트에서는 Thymeleaf라는 템플릿 엔진 활용
  • 최근 스프링 부트는 화면을 구성하지 않고 데이터만을 제공하는 API 서버 형태를 이용하기도 함
  • 스프링 부트에서도 MyBatis를 이용할 수 있지만, [자바 웹 개발 워크북]에서는 JPA 이용
    • JPA 이용 시 객체지향으로 구성된 객체들을 데이터베이스에 반영할 수 있고, 이를 자동으로 처리할 수 있으므로 별도의 SQL 개발 없이도 개발 가능

 

 1) 스프링 부트의 프로젝트 생성 방식

  • Spring Initializr를 이용한 자동 생성 또는
    Maven이나 Gradle을 이용한 직접 생성
  • 스프링 부트는 거의 모든 개발에 Spring Initializr를 이용(프로젝트의 기본 템플릿 구조를 만들어 주기 때문)

 

 

2. Spring Initailizr를 이용한 프로젝트 생성

  • New Project 생성

  • Dependencies에서 다음 항목들 추가
    • Spring Boot DevTools
    • Lombok
    • Spring Web
    • Thymeleaf
    • Spring Data JPA
    • MariaDB Driver

 

 1) 프로젝트의 실행

  • 스프링 부트의 프로젝트는 서버를 내장한 상태에서 만들어지기 때문에 스프링만을 이용할 때와 달리 별도의 WAS 설정 필요 x
  • main()의 실행을 통해 프로젝트 실행
  • 프로젝트 초기화할 때 실행 메뉴에 'B01Application이라는 이름으로 실행 메뉴가 구성됨

  • main() 실행 시, 다음과 같은 로그 출력

  • 실행 결과는 실패

  • 스프링 부트가 자동 설정을 통해 인식한 Spring Data JPA를 실행할 때 DB와 관련된 설정을 찾을 수 없어 발생
  • 에러가 발생하긴 했지만 아무 설정 없이 자동으로 데이터베이스 관련 설정을 이용함
    → 라이브러리만으로 설정을 인식하려는 특성을 자동 설정(auto configuration)이라고 함

 

  • 스프링 부트 설정은 프로젝트 생성 시 만들어진 application.properties 파일을 이용하거나 application.yml 파일 이용
  • 파일 설정을 피하고 싶다면 @Configuration이 있는 클래스 파일을 만들어서 필요한 설정을 추가
  • 대부분의 스프링을 지원하는 IDE에서 application.properties 파일에 들어갈 수 있는 내용을 쉽게 완성해 주는 기능 제공
  • application.properties 파일에 데이터베이스 설정을 다음과 같이 추가
// application.properties

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/webdb
spring.datasource.username=webuser
spring.datasource.password=yong1998
  • 다시 실행하면 8080포트로 톰캣이 실행됨

 

  • HikariCP 라이브러리를 가져오거나 HikariConfig 객체를 구성하는 등의 모든 과정이 생략됨

 

 2) 편의성을 높이는 설정

  - 자동 리로딩 설정

  • 웹 개발 시 코드 수정하고 다시 deploy 하는 과정을 자동으로 설정 가능
  • Edit Configuration > Modify options > On 'Update' action / On frame deactivation > Update classes and resources

 

  - Lombok을 테스트 환경에서도 사용하기

  • 스프링 부트는 체크박스를 선택하는 것만으로 Lombok 라이브러리 추가가 가능하지만 테스트 환경에서는 설정이 빠져 있음
  • build.gradle 파일 내 dependencies 항목에 test 관련 설정을 조정
// build.gradle
...

dependencies {
	
    ...
	
	testCompileOnly 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
}

...

 

  - 로그 레벨의 설정

  • 스프링 부트는 기본적으로 Log4j2가 추가되어 있어 라이브러리를 추가하지 않아고 됨
  • application.properties 파일을 이용해서 간단하게 로그 설정을 추가 가능
// application.properties

...

logging.level.org.springframework=info
logging.level.org.zerock=debug

 

  - 인텔리제이의 DataSource 설정

  • DataSource를 설정해두면 나중에 엔티티 클래스의 생성이나 기타 클래스의 생성과 설정 시에 도움이 됨
  • MariaDB를 설정

 

  - 테스트 환경과 의존성 주입 테스트

  • 스프링에는 'spring-test-xxx' 라이브러리를 추가해야 하고, JUnit 등도 직접 추가해야하지만,
    스프링 부트는 프로젝트 생성 시 이미 테스트 관련 설정이 완료되고 테스트 코드도 생성되어 있음

  • 테스트 코드 실행을 위해 DataSourceTests를 작성해서 HikariCP의 테스트와 Lombok 확인
// DataSourceTests
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 {

    // DataSource는 application.properties에 설정된 DataSource 관련 설정을 통해 생성된 bean
    // 이에 대한 별도 설정없이 스프링에서 바로 사용 가능    
    @Autowired
    private DataSource dataSource;
    
    @Test
    public void testConnection() throws SQLException {
        
        @Cleanup
        Connection con = dataSource.getConnection();
        
        log.info(con);
        Assertions.assertNotNull(con);
    }
}
  • 테스트 환경에서도 @Log4j2 어노테이션을 통해 테스트 환경에서 Lombok을 사용할 수 있음을 확인

 

  - Spring Data JPA를 위한 설정

  • application.properties에 다음 내용 추가
//application.properties

...

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
  • spring.jpa.hibernate.ddl-auto 속성은 프로젝트 실행 시 DDL 문을 어떻게 처리할 것인지 명시
  • 속성값은 다음과 같이 명시
속성값 의미
none DDL을 하지 않음
create-drop 실행할 때 DDL을 실행하고 종료 시에 만들어진 테이블 등을 모두 삭제
create 실행할 때마다 새롭게 테이블을 생성
update 기존과 다르게 변경된 부분이 있을 때는 새로 생성
validate 변경된 부분만 알려주고 종료
  • update 속성값의 경우, 테이블이 없을 때는 자동으로 생성하고 변경이 필요할 때는 alter table이 실행됨,
    테이블 뿐만 아니라 인덱스나 외래키 등도 자동으로 처리

 

  • spring.jpa.properties.hibernate.format_sql 속성은 실제로 실행되는 SQL을 포맷팅하여 알아보기 쉽게 출력
  • sprinf.jpa.show-sql은 JPA가 실행하는 SQL을 같이 출력

 

 

3. 스프링 부트에서 웹 개발

  • controller나 화면을 개발하는 것은 유사하지만 web.xml이나 servlet-context.xml과 같은 웹 관련 설정 파일들이 없기 때문에 이를 대신하는 클래스를 작성해 준다는 점이 다름

 

 1) 컨트롤러와 Thymeleaf 만들기

  • 프로젝트에 우선 controller라는 패키지 생성 > SampleController 클래스 생성
// SampleController
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");
    }
}
  • 프로젝트 생성 시 만들어져 있는 templates 폴더에 hello.html 작성

<!-- hello.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<h1 th:text="${msg}"></h1>
</body>
</html>
  • 실행 결과

 

 2) JSON 데이터 만들기

  • controller 패키지에 SampleJSONComtroller라는 클래스 작성
// SampleJSONController
package org.zerock.b01.controller;

import lombok.extern.log4j.Log4j2;
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"};
    }
}
  • 브라우저에 'localhost:8080/helloArr' 경로를 호출하면 배열이 그대로 출력

  • 응답 헤더를 확인해보면 서버에서 해당 데이터는 'application/json'이라는 것을 전송함

+ Recent posts