Spring boot 기본 개념

SangLog·2023년 9월 30일
1

기본상식

목록 보기
7/8
post-thumbnail

Spring Boot 는 java를 통해서 프로그래밍을 하는 사람들에게는 굉장하게 친숙한 프레임워크 입니다.

Spring Boot와 Spring Boot에서 다용되는 Spring 기술들 그리고 개발을 하면서 알면 좋은 기능등 그동안 공부했던 내용들에 대한 전체적인 정리를 해보고 싶어서 포스팅을 하게 되었습니다.

포스팅 중에 정확하지 않은 내용들이 있을 수 있는데 이런 부분에 대해서는 편안하게 알려주시면 수정하겠습니다.

Spring Boot 와 Spring

Spring 은 java의 웹 프레임워크로 java를 통하여 프로젝트를 쉽게 할 수 있도록 지원해준다. 하지만 쉽게 지원해준다고 하지만 Spring 프로젝트를 직접 만들고 운영해보려고 한다면 생각보다 설정을 해줘야하는 것도 많고 복잡하다는 것을 알 수 있다.

이러한 Spring을 보다 더욱 편리하게 개발 할 수 있도록 해주기 위해서 Spring Boot 가 등장하게 되었다.

Srping Boot 가 Spring 보다 편한점

기본적으로 Spring Boot는 Spring 의 기능을 활용해서 만들어 졌다.
Spring 을 통해서 애플리케이션을 만들기 위해서는 다양한 환경설정들이 필요한데
이러한 환경설정들을 훨씬 간편하게 해주면서 Spring의 기능은 모두 활용할 수 있다.

Containerlses

Spring boot 를 이야기할때는 containerless라는 이야기를 한다.

Java의 표준 웹 기술을 사용하려면 Servlet Container를 통하여
webclient 로 부터 web request를 받고 처리를하여 response를 해주는 부분이 존재한다.

즉 Spring 환경에서도 Spring Container 앞부분에 Web 통신을 할 수 있는 Servelt Container 가 별도로 존재하고 이부분에 대한 설치 및 설정까지 신경써줘야지만 JAVA 웹 애플리케이션을 동작하게 할 수 있다.

대표적인 Servlet Container인 WAS 는 Tomcat, Jetty 등이 있다.

Spring boot 는 이러한 Servlet Container에 대한 처리를 개발자가 신경쓰지 않고 처리할 수 있도록 도와준다.

Spring boot 는 Tomcat이난 Jetty같은 내장 WAS를 가지고 있으며 해당 WAS에대한 기본적인 설정까지도 셋팅이 되어있기 때문에 개발자가 애플리케이션 영역에 집중할 수 있도록 도와준다.


이미지 출처

Auto Configuration

Spring Boot는 다양한 configuration에 대한 기본 정보들을 가지고 있다.
모든 내용들이 무조건적으로 설정되는것은 아니며 필요한 library를 사용한다면 해당하는 library에 대한 기본적인 설정 정보가 저장되어 있다고 보면 된다.

예를 들어서 Tomcat과 같은경우도 기본적인 환경설정이 되어있고 tomcat library를 가지고 있기 때문에 기본 상태에서 Spring Boot 애플리케이션을 실행하면 별도의 Tomcat관련 설정 없이도 Tomcat이 구동되며 사용이 가능하다. 이러한 Auto Configuration이 가능하도록 지원해주는 어노테이션은

@EnableAutoConfiguration 이다.

간편하게 내가 원하는 기능을 적용한는 starter

특정한 기능을 수행하기를 원하는경우 Spring Boot에서는 다양한 Starter를
gradle혹은 maven에 작성하기만하면 관련된 기능을 수행하기 위해서 필요한 다양한 의존관계의 library들과 버전을 맞춰서 사용할 수 있게 해준다.

예를들어 jdbc를 사용하기를 원한다면

implementation 'org.springframework.boot:spring-boot-starter-jdbc:3.1.4'

혹은 redis를 사용하기를 원한다면

implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.1.4'

이런식으로 훨씬 간편하고 빠르게 내가 원하는 기능을 추가해서 사용하는것이 가능해진다.

Spring Boot의 Scan

Scan을 이해하기 전의 사전 지식

Bean 이란 무엇인가

내가 생각하는 Spring의 가장 핵심적인 기능은 Bean을 구성하고 해당 Bean을 여러곳에서 사용할 수 있게 해주는 것이다.

동일한 기능을 수행하면서 여러곳에서 사용되는 즉 애플리케이션 동작에 핵심이 되는 Object를 Bean Object로 생성하면 성능상으로 훨씬 효율적으로 애플리케이션을 동작하게 할 수 있다.

이렇게 생성되는 Bean은 일반적으로 Singleton으로 생성되며 스프링 IoC(Inversion of Control) 컨테이너에 의해서 관리된다.

Singleton : 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

Spring Boot의 Bean 구성

Spring Container에서 생성되는 Bean들을 구분해보자면 아래와 같은 방법으로 구분해볼 수 있다.

애플리케이션 로직 빈

실제 비즈니스 로직을 구성하는 Object로서 Service, Controller, Repository 와 같이 내가 직접 생성하고 관리하는 빈이다.

Class 혹은 Method에 @Component를 작성해주면 Bean으로 생성이되며 내가 생성하는 Bean이 어떤 Bean인지 명확하게 명시를 해주기 위해 @Controller, @Service, @Repository등을 사용해줄 수 있다.

결과적으로 이러한 Annotation 들은 모두 메타 annotation으로 @Componet를 토함하고 있다.

@ComponentScan을 통해서 해당 패키지에 있는 모든 Bean들은 Spring boot 구동시에 등록이 되게 된다.

애플리케이션 인프라스트처 빈

spring container 자신도 빈으로서 관리가 되며, spring boot 환경에서 구성되는 자동 환경구성 정보들로 Enviroment, ApplicationContext, BeanFactory와 같은 빈들이 있다.

해당 빈들은 내가 직접관리하는게 아니라 시스템적으로 환경구성이 되어있으며 해당 값을은 내가 만드는 비즈니스 로직에서도 활용될 수 있다.

인프라환경설정 구성요소들은 @ComponentScan이 완료된 이후에
@EnableAutoConfiguration을 통해서 생성되지 않은 Bean들에 대해서 추가적으로 생성을 해준다.

DI를 통한 Bean 주입

Bean으로 생성되는 객체들은 DI를 통해서 특정 객체에 주입해줄 수 있다.
그리고 이러한 의존관계들은 Spring container에 의해서 구동되는 시점에 정의가 된다.

DI를 통해서 의존성을 설정할 수 있는 방법은 대표적으로 3가지 정도의 방법이 있다.

  • @Autowired
  • Setter
  • @RequiredArgsConstructor

Spring Boot의 Scan 방식

Component Scan

ComponentScan을 하는경우 Bean을 등록하는 과정을 진행한다.
@Componet의 여러 annotation중에 @Configuration의 경우는 다양한 Bean값을 가지는 경우가 많다. 하지만 만약에 동일한 타입의 Bean이 두개 존재한다면 어떻게 될까?

기본적으로 @Configuration 경우 proxyBeanMethods=ture 값을 가진다.
이 뜻은 Bean을 생성하기전에 앞쪽에 proxy를 두고 동일한 타입의 Bean이 이미 존재한다면 캐시되어있는 값을 전달한다. 결과적으로는 동일한 타입의 Bean을 두개 셋팅한다고 하더라도 구동은 문제 없이 동작하게 된다.

불필요한 리소스 낭비를 막기 위하여 동일 타입의 Bean을 등록하는 케이스가 아닌경우 proxyBeanMethods=false값으로 셋팅하는것이 요즘에는 권장되고 있다.

EnableAutoConfiguration

Spring Boot 는 기본적으로 제공하는 많은 auto configuration 정보들을 가지고 있다. 이러한 셋팅 정보는

Spring-boot-autoconfigure의 META- INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 보면 확인해보면 셋팅 되어져 있는 수많은 정보를 볼 수 있다.

자동설정 방식

Spring boot에서는 많은 자동 환경들이 존재하지만 모든 환경설정파일들을 수행하고 해당하는 Bean들을 만들지는 않는다.

Spring boot에서는 기본적으로 해당 configuration을 수행하는데 필요한 library가 존재하는지 여부를 판별하고 해당하는 library가 존재한다면 configuration 의 bean들을 등록한다.

그리고 이러한 환경설정을 Custom하게 사용자가 미리 셋팅을했다면
@ConditionalOnMissingBean을 통해서 사용자가 생성한 Bean을 우선시 하여
autoConfiguration에 존재하는 Bean설정은 생성하지 않는다.

특정 library 제거

그렇게 때문에 우선순위가 존재하기 때문에 특정 라이브러리를 제거한다면 해당 configuration은 등록이 안되게 되고 exclude등을 통해서 특정 library제거도 가능하다.

자동설정의 원리

Conditional

해당하는 Bean을 생성할것인지 아닐지에 대한 조건을 설정할 수 있다.

이러한 조건은 @Conditional을 통해서 Method 혹은 Class에 설정할 수 있으며 Conditional의 프로퍼티로 @Condition을 생성하여야한다.

Properties 우선순위

Spring Boot에는 다양하게 환경변수를 셋팅할 수 있는데 환경변수 값이 적용되는 것에는 우선순위가 존재한다.

profile
기록 쌓기

0개의 댓글