1.  스프링 부트란 ?

🐰  스프링 부트는 엄밀하게 말하면 '스프링 프레임워크 개발 도구'. 즉, 엔터프라이즈급 에플리케이션을 개발 하기 위해서 필요한 기능을 제공하는 개발 도구
🐰  스프링의 중요한 특징자동 설정 Auto Configuration (라이브러리만으로 설정을 인식하려는 특성) 을 내세울 수 있음
     예를 들어 스프링 부트는 데이터베이스와 관련된 모듈을 추가하면 자동으로 데이터베이스 관련 설정을 찾아서 실행
      ✓  스프링만을 이용하는 경우와 비교해보면 추가한 모듈 설정이 전혀 필요하지 않고, 설정 자체도 단순
🐰  다른 특징으로는 '내장 톰캣'과 단독 실행 가능한 도구라는 점. 스프링 부트는 별도의 서버 설정 없이도 개발이 가능하고, 실행도 가능

 

 

1) 기존 개발과 차이점


✓ 설정과 관련해서는 직접 필요한 라이브러리를 기존 build.gradle 파일에 추가하는 설정이 상당히 단순하기도 하지만 자동으로 처리

✓ 특히 톰캣이 내장된 상태로 프로젝트가 생성되기 때문에 WAS의 추가 설정이 필요하지 않다는 점도 편리
✓ 빈 설정은 XML을 대신해서 자바 설정을 이용하는 것으로 약간의 변경이 있음

스프링 MVC에서는 JSP를 이용할 수 있지만 기본 설정이 아니라서 라이브러리를 추가해야 되고, 스프링 부트는 Thymeleaf라는 템플릿 엔진을 활용하는 경우가 많음
스프링 부트에서도 MyBatis를 이용할 수 있지만, JPA를 이용하면 객체지향으로 구성된 객체들을 데이터베이스에 반영할 수 있는데 이를 자동으로 처리할 수 있으므로 별도의 SQL의 개발 없이도 개발이 가능

 

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


  👾  스프링 부트를 위한 프로젝트의 생성 방법은 크게 2가지
      -  Spring Initializr를 이용한 자동 생성 ( 대부분 많이 사용. 프로젝트의 기본 템플릿 구조를 만들어 주기 때문 )

            ➡️  웹 사이트(https://start.spring.io/) 에서 프로젝트를 생성하거나, 이클립스나 인텔리제이, VS Code 등에서도 Spring Initializr를 지원하기 때문에 호환성 면에서도 유리
      -  Maven이나 Gradle을 이용한 직접 생성

  👾  스프링 부트는 스프링을 쉽게 사용하기 위한 도구이므로 프로젝트를 생성하고 필요한 라이브러리들을 추가하는 형태의 개발도 가능


 

2.  프로젝트의 실행

🐰  스프링 부트의 프로젝트는 이미 서버를 내장한 상태에서 만들어지기 때문에 스프링만을 이용할 때와 달리 별 의 WAS (Web Application Server) 설정이 필요하지 않고 main() 메서드의 실행을 통해서 프로젝트를 실행

 

main()을 실행하면 자동으로 내장된 톰캣이 실행되는 것을 로그를 통해서 확인

  ✓  실행 결과는 에러가 발생
  ✓  스프링 부트가 자동 설정을 통해서 인식한 Spring Data JPA를 실행했을 때 DB와 관련된 설정을 찾을 수 없어서 발생한 에러

  📍  에러가 발생하긴 했지만, 아무런 설정이 없는 상태인데 자동으로 데이터베이스 관련 설정을 이용을 함
        ➡️  이와 같이 라이브러리만으로 설정을 인식하려는 특성을 '자동 설정 auto configuration'이라고 함

  📍  스프링 부트 설정은 프로젝트 생성 시에 만들어진 application.properties 파일을 이용하거나 application.yml (YAML 이라고 함) 파일을 이용할 수 있음
        ➡️  만일 파일 설정을 피하고 싶으면 @Configuration이 있는 클래스 파일을 만들어서 필요한 설정을 추가할 수 있음

  📍  대부분의 스프링을 지원하는 개발 도구 IDE에서는 application.properties 파일에 들어갈수 있는 내용을 쉽게 완성해 주는 기능을 제공

 

application.properties 파일에 데이터베이스 설정을 추가
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sample
spring.datasource.username="아이디"
spring.datasource.password="비밀번호"

 

  💡  만일8080 port가 다른 프로젝트에서 실행되고 있다면 포트번호를 application.properties에서 server.port를 지정해서 변경할 수 있음

server.port=8082

 

서블릿이나 스프링처럼 프로젝트를 실행하면 브라우저가 자동으로 실행되지 않음. 부트의 경우 서버를 내장하고 있어서 브라우저가 자동 실행이 안되어서, 직접 브라우저를 열어서 주소창에 주소를 입력해야 함


 

3.  편의성을 높이는 몇 가지 설정

DataSource를 이용하는 것만으로도 스프링 부트가 편리하다는 사실을 알수 있지만, 추가적인 설정 몇 가지만 더 한다면 개발 시간을 더욱 단축할 수 있음

자동 리로딩 설정

 

  • 웹 개발 시에 코드를 수정하고 다시 deploy를 하는 과정을 자동으로 설정. Edit Configuration 메뉴를 실행
  • Bulid and run 메뉴에 있는 Modify options를 선택
  • On 'Update' action / On frame deactivation 의 옵션값을 Update classes and resources 로 지정

 

 

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


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

// lombok을 테스트 환경에서도 사용.
testCompileOnly('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')



로그 레벨의 설정


스프링 부트는 기본적으로 Log4j2가 추가되어 있기 때문에 라이브러리를 추가하지 않아도 됨.
applocation.properties 파일을 이용해서 간단하게 로그 설정을 추가할 수 있음.

logging.level.org.springframework=info
logging.level.kr.nomadlab=debug

 

 

인텔리제이의 DataSource 설정


인텔리제이 ultimate의 경우 JPA 관련 플러그인이 이미 설치되어 있기 때문에 DataSource를 설정해두면 나중에 엔티티 클래스의 생성이나 기타 클래스의 생성과 설정 시에 도움이 됨

 

 

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


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

 

  ✓  테스트 코드의 실행을 점검하기 위해서 DataSourceTest를 작성해서 HikariCP의 테스트와 Lombok을 확인

  ✓  DataSource는 application.properties에 설정된 DataSource 관련 설정을 통해서 생성된 빈 Bean이고, 이에 대한 별도의 설정 없이 스프링에서 바로 사용이 가능

package com.example.springboot;

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 DataSourceTest {
    @Autowired
    private DataSource dataSource;

    @Test
    public void connection() throws SQLException {
        @Cleanup Connection connection = dataSource.getConnection();

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

 

 

Spring Data JPA을 위한 설정


DataSource 설정까지 모든 테스트가 완료되었다면 Spring Data JPA를 이용할 때 필요한 설정을 추가
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 문을 처리 할 것인지를 명시
  ✓  DDL : Data Definition Language  ➡️  테이블이나 관계의 구조를 생성하는데 사용하며 CREATE, ALTER, DROP, TRUNCATE 문 등이 있음

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

 

속성값 의미
none DDL을 하지 않음
create-drop 실행할 때 DDL을 실행하고 종료시에 만들어진 테이블 등을 모두 삭제
create 실행할 때마다 새롭게 테이블을 생성
update 기존과 다르게 변경돤 부분이 있을 때는 새로 생성
validate 변경된 부분만 알려주고 종료

 

📍  update 속성 값의 경우 테이블이 없을 때는 자동으로 생성하고 변경이 필요할 때는 alter table이 실행. 테이블뿐만 아니라 인덱스나 외래키 등도 자동으로 처리

 


 

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

🐰  스프링 부트를 이용해서 웹을 개발하는 일은 컨트롤러나 화면을 개발하는 것은 유사하지만, web.xml이나 server-context.xml과 같은 웹 관련 설정 파일들이 없기 때문에 이를 대신하는 클래스를 작성해 준다는 점이 다름
   ✓  xml을 통한 설정은 오류가 발생했을 때 찾기 힘듬. 마크업 언어라서 문법을 체크하는데 한계가 있음. 인텔리제이같은 통합 개발 환경에서도 자동완성을 사용하기 힘듬

 

1) 컨트롤러와 Thymeleaf 만들기

프로젝트에 우선 controller라는 패키지를 생성하고 SampleController 클래스를 생성
SampleController 자체의 개발은 기존의 스프링 MVC를 그대로 이용

@Controller
@Log4j2
public class SampleController {

    @GetMapping("/hello")
    public void hello(Model model) {

        log.info("hello...");
        model.addAttribute("msg", "Hello World");

    }
}

 

  📍 화면은 Thymeleaf를 이용하는데 위치를 주의해서 작성. 프로젝트 생성 시에 만들어져 있는 resources/templates 폴더에 hello.html을 작성
  📍 중요한 부분은 Thymeleaf의 네임스페이스 namespace를 추가

<!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>

 

 

 

Thymeleaf는 JSP와 동일하게 서버에서 결과물을 생성해서 보내는 방식이지만
좀더 HTML에 가깝게 작성할 수 있고 다양한 기능을 가지고 있음

 

 

 

 


 

2)  JSON 데이터 만들기

스프링을 사용할 때는 jackon-databind 라는 별도의 라이브러리를 출력한 후에 개발할 수 있지만, 스프링 부트는 'web' 항목을 추가할 때 자동으로 포함되므로 별도의 설정 없이 바로 개발할 수 있음

 

controller 패키지에 SampleJSONController라는 클래스를 작성
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Log4j2
@RestController
public class SampleJSONController {

    @GetMapping("/helloArr")
    public String[] helloArr() {
        log.info("HelloArr...");

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

}

 

브라우저에 'helloArr' 경로를 호출하면 배열이 그대로 출력. 중요한 점은 서버에서 해당 데이터는 Content_Type을 'application/json' 방식 으로 전송

 

+ Recent posts