본문 바로가기
Spring/스프링 부트 핵심 가이드

[Spring] Ch.1 스프링 부트란?

by ♡˖GYURI˖♡ 2024. 3. 24.
728x90

제로베이스에서 진행하는 북 스터디 첫 번째 책, 스프링 부트 핵심 가이드!

깃허브에 관련 코드를 전부 올려줘서 너무 편하다...

 

GitHub - wikibook/springboot: 《스프링 부트 핵심 가이드》 예제 코드

《스프링 부트 핵심 가이드》 예제 코드. Contribute to wikibook/springboot development by creating an account on GitHub.

github.com

 

 

1.1 스프링 프레임워크

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

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

 

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

 

 

1.1.1 제어 역전(IoC)

일바적인 자바 개발의 경우 아래와 같은 코드를 사용함

package com.wikibooks.chapter1.controller;

import com.wikibooks.chapter1.service.MyService;
import com.wikibooks.chapter1.service.MyServiceImpl;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class NoDIController {

    private MyService service = new MyServiceImpl();

    @GetMapping("/no-di/hello")
    public String getHello() {
        return service.getHello();
    }

}

 

위 코드는 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용함

즉 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조

 

하지만 제어 역전을 적용한 환경에서는 사용자가 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임함

여기서 '외부'는 스프링 컨테이너 or IoC 컨테이너를 의미

 

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

 

 

1.1.2 의존성 주입(DI)

제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식

스프링에서는 @Autowired라는 어노테이션을 통해 의존성을 주입할 수 있음

 

 

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

  • 생성자를 통한 의존성 주입
package com.wikibooks.chapter1.controller;

import com.wikibooks.chapter1.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DIController {

    MyService myService;

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

    @GetMapping("/di/hello")
    public String getHello() {
        return myService.getHello();
    }

}

 

  • 필드 객체 선언을 통한 의존성 주입
package com.wikibooks.chapter1.controller;

import com.wikibooks.chapter1.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FieldInjectionController {

    @Autowired
    private MyService myService;

}

 

  • setter 메서드를 통한 의존성 주입
package com.wikibooks.chapter1.controller;

import com.wikibooks.chapter1.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class SetterInjectionController {

        MyService myService;

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

    }

 

스프링 공식문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식

다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문

 

→ 이 부분은 이유가 궁금해서 이전에 정리해두었던 의존관계 주입 글을 다시 보았다.

 

[스터디] 의존관계 주입(DI : Dependency Injection)

최근 김영한님의 Spring 핵심 원리 - 기본편 강의를 듣고 있는데 DI라는 단어가 자주 나왔다. 도대체 DI가 정확히 뭘까? 이번 기회에 한 번 알아보겠다. 의존관계란? "A가 B를 의존한다."라는 표현은

newbie-in-softengineering.tistory.com

결론만 말하자면 나머지 방법은 불필요하게 수정의 가능성을 열어두기 때문에 권장되지 않으며, 생성자를 통한 DI는 변경의 가능성을 배제하고 불변성을 보장할 수 있기에 권장되는 것 같다.

 

 

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

스프링의 아주 중요한 특징 중 하나로, 관점을 기준으로 묶어 개발하는 방식

여기서 관점이란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미

 

핵심기능 : 비즈니스 로직이 처리하려는 목적 기능

부가 기능 : e.g. 비즈니스 로직 사이의 로깅 처리나 트랜잭션을 처리하는 코드

 

 

OOP 방식의 애플리케이션 로직

상품 정보 등록과 상품 정보 조회는 동일한 기능을 수행할 확률이 높기 때문에 핵심 기능을 구현한 두 로직에 동일한 코드가 포함되어있음

 

 

AOP 방식의 애플리케이션 로직

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

 

 

AOP를 구현하는 방법 3가지

  • 컴파일 과정에 삽입하는 방식
  • 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식
  • 프락시 패턴을 이용하는 방식

이 중 스프링은 프락시 패턴을 통해 AOP 기능을 제공하고 있음

 

스프링 AOP의 목적은 OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와주는 것

 

 

1.1.4 스프링 프레임워크의 다양한 모듈

스프링 프레임워크는 기능별로 구분된 약 20여 개의 모듈로 구성되어 있음

스프링 공식 문서에서 제공하는 다이어그램

 

모든 모듈을 사용할 필요는 없으며, 애플리케이션 개발에 필요한 모듈만 선택해서 사용하게끔 설계되어 있음 = 경량 컨테이너 설계

 

 

1.2 스프링 프레임워크 vs. 스프링 부트

스프링 프레임워크는 기능이 많은 만큼 설정이 복잡함 

→ 이를 해결하기 위해 등장한 것이 스프링 부트

 

스프링 부트를 이용하면 단독으로 실행 가능한 상용 수준의 스프링 기반 애플리케이션을 손쉽게 만들 수 있습니다.
- 스프링 부트 공식 사이트

 

즉, 별도의 복잡한 설정을 하지 않아도 스프링 부트를 사용하면 개발이 쉬워진다는 뜻

 

 

1.2.1 의존성 관리

스프링 프레임워크

  • 개발에 필요한 각 모듈의 의존성을 직접 설정해야 함
  • 호환되는 버전을 명시해야 정상 동작함
  • 애플리케이션에서 사용하는 스프링 프레임워크나 라이브러리의 버전을 올리는 상황에서 연관된 다른 라이브러리의 버전까지도 고려해야 함

 

스프링 부트

'spring-boot-start'라는 의존성을 제공

  • 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합 제공
  • 라이브러리 호환 문제 해결

 

자주 사용되는 spring-boot-start 라이브러리

  • spring-boot-starter-web : 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성, 기본적으로 내장 톰캣이 포함되어 있어 jar 형식으로 실행 가능
  • spring-boot-start-test : JUnit, Jupiter, Mockito 등의 테스트용 라이브러리 포함
  • spring-boot-starter-jdbc : HikariCP 커넥션 풀을 활용한 JDBC 기능 제공
  • spring-boot-starter-security : 스프링 시큐리티(인증, 권한, 인가 등) 기능 제공
  • spring-boot-starter-data-jpa : 하이버네이트를 활용한 JPA 기능 제공
  • spring-boot-starter-cache : 스프링 프레임워크의 캐시 기능 제공

+ 'spring-boot-start'의 여러 라이브러리를 함께 사용할 때는 의존성이 겹칠 수 있고 이로 인해 버전 충돌이 발생할 수 있는데, 의존성 조합 충돌 문제가 없도록 'spring-boot-starter-parent'가 검증된 조합을 제공함

 

 

1.2.2 자동 설정

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

즉, 애플리케이션을 깨발하는 데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해줌

e.g. @SpringBootApplication 어노테이션

 

 

1.2.3 내장 WAS

웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-start-web'의 경우 위에서 나왔듯 톰캣을 내장하기에 특별한 설정 없이도 톰캣을 실행할 수 있음

 

 

1.2.4 모니터링

스프링 부트 액추에이터라는 자체 모니터링 도구 포함

 

 

 

 

 

 

 

+ 예전에 정리해두었던 IoC 글도 첨부!

 

[스터디] IoC : 제어의 역전

저번 스터디에서 DI에 대해 발표했었다. 그것과 연결하여 이번에는 IoC에 대해 알아보았다. [스터디] 의존관계 주입(DI : Dependency Injection) 최근 김영한님의 Spring 핵심 원리 - 기본편 강의를 듣고 있

newbie-in-softengineering.tistory.com