스프링(Spring), 스프링부트(SpringBoot)란?

    1. 스프링이란?

    1) 스프링의 개념

    • 자바 기반의 웹 애플리케이션을 만들 수 있는 프레임워크
    • 스프링 프레임워크는 현대 자바 기반의 엔터프라이즈 애플리케이션을 위한 프로그래밍 및  Configuration Model을 제공

     

    2) 스프링의 특징

    • 자바 객체와 라이브러리들을 관리해 주며, 내장 톰캣이 있어 자바 웹 애플리케이션을 구동할 수 있음
    • 경량 컨테이너로 자바 객체를 직접 Spring 안에서 관리함
    • 객체의 생성 및 소멸과 같은 생명 주기(Life cycle)을 관리하며, Spring 컨테이너에서 필요한 객체를 가져와 사용함

     

    2-1) 제어 역전(IoC, Inversion Of Control)

    • 객체의 생성을 관리 위임 주체에게 맡김
    • 사용자는 객체를 직접 생성하지 않고, 객체의 생명 주기를 컨트롤하는 주체는 다른 주체가 됨
    • 사용자의 제어권을 다른 주체에게 넘기는 것을 제어의 역전이라고 함

     

    2-2) 의존성 주입(DI, Dependency Injection)

    • 어떤 객체를 사용하는 주체가 객체를 직접 생성하는 것이 아니라, 객체를 Spring이 생성하고 사용하는 주체에게 주입시켜 줌

     

    스프링에서 의존성을 주입하는 방법1. 생성자를 통한 의존성 주입

    스프링 공식 문서에서 권장하는 방식

    @RestController
    public class DiController {
    	private MyService service;
    
    	@Autowired
    	public DiController(MyService service) {
    		this.service = service;
    	}
    
    	@GetMapping("/no-di/hello")
    	public String getHello() {
    		return service.getHello();
    	}
    }

     

    스프링에서 의존성을 주입하는 방법2. 필드 객체 선언을 통한 의존성 주입

    @RestController
    public class DiController {
    	@Autowired
    	private MyService service;
    
    	@GetMapping("/no-di/hello")
    	public String getHello() {
    		return service.getHello();
    	}
    }

     

    스프링에서 의존성을 주입하는 방법3. setter 메서드를 통한 의존성 주입

    @RestController
    public class DiController {
    private MyService service;
    
        @Autowired
        public void setService(MyService service) {
            this.service = service;
        }
    
    	@GetMapping("/no-di/hello")
    	public String getHello() {
    		return service.getHello();
    	}
    }

     

    2-3) 관심 지향 프로그래밍(AOP, Aspect Oriented Programming)

    • 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것
    • 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것
    • 공통 기능을 분리하지 않을 경우, 공통 기능의 변화가 생겼을 때 일일이 수정해 주어야 하는 수고를 덜어 주게 됨

     

    2. Spring Boot란?

    Spring을 더 쉽게 사용하기 위한 별도의 프레임워크

     

    1) 스프링 부트의 특징

    1-1) 의존성 관리

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

    <많이 사용하는 spring-boot-starter 라이브러리>

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

     

    1-2) 자동 설정(Auto Configuration)

    • 애플리케이션에 추가된 라이브러리를 실행하는데 필요한 환경 설정을 알아서 찾아 줌
    • 애플리케이션을 개발하는데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리

     

    1-3) 내장 WAS(Web Application Server)

    • 스프링 부트의 각 웹 애플리케이션에는 내장 WAS가 존재함
    • spring-boot-starter-web의 경우 톰캣을 내장
    • 스프링 부트의 자동 설정 기능은 톰캣에도 적용되므로 특별한 설정 없이 톰캣을 실행할 수 있음
    • 필요에 따라 Jetty, Undertow 등으로 대체 가능

     

    1-4) 모니터링

    • 스프링 부트에는 Spring Boot Actuator라는 자체 모니터링 도구가 있음

    'Spring' 카테고리의 다른 글

    [Spring] Swagger 라이브러리  (0) 2023.04.06
    [Spring] MVC 패턴  (0) 2023.04.05
    [SpringBoot] REST API란?  (0) 2023.04.05
    [Spring] 싱글톤 패턴  (0) 2023.04.04
    [Spring] 빌드 관리 도구  (0) 2023.04.04

    댓글