스프링 부트란
스프링부트의 특징
- 내장 서버를 이용해 별도의 설정 없이 독립 실행이 가능한 스프링 애플리케이션
- 톰캣, 제티 또는 언더토우와 같은 웹 애플리케이션서버(WAS) 자체 내장
- 빌드 구성을 단순화하기 위한 ‘spring boot starter’ 의존성 제공
- XML 설정 없이 단순 자바 수준의 설정 방식 제공
- JAR를 이용해 자바 옵션만으로 배포 가능
- 애플리케이션의 모니터링과 관리를 위한 스프링 액추에이터 제공
톰캣, 제티, 언더토우와 같은 웹 애플리케이션서버(WAS) 자체 내장
스프링 부트는 디폴트 내장 서버로 톰캣(tomcat)을 사용하고 있습니다.
내장 웹 서버에 대한 설정을 자동으로 처리하기 때문에 스프링 부트 사용자는 웹 서버와 관련된 설정을 하지 않아도 프로젝트 내부에 포함하게 됩니다.
제티(Jetty)나 언더토우(Undertow)와 같은 내장 웹 서버를 사용하기 위해서는 pom, xml에 설정 값을 작성하는 것만으로 쉽게 변경이 가능합니다.
빌드 구성을 단순화하기 위한 ‘스프링부트 스타터’ 의존성 제공
스프링 부트에서 스타터(starter)란 설정을 자동화해주는 모듈을 의미합니다.
프로젝트에서 설정해야 하는 다양한 의존성을 사전에 미리 정의해서 제공합니다.
따라서 프로젝트에서 설정해야 하는 다수의 의존성들을 스타터가 이미 포함하고 있기 때문에 스타터에 대한 의존성만 추가하면 프로젝트를 쉽게 진행할 수 있습니다.
XML설정 없이 단순 자바 수준의 설정 방식 제공
스프링 부트는 XML에 설정을 작성할 필요 없이 자바 코드로 설정할 수 있습니다.
XML은 문법이 틀리거나 선언이 선언을 잘못하면 원인을 찾기 힘듭니다.
자바 코드는 컴파일러의 도움을 받기 때문에 오타 등의 설정정보 오류를 미리 알 수 있습니다.
또한 클래스 단위로 설정하기 때문에 쉽게 관리할 수 있습니다.
애플리케이션의 모니터링과 관리를 위한 스프링 액추에이터 제공
서비스를 운영하려면 서비스 개발 뿐 아니라 서비스가 정상적으로 동작하고 있는지 상태를 모니터링 해야 합니다.
스프링 액추에이터는 스프링 부트 애플리케이션에서 제공하는 여러가지 정보를 손쉽게 모니터링 할 수 있게 도와주는 라이브러리입니다.
*스프링부트는 스프링에 속한 도구 중 하나이다.
스프링과 스프링부트의 차이
구성의 차이
스프링은 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야 한다.
스프링부트는 스프링 코어와 스프링 MVC의 모든 기능을 제공하기 때문에 수동으로 개발 환경을 구성할 필요가 없다.
내장 WAS 차이
스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에서 배포된다.
*WAS는 웹 애플리케이션을 실행하기 위한 장치이다.
스프링부트는 WAS를 자체적으로 가지고 있다.
따라서 jar 파일만 만들면 별도의 WAS 설정을 하지 않아도 애플리케이션을 실행할 수 있다.
*스프링부트의 내방 WAS는 톰캣, 제티, 언더토우가 있기 때문에 상황에 따라서 선택할 수 있다.
<요약> 스프링 스프링부트
목적 | 엔터프라이즈 애플리케이션 개발을 더 쉽게 만듬 | 스프링의 개발을 더 빠르고 쉽게 만듬 |
설정파일 | 개발자가 수동으로 구성 | 자동 구성 |
XML | 일부 파일은 XML로 직접 생성하고 관리 | 사용하지 않음 |
인메모리 데이터베이스 지원 | 지원하지 않음 | 인메모리 데이터베이스 자동 설정 지원 |
서버 | 프로젝트를 띄우는 서버 | 내장형 서버를 제공해 별도의 설정이 필요 없음 |
스프링 콘셉
제어의 역전과 의존성 주입
스프링은 모든 기능의 기반을 제어의 역전(IoC)와 의존성 주입(DI)에 두고 있습니다.
IoC란(제어의 역전): Inversion of Control
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것
스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 하고 있다.
private class A{
private B b;
}
DI(의존성 주입): Dependency Injection
DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻
public class A{
@Autowired
B b;
}
빈과 스프링 컨테이너
스프링 컨테이너
스프링 컨테이너는 빈을 생성하고 관리합니다.
빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너에서 관리합니다.
@Autowired 와 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원 합니다.
빈
빈은 스프링 컨테이너가 생성하고 관리하는 객체입니다.
스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등 여러 방법을 제공합니다.
*예를 들어서 MyBook 이라는 클래스에 @Component 애너테이션을 붙이면 MyBook 클래스가 빈으로 등록이 됩니다.
*이후 스프링 컨테이너에서 해당 클래스를 관리합니다.
@Component
public class MyBook{}
관점 지향 프로그래밍 AOP: Aspect Oriented Programming
프로그래밍에 대한 관심을 핵심 관점, 부가관점으로 나누어서 관심 기준으로 모듈화 하는 것 입니다.
이식 가능한 서비스 추상화 PSA: Portable Service Abstraction
스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스 입니다.
대표적인 PSA의 예는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션이 있습니다.
또한 스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 등이 있습니다.
WAS도 PSA의 일종이라고 볼 수 있습니다.
스프링 프레임워크는 IoC/DI를 통해 객체 간의 의존 관계를 설정하고, AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며 PAS를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용합니다.
스프링부트 스타터
spring-boot-starter-{작업유형}
해당 규칙을 규칙을 잘 기억하고 필요한 기능을 찾으면 스타터를 쉽게 찾을 수 있습니다.
자주 사용하는 스타터
스타터 설명
springboot-starter-web | spring mvc를 사용해서 restful 웹 서비스를 개발할 때 필요한 의존성 모음 |
springboot-starter-test | 스프링 애플리케이션을 테스트 하기 위해 필요한 의존성 모음 |
springboot-starter-validation | 유효성 검사를 위해 필요한 의존성 모음 |
springboot-starter-actuator | 모니터링을 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음 |
springboot-starter-data-jpa | ORM을 사용하기 위한 인터페이스 모음인 jpa를 더 쉽게 사용하기 위한 인존성 모음 |
다양한 애너테이션
@SpringBootConfiguration
스프링 부트 관련 설정을 나타내는 애너테이션
@Configuration을 상속해서 만든 애너테이션임
@ComponentScan
사용자가 등록한 빈을 읽고 등록하는 애너테이션
@Component 라는 애너테이션을 가진 클리스들을 찾아 빈으로 등록하는 역할을 한다.
@Configuration- 설정 파일 등록
@Repository- ORM 매핑
@Controller, @RestController- 라우터:http 요청과 메서드를 연결하는 장치.
@Service- 비지니스 로직
스프링 부트 구조
스프링 부트에는 프레젠테이션, 비지니스, 퍼시스턴스 계층이 있습니다.
이 계층들이 서로 통신하며 프로그램을 구성합니다.
프레젠티이션 계층
http 요청을 받고 해당 요청을 비지니스 계층으로 전송하는 역할을 합니다.
컨트롤러가 바로 프레젠테이션 역할을 하기 때문입니다.
컨트롤러는 TestController 클래스와 같은 것으로 스프링 부트 내에 여러개가 있습니다.
비지니스 계층
모든 비지니스 로직을 처리합니다.
비지니스 로직이란 서비스를 만들기 위한 로직ㅇ르 말합니다.
쉽게 말하면 웹사이트에서 벌어지는 모든 작업입니다.
쿠팡을 예로 들면 주문 서비스, 주문 개수 등의 데이터를 처리하기 위한 로직, 주문 처리를 하다가 발생하는 예외 처리로직, 주문을 받거나 취소하는 것과 같이 프로세스를 구현하기 위한 로직입니다.
*서비스가 비지니스 계층의 역할을 합니다.
퍼시스턴스 계층
모든 데이터 베이스 관련 로직을 처리합니다.
해당 과정에서 데이터베이스에 접근하는 DAO 객체를 사용합니다.
DAO는 데이터베이스 계층과 상호작용하기 위한 객체입니다
*리포지토리가 퍼시스턴스 계층의 역할을 합니다.
테스트 코드
given-when-then 패턴이란
테스트 코드를 세단계로 구분해서 작성하는 것 입니다.
given: 테스트 실행을 준비하는 단계
when: 테스트를 진행하는 단계
then: 테스트 결과를 검증하는 단계
스프링 부트 스타터 테스트 목록
JUnit: 자바 프로그래밍 언어용 단위 테스트 프레임워크
Spring test & Spring Boot test: 스프링 부트 애플리케이션을 위한 통합 테스트 지원
AssertJ: 검증문인 어설션을 작성하는데 사용하는 라이브러리
Hamcrest: 표현식을 보다 이해하기 쉽게 만드는데 사용되는 Mathcer 라이브러리
Mockito: 테스트에 사용할 가짜 객체인 목 객체를 쉽게 만들고, 관리하고, 검증할 수 있게 지원하는 테스트 프레임워크
JSONassert: JSON용 어설션 라이브러리
JsonPath: JSON데이터에서 특정 데이터를 선택하고 검색하기 위한 라이브러리
JUnit
자바 언어를 위한 단위 테스트 프레임워크 입니다.
단위 테스트란 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것 입니다.
이때 단위는 보통 메서드가 됩니다.
JUnit을 사용하면 단위 테스트를 작성하고 테스트 하는데 도움을 줍니다.
JUnit 장점
- 테스트 방식을 구분할 수 있는 애너테이션을 제공
- @Test 애너테이션으로 메서드를 호출할 때마다 새 인스턴스를 생성, 독립 테스트 가능
- 예상 결과를 검증하는 어선셜 메서드 제공
- 사용 방법이 단순, 테스트 코드 작성 시간이 적음
- 자동 실행, 자체 결과를 확인하고 즉각적인 피드백을 제공
자주 사용하는 애너테이션
@DisplayName: 테스트 이름을 명시
@Test: 해당 애너테이션을 붙인 메서드는 테스트를 수행하는 메서드가 된다.
@BeforeAll: 전체 테스트를 시작하기 전에 처음으로 한 번만 실행. 이 애너테이션은 전체 테스트 실행 주기에서 한번만 호출되어야 하기 때문에 메서드를 static으로 선언해야 한다.
@BeforeEach: 테스트 케이스를 시작하기 전에 매번 실행합니다. 각 인스턴스에 대해 메서드를 호출해야 하므로 메서드는 static이 아니여야 합니다.
@AfterAll: 전체 테스트를 마치고 종료하기 전에 한 번만 실행합니다. 전체 테스트 실행 주기에서 한 번만 호출되어야 하므로 메서드를 static으로 선언해야 합니다.
@AfterEach: 각 테스트 케이스를 종료하기 전 매번 실행합니다. @BeforeEach 애너테이션과 마찬가지로 메서드는 ststic이 아니여야 합니다.
@SpringBootTest: 메인 애플리케이션 클래스에 추가하는 애너테이션인 @SpringBootApplication이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트를 만듭니다.
@AutoConfigureMockMvc: MockMvc를 생성하고 자동으로 구성하는 애너테이션 입니다. MockMvc는 어플리케이션을 서버에 배포하지 않고도 테스트용 MVC 환경을 만들어 요청 및 전송, 응답 기증을 제공하는 유틸리티 클래스 입니다. 즉 컨트롤러를 테스트 할 때 사용되는 클래스 입니다.