
: 스프링 부트를 활용한 애플리케이션 개발 실무
📝 목차
1장. 스프링부트란?
1-1. 스프링 프레임워크
- 제어 역전 (IoC)
- 의존성 주입 (DI)
- 관점 지향 프로그래밍 (AOP)
- 스프링 프레임워크의 다양한 모듈
1-2. 스프링 프레임워크 vs 스프링 부트
- 의존성 관리
- 자동 설정
- 내장 WAS
- 모니터링
자바 기반의 애플리케이션 프레임 워크
목적에 따라 다양한 프로젝트를 제공 ➡️ 그 중 하나가 스프링 부트(Spring Boot)
자바에서 가장 많이 사용하는 프레임워크
현재 우리나라의 전자정부 표준 프레임워크의 기반 기술로 채택
: 객체의 관리를 컨테이너에게 맡겨 제어권이 넘어간 것
사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임
❓외부 = 스프링 컨테이너, IoC 컨테이너
제어 역전을 통해 의존성 주입 & 관점 지향 프로그래밍 등이 가능해진다.
일반적인 자바 개발
: 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조
⬇️ 일반적인 자바 코드에서 객체 사용법
@RestController
public class NoDIController {
private MyService service = new MyServiceImple();
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
: 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
(제어 역전의 방법 중 하나)
스프링에서 의존성을 주입받는 방법 3가지
1. 생성자
2. 필드 객체 선언
3. setter 메서드
@Autowired라는 어노테이션(annotation)을 통해 의존성을 주입
스프링 4.3이후 버전은 @Autowired 어노테이션 생략 가능
⭐ 스프링 공식 문서에서 권장하는 의존성 주입 방법 ⭐
= 생성자를 통해 의존성을 주입받는 방식
생성자를 통해 의존성을 주입하는 방식을 추천하는 이유?
래퍼런스 객체 없이는 객체를 초기화 할 수 없게 설계 할 수 있기 때문
⬇️ 생성자를 통한 의존성 주입
@RestController
public class DIController {
MyService myService;
@Autowired
public DIController(MyService mysService) {
this.myService = myService;
}
@GetMapping("/di/hello")
public String getHello() {
return myService.getHello();
}
}
⬇️ 필드 객체 선언을 통한 의존성 주입
@RestController
public class FieldInjectionController {
@Autowired
private MyService myService;
}
⬇️ setter 메서드를 통한 의존성 주입
@RestController
public class SetterInjectionController {
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
: 관점을 기준으로 묶어 개발하는 방식
관점 지향 프로그래밍(AOP)의 목적
: 모듈화해서 재사용 가능한 구성을 만드는 것
!= 객체지향 프로그래밍 (OOP; Object-Oriented Programming)
⭐ AOP는 OOP를 더욱 잘 사용하도록 돕는 개념으로 이해하기 ⭐
관점(aspect)?
어떤 기능을 구현할 때, 그 기능을 핵심 기능과 부가 기능으로 구분해
각각을 하나의 관점으로 보는 것
⬇️
핵심 기능
: 비즈니스 로직이 처리하려는 목적 기능
예를 들어, 클라이언트로부터 상품 정보 등록 요청을 받아 DB에 저장하고 상품 정보를 조회하는 로직을 구현한다면,
1. 상품 정보를 DB에 저장하는 코드
2. 저장된 상품 정보 데이터를 보여주는 코드
⬇️
실제 애플리케이션을 개발 할 때,
핵심 기능 + 부가 기능을 추가해야하는 상황이 발생
핵심 기능인 비즈니스 로직 사이에
로깅 처리를 하거나 트랜잭션을 처리하는 코드 == 부가 기능
OOP방식의 애플리케이션 로직

AOP방식의 애플리케이션 로직
반복되는 부가기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입 ⬇️

AOP를 구현하는 방법
기능별로 구분된 약 20여개의 모듈로 구성
경량 컨테이너 설계
: 개발에 필요한 모듈만 선택해서 사용하게 설계

<스프링 프레임 워크의 단점>
기능이 많은 만큼 설정이 복잡
필요한 모듈들을 추가하다 보면 설정이 복잡해지는 문제 발생
⬇️
스프링 부트(Spring Boot)
: 별도의 복잡한 설정을 하지 않아도 된다.
'spring-boot-starter' 라는 의존성 제공 (의존성은 여러 종류가 있다)
각 라이브러리의 기능과 관련해서 자주 사용
서로 호환되는 버전의 모듈 조합을 제공 (라이브러리 호환 문제 해결)
많이 사용되는 spring-boot-starter 라이브러리 ⬇️
- spring-boot-starter-web
: 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성,
기본으로 내장 톰캣이 포함돼 있어 jar 형식으로 실행 가능
- spring-boot-starter-test
: JUnit Jupiter, Mockito 등의 테스트용 라이브러리를 포함
- spring-boot-jdbc
: HikariCP 커넥션 풀을 활용한 JDBC 기능을 제공
- spring-boot-starter-security
: 스프링 시큐리티(인증, 권한, 인가 등) 기능을 제공
- spring-boot-starter-data-jpa
: 하이버네이트를 활용한 JPA 기능을 제공
- spring-boot-starter-cache
: 스프링 프레임워크의 캐시 기능을 지원
- spring-boot-starter-parent
: 의존성 조합 충돌 문제가 없도록 검증된 조합을 제공
: 개발하는 데 필요한 의존성을 추가 ➡️ 프레임워크가 자동으로 관리
ex. @SpringBootApplication 여러 어노테이션을 합쳐놓은 인터페이스
= @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
스프링 부트 애플리케이션 실행
⬇️
@ComponentScan 어노테이션이
@Component 어노테이션이 붙은 class를 발견해 Bean을 등록
⬇️
@EnableAutoConfiguration 어노테이션을 통해 조건 충족 시 자동 반영
: spring-boot-starter-web = 톰캣 내장
스프링 부트의 자동 설정 기능은 톰캣에도 적용
⬇️
특별한 설정 없이도 톰캣 실행 가능
: 스프링 부트 액추에이터(Spring Boot Actuator)라는 자체 모니터링 도구 존재
스프링 프레임 워크 설명 중,
자바 기반의 애플리케이션 프레임 워크로 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공
엔터프라이즈급 개발?
기업 환경을 대상으로 하는 개발
대규모 데이터를 처리하는 환경 = 엔터프라이즈 환경
: 각 기능을 재사용 가능한 개별 객체로 구성해 프로그래밍 하는 것
: 개발이 끝나고 서비스를 운영할 때, 시스템이 사용하는 주요 요소들을 모니터링 (스레드, 메모리, 세션)
자체 모니터링 도구 = 스프링 부트 액추에이터