북터디/스프링 부트 핵심 가이드

스프링 부트 핵심 가이드 1장 [스프링 부트란?]

vita12321 2023. 7. 24. 00:05
728x90
반응형

스프링 부트 핵심가이드 ( 부제 : 스프링 부트를 활용한 애플리케이션 개발 실무 ) - 장성우 지음

 

1장  스프링 부트란?

 

1.1  스프링 프레임워크

  • 자바(Java)를 위한 오픈소스 경량급 애플리케이션 프레임워크로 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공, 쉽게 사용할 수 있도록 돕는 도구.

1.1.1 제어역전(IoC, Inversion of Control)

  •  일반적인 자바 개발의 경우 객체를 사용하기 위해, 사용하려는 객체를 선언, 객체의 의존성 생성 후 객체에서 제공하는 기능 사용.
  •  제어 역전(IoC)을 적용한 환경에서는 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부(컨테이너)에 위임하며 이로 인해 의존성 주입(DI; Dependency Injection), 관점 지향 프로그래밍(AOP; Aspect-Oriented Programming) 등이 가능.또한 프로그래밍에서 실행 흐름 제어를 변경하는 설계 원칙으로 IoC는 객체 생성 및 연결을 외부 요소에 맡겨 결합도를 낮추고, 코드 유연성을 높인다.

1.1.2 의존성 주입(DI, Dependency Injection)

  • 의존성 주입(DI)이란 제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입 받아 사용하는 방식을 의미하며 이로 인해 코드 유지보수와 확장성이 향상.

 

  • 스프링에 의존성을 주입받는 3가지 방법
  1.  생성자를 통한 의존성 주입
  2. 필드 객체 선언을 통한 의존성 주입
  3. setter 메서드를 통한 의존성 주입
  •  @Autowired라는 어노테이션(annotation)을 통해 의존성을 주입가능. (4.3 이후 버전은 생성자를 통해 의존성을 주입할 때 @Autowired 생략 가능)
생성자를 통한 의존성 주입

@RestController
public class DIContoller {
    MyService myService;	

    
    @Autowired
    public DIContoller(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;
    }
}
  • 스프링 공식 문서에서 권장하는 의존성 주입 방법 

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


1.1.3 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)

  • AOP는 OOP를 더욱 잘 사용하도록 돕는 개념이다.
  • AOP는 관점을 기준으로 묶어 개발하는 방식

- 관점(aspect)이란 어떤 기능을 구현할 때 그 기능을핵심 기능부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.

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

 

  • 공통 기능을 모듈화하여 여러 객체 또는 클래스에 적용하는 프로그래밍 기법. 이를 통해 중복되거나 비슷한 코드 조각을 줄이고, 코드 가독성과 유지 보수성을 개선할 수 있다.

 

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

객체마다 핵심 기능을 수행하기 위한 로직과 부가 기능인 로깅, 트랜잭션 등의 코드를 작성.

유지보수 목적이나 데이터베이스 접근을 위해 작성된 로깅과 트랜잭션 영역은 상품정보를 등록할 때나 상품정보를 조회할 때 동일한 기능을 수행할 확률이 높다. , 핵심 기능을 구현한 두 로직에 동일한 코드가 포함된다는 것을 의미한다.

또한 객체 지향 원칙에 따라 구현되며, 객체 간 상호작용을 통해 소프트웨어를 모델링하고 개발한다. OOP는 객체 개념과 클래스를 이용해서 데이터와 함수를 구조화하며, 코드의 재사용성, 확장성 및 유지 보수성을 향상시킨다.

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

 

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

AOP의 관점에서는 부가 기능은 핵심 기능이 어떤 기능인지에 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 된다. 제 비즈니스 로직에 집중할 수 있는 구조를 만들어 준다. 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 한다. 또한 스프링 프레임워크에서는 프락시 패턴을 통해 AOP를 지원하여 여러 코드의 공통 부분을 추출하고, 애플리케이션 전반에 적용할 수 있다.

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


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

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

스프링 프레임워크의 모듈


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

  • 스프링 프레임워크(Spring Framework)는 자바 애플리케이션 개발을 위한 커다란 프레임워크이며 다양한 기능을 제공한다.
  • 스프링 부트(Spring Boot)는 이러한 스프링 프레임워크 기반 애플리케이션 개발을 간편하게 만들어주는 도구이며, 필요한 모듈들을 추가하다 보면 설정이 복잡해지는 문제를 해결하며, 빠른 개발과 구성의 간편함을 제공한다.

1.2.1 의존성 관리

  • -스프링 부트에서는 스프링 프레임워크의 개발에 필요한 각 모듈의 의존성을 직접 설정하는 불편함을 해소하기 위해 다양한 의존성을 제공한다.
  1. spring-boot-starter-web: 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성이다. 기본으로 내장 톰캣(Tomcat)이 포함돼 있어 jar 형식으로 실행 가능하다.
  2. spring-boot-starter-test: JUnit Jupiter, Mockito 등의 테스트용 라이브러리를 포함한다.
  3. spring-boot-starter-jdbc: HikariCP 커넥션 풀을 활용한 JDBC 기능을 제공한다.
  4. spring-boot-starter-security: 스프링 시큐리티(인증, 권한, 인가 등) 기능을 제한다.
  5. spring-boot-starter-data-jpa: 하이버네이트를 활용한 JPA 기능을 제공한다.
  6. spring-boot-starter-cache: 스프링 프레임워크의 캐시 기능을 지원한다.

1.2.2 자동설정

  • 스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원한다. 애플리케이션 개발에 필요한 의존성을 추가하면 프레임 워크가 이를 자동으로 관리.

1.2.3 내장 WAS

  • 스프링 부트의 각 웹 애플리케이션에는 내장 WAS(Web Application Server)가 존재하며 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 ‘spring-boot-starter-web’의 경우 톰캣을 내장한다. (스프링 부트는 톰캣이 자동 설정)

1.2.4 모니터링

  • 개발이 끝나고 서비스를 운영하는 시기에는 해당 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링해야 한다. 스프링 부트에는 스프링 부트 액추에이터(Spring Boot Actuator)라는 자체 모니터링 도구가 있다.
728x90
반응형