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'이라는 것을 전송함
'back-end > Java' 카테고리의 다른 글
[자바 웹 개발 워크북] 5.2 - Thymeleaf (0) | 2023.03.14 |
---|---|
[자바 웹 개발 워크북] 4.4 - 스프링 Web MVC 구현하기(5) (0) | 2023.02.22 |
[자바 웹 개발 워크북] 4.4 - 스프링 Web MVC 구현하기(4) (0) | 2023.02.21 |
[자바 웹 개발 워크북] 4.4 - 스프링 Web MVC 구현하기(3) (0) | 2023.02.15 |
[자바 웹 개발 워크북] 4.4 - 스프링 Web MVC 구현하기(2) (0) | 2023.02.14 |