본문 바로가기
Programming/Spring

[Spring] Spring 프레임워크의 특징

by jenlve 2024. 1. 24.

스프링 부트 : 스프링이 목적에 따라 제공하는 프로젝트 중 하나

🌱 스프링 프레임워크

프레임워크 - 미리 만들어진 구조나 도구의 집합

 

스프링 프레임워크

      ▪ 자바 언어를 이용해 엔터프라이즈급 개발(기업 환경을 대상으로 하는 개발)을

        편리하게 만들어주는 '오픈소스 경량급 애플리케이션 프레임워크'

            ▪ 경량급 : 필요한 모듈만 선택해서 사용하게끔 설계하는 경량 컨테이너 설계

 

        핵심 가치

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

 

 


 

🍀 스프링 프레임워크의 특징

제어 역전(Inversion of Control)

      ▪ 기존 자바 개발 방식 : 객체 선언, 객체의 의존성 생성 후 사용 ➡️ 개발자가 직접 제어하는 구조

      ▪ 스프링의 개발 방식 : 객체를 직접 생성하지 않고, 객체의 생명주기를 외부에 위임

                                          ➡️ 객체의 관리를 컨테이너에 맡겨, 제어권을 넘긴 구조

             외부스프링 컨테이너 / IoC 컨테이너

 

      ▪ 제어 역전을 통해 가능한 것:

            1. 의존성 주입(DI : Dependency Injection)

            2. 관점지향 프로그래밍(AOP : Aspect-Oriented Programming)

 


 

1. 의존성 주입(DI : Dependency Injection)

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

       ➡️ 클래스는 자신이 사용하는 의존성을 직접 생성하거나 관리하지 않고 외부로부터 필요한 의존성을 바을 수 있게 된다. 이 방식을 통해 클래스의 결합도를 줄이고 코드의 재사용성과 확장성을 증가시킬 수 있다.

 

      ▪ 의존성을 주입받는 방법 3가지

            1. 생성자를 통해

            2. 필드 객체 선언을 통해

            3. setter 메서드를 통해

 

      ▪ 스프링에선, "@Autowired"라는 어노테이션을 통해 의존성을 주입할 수 있다. 

 

      ▪ 권장하는 DI 방법 : 생성자를 통한 의존성 주입

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

 

@RestController
public class DIController {

    MyService myService;

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

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

}

 

 

2.  관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)

      ▪ AOP의 목적 : 재사용 가능한 구성을 모듈화해서

                               개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 하는 것

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

      ▪ 관점 : 핵심 기능부가 기능으로 구분해, 각각을 하나의 관점으로 보는 것 

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

             부가 기능 : 로깅, 트랜잭션 등으로, 대개 핵심 기능 로직 수행 전 후에 붙는 동일한 로직

 

따라서 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입할 수 있고,

이를 AOP(Aspect-Oriented Programming)라고 한다. 

AOP 로직

 

 

      ▪ AOP를 구현하는 방법 3가지

            1. 컴파일 과정에 삽입하는 방식

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

            3. 프락시 패턴을 이용한 방식 - 스프링이 사용하는 방식

 


 

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

  스프링 프레임워크의 단점

      ▪ 기존 개발 방식의 문제와 한계를 극복하기 위한 다양한 기능을 제공하지만 그만큼 설정이 복잡하다.

 

위의 문제를 해결하기 위해 등장한 것이 스프링 부트(Spring Boot)이다.

 

 ▪ 스프링 부트의 장점

       의존성 관리

             ▪ 스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성을 직접 설정해야 했다.

 ➡️ 스피링 부트에서는 'spring-boot-starter' 의존성을 제공하여 라이브러리 호환 문제를 해결 해준다. 

       ( 의존성 조합 충돌 문제가 없도록 'spring-boot-starter-parent'가 검증된 조합을 제공한다.)

 

 

        자동 설정

➡️ 스피링 부트에서는 애플리케이션을 개발하는 데 필요한 의존성을 추가하면,

      프레임워크가 이를 자동으로 관리해준다. 

 

             ▪ Auto Configuration으로, 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한

              환경 설정을 알아서 찾아준다. 

 

             ▪ @SpringBootAplication 어노테이션이 위의 기능을 가능하게 해준다. 

                  ▪ @SpringBootAplication 구성 

                        ▪ @SpringBootConfiguration

                        ▪ @EnableAutoConfiguration

                        ▪ @ComponentScan

                              - @Component 시리즈 어노테이션이 붙은 클래스를 발견해 빈(Bean)에 등록해준다.

                             

                                  ▪ @Component 시리즈 어노테이션

                                        ▪ @Controller 

                                         @RestController 

                                         @Service 

                                         @Repository 

                                         @Configuration 

             

 

        내장 WAS

➡️ 스피링 부트에서는 각 웹 애플리케이션에 내장 WAS(Web Application Server)가 존재하는데,

웹 애플리케이션 개발 시에는 톰켓을 내장하고 있다.