스프링 부트란?
1. 프레임워크
- 소프트웨어 개발에서 프레임워크는 미리 만들어진 구조나 도구의 집합으로, 애플리케이션을 빠르고 효율적으로 개발할 수 있도록 지원한다.
- 프레임워크는 라이브러리, API 및 코드 구성을 위한 규칙 등을 제공하여 일반적으로 프로그래밍 작업을 보다 쉽게 수행할 수 있도록 한다. 또한 애플리케이션의 다양한 구성 요소가 어떻게 상호작용해야 하는지에 대한 가이드라인도 제공한다.
2. 스프링 프레임워크
- 엔터프라이즈용 JAVA 애플리케이션 개발을 편하게 할 수 있도록 다양한 기능을 제공하는 JAVA 기반의 오픈소스 경량급 애플리케이션 프레임워크
- 스프링 프레임워크(스프링)는 목적에 따라 다양한 프로젝트를 제공하는데, 그 중 하나가 스프링 부트(Spring Boot)이다.
- 핵심 가치 : 애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것
(1) 스프링 특징
① 제어 역전 (IoC : Inversion Of Control)
- 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임한다.
- 여기서 '외부'란, 스프링 컨테이너(Spring Container) 또는 IoC 컨테이너를 의미한다.
- 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 한다.
- 이를 통해, 의존성 주입(DI), 관점 지향 프로그래밍(AOP)이 가능하다.
② 의존성 주입 (DI : Dependency Injection)
- 제어 역전의 방법 중 하나
- 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입 받아 사용하는 방식을 의미한다.
- 의존성을 주입 받는 방법 4가지
- 생성자를 통한 의존성 주입
- 필드 객체 선언을 통한 의존성 주입
- setter 메서드를 통한 의존성 주입
- @Autowired 어노테이션(annotation)을 통해 의존성 주입
③ 관점 지향 프로그래밍 (AOP : Aspect-Oriented Programming)
- 스프링의 아주 중요한 특징
- 관점을 기준으로 묶어 개발하는 방식
- '관점'이란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.
- '핵심 기능'은 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다.
- '부가 기능'은 핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리한느 코드를 예로 들 수 있다.
- 즉, 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP 라고 한다.
3. 스프링 부트
스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크
(1) 스프링부트 특징
① 의존성 관리
- 'spring-boot-starter'라는 의존성을 제공한다.
- 이를 통해, 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공한다.
② 자동 관리
- 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원한다.
- 즉, 애플리케이션을 개발하는 데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해준다.
③ 내장 WAS
- 스프링 부트의 각 웹 애플리케이션에는 내장 WAS(Web Application Server)가 존재한다.
(2) 스프링부트 동작 방식
- 기본적으로 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작
- (1) : DispatcherServlet으로 요청 (HttpServletRequest)이 들어오면 DispatcherServlet은 핸들러 매핑(Handler Mapping)을 통해 요청 URL에 매핑된 핸들러를 탐색한다. 여기서 핸들러는 컨트롤러(Controller)를 의미한다.
- (2) : 핸들러 어댑터(Handler Adapter)로 컨트롤러를 호출한다.
- (3) : 핸들러 어댑터에 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환한다.
- (4) : 뷰 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버(View Resolver)를 통해 뷰(View)를 받아 리턴한다.
4. 레이어드 아키텍처
레이어드 아키텍처(Layered Architecture)란 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조이다.
계층을 나누어 개발하는 패턴을 레이어드 아키텍처 패턴이라 한다. 레이어드 아키텍처 패턴이란 코드를 분리하여 관리하는 방법이다. 구체적으로 얘기하면 애플리케이션의 구성 요소들을 프레젠테이션, 비즈니스, 퍼시스턴스, 데이터베이스로 나눠서 관리한다.
(1) 레이어드 아키텍처 패턴의 계층 간 의존성 규칙
레이어드 아키텍처 패턴에서는 각 계층 간의 의존성이 중요한 규칙으로 작용한다. 이를 단방향 의존성이라고도 하는데, 상위 계층은 하위 계층에만 의존할 수 있고, 하위 계층은 상위 계층에 의존해서는 안된다는 원칙이다. 예를 들어, Controller 계층은 Service 계층을 직접 호출할 수 있지만, Repository 계층을 직접 호출해서는 안된다.
이러한 단방향 의존성 규칙을 지킴으로써 계층 간의 결합도를 낮추고, 시스템의 유연성과 유지보수성을 높일 수 있다. 또한 각 계층의 역할과 책임을 명확히 구분할 수 있어, 시스템의 복잡성을 관리하는데 도움이 된다.
(2) 스프링의 레이어드 아키텍처
Spring MVC는 Model-View-Controller의 구조로 View와 Controller는 프레젠테이션 계층 영역이며, Model은 비즈니스와 데이터 접근 계층의 영역으로 구분할 수 있다.
프레젠테이션 계층
- 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할
- controller는 클라이언트의 요구사항을 이해하고 요청을 service에 전달한다.
비즈니스 계층
- 상황에 따라 서비스(Service) 계층이라고도 한다, 핵심 비즈니스 로직을 구현하는 영역이다.
- 데이터를 가공하는 등 비즈니스 로직을 수행하고 다시 controller에 반환하는 역할을 수행한다.
데이터 접근 계층
- Repository를 배치해 도메인을 관리한다.
- Repository는 서비스가 비즈니스 로직을 수행할 때 필요한 데이터를 생성, 수정, 조회 등을 처리하여 실제로 데이터베이스에 데이터를 저장, 수정, 조회하는 역할을 수행한다.
5. REST API
(1) REST
- ‘Representational State Transfer’의 약자로, 월드 와이드 웹(WWW)과 같은 분산 하이퍼미디어 시스템 아키텍처의 한 형식이다. 주고받는 자원(Resource)에 이름을 규정하고 URL에 명시해 HTTP 메서드 (GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고 받는 것을 의미한다.
(2) API
- ‘Application Programming Interface’의 약자로, 애플리케이션에서 제공하는 인터페이스를 의미한다. API를 통해 서버 또는 프로그램 사이를 연결할 수 있다.
즉, REST API는 REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스라고 할 수 있다.
(3) 특징
- 유니폼 인터페이스
- ‘일관된 인터페이스’를 의미한다. 즉, REST 서버는 HTTP 표준 전송 규약을 따르기 때문에 어떤 프로그래밍 언어로 만들어졌느냐와 상관없이 플랫폼 및 기술에 종속되지 않고 타 언어, 플랫폼, 기술 등과 호환해 사용할 수 있다는 것을 의미한다.
- 무상태성 (Stateless)
- 서버에 상태 정보를 따로 보관하거나 관리하지 않는다는 의미이다.
- 캐시 가능성
- REST는 HTTP 표준을 그대로 사용하므로 HTTP의 캐싱 기능을 적용할 수 있다. 이 기능을 이용하기 위해서 응답과 요청이 모두 캐싱이 가능한지(Cacheable) 명시가 필요하다.
- 레이어 시스템
- REST 서버는 네트워크 상의 여러 계층으로 구성될 수 있다. 하지만 서버의 복잡도와 상관없이 클라이언트는 서버와 연결되는 포인트만 알면 된다.
- 클라이언트-서버 아키텍처
- RSET 서버는 API를 제공하고 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계한다. 이 구성은 서로에 대한 의존성을 낮추는 기능을 한다.