스프링 | 스프링 부트 | |
---|---|---|
목적 | 엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기 | 스프링 개발을 더 빠르고 쉽게 하기 |
설정 파일 | 개발자가 수동으로 구성 | 자동 구성 |
XML | 일부 파일은 XML로 직접 생성하고 관리 | 사용하지 않음 |
인메모리 db 지원 | 지원하지 않음 | 자동 설정 지원 |
서버 | 프로젝트를 띄우는 서버(톰캣, 제티 등)을 별도로 수동 설정 | 내장형 서버를 제공해 별도의 설정 필요없음 |
스프링을 사용하는 이유에서 보았듯이, 애플리케이션을 개발할 때 여러 편의성을 지원하기 때문인데,
1. 스프링 애플리케이션은 대부분 POJO로 구성되어 애플리케이션을 쉽게 테스트할 수 있고,
2. 의존성 주입을 지원하여 객체 관리가 편하고,
3. AOP 프로그래밍 패러다임을 가지고 있어 기능 구현에 집중할 수 있으며,
4. PSA를 지원하여 변경에 유연하게 대응할 수 있고,
5. 트랜잭션 관리를 쉽게 할 수 있기 때문이다.
스프링 컨테이너는 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너에서 관리한다. 또한 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원한다.
빈은 스프링에서 제공해주는 객체라고 생각하면 된다.
스프링은 빈을 컨테이너에 등록하기 위해 XML파일 설정, 애너테이션 등의 방법을 제공한다.
예를 들어, 아래의 경우 @Component 애너테이션을 붙여 해당 클래스를 빈으로 등록한다. 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔 관리한다.
@Component
public class MyBean{} // 클래스 MyBeandmf myBean이라는 이름으로 관리한다
IoC는 제어의 흐름을 역전(개발자 > 컨테이너)
시키는 개념이며, DI는 객체가 필요로 하는 의존성을 외부에서 주입
하는 개념이다
스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용한다. 객체를 개발자가 직접 생성하거나 제어하는 것이 아니라 외부(스프링 컨테이너)에서 관리하는 객체를 주입받아 사용하는 것
을 말한다.
제어의 역전을 구현하기 위해 사용하는 방법이 DI이다. 클래스 A에서 B객체를 사용하고 싶은 경우, 직접 생성하지 않고 스프링 컨테이너에서 객체를 주입받아 사용한다.
의존성은 주로 생성자 주입, 수정자 주입, 필드 주입 등이 있다.
관점을 핵심관점과 부가관점으로 분리하여 개발
하는 것을 말한다.
계좌 이체, 고객 관리 등 핵심 비즈니스 로직을 제외한, 로깅 혹은 DB 연결 등 부가적인 기능을 따로 관리한다. 이를 통해 비즈니스 로직에 집중하여 개발을 할 수 있을 뿐만 아니라 프로그램의 변경과 확장에도 유연하게 대응할 수 있다.
이식 가능한 서비스 추상화를 PSA(Portable service abstraction)라고 부른다. 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말한다. 이를 통해 어느 기술을 사용하던 일관된 방식으로 처리
할 수 있다.
스프링 부트 스타터는 의존성이 모여있는 그룹(6.1.5 참고)이다. 스타터를 사용하면 필요한 기능을 간편하게 설정할 수 있다.
build.gradle 파일에 의존성을 설정하는데, 자주 사용하는 스타터는 web, test, validation, actuator, jpa 등이 있다.
스프링 부트는 애플리케이션의 여러 부분을 자동으로 구성해준다.(자동 설정)
스프링 부트는 서버를 시작할 때 구성 파일을 읽어와서 설정한다.
자동 설정은 META-INF에 있는 spring.factories 파일에 담겨있다.
스프링 부트를 시작할 때 @EnableAutoConfiguration는 이 파일에 설정된 클래스를 모두 불러오고, 이후 프로젝트에서 사용할 것들만 자동으로 구성해 등록한다.
파일 | 구성 요소 |
---|---|
spring-boot-autoconfigure/spring.factories | 프로젝트에 쓰일 구성 후보들을 확인할 수 있다. |
프로젝트 구성/spring-boot-autoconfigure/h2 | h2 구성과 관련된 파일이 자동 구성되어 등록된 폴더 |
H2ConsoleAutoConfiguration | 자동 구성되는 클래스 |
H2ConsoleProperties | 속성값을 정의한 클래스 |
애너테이션 | 기능 |
---|---|
@SpringBootApplication | 스프링 부트 사용에 필요한 기본 설정을 해줌. |
@SpringBootConfiguration | 스프링 부트 관련 설정을 나타내는 애너테이션. @Configuration을 상속해서 만들음 |
@ComponentScan | 사용자가 등록한 빈을 읽고 등록하는 애너테이션 |
@EnableAutoConfiguration | 스프링 부트에서 자동 구성을 활성화하는 애너테이션 |
@RestController | 라우터(HTTP 요청과 메서드를 연결하는 장치) 역할을 하는 애너테이션 |
스프링 부트 2는 자바 8버전 이상을 사용하고
스프링 부트 3은 자바 17버전 이상을 사용해야 한다.
추가된 기능 | 기능 | 이전 | 자바17이상 |
---|---|---|---|
텍스트 블록 | 여러 줄의 텍스트 작성 | \n을 사용 | """로 텍스트를 감싸서 사용 |
formatted()메서드 | 값을 파싱 | ? | ? |
레코드 | 데이터를 전달하는 객체를 더 빠르고 간편하게 만들기 위한 기능 | 애너테이션이나 메서드로 게터 정의 | 게터를 자동으로 만들어줌 |
레코드는 상속을 할 수 없고 파라미터에 정의한 필드는 private final로 정의된다 | |||
패턴 매칭 | 타입 확인 | instanceof 키워드와 형변환 코드를 조합 | 바로 형변환 후 사용 가능 |
제어문 추가 | 자료형에 맞는 case 처리 | ? | switch-case문으로 자료형에 맞게 case처리 가능 |
패키지 네임스페이스 | 패키지 네임스페이스 변경 | javax.* | jakarta.* |