본문 바로가기
ZB 백엔드 스쿨/블로그 과제

스프링 핵심가이드) 북스터디 1주차 : 01장

by son_i 2023. 9. 24.
728x90

01 스프링 부트란 ?

- 스프링 : 자바 언어를 이용해 엔터프라이즈급 개발을 편리하게 만들어주는 '오픈소스 경량급 애플리케이션 프레임워크'

 

엔터프라이즈급 개발 ? ) 기업 환경을 대상으로 하는 개발

 


- 제어 역전(Inversion of Control) 

 : 객체 제어의 주체가 객체를 사용하는 클래스 자신이 아닌 외부에 있음.

자바에서처럼 클래스 내에 필요한 객체를 선언하고 new를 통해 의존성을 생성하는 방식이 아닌

Spring Container/ IoC Container가 객체의 의존성을 관리.

 

이런 제어 역전을 통해 의존성 주입(Dependency Injection), 관점 지향 프로그래밍 (AOP)가 가능해짐.

 


- 의존성 주입(DI)

 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용

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

  1. 생성자를 통한 의존성 주입

  2. 필드 객체 선언을 통한 의존성 주입

  3. setter 메서드를 통한 의존성 주입

 

스프링에서는 @Autowired를 이용해 의존성을 주입.

 1. 생성자를 통한 의존성 주입

@RestController
public class DIController {
	MyService myService;

	@Autowired
    public DIController(MyService myService) {
    	this.myService = myService;
    }
    
    @GetMapping("/di/hello")
    public String getHello() {
    	return myService.getHello();
    }

2. 필드 객체 선언을 통한 의존성 주입

@RestController
public class FieldInjectionController {
	@Autowired
    private MyService myService;
}

 3. setter 메서드를 통한 의존성 주입

@RestController
public class SetterInjectionController {

	MyService myService;
    
    @Autowired
    public void setMyService(MyService myService) {
    	this.myService = myService
    }
 }

 

스프링에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성 주입 받는 것.

 -> 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문에

 


- 관점지향 프로그래밍(AOP)

AOP는 OOP를 더욱 잘 사용하도록 돕는 개념.

(OOP는 SOLID를 잘 지키면서 프로그래밍 하는 것)

관점을 기준으로 묶어 개발하는 방식 의미

 

* 관점? ) 어떤 기능 구현시 그 기능을 핵심기능과 부가기능으로 구분해 각각을 하나의 관점으로 보는 것

 

  - 핵심기능 : 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능

  - 부가기능 : 핵심기능 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드들

       핵심기능이 어떤 기능인지와 무관하게 로직이 수행되기 전/ 후에 수행되기만 하면 됨.

 

=> 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식이 AOP

 

AOP를 구현하는 방법 3가지

1. 컴파일 과정에 삽입

2. 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식

3. 프락시 패턴을 이용

 

스프링은 3을 통해 AOP기능을 제공.

 

AOP의 목적 )

  OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만들어, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도움.

 


스프링 프레임워크 VS 스프링 부트

스프링에서 필요한 모듈들을 추가할 때 설정이 복잡해지는 문제를 해결하기 위해 등장한 것이 스프링부트

별도의 복잡한 설정을 하지 않아도 스프링 부트 사용시 개발이 쉬워짐.

 

스프링과 비교했을 때 스프링 부트가 가진 특징

1. 의존성 관리

스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성 직접 설정. + 호환 버전 명시

연관된 라이브러리의 버전까지도 고려

 

스프링부트에서는 spring-boot-starter라는 의존성을 제공하여 라이브러리 호환 문제를 해결할 수 있음.

 

2. 자동설정

스프링 부트는 스프링 프레임워크의 기능 사용을 위한 자동설정을 지원.

자동설정 : 애플리케이션에 추가된 라이브러리를 실행하는데 필요한 환경을 알아서 찾아줌.

=> 애플리케이션 개발에 필요한 의존성 추가하면 프레임워크가 이를 자동으로 관리해줌.

 

@SpringBootApplication 은 아래 세가지를 합쳐놓은 구성

  @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan

 

스프링 부트 어플리케이션 실행시

1. @ComponentScan이 @Component 시리즈 어노테이션이 붙은 클래스를 찾아 bean을 등록

2. @EnableAutoConfiguration을 통해 spring-boot-autoconfigure 패키지 안에 spring.factories 파일을 추가해 다양한 자동 설정이 일부 조건을 거쳐 적용됨.

  factories파일안에 Auto Configure 항목에 많은 자동 설정들이 정의되어있음.

  이 설정들은 각 파일에 설정된 @Conditional 조건을 충족할 경우 빈에 등록되고 애플리케이션에 자동 반영.

 

* Component 시리즈

  - @Controller 

  - @RestController

  - @Service

  - @Repository

  - @Configuration

 

3. 내장 WAS

스프링 부트의 각 웹 App에는 내장 WAS가 존재. 

웹 어플리케이션 개발 시 가장 기본이 되는 의존성인 spring-boot-starter-web의 경우 톰캣이 내장.

특별한 설정 없이도 톰캣이 실행

 

4. 모니터링

개발이 끝나고 서비스를 운영할 때 해당 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링 해야함.

스프링 부트에는 스프링 부트 액추에이터(Spring Boot Actuator)라는 자체 모니터링 도구가 있음. (11장에서 자세히)