Spring boot

스프링 부트 핵심 콘셉트

ryeonng 2024. 9. 26. 16:33
사전 기반 지식

1. 스프링 프레임 워크(Spring Framework)

  • 일반적인 정의 : 스프링 프레임 워크는 자바 플랫폼을 위한 강력한 애플리케이션 프레임워크이다. 객체 지향 프로그래밍의 원칙에 기반하여 애플리케이션을 구성하고 관리하는 방식으로, 주로 엔터프라이즈급 애플리케이션을 구축할 때 사용된다.
  • 설정 방식 : 스프링은 초기 설정이 복잡할 수 있다. xml 설정 파일이나 자바 기반의 설정 클래스를 통해 다양한 기능을 직접 구성해야 한다.
  • 기능 : 스프링은 의존성 주입(DI), AOP(관점 지향 프로그래밍), 트랜잭션 관리, 데이터 액세스, 웹 애플리케이션 개발, 보안 등 광범위한 기능을 제공한다. 그러나 이 모든 기능을 사용하기 위해서는 상당한 양의 설정 작업이 필요하다.

2. 스프링 부트(Spring Boot)

  • 일반적인 정의 : 스프링 부트는 스프링 프레임워크의 서브 프로젝트로, 스프링 기반 애플리케이션을 더 쉽고 빠르게 개발할 수 있도록 도와준다. 특히 복잡한 설정을 자동화하고, 기본적인 기능을 쉽게 사용할 수 있도록 다양한 도구와 설정을 제공한다.
  • 설정 방식 : 스프링 부트는 "Convention over Configuration(관례에 따른 설정)" 철학을 따른다. 즉, 개발자가 기본 설정을 크게 수정할 필요 없이, 자동 설정 기능을 통해 많은 부분이 자동으로 설정된다. 이를 통해 초기 설정이 간단해지고, 생산성이 크게 향상된다.
  • 기능 : 스프링 부트는 내장 웹 서버(예 : Tomcat, Jetty)를 제공하여 별도의 웹 서버 설정 없이 애플리케이션을 실행할 수 있다. 또한, 다양한 스타터 의존성(Starter Dependency)을 통해 필요한 기능을 쉽게 추가할 수 있으며, 간단한 명령어로 프로젝트를 빠르게 시작할 수 있다.
참고
스프링 부트와 스프링이 다른 도구라고 생각할 수 있다. 하지만 스프링 부트는 스프링에 속한 도구이다.
즉, 스프링 부트는 스프링 프레임워크의 일부로, 스프링의 기본 기능을 활용하면서 개발자의 편의성을 극대화하기 위해 만들어졌다.

 

스프링 부트의 핵심 개념

특징 설명
자동 설정(Auto Configuration) 스프링 부트는 애플리케이션의 설정을 자동으로 처리한다. 개발자가 최소한의 설정만 해도 스프링 부트가 자동으로 필요한 빈(Bean)을 생성하고 설정해준다. 이는 개발 속도를 크게 향상 시킨다.
스타터 의존성(Starter Dependency) 스프링 부트는 다양한 스타터 의존성을 제공한다. 스타터 의존성은 특정 기능을 구현하는 데 필요한 라이브러리들을 하나로 묶어서 제공하며, 개발자는 필요한 기능에 대한 의존성만 추가하면 된다.
내장 웹 서버(Embedded Web Server) 스프링 부트는 Tomcat, Jetty, Undertow 등의 웹 서버를 내장하고 있어, 별도의 웹 서버 설치 없이 애플리케이션을 실행할 수 있다. 이는 배포와 테스트를 간편하게 만들어 준다.
프로덕션 준비 기능(Production-ready-Features) 스프링 부트는 애플리케이션을 운영 환경에서 안정적으로 실행할 수 있도록 다양한 프로덕션 준비 기능을 제공한다. 예를 들어, 헬스 체크, 모니터링, 메트릭스, 애플리케이션 상태 정보를 확인할 수 있는 액추에이터(Actuator)등이 있다.
Spring Boot CLI 간단한 스크립트를 통해 스프링 애플리케이션을 빠르게 실행할 수 있는 명령어 인터페이스 도구이다. 이 도구를 사용하면 복잡한 설정 없이 간단한 명령어로 애플리케이션을 실행할 수 있다.
외부 설정(Extermalized Configuration) 환경 변수나 설정 파일(yml 등)을 통해 애플리케이션 설정을 외부에서 쉽게 관리할 수 있도록 지원한다. 이를 통해 개발, 테스트, 운영 환경에서 다른 설정을 쉽게 적용할 수 있다.

스프링 부트 핵심 콘셉트 이해하기

1. 제어의 역전(IoC)와 의존성 주입(DI)

제어의 역전(Inversion Of Control) : 일반적으로 프로그램의 흐름(제어)은 개발자가 결정한다. 하지만 스프링에서는 제어의 역전이 이루어 진다. 즉, 객체의 생성 및 라이프사이클 관리가 스프링 프레임워크에 의해 자동으로 제어된다. 쉽게 말해, 프로그램의 흐름을 스프링이 관리하는 것이다.

 

의존성 주입(Dependency Injection) : 애플리케이션을 개발할 때, 클래스 간의 의존 관계가 발생한다. 이 의존성을 코드에서 직접 관리하는 대신, 스프링이 필요한 의존성을 자동으로 주입해준다. 예를 들어, UserService 클래스가 UserRepository를 필요로 할 때, 개발자는 이를 직접 생성하는 대신, 스프링이 이 두 객체를 연결(주입)해준다. 이렇게 하면 코드가 더 유연하고 테스트하기 쉬워진다.

public class A {
	b = new B();  // 개발자가 직접 new 키워드로 B 클래스를 생성 
}

public class A {
  @Authowired
	private B b; // 코드에서 직접 객체를 생성하지 않고 어디선가 받아서 b에 할당 됨 
}

 

2. 빈(Bean)과 스프링 컨테이너

스프링 컨테이너 : 스프링 애플리케이션의 중심이다. 이 컨테이너는 애플리케이션이 필요로 하는 빈을 생성하고, 이 빈들 간의 의존성을 주입하며, 애플리케이션이 실행될 때 빈을 사용할 수 있도록 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리한다. @Autowrired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI도 지원한다.

 

빈(Bean) : 스프링에서 빈은 스프링 컨테이너가 관리하는 객체를 의미한다. 스프링은 애플리케이션이 실행될 때 필요한 객체(빈)를 자동으로 생성하고 관리한다. XML 파일 설정, 애너테이션 추가 등의 방법 등을 제공한다.

@Component // 클래스 MyBean 을 빈으로 등록 합니다. 
public class MyBean {}

 

3. 관점 지향 프로그래밍(AOP)

관점 지향 프로그래밍(Aspect Oriented Programming) : AOP는 애플리케이션의 핵심 기능에 영향을 주지 않으면서, 부가적인 기능(예 : 로깅, 트랜잭션 관리)을 쉽게 추가할 수 있는 프로그래밍 패러다임이다. 예를 들어, 모든 메소드 호출 전에 로그를 남기고 싶다면, 모든 메소드 마다 코드를 추가할 필요 없이, AOP를 사용해 이러한 기능을 쉽게 적용할 수 있다.

  • 예시 : 은행 시스템에서 로그 기능이 필요하다고 가정해보자. 모든 서비스 메소드마다 로그를 남기는 코드를 작성하는 대신, AOP를 통해 "모든 서비스 메소드 호출 시 로그를 남기자"는 규칙을 만들 수 있다. 이렇게 하면 코드의 중복을 피하고, 애플리케이션의 유지보수가 훨씬 쉬워진다.

이식 가능한 추상화 - PSA(Portable Service Abstraction) : PSA는 스프링에서 다양한 기술 스택에 대한 추상화를 제공함으로써, 특정 기술에 종속되지 않고 이식성이 높은 코드를 작성할 수 있도록 돕는 개념을 의미한다. 대표적으로 데이터베이스, 메시징 시스템, 트랜잭션 관리 등의 서비스들이 있다. 예를 들어 데이터베이스 관련 코드가 특정 DBMS(MySQL, Oracle 등)에 종속되지 않도록, 스프링은 추상화 계층을 통해 다양한 DBMS에서 동일한 코드가 작동하도록 도와주며 또한 WAS도 PAS 예시 중 하나라고 볼 수 있다. WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른곳에서 실행해도 기존 코드를 그대로 사용할 수 있는 개념이다.

 

정리 : 스프링 부트 핵심 콘셉트

 


스프링 부트 연습 문제

문제 1) 스프링과 비교한 스프링 부트의 주요 특징 중 올바르지 않은 것을 고르세요.

  1. 스프링 부트는 설정을 최소화하고 자동으로 설정을 제공하여 빠르게 애플리케이션을 개발할 수 있도록 돕는다.
  2. 스프링 부트는 내장 웹 서버를 제공하여 별도의 웹 서버 설정 없이 애플리케이션을 실행할 수 있다.
  3. 스프링 부트는 스프링의 기능을 기반으로 하지만, 스프링과는 별도의 독립적인 프레임워크로 동작한다.
  4. 스프링 부트는 스타터 의존성(Starter Dependency)을 제공하여 필요한 기능을 쉽게 추가할 수 있다.

문제 2) 스프링 부트의 기본 내장 WAS를 고르세요.

  1. Tomcat
  2. Jetty
  3. Undertow
  4. Netty

문제 3) 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 개념을 뭐라고 하나요?

 

문제 4) 스프링에서 IoC를 구현하기 위해 사용하는 방법 중 외부에서 객체를 주입 받아 사용하는 개념을 뭐라고 하나요?

 

문제 5) 다음 어노테이션 중 , 빈으로 등록되지 않은것은?

  1. @Component
  2. @Controller
  3. @Service
  4. @Repository
  5. @Value