번외 - Spring boot 사용 이유
스프링이라 하면 우선 스프링 프레임워크, 스프링 부트, 스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 Rest Docs, 스프링 배치, 스프링 클라우드 등을 포함하는 프레임 워크다. 이중에 핵심이 되는 것은 스프링 프레임 워크라고 할 수 있다.
스프링의 특징
•
경량 컨테이너로서 자바 객체를 직접 관리
→ 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
•
제어의 역전(IoC)
→ 애플리케이션의 느슨한 결합을 도모
→ 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출
•
의존성 주입(DI)
→ 각각의 계층이나 서브스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜 줌
•
관점 지향 프로그래밍(AOP)
→ 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리해서 관리 가능
•
애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 "컨테이너"(Container)라고 할 수 있다.
→ iBatis, myBatis나 Hibernate 등 완성도가 높은 데이터베이스처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
•
트랜잭션 관리 프레임워크
→ 추상화된 트랜잭션 관리를 지원하며 설정파일(xml, java, property 등)을 이용한 선언적인 방식 및 프로그래밍을 통한 방식을 모두 지원한다.
•
모델-뷰-컨트롤러 패턴(MVC)
→ 웹 프로그램밍 개발 시 거의 표준적인 방식인 "Spring MVC"라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다.
→ DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다.
•
배치 프레임워크
→ 스프링은 특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)을 지원하는 배치 프레임워크를 제공한다. 기본적으로 스프링 배치는 Quartz 기반으로 동작한다.
•
즉, 공통 부분의 소스 코딩이 용이하며, 확장성도 매우 높다.
스프링 프레임 워크
•
핵심기술 : 스프링 DI 컨테이너, AOP, 이벤트, 기타
•
웹 기술 : 스프링 MVC, 스프링 WebFlux
•
데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
•
기술 통합 : 캐시, 이메일, 원격접근, 스케쥴링
•
테스트 : 스프링 기반 테스트 지원
•
언어 : 코틀린, 그루비 등
스프링의 핵심
•
자바 언어 기반의 프레임 워크로 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크다.
→ 자바 엔터프라이즈 개발을 위한 “오픈소스” 프래임워크
•
즉, 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크라 볼 수 있다.
스프링 부트
•
스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
•
단독으로 실행할 수 있는 스프링 애플리케이션 쉽게 생성
→ 빌드 및 서버 띄우는 것 등 매우 간단해짐
•
Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
•
손쉬운 빌드 구성을 위한 starter 종속성 제공
•
스프링과 3rd parth(외부) 라이브러리 자동 구성
→ 스프링 부트와 매칭되는 라이브러리를 알아서 잘 맞춰줌
•
메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
→ 운영환경에서 모니터링 같은 것을 기본적으로 제공
•
관례에 의한 간결한 설정
Spring Initializr로 프로젝트 생성
1. 하단의 사이트 접속
→ 자세한 내용은 그림 하단 참고.
•
Project(Gradle)
• 프로젝트에서 필요한 라이브러리를 관리해주고, 빌드 라이프 사이클을 관리해주는 툴을 선택
• 최근에는 Groovy를 사용하는 추세
•
Language
• 사용할 프로그래밍 언어
•
Spring Boot
• 사용할 스프링 부트 버전을 선택한다.
• 버전 뒤에 표기된 접미사는 소프트웨어 배포 생명 주기를 의미한다.
• GA 또는 아무런 접미사가 없는 버전을 선택한다.
•
Project MetaData
Group, Artifact를 설정하면 Name과 Project Name은 자동으로 추가된다.
• 프로젝트와 관련된 정보를 포함한 메타 데이터를 작성한다.
◦
Group : 패키지 이름을 의미한다. 주로 기업명(기업 도메인)
◦
Artifact : 애플리케이션 이름을 의미
◦
Name : Artifact와 동일
◦
Description : 해당 필드에 프로젝트에 대한 설명을 작성
◦
Package name : 생성될 프로젝트의 패키지 이름이다.Group + Name(혹은 Artifact)이 합쳐진 내용
◦
Packaging : 프로젝트를 생성할 때 어떤 확장자로 생성할 것인지를 선택한다.
◦
Java : 자바 버전을 선택한다.
boot 3.X부터는 JAVA 버전 17 이상부터 지원!!
선택한 JAVA 버전과 같은 버전의 JDK를 설치해야한다!
•
Dependencies
• 스프링 부트 기반으로 프로젝트를 생성할 때 어떤 라이브러리를 사용할 지 선택
• 선택하지 않을 경우, spring-boot-starter만 의존
• 지금 설정하지 않아도 Build.gradle에서 설정 가능
2. Generate - Ctrl(Cmd) + Enter
• boot 프로젝트가 zip 파일로 다운로드 됨
프로젝트 Import
1. 이클립스 혹은 IntelliJ를 이용해 프로젝트 열기
Build.gradle 설정(라이브러리)
1. spring-boot-starter-web
•
Spring MVC를 사용한 RESTful서비스를 개발하는데 사용
•
이 라이브러리에 tomcat(WAS)를 내장하고 있기때문에 바로 웹 서버로 사용 가능
MVC 란?
•
모델, Model - (M)
→ 데이터를 처리하는 영역
→ DB와 통신하고, 사용자가 원하는 데이터를 가공하는 역할
•
뷰, View - (V)
→ 화면을 의미
→ 타임리프(HTML)를 이용해서 화면을 처리
•
컨트롤러, Controller - (C)
→ 모델(M)과 뷰(V)의 중간 다리 역할을 하는 영역
implementation 'org.springframework.boot:spring-boot-starter-web'
Java
복사
2. spring-boot-starter-test
•
스프링 어플리케이션을 테스트 가능하도록 추가
•
구성
◦
junit : 테스트 프레임워크
◦
mockito: 목 라이브러리
◦
assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
◦
spring-test : 스프링 통합 테스트 지원
testImplementation 'org.springframework.boot:spring-boot-starter-test'
Java
복사
3. spring-boot-starter(공통)
•
스프링 부트 + 스프링 코어 + 로깅
•
구성
◦
spring-boot
▪
sping-core
◦
spring-boot-starter-logger
▪
slf4j, logback
4. mavenCentral()
•
mavenCentral()이라는 함수를 실행하여 dependecies를 간편하게 다운로드
5. 초기 전체 코드
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.5'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
Java
복사
BootApplication.java
•
@SpringBootApplication 이란 어노테이션이 선언되어 있는 것을 확인
1. @SpringBootApplication
•
@EnableAutoConfiguration, @ComponentScan, @Configuration을 하나로 묶어 놓은 것
•
스프링부트를 기동하기 위해서는 main 메소드가 필요한데 여기에SpringApplication.run(BoApplication.class, args); 이 부분이 들어감
해당 annotation을 설정한 클래스가 있는 package를 최상위 패키지로 인식하고 ComponentScan을 수행하기 때문에 해당 어노테이션이 있는 클래스의 파일 위치또한 중요!!!!
실행
IntelliJ에서 실행할 시 Gradle을 통해 실행된다면 실행 속도가 느릴 수 있기 때문에
Setting → Build, Execution, Deployment → Build Tools → Gradle으로 들어가 IntelliJ로 변경해주자
1.
Ctrl + R 로 실행
2.
해당 페이지가 나오면 성공
•
포트는 위 console에서 tomcat 8080과 같은 포트 번호를 확인한 후 변경
3.
Index.html(정적 페이지)
Spring Boot는 WelcomePage(첫화면)을 static에서 index.html을 찾고 없다면 index tamplates를 찾는다.
•
src → main → resources → static 경로 안에 index.html 생성 시 페이지 접근 가능
•
http://localhost:8080/lindex.html
폴더 구조
templates | 템플릿 파일은 HTML 파일 형태로 자바 객체와 연동되는 파일 |
static | 해당 폴더에는 css, fonts, images, plugin, scripts 등의 정적 리소스 파일이 위치 |
application.properties | 해당 파일은 웹 애플리케이션을 실행하면서 자동으로 로딩되는 파일입니다. 예를 들어, 부트에 내장된 톰캣의 포트 번호, 콘텍스트 패스(Context Path) 설정이나, 데이터베이스 관련 정보 등 애플리케이션에서 사용하는 여러가지 설정을 해당 파일에 Key - Value 형식으로 선언해서 사용 가능
선언한 속성은 일반적으로 설정(Configuration) 파일에서 사용 |
src/test/java | 서버를 실행하지 않은 상태에서 src/main/java 디렉터리에 작성한 코드를 테스트 |
Error
1. No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.5 was found.
•
Boot 버전과 Gradle 버전이 맞지 않는 경우
→ Boot 3.X 부터는 JAVA 17 버전 이상부터 지원한다.
•
Boot 프로젝트 생성 시 설정한 JAVA 버전과 맞지 않는 경우
1-1 해결법
Setting → Build, Execution, Deployment → Build Tools → Gradle
JAVA 설치 및 버전 변경(for mac)
2. Unsupported class file major version 64
•
라이브러리중 JAVA 버전을 지원하지 않을 경우 발생
2-1 해결법
•
JAVA 17 버전의 Boot 3.X 버전으로 프로젝트 생성
•
JAVA 11 버전의 Boot 2.7.x버전으로 프로젝트 생성