이 글은 스프링 부트 핵심 가이드(장정우 저)를 읽고 개인적으로 정리하기 위한 글입니다.

 

스프링 프레임워크(Spring framework)

자바 기반의 애플리케이션 프레임 워크로 엔터프라이즈급(기업 환경을 대상으로 하는 개발) 애플리케이션을
개발하기 위한 다양한 기능을 제공한다.

쉽게 얘기해 자바로 애플리케이션을 개발하는데 필요한 기능을 제공하고 쉽게 사용하도록 돕는 도구

 

스프링 부트

스프링은 목적에 따라 다양한 프로젝트를 제공하는데, 그 중 하나가 스프링 부트(Spring Boot)이다

 

스프링의 핵심 가치

애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는것

 

제어 역전(IoC)

객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해
의존성 주입(DI : Dependency Injection), 관점 지향 프로그래밍(AOP : Aspect-Oriented Programing) 등이 가능 해진다.

의존성 주입(DI : Dependency Injection)

  • 제어 역전의 방법 중 하나
  • 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
  • @Autowired 라는 어노테이션을  통해 의존성을 주입할 수 있음
  • 스프링 4.3 이후 버전은 생략도 가능 but 처음 스프링을 다룰 때는 가독성을 위해 어노테이션 명시 권장

스프링에서 의존성을 주입받는 3가지 방법

  1. 생성자를 통한 의존성 주입 -> 스프링에서 공식적으로 권장하는 방식
  2. 필드 객체 선언을 통한 의존성 주입
  3. setter 메서드를 통한 의존성 주입
생성자를 통한 의존성 주입
@RestController
public class DIController {

    MyService myService;

    @Autowired
    public DIController(MyService myService) {
        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 : Aspect-Oriented Programing)

  • 관점을 기준으로 묶어 개발하는 방식
  • 관점 : 어떤 기능을 구현할 때 그 기능을 핵심 기능부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미
    • 핵심 기능 : 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능
                         ex)클라이언트로부터 상품 정보 등록 요청을 받아 데이터베이스에 저장하고, 그 상품 정보를
                              조회하는 비즈니스 로직을 구현한다면
                              (1) 상품 정보를 데이터베이스에 저장하고,
                              (2) 저장된 상품 정보 데이터를 보여주는 코드가 핵심 기능
    • 부가 기능 : ex) 로깅 처리, 트랜잭션 처리하려는 코드
  • AOP 구현 방법
    • 컴파일 과정에 삽입하는 방식
    • 바이트 코드를 메모리에 로듷는 과정에서 삽입하는 방식
    • 프락시 패턴을 이용한 방식
  • AOP는 모듈화해서 재사용 가능한 구성을 만들어 결론적으로 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와준다.

이미지 출처 : https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F4E5475C722F6C09

스프링 vs 스프링 부트

  • 스프링은 모듈 추가 시 설정이 복잡하다.
  • 설정이 복잡해지는 문제를 해결하기 위해 등장한 것이 스프링 부트

스프링과 비교하여 스프링 부트가 가진 특징

  • 의존성 관리
    • 기존 스프링은 프레임워크나 라이브러리 버전을 올리는 상황에서 연관된 다른 라이브러리 버전까지도 고려해야 했다.
    • 부트에서는 spring-boot-starter 라는 의존성을 제공, 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공
    • 개발자는 라비르러리 호환 문제를 해결할 수 있다.
  • 자동 설정
    • 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원
    • 자동 설정은 애플리케이션에 추가된 라이브러리를 실행하는데 필요한 환경 설정을 알아서 찾아 준다.
  • 내장 WAS
    • 부트의 각 웹 어플리케이션에는 내장 WAS(Web Application Server)가 존재
    • spring-boot-starter-web 의 경우 톰캣을 내장
  • 모니터링
    • 개발이 끝나고 서비스를 운영하는 시기에는 해당 시스템이  사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링 해야한다,
    • 부트에는 스프링 부트 액추에이터(Spring Boot Actuator)라는 자체 모니터링 도구가 있다.

+ Recent posts