스프링부트3 백엔드 - 2. 스프링 부트 3 시작하기(스프링과 스프링부트 차이, IoC, DI, AOP, PSA )
스프링과 스프링 부트
스프링의 등장
엔터프라이즈 애플리케이션
대규모의 복잡한 데이터를 관리하는 애플리케이션.
많은 사용자의 요청을 동시에 처리해야 하므로 서버 성능, 안정성 ,보안이 중요함.
▶ 기능 개발에만 집중할 수 있게끔 엔터프라이즈 애플리케이션을 위한 개발환경을 제공함. → 스프링 프레임워크
스프링을 더 쉽게 만들어주는 스프링 부트 Spring Boot
설정이 매우 복잡한 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구.
스프링 프로젝트를 빠르게 설정할 수 있음.
스타터(의존성 세트) 사용하여 간편하게 의존성을 사용하거나 관리할 수 있음.
자바(객체 지향) 언어 기반의 프레임워크
객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
주요 특징
- 톰캣, 제티, 언더토우 같은 웹애플리케이션서버(WAS)가 내장되어 있음 → 따로 설치 안해도 독립적 실행 가능
- 빌드 구성 단순화하는 스프링부트 스타터 종속성 제공.
- 스프링과 외부(3rd parth) 라이브러리 자동 구성. → 외부 라이브러리의 버전을 걱정하지 않아도 됨
- 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공.
- 스프링 액츄에이터 ( 애플리케이션의 모니터링 및 관리 도구 ) 제공.
- 관례에 의한 간결한 설정.
- XML 설정 않고도 자바 코드로 모두 작성 가능.
- JAR 이용하여 자바 옵션만으로도 배포 가능.
Spring 과 Spring Boot 의 차이
1. 구성의 차이
스프링 : 애플리케이션 개발에 필요한 환경을 수동으로 구성·정의
스프링부트 : 스프링코어와 스프링MVC(Model, View, Controller) 의 모든 기능을 자동으로 로드 → 수동으로 개발 환경을 구성할 필요가 없다.
2. 내장 WAS의 유무
WAS : 웹 애플리케이션을 실행하기 위한 장치.
스프링 : 톰캣과 같은 WAS에서 일반적으로 애플리케이션을 배포.
스프링 부트 : 자체 WAS 보유함 ∴ jar 파일만 만들면 별도의 WAS 설정 안해도 애플리케이션 실행 가능.
+) 그 외
스프링 | 스프링 부트 | |
목적 | 엔터프라이즈 애플리케이션 개발 더 쉽게 만들기 | 스프링 개발 더 빠르고 쉽게 |
설정 파일 | 개발자가 수동으로 구성 | 자동 구성 |
XML | 일부 파일은 XML로 직접 생성, 관리 | 사용하지 않음 |
인메모리 데이터베이스 지원 | 지원 안함 | 자동 설정 지원 |
서버 | 프로젝트를 띄우는 서버(ex. 톰캣, 제티)를 별도로 수동 설정 | 별도 설정 필요 없음(내장형 서버 제공) |
스프링 콘셉트 공부하기
스프링이라는 프레임워크가 작동하는 원리를 이해하기 위해 스프링의 주요 개념을 살펴보자.
스프링 모든 기능의 기반은 제어의 역전(IoC)과 의존성 주입(DI)이다.
이 둘은 객체 간 의존 관계를 설정한다.
제어의 역전 ( Inversion of Control : IoC )
▶ 객체를 관리하기 위해
다른 객체를 직접 생성하거나 제어하는 것이 아니라, 외부에서 관리하는 객체를 가져와 사용하는 것.
( 그동안 자바로 객체 생성할때는 객체가 필요한 곳에서 직접 생성해왔음. )
실제로 스프링은 '스프링 컨테이너'가 객체를 관리·제공 한다.
public class A{
private B b; // 어디에서도 B객체를 생성하지 않았음. 어딘가에서 받아온 객체를 b 에 할당.
}
의존성 주입 ( Dependency Injection : DI )
▶ IoC를 구현하기 위해
어떤 클래스가 다른 클래스에 의존한다.
스프링 컨테이너에서 객체를 주입받아 사용.
// 객체를 주입받는 모습 예
public class A {
// 클래스 A에서 B를 주입받음
@Autowired
B b;
}
빈과 스프링컨테이너
스프링 컨테이너
빈 생성하고 관리.
빈 생명주기를 관리함.
@Autowired (스프링 컨테이너에 있는 빈을 주입하는 역할)을 사용하여 빈 주입받을 수 있게 DI를 지원하기도 함.
빈
스프링의 객체.
스프링 컨테이너가 관리.
스프링 컨테이너에 등록하기 위한 방법은 여러가지이다. → XML 파일 설정 / 어노테이션 추가 ···
@Component : 클래스를 빈으로 등록. 클래스 이름의 첫글자를 소문자로 바꾸어 스프링 컨테이너에서 관리.
ex) SayHello 라는 클래스를 @Component 어노테이션을 통해 빈으로 등록한다면, 스프링 컨테이너는 이를 sayHello로 바꾸어 관리함.
관점 지향 프로그래밍 ( Aspect Oriented Programming : AOP )
프로그래밍에 대한 관심을 '핵심 관점' 과 '부가 관점' 으로 분리하여, 관심 기준으로 모듈화 하는 것.
프로그래머는, 핵심 관점 코드에만 집중할 수 있다.
프로그래머는, 프로그램 변경 / 확장에 유연하게 대응할 수 있다.
이식 가능한 서비스 추상화 ( Portable Service Abstraction : PSA )
스프링에서 제공하는 다양한 기술들을 추상화해서 개발자가 쉽게 사용하는 인터페이스.
ex 1 ) '클라이언트의 매핑 & 클래스·메서드의 매핑' 을 위한 '어노테이션'
ex 2 ) JPA, MyBatis, JDBC 등 어떤 기술을 사용하든 일관된 방식으로 DB에 접근하도록 인터페이스 지원.
ex 3 ) WAS도 PSA의 예시 중 하나. WAS를 톰캣이 아닌 언더토우, 네티 등등 에서도 같은 코드로 실행 가능.
요약
IOC : 객체의 생성과 관리를 개발자가 아닌 프레임워크가 대신하는 것.
DI : 외부에서 객체를 주입받아 사용하는 것.
AOP : 프로그래밍 시 핵심관점과 부가관점을 분리하여 개발하는 것.
PSA : 어느 기술을 사용하던 추상화된 다양한 서비스들을 일관된 방식으로 처리하도록 하는 것.
스프링부트 3 둘러보기
스프링 부트 스타터 살펴보기
의존성이 모여있는 그룹.
필요한 기능을 간편하게 설정할 수 있음.
명명규칙
spring-boot-starter-{작업유형}
자주 사용하는 스타터
- spring-boot-starter-web : Spring MVC를 사용해서 RESTful 웹서비스를 개발할 때 필요.
- spring-boot-starter-test : 스프링 애플리케이션을 테스트하기 위해 필요.
- spring-boot-starter-vaildation : 유효성 검사를 위해 필요.
- spring-boot-starter-actuator : 모니터링을 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게 함.
- spring-boot-starter-data-jpa : JPA(ORM을 사용하기 위한 인터페이스의 모음)를 더 쉽게 사용하기 위함.
+) 스프링 부트가 의존성을 가져온다 : 필요한 기능을 가져와서 쓴다.
자동구성
자동구성을 알아야 하는 이유
: 본인이 구성하지 않은 부분을 스프링에서 자동으로 어떻게 구성했는지 확인할 상황이 있음.
스프링부트 :
최소한의 설정만으로도 실행되게 여러 부분을 자동으로 구성함.
자동설정(서버 시작할 때 구성파일을 읽어와서 설정)을 함.
자동설정은 META-INF에 있는 spring.factories 파일에 담겨 있음.
자동구성이 없다면 개발자가 특정 기술을 사용할 때마다 설정해야 하는 값을 모두 개발자가 직접 설정해줘야 함.
스프링부트3와 자바 버전
스프링부트 2 : 자바8 버전 이상을 사용.
스프링부트 3 : 자바 17 버전 이상을 사용.
자바17의 주요 변화
텍스트블록
이전에는 여러 줄의 텍스트를 작성하려면 \n을 추가해야 했으나,
이제는 """로 감싼 텍스트를 사용해 여러 줄의 텍스트를 표현할 수 있음.
formatted() 메서드
값을 파싱하기 위해 제공하는 메서드.
레코드
데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만들기 위한 기능.
상속 불가.
파라미터에 정의한 필드는 private final로 정의됨.
게터를 자동으로 만들기 때문에 애너테이션이나 메서드로 게터 정의를 하지 않아도 됨.
패턴 매칭
타입확인을 위해 사용하던 instanceof 키워드를 조금 더 쉽게 사용할 수 있게 해줌.
instanceof키워드와 형변환코드를 조합할 필요 없이 바로 형변환한 뒤 사용 가능.
자료형에 맞는 case 처리
switch-case문으로 자료형에 맞게 case 처리를 할 수도 있음.
Servlet, JPA의 네임스페이스가 Jakarta로 대체
패키지네임스페이스가 javax.*에서 jakarta.*로 변경되었음.
스프링부트2 버전을 사용하고 있다면 패키지 이름을 javax에서 jakarta를 사용하게 변경해야 함.
GraalVM기반의 스프링 네이티브 공식 지원
'스프링 애플리케이션을 네이티브 이미지로 컴파일해 JVM에 구동되는 애플리케이션'에 비해
시작시간과 메모리 오버헤드를 줄일 'GraalVM기반의 스프링 네이티브'를 공식 지원함.
JVM 실행 파일과 비교해 네이티브이미지를 사용하면 가동 시간이 짧아지고 메모리소모가 적어짐.
스프링부트3 코드 이해하기
@SpringBootApplication 이해하기
자바의 main() 메서드와 같은 역할.
스프링 부트 사용에 필요한 기본 설정을 해줌.
SpringApplication.run() : 애플리케이션을 실행
이 메소드의 첫 번째 인수는 스프링부트3 애플리케이션의 메인클래스로 사용할 클래스,
이 메소드의 두 번째 인수는 커맨드 라인의 인수들을 전달함.
@SpringBootApplication 애너테이션의 구성
@SpringBootConfiguration
스프링부트 관련 설정을 나타냄
스프링의 @Configuration을 상속해서 만듦
개발자가 직접 사용하는 애너테이션은 아님.
@ComponentScan
사용자가 등록한 빈을 읽고 등록하는 애너테이션.
@Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록함. ( 모든 빈이 이 애너테이션을 사용하는 것은 아님 )
용도에 따라 다른 애너테이션을 사용함.
- @Configuration : 설정 파일 등록.
- @Repository : ORM 매핑.
- @Controller, @RestController : 라우터
- @Service : 비즈니스 로직
@EnableAutoConfiguration
자동 구성을 활성화.
스프링부트 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행.
이를 사용할 때 spring.factories파일에 클래스들이 자동설정됨.
테스트 컨트롤러 살펴보기
라우터 : HTTP요청과 메서드를 연결하는 장치.
클라이언트의 요청에 맞는 메서드를 실행할 수 있음.
@RestController, @Configuration, @Repository, @Service 애너테이션도 내부에 타고타고 들어가면 @Component 애너테이션이 있어서 용어는 다르지만 @Component처럼 취급할 수 있음.
빈이 무슨 역할을 하는지 명확하게 구분하기 위해 다른 이름으로 덮어 두었을 뿐.