02 스프링과 스프링 부트의 차이

hyHA·2023년 12월 15일
0
post-custom-banner

스프링과 스프링 부트의 차이

스프링스프링 부트
목적엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기스프링 개발을 더 빠르고 쉽게 하기
설정 파일개발자가 수동으로 구성자동 구성
XML일부 파일은 XML로 직접 생성하고 관리사용하지 않음
인메모리 db 지원지원하지 않음자동 설정 지원
서버프로젝트를 띄우는 서버(톰캣, 제티 등)을 별도로 수동 설정내장형 서버를 제공해 별도의 설정 필요없음

스프링을 쓰는 이유

스프링을 사용하는 이유에서 보았듯이, 애플리케이션을 개발할 때 여러 편의성을 지원하기 때문인데,
1. 스프링 애플리케이션은 대부분 POJO로 구성되어 애플리케이션을 쉽게 테스트할 수 있고,
2. 의존성 주입을 지원하여 객체 관리가 편하고,
3. AOP 프로그래밍 패러다임을 가지고 있어 기능 구현에 집중할 수 있으며,
4. PSA를 지원하여 변경에 유연하게 대응할 수 있고,
5. 트랜잭션 관리를 쉽게 할 수 있기 때문이다.

빈과 스프링 컨테이너

스프링 컨테이너는 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너에서 관리한다. 또한 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원한다.

빈은 스프링에서 제공해주는 객체라고 생각하면 된다.
스프링은 빈을 컨테이너에 등록하기 위해 XML파일 설정, 애너테이션 등의 방법을 제공한다.

예를 들어, 아래의 경우 @Component 애너테이션을 붙여 해당 클래스를 빈으로 등록한다. 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔 관리한다.

@Component
public class MyBean{} // 클래스 MyBeandmf myBean이라는 이름으로 관리한다

제어의 역전(IoC)과 의존성 주입(DI)

IoC는 제어의 흐름을 역전(개발자 > 컨테이너)시키는 개념이며, DI는 객체가 필요로 하는 의존성을 외부에서 주입하는 개념이다

스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용한다. 객체를 개발자가 직접 생성하거나 제어하는 것이 아니라 외부(스프링 컨테이너)에서 관리하는 객체를 주입받아 사용하는 것을 말한다.

제어의 역전을 구현하기 위해 사용하는 방법이 DI이다. 클래스 A에서 B객체를 사용하고 싶은 경우, 직접 생성하지 않고 스프링 컨테이너에서 객체를 주입받아 사용한다.
의존성은 주로 생성자 주입, 수정자 주입, 필드 주입 등이 있다.

AOP 관점지향 프로그래밍

관점을 핵심관점과 부가관점으로 분리하여 개발하는 것을 말한다.
계좌 이체, 고객 관리 등 핵심 비즈니스 로직을 제외한, 로깅 혹은 DB 연결 등 부가적인 기능을 따로 관리한다. 이를 통해 비즈니스 로직에 집중하여 개발을 할 수 있을 뿐만 아니라 프로그램의 변경과 확장에도 유연하게 대응할 수 있다.

PSA 이식 가능한 서비스 추상화

이식 가능한 서비스 추상화를 PSA(Portable service abstraction)라고 부른다. 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말한다. 이를 통해 어느 기술을 사용하던 일관된 방식으로 처리할 수 있다.

  • 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션
  • DB에 접근하기 위한 기술인 JPA, MyBatis, JDBC 중 어떤 것으로 사용해도 일관된 방식으로 DB에 접근할 수 있도록 인터페이스를 지원한다.
  • WAS를 톰캣, 언더토우, 네티 중 어떤 것으로 사용해도 기존 코드를 그대로 사용할 수 잇다.

스프링 부트 3의 시작점

스프링 부트 스타터

스프링 부트 스타터는 의존성이 모여있는 그룹(6.1.5 참고)이다. 스타터를 사용하면 필요한 기능을 간편하게 설정할 수 있다.
build.gradle 파일에 의존성을 설정하는데, 자주 사용하는 스타터는 web, test, validation, actuator, jpa 등이 있다.

자동 구성

스프링 부트는 애플리케이션의 여러 부분을 자동으로 구성해준다.(자동 설정)
스프링 부트는 서버를 시작할 때 구성 파일을 읽어와서 설정한다.
자동 설정은 META-INF에 있는 spring.factories 파일에 담겨있다.
스프링 부트를 시작할 때 @EnableAutoConfiguration는 이 파일에 설정된 클래스를 모두 불러오고, 이후 프로젝트에서 사용할 것들만 자동으로 구성해 등록한다.

파일구성 요소
spring-boot-autoconfigure/spring.factories프로젝트에 쓰일 구성 후보들을 확인할 수 있다.
프로젝트 구성/spring-boot-autoconfigure/h2h2 구성과 관련된 파일이 자동 구성되어 등록된 폴더
H2ConsoleAutoConfiguration자동 구성되는 클래스
H2ConsoleProperties속성값을 정의한 클래스

스프링 부트 3 주요 애너테이션

애너테이션기능
@SpringBootApplication스프링 부트 사용에 필요한 기본 설정을 해줌.
@SpringBootConfiguration스프링 부트 관련 설정을 나타내는 애너테이션. @Configuration을 상속해서 만들음
@ComponentScan사용자가 등록한 빈을 읽고 등록하는 애너테이션
@EnableAutoConfiguration스프링 부트에서 자동 구성을 활성화하는 애너테이션
@RestController라우터(HTTP 요청과 메서드를 연결하는 장치) 역할을 하는 애너테이션
  • @SpringBootApplication
    • 해당 애너테이션이 붙은 클래스에서 스프링부트가 시작됨. 해당 클래스는 자바의 main() 메서드 역할.
    • SpringApplication.run()메서드
      • 애플리케이션을 실행하는 메서드
      • 이 메서드의 첫번째 인수는 스프링 부트3 애플리케이션의 메인 클래스로 사용할 클래스, 두번째 인수는 커맨드 라인의 인수들을 전달.
  • @RestController
    • @Controller + @ResponseBody
    • 해당 애너테이션이 붙은 컨트롤러에 등록된 메서드는 @GetMapping혹은 @PostMapping등의 애너테이션을 통해 HTTP요청을 처리한다.

그 밖에.. 스프링 부트 3와 자바 버전

스프링 부트 2는 자바 8버전 이상을 사용하고
스프링 부트 3은 자바 17버전 이상을 사용해야 한다.

추가된 기능기능이전자바17이상
텍스트 블록여러 줄의 텍스트 작성\n을 사용"""로 텍스트를 감싸서 사용
formatted()메서드값을 파싱??
레코드데이터를 전달하는 객체를 더 빠르고 간편하게 만들기 위한 기능애너테이션이나 메서드로 게터 정의게터를 자동으로 만들어줌
레코드는 상속을 할 수 없고 파라미터에 정의한 필드는 private final로 정의된다
패턴 매칭타입 확인instanceof 키워드와 형변환 코드를 조합바로 형변환 후 사용 가능
제어문 추가자료형에 맞는 case 처리?switch-case문으로 자료형에 맞게 case처리 가능
패키지 네임스페이스패키지 네임스페이스 변경javax.*jakarta.*
profile
룰루랄라
post-custom-banner

0개의 댓글