[Spring] Spring Boot 프로젝트 만들기
Spring Boot는 Spring 프레임워크를 개선하여 더 간편하게 사용할 수 있게 만들어졌습니다.
개발자가 설정 파일을 작성하거나 의존성을 주입하는 등의 작업을 대폭 줄여주는 효과가 있습니다.
또한, 스프링 부트 내에서는 별도의 WAS 없이도 내장 서버로 훨씬 쉽게 애플리케이션을 실행할 수 있고. 결국 스프링 부트의 장점이란 ‘빠른 생산성’입니다.
위 사이트에 접속하면 쉽게 스프링 부트 프로젝트를 생성 가능합니다.
Gradle과 Maven은 둘 다 빌드 관리 도구입니다.
빌드란 소스코드 파일을 컴퓨터나 휴대폰에서 실행할 수 있는 독립(standalone) 소프트웨어 가공물로 변환하는 과정 및 그에 대한 결과물을 일컫는다고 하네요. 흔히 알고 있는 컴파일 역시 빌드 과정 중 하나로 변환된 파일이 WAS에서 작동할 수 있는 패키징 과정을 거치면 빌드가 완료됩니다. 어려울 것 없이 소스코드를 실제 애플리케이션으로 만드는 과정이라고 생각하면 되겠습니다.
그럼 위에서 말한 Gradle이나 Maven이 왜 필요할까요?
개발하면서 모든 소스코드를 본인이 작성하지는 않을 것입니다. 당연히 외부 라이브러리를 사용하게 되고, 과거 이런 빌드 관리 도구가 없을 때는 Build Path를 직접 입력하는 작업을 거쳤습니다. 그러나 라이브러리가 한 두 개도 아니고 매번 새로운 라이브러리를 받아 프로젝트에 적용시키는 번거로운 작업을 자동화 하기 위해서 등장한 게 빌드 관리 도구입니다.
- Maven
Spring 초기에 사용된 Java 프로젝트 전용 관리 도구로, Apache Ant의 대안으로 만들어졌다. xml 형식의 프로젝트 설정 파일 사용한다. pom.mxl에 프로젝트 관련 설정을 추가하면 자동으로 빌드가 된다. 다만, 멀티 프로젝트일 경우 특정 설정을 다른 모듈에서 사용하면 상속을 받아야한다. - Gradle
Java 외에도 Android, Python 등을 지원하며 그루비 스크립트를 기반으로 한다. 그루비는 JVM에서 실행되는 스크립트 언어인데 소스코드를 컴파일 할 필요가 없다. 사실 정확히 어떤 문법인지는 정확히 모르더라도 사용할 수 있다. (initializr를 사용하면 이것마저도 자동화가 되니까) xml과 달리 변수 선언, if, else, for 등의 로직을 구현할 수 있다는 게 특징이다.
무엇보다 중요한 건 Gradle이 Maven 보다 속도 측면에서 훨씬 우수합니다. Gradle은 지금도 계속 새로운 버전을 릴리즈 하고 있기 때문에 기존에 Maven으로 만들어진 프로젝트가 아니라면 굳이 Maven을 쓸 이유는 없어 보입니다.
다음으로 스프링 버전을 보면 여러 숫자와 (SNAPSHOT)이나 (M2)라고 붙은 버전인데. 이런 글자가 붙지 않은 버전 중에서 제일 최신 버전을 고르면 됩니다.
- SNAPSHOT : 아직 개발이 완료 되지 않은 버전. 인터페이스 변경사항이 있을 수 있다.
- M (Milestone) : 개발은 완료 됐으나 아직 개선 중, 혹은 버그를 수정중인 버전이다.
- RC (Release Candidate) : 전반적인 기능 개선, 버그 수정은 완료되었으나 아직 최종 릴리즈 되지 않은 버전이다.
아래에 프로젝트 메타데이터를 입력하고. 스프링 부트 3.x 버전부터는 Java 17 이상만 지원합니다.
패키징 방법은 두 가지가 있습니다.
- Jar
Java ARchive로 독립적인 Java 애플리케이션이다. 실행가능한 파일로 소스코드가 압축된 형태라 파일 전달이 쉽다. Jar 내부에 main 매서드가 있어 JVM만 있으면 실행 가능하다. - War
Wep Application Archive로, 웹 애플리케이션 압축파일 포맷이다. 웹과 관련된 자원을 포함한다. 실행하려면 별도의 웹 서버나 웹 컨테이너가 필요하다. Jsp나 외부 WAS에 배포할 예정이라면 War를 선택해야 된다.
보통 Spring Boot에서는 Jar를 추천합니다. 왜냐하면 내장 Tomcat(WAS)가 있어 외부 WAS를 사용할 필요가 없기 때문입니다. AWS EC2에 배포할 때도 Jar 파일로 배포할 수 있으니 웬만하면 Jar로 패키징해도 상관없습니다.
마지막으로 자신이 사용할 라이브러리의 Dependencies를 추가해주면 끝입니다. 프로젝트에서 자주 사용하는 것들은 아래와 같습니다.
SpringWeb
웹 애플리케이션을 위해 필수. 내장 Tomcat 뿐 아니라 Spring MVC 패턴을 위한 기능들이 포함되어 있다.
Spring Data JPA
데이터베이스를 조작할 수 있는 도구를 ORM이라고 하는데 JPA는 스프링 부트에서 ORM 기술 표준이라고 할 수 있다. Spring Data JPA != JPA. 이 모듈은 JPA를 더 쉽게 사용할 수 있게 해줄 뿐.
레포지토리 인터페이스만 정의하면 알아서 JPA 구현체를 만들어주기 때문에 Hibernate 같은 구현체를 사용하지 않아도 된다. 기본적인 CRUD가 매우 간단해지며, 매서드 이름 규칙을 따르면 필요한 쿼리를 알아서 생성해준다. 페이징 처리, 등등 많은 기능을 제공한다.
Lombok
getter, setter, toString, 해시값 비교 등의 메소드를 어노테이션으로 지정할 수 있어 코드를 줄여주는 기능을 한다.
Spring Boot DevTools
애플리케이션을 재시작 하지 않고 변경사항을 반영시켜주는 매우매우매우매우 좋은 툴이다. 아무리 스프링 부트가 내장 톰캣을 가지고 있다고 해도 매번 빌드하는 번거로움이 줄어든다.
Thymeleaf 혹은 Mustache
둘 다 서버 사이드 템플릿 엔진으로, 웹 애플리케이션에서 동적으로 HTML을 생성하는데 사용된다. JSP와 비슷한 역할을 하지만 몇 가지 차이점이 있다. (참고로 스프링 부트에서는 JSP를 권장하지 않는다. War로 패키징 해야 되기 때문에)
- Mustache
.js와 .java로 파일이 나누어져서 가독성이 좋고, 하나의 문법으로 서버 사이드와 클라이언트 사이드를 둘 다 개발할 수 있는 게 특징이다. 다양한 언어를 지원하며 Thymeleaf에 비하면 비교적 가볍고 단순하다. - Thymeleaf
HTML과 유사한 문법으로 태그 속성 안에 표현식을 넣어서 사용한다. 보통 Spring 프레임워크에서 Thymeleaf와의 통합이 용이하다 보니 많이 사용한다. (통합이 안 되면 개발자가 작성해야 되는 코드가 늘어남) Mustache보다 문법도 어렵지만 로직을 작성할 수 있다는 장점이 있다.
H2 Database
H2는 컴퓨터에 내장된 램 메모리에 의존하는 데이터베이스를 말한다. 테스트, 혹은 실습을 위해서 사용하기 편리하다. 램에 데이터를 저장하기 때문에 웹 서버를 재부팅하면 기존의 데이터가 사라진다.
Validation
이전 버전에서는 spring-boot-starter-web 내부에 validation이 있었지만 2.3 이상 부터는 아예 모듈로 빠져서 의존성을 추가해야 사용 가능하다. @NotNull @NotBlank @Pattern 등등... validation에서 사용할 수 있는 여러 어노테이션을 제공한다.
기본적인 설정이 끝나면 프로젝트 파일을 받아서 IDE로 옮겨줍니다.
인텔리제이 Ultimate 유료 버전을 쓰는 사람이라면 그냥 프로젝트 생성에서 Spring Initializr로 똑같이 설정하면 웹에서 스프링 부트 프로젝트를 생성한 것과 동일합니다.