반응형
스프링이란?
💡 Spring은 자바 프로그래밍을 모든 사람들에게 더 빠르고, 더 쉽고, 더 안전하게 만들어줍니다. Spring은 속도, 단순성, 그리고 생산성에 집중한 자바를 세계에서 가장 인기 있는 프레임워크로 만들었습니다.
- 스프링은 여러 프로젝트를 포함한 프레임워크로, 객체지향 어플리케이션을 개발할 수 있도록 도와주는 프레임 워크입니다.
- 스프링은 DI와 DI Container, AOP, Web MVC등을 지원해 객체지향적인 어플리케이션을 개발하도록 도와줍니다.
DI란?
- DI는 Dependency Injection의 약자로, 특정 객체의 생명주기를 관리하고 의존성을 주입시켜주는 역할을 합니다.
- Spring에서는 이러한 DI를 소스코드가 아닌 외부 파일(.xml 등)을 통해 정의해주어야 했습니다.
Spring의 문제점
- 기존의 스프링 생태계가 커짐에 따라 스프링의 기능이 많아지고, 이에 수많은 라이브러리를 함께 사용해야해 프로젝트를 시작할 때 필요한 설정이 점점 늘어났습니다.
- 이렇게 라이브러리를 직접 관리해주어야 하는 문제는 라이브러리간 충돌이나 버젼 충돌 문제가 발생했습니다.
- 또한 라이브러리를 사용하기 위해서 개발자가 직접 빈을 일일히 등록해주어야 하는 문제도 존재했습니다.
Spring Boot란?
- Spring Boot는 스프링 어플리케이션의 불편한 점을 보완하는 프레임워크로 개발을 위한 복잡한 설정을 해결하고 스프링 어플리케이션을 쉽고 빠르게 시작하기 위해 제공되기 시작했습니다.
- 스프링 부트에서 제공하는 기능은 다음과 같습니다.
- WAS 제공
- Tomcat, Jetty 등의 웹서버를 내장해서 별도의 웹 서버 프로그램 설치 없이 단순한 실행만으로 웹 서버를 제공합니다.
- 라이브러리 관리
- Starter Dependency를 제공해 특정 프로젝트를 진행하기 위한 라이브러리를 자동으로 관리합니다.
- 자동 구성
- 프로젝트에 기본적으로 필요한 빈을 자동으로 등록해줍니다.
- 외부 설정
- 환경에 따라 달라지는 외부 설정을 공통화하여 환경에 따라 구분해서 제공합니다.
- 프로덕션 준비
- 모니터링을 위한 메트릭, 상태 확인 기능을 제공합니다.
장점 1 : WAS 제공
- 전통적인 방법은 Java파일을 빌드한 war 파일을 Tomcat과 같은 WAS에 전달해서 배포하는 식으로 동작합니다.
- 최근에는 Spring Boot에 톰캣을 라이브러리 형태로 제공해서, 개발자는 main() 메서드만 실행해 서버를 실행할 수 있습니다.
public class EmbedTomcatServletMain {
public static void main(String[] args) throws LifecycleException {
//톰캣 설정
Tomcat tomcat = new Tomcat();
Connector connector = new Connector();
connector.setPort(8080);
tomcat.setConnector(connector);
//서블릿 등록
Context context = tomcat.addContext("", "/");
tomcat.addServlet("", "helloServlet", new HelloServlet());
context.addServletMappingDecoded("/hello-servlet", "helloServlet");
tomcat.start();
}
}
장점 2 : 라이브러리 관리
- 프로젝트 초기에는 라이브러리를 수동으로 등록해 주어야 했습니다. 이러한 문제는 라이브러리 충돌 및 버젼 관리에 어려움이 있었습니다.
- 이에 대해 스프링 부트는 Starter Dependency를 제공해 특정 기능에 대해 필요한 라이브러리를 묶어서 관리해 제공해주며, build.gradle에 라이브러리 버젼을 생략하면 스프링 부트가 자동으로 버젼을 관리하는 기능도 제공해줍니다.
- 자동 버젼 관리를 사용하려면 build.gradle에 아래와 같이 한줄만 추가하면 됩니다.
plugins { id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' }
- 물론 다해주는 건 아니고, 아래 사이트에 존재하는 거만 제공하고 없는건 직접 적어줘야 합니다. Managed Dependency Coordinates :: Spring Boot
- Starter Dependecy는 아래와 같이 라이브러리 추가하듯 추가하면 되고, 그러면 안에 해당 기능을 개발할 때 필요한 라이브러리를 알아서 불러옵니다.
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' }
장점 3. 자동 구성
- Spring Boot는 Auto Configuration이라는 기능을 제공합니다. 이러한 기능은 반복적으로 빈을 설정하고 등록하는 부분을 줄여줍니다.
- AutoConfiguration은 Spring-Boot-Starter에 spring-boot-autoconfigure 라이브러리가 도와주며, 여기서 XXXAutoConfiguration.class 같은 파일들이 있어서, 사용자가 특정 빈을 등록하지 않은 경우 위 클래스에서 정의한 기본 빈을 주입하게 됩니다.
- Spring Boot로 생성한 Spring App은 메인 메서드에 @SpringBootApplication 이 존재하는데, 이 어노테이션에는 @ComponentScan과 @EnableAutoConfiguration , @SpringBootConfiguration이 포함되어 있습니다.
- 이중에 @EnableAutoConfiguration을 통해 스프링에서 자주 사용되는 빈을 등록합니다.
- ImportSelector는 @EnableAutoConfiguration에 Import되어 사용되며, 스프링에서 동적으로 설정 정보를 등록하도록 제공하는 인터페이스입니다.
- public class HelloImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"hello.selector.HelloConfig"}; } }
- 위와같이 문자열로 Import할 Config 클래스를 지정해서 넘겨줄수 있는데, 여기서 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports의 값을 읽어서 빈으로 등록합니다.
- 만약 내가 라이브러리를 개발하는 개발자이고, 내가 만든 라이브러리가 스프링 부트의 자동 구성으로 등록되도록 하고 싶으면, 아래와 같이 할 수 있습니다.
@AutoConfiguration
@ConditionalOnProperty(name = "memory", havingValue = "on")
public class MemoryAutoConfig {
@Bean
public MemoryController memoryController() {
return new MemoryController(memoryFinder());
}
@Bean
public MemoryFinder memoryFinder() {
return new MemoryFinder();
}
}
- @AutoConfiguration을 사용해 어노테이션을 등록하고, 자동 구성 대상 src/main/resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports 에 작성해 주어야 합니다.
package.자동구성하려는Config클래스명
장점 4 : 외부 설정
- 하나의 어플리케이션에 대해 다른 설정값을 사용해야 하는 경우가 있습니다. 이러한 경우에 설정값에 따라 여러 jar파일을 생성하는 방법도 있지만, Spring Boot에서는 jar파일에 설정값을 두지 않고 실행 시 외부 설정 값을 주입하도록 지원합니다.
- 외부 설정에는 OS환경변수, JVM 환경 변수(시스템 속성), command line argument, 외부 파일이 있으며 스프링은 이렇게 다양한 설정 값을 하나의 인터페이스에 통합해 관리해줍니다.
- 스프링에서는 Environment 인터페이스를 제공하며, 이 Enviroment 구현체에는 PropertySource를 연결해 두어 사용합니다. PropertySource는 위에서 말한 4가지 외부 설정 방법에 대해 값을 제공해주는 추상 클래스입니다.
- Environment말고도 @Value 와 @ConfigurationProperties 로도 읽을 수 있도록 지원합니다.
참고
반응형
'Spring' 카테고리의 다른 글
스프링의 핵심, IoC/DI, AOP, PSA - IoC/DI 편 (0) | 2024.11.26 |
---|---|
Spring + ELK로 로그 시스템 구축하기 (2) | 2024.11.16 |
락을 활용한 동시성 처리 (0) | 2024.11.15 |
War와 Jar (0) | 2024.11.15 |
낙관적 락과 비관적 락, 그리고 Redis를 활용한 Lock (1) | 2024.11.15 |