1.스트링부트란?

구보선·2023년 1월 13일
0

스프링부트

목록 보기
1/9

1.1스프링 프레임워크

스프링 프레임워크(Spring Framework)는 자바 기반의 애플리케이션 프레임워크로 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공한다.

스프링 프레임워크는 자바에서 가장 많이 사용하는 프레임워크로 자바를 이용해 애플리케이션을 개발하는 데 필요한 기능을 제공하고 쉽게 사용하도록 돕는 도구이다.

스프링의 특징과 구조

1.1.1 제어 역전(ioC)

일반적인 자바 개발의 경우 객체를 사용할 때에 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후에 객체에서 제공하는 기능을 사용한다. 이는 객체를 생성하고 사용하는 작업을 개발자가 직접 제어하는 구조이다.
이와 달리, 제어 역전(ioC)를 특징으로 하는 스프링은 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임한다. 여기서 '외부'란 스프링 컨테이너(SpringContainer) 또는 ioC컨테이너(ioC Container)를 의미한다. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어역전이라 부르며, 이를 통해 의존성 주입(DI:Dependency Injection), 관점 지향 프로그래밍(AOP:Aspect-Oriented Programming)등이 가능하다. 객체의 제어권을 컨테이너로 넘김으로써 개발자는 비즈니스 로직 작성에 더욱 집중할 수 있다는 장점을 갖는다.

1.1.2 의존성 주입(DI)

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

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

  • 생성자를 통한 의존성 주입
  • 필드 객체 선언을 통한 의존성 주입
  • setter 메서드를 통한 의존성 주입

스프링에서는 @Autowired라는 어노테이션(annotation)을 통해 의존성을 주입할 수 있다. 스프링 4.3 이후 버전에서는 생성자를 통해 의존성을 주입할 때에 @Autowired 어노테이션을 생략해도 되지만, 가독성을 위해 어노테이션을 명시하기를 권장하고 있다.

*어노테이션: 작성한 코드에 대해 추가적인 정보를 제공하면서 컴파일 타임 혹은 런타임 시점에서 해당 코드에 필요한 추가적인 처리를 해 주는 역할을 한다.

..의존성..
운전자가 자동차를 생성한다
자동차는 내부적으로 타이어를 생산한다.
new car();
car 객체 생성자에서 new Tire();
//car가 new Tire에 의존..전체가 부분에 의존 ㅇㅋ```

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

@Controller
public class CocoController {
  //final을 붙일 수 있음
    private final CocoService cocoService;
  //---------------------------------------------------------
  //@Autowired 
    public CocoController(CocoService cocoService) {
        this.cocoService = cocoService;
    }
}

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

@Controller
public class CocoController {
	
    @Autowired 
    private CocoService cocoService;
}

필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성 주입

- 단점

 코드가 간결하지만, 외부에서 변경하기 힘들다.
 프레임워크에 의존적이고 객체지향적으로 좋지 않다.

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

@Controller
public class CocoController {
    private CocoService cocoService;
    
    @Autowired
    public void setCocoService(CocoService cocoService) {
    	this.cocoService = cocoService;
    }
}

Setter 메소드에 @Autowired 어노테이션을 붙이는 방법

- 단점

 수정자 주입을 사용하면 setXXX 메서드를 public으로 열어  두어야 하기 때문에 언제 어디서든 변경이 가능하다.

스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식이다. 해당 방식은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문이다....? .....

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

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

관점 지향 프로그래밍은 스프링의 아주 중요한 특징이다. AOP은 관점을 기준으로 묶어 개발하는 방식이다. 여기서 관점이란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것이다.

'핵심 기능'이란 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다.

ex) 클라이언트로부터 상품 정보 등록 요청을 받아 데이터 베이스에 저장하고, 그 상품 정보를 조회하는 비즈니스 로직을 구현할 때
1) 상품 정보를 데이터베이스에 저장하는 코드
2) 저장된 상품 정보 데이터를 보여주는 코드

실제 애플리케이션을 개발할 때에는 핵심 기능에 부가 기능을 추가할 상황이 생긴다. 대표적인 예로 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드가 있다.
이때 객체 지향 프로그래밍 형식으로 비즈니스 로직을 작성하면
객체마다 핵심 기능을 수행하기 위한 로직과 함께 부가 기능인 로깅, 트랜잭션 등의 코드를 작성한다.
하지만 관점 지향 프로그래밍에서는 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 해 모듈화해 삽입한다.

AOP를 구현하는 방법 세 가지

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

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

스프링 프레임워크 사용시, 애플리케이션 개발에 필요한 모듈만 선택해 사용하게끔 설계되어 있어 모든 모듈을 사용할 필요는 없다. 이를 경량 컨테이너 설계라고 부른다.

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

1.2.1 의존성 관리

스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성을 직접 설정해야 했으며, 호환되는 버전을 명시해야 정상 동작이 됐다. 하지만 스프링 부트에서는 'spring-boot-starter'라는 의존성을 제공하여 각 라이브러리 기능과 관련해 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공한다. 이를 통해 개발자는 라이브러리 호환 문제를 해결할 수 있다.

1.2.2 자동 설정

스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정을 지원한ㄴ다. 자동 설정은 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아주어 의존성을 자동으로 관리해준다.

프링 프로젝트가 실행되는 지점인 메인 어플리케이션의 기본적인 형태

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

여기서 @SpringBootApplication는 세개의 어노테이션을 하나로 합쳐놓은 형태다.

@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration

스프링 부트 어플리케이션은 Bean등록 2단계

1단계 : ComponentScan으로 등록하고

2단계 : EnableAutoConfiguration으로 추가적으로 읽어온 Bean들을 읽어서 등록한다

------
1.@SpringBootApplication이 붙은 어플리케이션을 실행
2.@Component 어노테이션이 있는 클래스들을 스캔해서 Bean으로 등록 (Bean 등록 1단계)
3.@EnableAutoConfiguration에 의해 spring.factories 안에 들어있는 수많은 자동 설정이 조건에 따라 적용 (Bean 등록 2단계)
4.많은 Bean들이 자동으로 생성되고 어플리케이션이 구동됨

1.2.3 내장 WAS

스프링 부트의 각 웹애플리케이션에는 내장 WAS가 존재한다. 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'SPRING-BOOT-STARTER-WEB'의 경우 톰캣을 내장한다.

*톰캣: 자바기반 웹 애플리케이션?웹서버?

필요에 따라선 다른 웹 서버로 대체가능
**
1.2.4 모니터링

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

0개의 댓글