- Web Application Concept :
。Browser / HTML / CSS / Request / Response / Form / Session / Authentification
- Spring MVC :
。Dispatcher Servlet / View Resolvers / Model / View / Controller / Validation
VIEW:html,JSP처럼 client에게 보여주는 문서를 의미.
- Spring Boot :
。Starters / Auto Configuration .. etc
- Framework :
。JSP / JSTL / JPA / Bootstrap / Spring Security / MySQL / H2 DB
Application Architecture의 발전과정 : Web ▶ REST API ▶ Microservice ▶ Cloud 순으로 발전.
Spring Ecosystem(스프링 생태계)가 유명한 이유
- Loose Coupling :
。Spring은 Bean과 dependency의 생성 및 연결을 관리하면서 Application을 loose coupling으로 구축하기 용이하게하면서 쉽게Unit test를 수행하도록 한다.
- AutoWiring :
。Boiler plate Code를 감소시켜 개발자가 Business Logic에 집중할 수 있도록 설계.
boiler plate code: 프로그래밍에서 반복되는 작업이나 패턴에 대한 일종의 표준화된 코드
- Architectural Flexibility :
。Spring Framework는 여러 개의 Module로 나뉘고 , Spring은 별개의 Project로 다양하므로 Application 구축 시 모든 옵션을 선택하는것이 아닌 , 필요한 module과 project만 선택하여 Application 구축이 가능.
Spring Projects 종류
- Spring Framework :
。Spring을 이용하여 Application을 개발 시 기반이 되는 framework로서 DI(의존성주입) , AOP(관점지향프로그래밍) 기능 제공
DI(Dependency Injection):
Spirng에서 요구하는 Field type에 해당하는 특정Spring Context내부의 Class의 Spring Bean instance를 식별 및 자동으로 주입.
AOP(Aspect Oriented Programming) : 관점지향프로그래밍
。Business Logic과Cross Cutting Concern을 분리하여 모듈화하는 프로그래밍 기법.
▶Java의AOP종류 :Spring AOP,AspectJ
。 각Layer의Business Logic에서Logging,Security,Transaction등의Cross Cutting Concern을 별도의 모듈(Aspect)로 분리하여 코드중복을 줄이고 유지보수를 쉽게 수행.
。각 모듈의 공통으로 공유하는 부분인Cross Cutting Concern으로 인한 코드중복으로 인한 유지보수성과 코드 가독성을 떨어뜨리는 문제점을 해결.
▶ 각 모듈에서 공통으로 공유하는 Logic인Cross Cutting Concern을Aspect로 구현 및Aspect를 적용할 모듈을Point Cut으로 정의하는 Logic을 정의.
- 공통관심사 : (
Cross Cutting Concern)
。Application의 여러 모듈에서 공통적으로 필요하지만 , 핵심Business Logic과는 별개인 기능을 의미.
▶Application전반에서 코드중복(WET)을 유발.
。같은 코드가 여러곳에서 중복될 수 있어 유지보수성과 코드 가독성을 떨어뜨리는 원인이됨.
▶AOP를 활용해 효과적으로 관리 가능.
Cross Cutting Concern예시 :
。3-Tier Architecture에서 각각의 Layer로 독립적으로 분리된Web,Business,DataLayer의 공통으로 공유하는 기능인Security(보안) ,Performance(성능측정) ,Logging(문제식별) 부분을 의미.
▶ 해당 공통으로 공유하는 기능을 각 계층에 구현 시 코드중복(WET)되는 단점이 존재.
▶Spring AOP을 통해Cross Cutting Concern를Aspect로 분리하여 해결.
- Spring Boot :
。Production ready , Build quickly
▶ 필요한 환경 설정을 최소화하고 개발자가 Business logic에 집중하게 함으로써 생산성을 향상.
- Spring Data :
。데이터 연동을 위한 단일 API를 제공하며 해당 API를 기반으로 JPA , MongoDB , Redis등의 RDMBS와 NoSQL과의 연동을 처리하는 역할.
- Spring Security :
。Application의 보안(인증: Authentication / 인가: Authorization 등)을 담당하는 Spring Framework.
▶ 보안에 필요한 기능을 제공함으로써 개발자가 보안 관련 logic을 따로 작성할 필요는 없음.
- Spring Intergration :
。다른 Application과 통합 또는 시스템 간의 연동을 위해 유용하게 사용되는 프로젝트
- Spring Cloud
Spring Framework
。Spring을 이용하여 Application을 개발 시 기반이 되는 Framework.
▶ 다양한 Spring Module(=Spring Core) 로 구성. ( ex :MVC,Core,WebFlux..etc)
。DI( Dependency Injection ) ,AOP( 관점지향프로그래밍 ) 기능 제공
。Framework의 Dependency를 정의 및 식별하여 자동으로 연결.
▶DI만으로 Application을 구축하기에는 Tool이 충분하지 않고 DB (JPA) 또는Hibernate, Unit test (JunitorMockito) 같은 추가적인 framework가 필요.
。Spring Modules와Spring Projects는 Spring이 다른 framework와 잘 통합할 수 있도록 지원하는 역할을 수행.
- Spring Framework가 여러 모듈로 분할된 이유?
Architectural Flexibility
。각각의 Spring Application은 구현기능에따른 요구조건이 다르고 , 다양한 모듈을 사용하므로 이에 Spring framework는 application 구축 시 Spring의 모든 Module 중 원하는 Module만 선택해서 사용하도록 Module이 분할..
ex) DB와 통신하는 Web Application을 구축 시 Spring Module 중 Spring MVC , Core , JDBC , JPA만 선택하여 사용하고 나머지 모듈은 사용 x
▶ 각 Application에 대해 유연하게 대처가 가능.
- Spring Framework 기능
IoC Container/Dependency Injection/Auto-Wiring/Loose Coupling/Scope.. etc
Spring Core(Module)
。Spring Framework의 Module
。web application / REST API / authentication / authorization / DB / 다른 시스템과 통합 / UNIT TEST에 중요한 역할을 수행한다.Spring Module 종류
- Web : Spring MVC
。Web application과 REST API의 Build 과정을 간소화.
。@Controller,@RestController,@RequestMapping("/courses")
- Web Reactive :
。Spring WebFlux
- Data Access :
。JDBC , JPA ( DB에 연결시 주로 사용하는 기능 )
- Integration :
。Spring JMS ( 다른 app`과 통합 시 사용하는 기능 )
- Unit Test :
。Spring MVC Test
Spring Boot
。 일반적으로 Spring Application에는 사전에
ComponenScan,Dispatcher Sevlet,Data Source,JSON Conversion등의 Configuration이 필요.
▶ Spring Boot 활용 시 Application을 Production ready , Build quickly 하도록 Spring과 Spring MVC를 쉽고 간편하게 활용가능.
Spring Boot의 사용 이전
。Spring Boot 이전에는 Spring Project를 설정하는 작업은 복잡함.
Dependency 관리 (pom.xml)
Web App Configuration 정의 (web.xml)
Spring Bean 관리 (content.xml)
NFR ( Non Functional Requirements ) : 비기능 요구사항 구현을 위한 코드 작성
。 상단의 많은 설정을 하고 나서야 Production 환경에 적합한 application을 얻을 수 있었고 이를 새 프로젝트를 Build할 때 마다 수동으로 반복해야한다!
▶ 이는 번거로울 뿐더러 , 오랫동안 유지관리를 수행 할 경우 작성 코드를 유지관리하는데 매우 힘듬.
- Spring Boot의 목표
。 Application을 Production ready , Build quickly 하도록 생성.
- Build Quickly
- Spring Initializer :
。Spring Boot project를 쉽게 생성.
- Spring Boot Starter Projects :
。Spring Starter의 Dependency를 빠르게 정의.
- Spring Boot Auto Configuration :
。Class PATH에 존재하는 Framework에 따라 자동으로 설정.
- Spring Boot DevTools :
。수동으로 서버를 재시작 않고도 Application을 변경 가능.
- Be Production-Ready
- Logging
。console에 표현되는 log의 logging level을 설정.
- Profiles , ConfigurationProperties
。여러 환경에 맞는 다양한 설정을 제공.- Spring Boot Actuator
。Application의 측정항목을 모니터링.NFR ( Non Functional Requirements ) : 비기능 요구사항
Actuator:endpoint를 이용한 application monitoring 수행.Embedded Server: Application 배포과정 간소화Profile&@ConfigurationProperties: Application Configuration(설정) 과정 간소화.Logging&Error Handling
- Spring Boot의 Application 배포방식
。spring-boot-starter-tomcat,spring-boot-starter-jetty,spring-boot-starter-undertow의 Embedded Server 활용
- WAR Approach :
。구세대 Application 배포 방식
#1. Java 설치
#2. Web / Application Server 설치 ( ex :Tomcat,WebSphere,WebLogic)
#3.WAR파일 배포
▶ 설정이 복잡하므로 Embedded Server로 대체
- Spring Boot Embedded Server :
Embedded Server: Application을 통해 작동시킬 수 있는 내장 웹서버
。Tomcat과 같은 Web-Server가 이미Spring Web의JAR파일 내에 내장되어있으므로 ,WAR방식과 다르게 Java만 설치하면JAR파일을 실행 가능.
。Spring Boot는 여러Embedded Server를 지원.
▶spring-boot-starter-tomcat,spring-boot-starter-jetty,spring-boot-starter-undertow등JAR(
.jar: Java ARchive) :
。여러 개의 Java Class 파일, 메타 데이터, Resource 파일 등을 하나의 파일로 묶은 Archive 파일.
。필요한 기본적인 dependency들을 전부 구성하여 간편하게 사용가능하게하는 Starter Project 역할 수행.
Spring Boot - Build Quickly
- Spring Boot Initializer
- Spring Boot Starter Project
- Spring Boot Auto Configuration
- Spring Boot DevTools
Spring Boot Initializer
。Spring Boot Project 생성 start.spring.io
。Spring Boot3은 최소한 Java 17의 버전을 필요로 한다.
。SNAPSHOT 버전은 Spring Boot Team이 현재 개발하는 버전으로서 새로운것을 배울때 사용은 부적합.
。Group ID:프로젝트 그룹
。Artifact ID:최종 결과물이름
▶ Class 이름과 유사
。Name:프로젝트이름
。Description:프로젝트 설명
。Package name:패키지명
Spring Project 자원관리도구
- Build Tool(빌드도구) :
。개발자의 Source code를 실행 가능한 Application으로 구축해주는 역할을 수행.
▶ 각 개발언어에 맞는Project를 build 및Dependency를 관리.
- Maven :
XMLScript 기반으로pom.xml을 이용해 자동으로 library 와 dependency를 관리.
。Maven clean,install
view - Tool Windows - Maven - 프로젝트명 - Lifecycle - clean 우클릭 - Run Maven Build
- Gradle :
。Maven이후 출시한Java,Kotlin,Android의Project Build Tool로서build.gradle에 script를 작성하여 dependency를 관리.
build.gradle:
。Gradle을 사용하는 Project의Build Script파일로서dependency,Compile,Plug-in,Test의 관리 및 설정이 가능.
▶Project의build,test,production을 자동화하는 역할을 수행.
。Groovy , Kotlin으로 작성가능.
▶XML기반Build Script에 비해 관리가 용이.
build.gradle주요 구성요소
plugins { id 'plugin이름' }
。Project에 활용한Gradle Plugin을 정의.
Gradle Plugin종류
。java: java project 용
。java-library: java library 용
。application: 실행 가능한 Application
。kotlin: Kotlin Project 용
。com.android.application: Android App Project 용
group,version:
。Project의 그룹명과 Version을 정의.
▶ 다른 Build Tool( ex.Maven)에서 Packaging 시 사용.
repositories { }
。Project에서 사용할 Dependency 저장소를 지정.
▶ 일반적으로Maven Central(Maven중앙 저장소 :mavenCentral()) ,JitPack등을 사용.
dependencies { 키워드 '라이브러리' }
。Project에서 사용할 외부 Library의 Dependency를 정의.
dependency키워드
。implementation:Compile+Runtime시 둘다 사용하는 일반 라이브러리
。complieOnly:Compile시에만 사용하는 라이브러리
。runtimeOnly:Runtime시에만 사용하는 라이브러리
。testImplementation:Test시에만 사용하는 라이브러리
。annotationProcessor:Annotation Processing용 라이브러리
application { mainClass = '메인클래스' }
。Application의 Main Class 지정 시 사용.
▶ 해당 설정을 지정 시gradle run명령어로 Application 실행이 가능.
Intellij에서gradleReload 하는 방법?
。Intellij의 우측에Gradle에서Reload All Gradle Projects실행.
▶build.gradle설정 변경 시 실행.
실습 : 간단한 REST API 구축해보기 설명
。REST API를 Build하려면 Spring / Spring MVC / Tomcat / JSON Conversion 이 필요.
▶ Spring Starter 로서Spring WebDependency를 추가 시 위 기능을 전부 사용이 가능하다!import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Arrays; import java.util.List; class Course{ private long id; private String name; private String description; public Course(long id, String name, String description) { this.id = id; this.name = name; this.description = description; } public long getId() { return id; } public String getDescription() { return description; } public String getName() { return name; } } @RestController public class CourseController { @RequestMapping("/courses") public List<Course> retrieveAllCourses() { return Arrays.asList( new Course(1,"Learn AWS","wjdtn747"), new Course(2,"Learn DevOps","wjdtn747") ); } }。
@RestController: Controller method에서 mapping한 url link를 노출.
。@RequestMapping("/courses"): 사용자가 URL에 /courses를 입력하면List<Course>형식 데이터를 반환.
▶ 해당 데이터는JSON Conversion을 통해 Java객체를JSON형식으로 변환하여 List로서 return.
。Web Application을 실행 한 후 chrome에json formatter chrome extension을 추가한 후 , URL에localhost:8080/courses검색.
。다음처럼 url 입력 시 JSON Format 데이터 표현.
▶Spring Bean이나xml을 따로 설정하지않아도 되므로 Spring Boot를 이용해 REST API를 생성하는것은 쉽다.
@RestController:
。Spring에서 RESTful Web의 Controller를 지정하기 위한 Annotation으로서REST API개발 시 주로 선언
。@RequestMapping을 통한Controller Method의 URL Link를 노출하는 역할을 수행.
。기존의@Controller와@ResponseBody가 결합된 어노테이션.
▶@Controller와 다르게 반환값에@ResponseBody가 자동으로 적용된다.
@RequestMapping(value = "url"):
。@Controller이 선언된 Class의Controller Method에 사용.
。클라이언트의 요청(url)에 해당하는Controller method를 mapping하는 annotation
▶ 해당 method는 요청을 처리하고 필요한 로직을 수행 후 응답 생성.
。URL Mapping 방식을 세밀하게 제어 가능.
- JSON Conversion :
。Java 객체 형식을 JSON 형식으로 변환하여 return.
ex)List<Class객체>▶ JSONpublic List<Course> retrieveAllCourses(){ return Arrays.asList( new Course(1,"Learn AWS","wjdtn747"), new Course(2,"Learn DevOps","wjdtn747"),
- Spring Web :
spring-boot-starter-web
。Web Application 개발에 필요한 실행환경 제공하는 Starter
。Spring MVC를 이용하여 REST API를 포함한 Restful한 Web Application을 build시 사용.
▶ REST API를 구축하기 위해 필요한 dependency
。기본 embedded container로Apache Tomcat활용.
▶ Dependency를 정의한 경우 Spring / Spring MVC / Tomcat / JSON Conversion의 기능을 사용 가능.
Spring Boot - Build Quickly
- Spring Boot Initializer
- Spring Boot Starter Project
- Spring Boot Auto Configuration
- Spring Boot DevTools
Spring Boot Starter
。
pom.xml을 통해 Applitcation을 Build 시 필요한 Starter를 정의하여 Spring Boot에 필요한 Framework를 불러올 수 있다.
。Spring Project의pom.xml내부에는spring-boot-starter-web과spring-boot-starter-test가 기본적으로<dependency>를 통해 starter로서 정의되어있음.
▶ctrl + click으로 해당 starter의 내부 dependency 구현을 확인 가능.
Spring Starter의 종류
spring-boot-starter-parent:
。pom.xml의<dependency>에 정의된 Spring Starter들의 version을 자동으로 관리.<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.2</version> <relativePath/> <!-- lookup parent from repository --> </parent>.
spring-boot-starter-web:
。Spring MVC를 활용해서 RESTful Application을 build시 활용하는 starter
。해당 Starter 설정 시 Spring Boot의 class path에 존재하는framework/class/Existing Configuration에 따라서 Auto Configuration이 결정.<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>。
spring-boot-starter-web내부에는 다음 dependency가 구현됨.<artifactId>spring-boot-starter</artifactId> <!-- Spring Context를 실행하는 역할 --> <artifactId>spring-boot-starter-json</artifactId> <!-- Bean to JSON / JSON to Bean을 수행하는 역할 --> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- Tomcat에서 application 실행하는 역할 --> <artifactId>spring-web</artifactId> <artifactId>spring-webmvc</artifactId> <!-- Spring MVC Framework를 활용해서 REST API를 Build하는 역할. -->
Spring Web :
spring-boot-starter-web
。Web Application 개발에 필요한 실행환경을 제공하는 Starter
。Spring MVC를 이용하여REST API를 포함한 Restful한 Web Application을 build시 사용.
▶ REST API를 구축하기 위해 필요한 dependency
。기본 embedded container로Apache Tomcat활용.
。Spring, Spring MVC, Jackson, Tomcat등의 수많은 JAR들을 dependency로서Spring Boot Starter Web에 포함.
Spring Web을 dependency로 추가하여 사용 시
。Spring,Spring MVC,Jackson,Tomcat등이Transitive Dependency로서 포함됨.
▶Error Page/Dispatcher Servlet/Spring Bean -> JSON변환 /Tomcat WebServer등이 자동으로 AutoConfiguration됨.Container :
。개발자가 Library, 종속성 등 필요한 모든 것을 이용하여 Application을 Packaging하여 하나의 Package로 배포할 수 있게하는 역할을 수행.
▶ OS 없이, Host의 Resource를 그대로 사용하는 Application
。서버 운영을 위한 Library만 Image에 포함하여 설치하므로, 경량화됨.
▶ Image : Object , Container : Instance
spring-boot-starter-test:
。Unit Test를 실행 시 정의하는 starter<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>.
spring-boot-starter-data-jpa:
。JPA를 활용해 DB 접근 시 정의하는 starter
spring-boot-starter-jdbc:
。JDBC를 이용한 DB 접근 시 정의하는 starter
spring-boot-starter-security:
。Web Application 또는 REST API 보안 설정 시 정의하는 starter
spring-boot-starter-actuator:
。endpoint를 통해 Production 단계의 Application을 모니터링하고 관리 시 정의하는 starter
spring-boot-starter-validation: 활용
。Client로부터POSTRequest로 전송된<form>객체 또는DTO의 데이터에 대한 유효성 검증을 수행.
validation: 어떤 데이터( 주로 사용자 또는 다른서버의 request )의 값이 유효한지, 잘못된 내용이 있는지 확인하는 단계.<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Spring Boot - Build Quickly
- Spring Boot Initializer
- Spring Boot Starter Project
- Spring Boot Auto Configuration
- Spring Boot DevTools
Spring Boot Auto Configuration
。Spring Application을 구축하기 위해서는
ComponentScan,JSON Conversion등 수많은 Configuration을 필요로한다!
。Spring Application의Configuration을 자동으로 설정
▶Spring Boot 프로젝트의class path상에 존재하는framework,Annotation등의Existing Configuration을 토대로 자동화된Application Configuration을 제공.
Existing Configuration(기존 설정) :
Spring boot가 제공하는 기본Auto Configuration을 Override
Auto Configuration과 관련된 Spring Starter
pom.xml에서는 여러Starter를<dependency>로서 추가하여 필요한 Framework를 불러올 수 있다.
spring-boot-starter-parent:
。pom.xml의<dependency>에 정의된 Spring Starter들의 version을 자동으로 관리.
spring-boot-sterter-web:
。Spring Boot의 class path에 존재하는framework/class/Existing Configuration에 따라서 Auto Configuration이 결정.
- Auto Configuration logic의 위치
。Maven Dependency의spring-boot-autoconfigure-3.2.5.jar내에서 AutoConfiguration class들이 설정되있음.
。spring-boot-autoconfigure-3.2.5.jar의 하위 경로인org.springframework.boot.autoconfiguration.web에서는 Web application 개발 및 REST API 관련된 모든 AutoConfiguration이 해당 package와 하위 package에서 정의되어있음.
Spring Boot - Build Quickly
- Spring Boot Initializer
- Spring Boot Starter Project
- Spring Boot Auto Configuration
- Spring Boot DevTools
。코드를 변경할 떄 마다 수동으로 서버를 재시작해야하는 불편함을 개선한 모듈
▶ 자동으로 서버를 재시작하면서 코드 변경사항을 적용.
。pom.xml의 <dependency>에 다음 Spring Starter를 입력 후 maven을 재실행.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
。spring-boot-devtools가 반영 시 java파일에서 코드 수정 시 자동으로 서버가 재실행됨.
。pom.xml을 통해 <dependency>를 수정 시 해당 DevTools 기능이 존재하더라도 수동으로 재시작을해야한다.
Spring Boot - Production-Ready
- Logging
- Profiles , @ConfigurationProperties
- Spring Boot Actuator
Spring Boot - Production-Ready
- Logging
- Profiles , @ConfigurationProperties
- Spring Boot Actuator
Spring Boot - Production-Ready
- Logging
- Profiles , @ConfigurationProperties
- Spring Boot Actuator