스프링 부트(Spring Boot)

2경빈·2024년 6월 17일

Spring Boot

목록 보기
1/19

Bean

스프링 부트에서 "bean"은 스프링 프레임워크에서 관리되는 객체를 의미한다.
스프링 프레임워크는 일반적으로 POJO(Plain Old Java Object)라 불리는 단순한 Java 객체들을 관리하며, 이를 "bean"이라고 부른다.
스프링 부트는 이를 통해 객체의 생명주기와 의존성 주입을 관리하며, 유연하고 모듈화된 애플리케이션 개발을 지원한다.

스프링 부트에서 Bean의 특징

  • 의존성 주입과 관리

스프링 컨테이너는 bean을 생성하고 의존성을 주입하는 역할을 한다.
이는 코드의 결합도를 낮추고 유연한 구조를 가능하게 한다.
@Autowired 어노테이션을 사용하여 필요한 bean을 주입받을 수 있다.

  • 라이프사이클 관리

스프링 컨테이너는 bean의 생명주기를 관리한다.
bean의 초기화와 소멸 과정을 제어할 수 있다.

  • 스코프 관리

스프링은 다양한 스코프(scope)를 제공하여 bean의 생명주기와 범위를 설정할 수 있다.
예를 들어, 싱글톤, 프로토타입, 요청(request), 세션(session) 등의 스코프가 있다.

  • 외부 설정 관리

스프링 부트는 @ConfigurationProperties 어노테이션을 사용하여 외부 설정 파일(properties 또는 YAML 파일)에서 bean의 속성을 설정하고 관리할 수 있다.

스프링 부트(Spring Boot)

스프링 프레임워크(Spring Framework) 기반의 자바 애플리케이션을 빠르고 쉽게 개발할 수 있도록 도와주는 프레임워크.
스프링 부트는 설정을 최소화하고 개발자가 코드 작성에만 집중할 수 있도록 다양한 기능을 제공한다.
스프링 부트를 사용하면 설정과 반복 작업에 대한 부담을 줄이고, 비즈니스 로직 구현에 더 많은 시간을 할애할 수 있다.

주요 특징

1. 자동 설정(Auto Configuration)

스프링 부트는 애플리케이션에 필요한 빈(Bean)들을 자동으로 설정한다.
이를 통해 개발자는 설정 파일(XML 또는 자바 설정 클래스) 작성의 부담을 덜 수 있다.

2. 독립 실행 가능

스프링 부트 애플리케이션은 내장된 웹 서버(Tomcat, Jetty 등)를 포함하고 있어 별도의 웹 서버를 설치할 필요 없이 독립적으로 실행할 수 있다.

3. 스타터 패키지

다양한 기능을 손쉽게 추가할 수 있는 스타터 패키지를 제공한다.
예를 들어, spring-boot-starter-web는 웹 애플리케이션 개발에 필요한 모든 의존성을 포함한다.

4. 스프링 부트 CLI

스프링 부트 명령줄 인터페이스(CLI)를 사용하면 간단한 스크립트를 통해 스프링 부트 애플리케이션을 빠르게 만들고 실행할 수 있다.

5. 프로덕션 준비 기능

내장된 애플리케이션 모니터링, 관리, 로깅 등의 기능을 통해 프로덕션 환경에서도 안정적으로 애플리케이션을 운영할 수 있다.

스프링 부트 애플리케이션 구조

스프링 부트 애플리케이션의 기본적인 구조는 다음과 같다.

메인 클래스

애플리케이션을 시작하는 진입점.
보통 @SpringBootApplication 어노테이션을 사용하여 설정한다.

설정 파일

application.properties 또는 application.yml 파일을 사용하여 애플리케이션 설정을 관리한다.

컨트롤러

요청을 처리하고 응답을 반환하는 역할을 한다.

스프링 부트의 장점

  • 싱글톤 패턴

스프링은 기본적으로 빈을 싱글톤(Singleton) 스코프로 관리한다.
이는 애플리케이션 컨텍스트(Application Context) 내에서 한 번 생성된 빈이 재사용됨을 의미한다. 이를 통해 메모리 사용을 효율화하고, 빈 생성 비용을 줄인다.

*싱글톤(Singleton)은 소프트웨어 디자인 패턴 중 하나로, 특정 클래스에 대해 인스턴스가 단 하나만 생성되도록 보장하는 패턴이다. 싱글톤 패턴을 사용하는 주요 목적은 애플리케이션 전체에서 하나의 인스턴스를 공유하여 자원의 낭비를 방지하고, 인스턴스 간의 상태를 일관되게 유지하는 것이다.

  • 의존성 관리와 결합도 감소

스프링의 의존성 주입(Dependency Injection) 메커니즘을 통해 클래스 간의 의존성을 줄이고 결합도를 낮출 수 있다.
이를 통해 애플리케이션의 유지보수성과 확장성이 향상된다.
또한, 스프링 부트는 스타터 의존성을 통해 필요한 라이브러리들을 쉽게 추가하고 관리할 수 있게 도와준다.

  • 제어의 역전(Inversion of Control, IoC)

스프링의 IoC 컨테이너는 객체의 생성과 생명주기를 관리한다.
개발자는 객체의 생성, 초기화, 소멸 등을 직접 관리할 필요가 없으며, 이를 스프링 컨테이너에 위임할 수 있다.
이는 코드의 간결함과 모듈화를 높여준다.

  • 자동 구성(Auto Configuration)

스프링 부트는 다양한 자동 구성 기능을 통해 개발자가 직접 설정해야 하는 부분을 최소화한다.
예를 들어, 데이터베이스 연결, JPA 설정, 웹 서버 설정 등 많은 부분을 자동으로 구성하여 빠른 개발을 도와준다.

스프링 부트의 단점

  • 자동 설정의 복잡성

자동 설정 기능은 개발을 쉽게 하지만, 때로는 설정이 어떻게 이루어졌는지 알기 어려울 수 있다.
이는 디버깅을 복잡하게 만들 수 있다.

  • 메모리 사용량 증가

스프링 부트는 다양한 라이브러리를 포함하므로, 기본 메모리 사용량이 다소 높을 수 있다.
이는 리소스가 제한된 환경에서 문제를 일으킬 수 있다.

  • 스타터 의존성의 무거움

스타터 의존성은 편리하지만, 필요하지 않은 라이브러리들이 함께 포함될 수 있다.
이는 애플리케이션 크기와 시작 시간을 증가시킬 수 있다.

  • 초기 설정의 제어 부족

자동 설정이 모든 상황에 적합하지 않을 수 있으며, 특정 요구 사항에 맞게 세밀하게 조정하는 것이 어려울 수 있다.
개발자가 설정을 세부적으로 제어하려면 자동 설정을 부분적으로 비활성화하고 수동 설정을 추가해야 할 수 있다.

application.properties

스프링 부트에서는 application.properties 파일을 사용하여 애플리케이션의 설정을 관리할 수 있다.
이 파일은 자바 프로퍼티 파일 형식으로 작성되며, 애플리케이션의 다양한 설정을 지정할 수 있다. 주로 데이터베이스 연결 정보, 포트 설정, 외부 API 키 등의 설정을 여기에 기술한다.

Ex)

spring.application.name=app01

//server port
server.port = 8081

//DB driver
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521/xe
spring.datasource.username=C##FINAL
spring.datasource.password=1234

//mybatis
# config
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.jdbc-type-for-null=NULL

//jsp
# view resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

build.gradle

build.gradle 파일은 Gradle 빌드 스크립트 파일로, 프로젝트의 빌드 설정, 의존성 관리, 플러그인 설정 등을 정의한다.
이 파일을 통해 프로젝트를 빌드하고 패키징하며, 테스트 실행 등을 관리할 수 있다.

dependencies

Gradle에서 dependencies 블록을 사용하여 프로젝트의 의존성을 관리한다.
이 블록은 프로젝트가 사용할 외부 라이브러리나 모듈의 종속성을 정의하며, 이를 통해 Gradle은 필요한 라이브러리를 자동으로 다운로드하고 클래스패스에 추가힌다.

Ex)

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

실행 순서

스프링 부트 애플리케이션의 기본적인 실행 순서는 다음과 같다

  • 의존성 정의 : build.gradle 또는 pom.xml 파일에 필요한 스프링 부트 및 외부 라이브러리 의존성을 정의한다.

  • 메인 애플리케이션 클래스 생성 : @SpringBootApplication 애노테이션이 붙은 메인 애플리케이션 클래스를 생성한다.

  • 내장 서버 실행 : 스프링 부트는 내장된 서블릿 컨테이너를 사용하여 애플리케이션을 실행한다. 이 과정에서 application.properties 또는 application.yml 파일에 설정된 내용을 기반으로 애플리케이션을 구성한다.

  • 애플리케이션 실행 및 서비스 제공 : 내장 서버가 시작되면 설정된 포트 번호로 서비스가 제공되며, 클라이언트의 요청에 따라 처리한다.

개인 노트

*웹서버 서블릿 응답과정

스프링 부트는 앞서 설명한 어노테이션 기반 설정, 스타터 패키지, 내장 서버 등을 통해 위 과정에서 반복 작업을 자동화하고 간소화해준다.
이를 통해 개발자는 비즈니스 로직에 더 집중할 수 있게 된다.

스프링 부트를 공부할 때 어노테이션을 집중적으로 다루려고 한다.
스프링 부트는 많은 기능을 어노테이션을 통해 제공하며, 이러한 어노테이션을 이해하는 것은 스프링 부트 애플리케이션 개발에 있어 핵심적이기 때문이다.

profile
eggs before hatching

0개의 댓글