반응형
1. 스프링 프레임워크
- 자바(Java) 기반 애플리케이션 프레임워크로, 엔터프라이즈급(기업 환경 대상 개발) 애플리케이션을 위한 다양한 기능 제공
-> 오픈소스 경량급 애플리케이션 프레임워크로 불림(자바로 애플리케이션을 개발하는 데 필요한 기능을 쉽게 사용) - 한국 전자정부 표준 프레임워크 기반 기술로 채택되어, 공공기관 웹 서비스를 개발할 때 사용
1) 제어 역전(IoC: Inversion of Conmtrol)
- 객체를 생성하고 사용하는 작업을 개발자가 직접 제어하지 않고,
객체의 생명주기 관리를 외부(스프링 컨테이너 or IoC 컨테이너)에 위임하여 컨테이너에 제어권이 넘어간 것 - 이를 통해 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 등이 가능해짐
2) 의존성 주입(DI: Dependency Injection)
- 제어 역전(IoC) 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용
- 생성자/필드 객체 선언/setter 메서드 앞에 @Autowired 어노테이션(annotation)을 붙여 의존성 주입 가능
-> 공식 문서에서는 생성자를 통해 의존성을 주입받는 방식 권장(레퍼런스 객체 없이 객체 초기화가 불가능하도록 설계)
// 생성자를 통해 의존성 주입
@RestController
public class DIController {
MyService myService;
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
}
3) 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming)
- 관점(aspect)을 기준으로 묶어 개발하는 방식
- 관점: 기능 구현 시 해당 기능을 '핵심 기능'과 '부가 기능'으로 구분하여 각각을 한 관점으로 보는 것
-> 부가 기능은 핵심 기능과 관계없이 로직이 수행되기 전/후에 수행되기만 하면 됨
- 관점: 기능 구현 시 해당 기능을 '핵심 기능'과 '부가 기능'으로 구분하여 각각을 한 관점으로 보는 것
- 비즈니스 로직에서 반복되는 부가 기능을 한 공통 로직으로 처리하도록 모듈화해 삽입하는 방식
-> 객체를 모듈화해서 재사용 가능한 구성을 만드는 것이 목적 - 스프링에서는 디자인 패턴 중 하나인 프락시 패턴을 통해 제공
- OOP(Object-Oriented Programming/객체 지향 프로그래밍)를 더욱 잘 사용하도록 도움
- OOP 관련 포스팅
Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와
1. 객체의 특징객체(Object): 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중, 고유 속성을 가지고 있어 식별 가능한 것-> 속성과 동작[필드(Field)와 메서드(Method)]으로 구성되어 있음현실
keep-programming-study.tistory.com
4) 스프링 프레임워크의 다양한 모듈
- 스프링 공식 문서에서 약 20여 개의 모듈 확인 가능: https://docs.spring.io/spring-security/reference/modules.html
Project Modules and Dependencies :: Spring Security
This module contains core authentication and access-control classes and interfaces, remoting support, and basic provisioning APIs. It is required by any application that uses Spring Security. It supports standalone applications, remote clients, method (ser
docs.spring.io
- 애플리케이션 개발에 필요한 모듈만 선택해서 사용하게 끔 설계(경량 컨테이너 설계)
2. 스프링 프레임워크 vs 스프링 부트
- 스프링 프레임워크에서는 필요한 모듈들을 추가하다 보면 설정이 복잡해지는데, 이를 해결하기 위해 스프링 부트가 등장
1) 의존성 관리
- 스프링에서는 개발에 필요한 각 모듈의 의존성을 호환되는 버전까지 명시해야 함
-> 연관된 다른 라이브러리의 버전까지 고려해야 하는 문제 발생 - 스프링 부트에서는 'spring-boot-starter'라는 의존성을 통해,
각 라이브러리의 자주 사용하고 서로 호환되는 버전의 모듈 조합 제공
-> 라이브러리 호환 문제 해결- 많이 사용되는 라이브러리 모음
spring-boot-starter-web: 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성
-> 기본으로 톰캣(Tomcat)이 내장되어 있어 jar 형식으로 실행 가능
spring-boot-starter-test: JUnit/Jupiter/Mockito 등의 테스트용 라이브러리 포함
spring-boot-starter-jdbc: HikariCP 커넥션 풀을 활용한 JDBC 기능 제공
spring-boot-starter-security: 스프링 시큐리티(인증/권한/인가) 기능 제공
spring-boot-starter-data-jpa: 하이버네이트(Hibernate)를 활용한 JPA 기능 제공
spring-boot-starter-cache: 스프링 프레임워크의 캐시 기능 지원
2) 자동 설정(Auto Configuration)
- 스프링 프레임워크의 기능을 사용하기 위한 자동 설정을 스프링부트에서 지원
- 애플리케이션에 필요한 라이브러리(의존성)를 추가하면, 그를 실행하는 데 필요한 환경 설정을 프레임워크가 알아서 찾아줌
- Maven이나 Gradle 파일에 의존성을 추가한 프로젝트를 생성하면,
@SpringBootApplication 어노테이션이 붙은 클래스가 기본적으로 생성
-> DispatcherServlet, Tomcat, RequestMapping등이 자동 설정되어 별도의 설정 없이 웹 서버가 실행 - 내부적으로 spring-boot-autoconfigure.jar에 포함된 설정 클래스들을 참조하며,
@ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty 등의 조건을 기반으로 설정 여부를 판단
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
// 자동으로 DataSource Bean을 생성
}
// 특정 자동 설정 클래스를 제외하고 싶을 때 exclude 속성을 사용
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
*윈도우 환경에 경우, cmd(명령 프롬프트)에서 다음 명령을 입력하면 적용된 자동 설정 확인 가능
java -jar myapp[애플리케이션 이름].jar --debug
3) 내장 WAS(Web Application Server)
- 스프링 부트의 각 웹 애플리케이션에 존재
- 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-starter-web'의 경우 톰캣을 기본으로 내장
-> 필요에 따라, 톰캣 외의 다른 웹 서버(Jetty, Undertow 등)로 변경 가능
4) 모니터링
개발이 끝나고 서비스 운영 시, 해당 시스템이 사용하는 스레드/메모리/세션 등의 주요 요서들을 모니터링해야 함
-> 스프링 부트에는 스프링 부트 액추에이터(Spring Boot Actuator)라는 자체 모니터링 도구로 관리
반응형