Spring이란

2024. 5. 7. 20:08TIL

✔오늘 배운 중요한 🔑 point

  • Spring은 Java 애플리케이션 개발을 위한 강력한 프레임워크로, 다양한 기능과 모듈화된 아키텍처를 제공하여 개발자가 유연하고 확장 가능한 애플리케이션을 쉽게 구축할 수 있도록 하며  의존성 주입(DI)과 제어의 역전(IOC)를 통해 객체지향적인 설계를 촉진하기 때문에 매우 중요하다
  • IOC의 방법 중 하나인 DI를 사용하면 고수준 모듈이 저수준 모듈에 직접 의존하지 않고, 추상화된 인터페이스에 의존하도록 강제되기 때문에 DI는 객체지향 프로그래밍과 매우 잘 어울리는 디자인 패턴 중 하나이며, 객체 간의 결합도를 줄이고 유연한 설계를 가능하게 한다
  • Spring Web Application구조에서 Web Layer가 객체(데이터)를 받으면 Service Layer로 넘겨주고 Service Layer에서는 Domain Model로 로직을 수행한 다음 그 객체를 다시 Web Layer로 보내는 형태로 구성되어 있다.

🎯 오늘 배운 내용

 

Spring이란?

spring은 java/kotlin 기반의 Application Framework이다
Spring은 개발자가 비즈니스 로직에 집중할 수 있도록 애플리케이션의 "plumbing"에 중점을 둔다
소프트웨어에서 plumbing이란 어플리케이션의 기본적인 기능을 담당하는 것을 의미. 즉, 데이터베이스 연결, 네트워크 통신, 보안, 설정 관리 등과 같은 기술적인 부분을 말한다

 

 

Framework와 Library의 차이?

 

Framework:  Application을 개발하기 위한 규약과 다양한 요소들을 제공하는

Library:         Application 개발시 활용가능한 도구(코드)의 집합

 

 

 

Framework는 Application 호출하는 Caller 역할


Library는 Application 호출을 하는 Callee의 역할

Framework는 Application의 구조와 흐름을 제어하고, Library는 특정 기능을 제공하여 개발자가 활용할 수 있도록 한다

 

 

Package  < Module < Library

 

Package

Package는 관련 클래스 및 인터페이스 집합을 구성하는 네임스페이스입니다. Java, Kotlin에서는 개념적으로 하나의 디렉토리라고 볼 수 있습니다.

 

Module

Module 패키지와 관련 리소스의 모음입니다. 하나의 작은 역할을 담당

Java Module은 Application 혹은 API 를 별도의 module로써 패키징하는 매커니즘.

 

Library

Library는 기능의 집합

여러 개의 모듈로 구성

예를 들어, Collections 라이브러리는 Set module, List module, Map module 등으로 구성된다고 말할 수 있음

 

 

Spring의 용도

Spring은 HTML/CSS와 같은 리소스를 응답해주는 역할도 했지만 현재에는 JSON 데이터를 응답해주는 역할을 주로 한다 

 

 

Spring boot란?

Spring Framework는 기본적으로 많은 기능을 제공하지만, 이를 사용하기 위해서는 상당한 설정과 구성이 필요한데 복잡한 설정이나 구성 없이Spring Boot를 사용하면 애플리케이션을 쉽게 시작할 수 있게 만들어주는 도구

 

 

Spring Web Application  구조

 

Web Application을 만들기 위해 필요한 요구사항

유저 혹은 Frontend Application의 요청을 처리하고, 적절한 응답을 줄 수 있어야 한다.

예외 처리를 할 수 있고, 예외가 발생했을 때 적절한 응답을 줄 수 있어야 한다.

인증과 인가 처리를 할 수 있어야 한다.

비즈니스 로직 처리할 수 있어야 한다.

Transaction 관리 전략이 있어야 한다.

스토리지 및 다른 외부 시스템과 통신할 수 있어야 한다.

 

 

Spring의 Layer 구조

이러한 요구사항을 만족시키기 위해서 Spring을 통해 개발할 시 일반적으로 Layer(계층)을 나눈다

 

Web Layer가 Service Layer를 호출하고, 다시 Service Layer에서 Repository Layer를 호출하게 되는 구조

 

Web Layer (Application의 최상위 Layer)

Client의 요청을 받고, 응답을 주는 역할 (Controllers)

하위 Layer에서 발생한 예외들을 처리하여 적절한 응답을 줌  (Exception Handlers)

인증과 인가 처리
를 담당 (Filters)

 

Service Layer(중간존재하는 Layer )

Transaction 경계의 역할

Application Service: 요청의 처리에 대한 주요 로직을 담당하고, 최종적으로 응답을 WebLayer에 넘겨주는 역할

Infrastructure Service: 데이터 베이스, 이메일 서버 같은 외부 서비스와 통신하는 역할, Application Service에서 Infrastructure Service를 사용

 

Repository Layer (가장 하위에 존재하는 Layer)

데이터베이스와 통신하는 역할

 

Layer 사이의 Interface (DTO , Domain Model)

 

DTO

데이터를 담을 수 있는 간단한 객체

Application 내에서 각 Layer 사이의 데이터를 전달하는데 쓰이며 응답과 요청 또한 DTO로 표현될 수 있다.

 

Domain Model

Domain ModelDomain ServiceEntityVO(Value Object)를 포함하는 개념

Domain Service : 도메인에 대한 특정 로직을 수행하는 Stateless 한 Class. 여기서 도메인은 우리가 만드는 Application을 통해 해결하고자 하는 문제 / 분야라 할 수 있음

Entity : Database에 저장될 수 있는 Data를 표현하는 객체로, table과 대응됨.  Entity의 Instance는 Table의 한 Row와 대응됨.

VO(Value Object) : 값을 표현하는 객체로, Entity와 Lifecycle을 함께함. Entity가 갖고 있는 속성중 하나라 할 수 있음.

 

 

DTOWeb Layer Service Layer에서 사용

Web LayerDTO를 input으로 받고, DTO를 응답합니다. 각각 Request와 Response에 대응된다 볼 수 있음

Service LayerWeb Layer로 부터 DTO 혹은 Basic Type(Int, String …) 을 넘겨 받아 로직을 수행한 후 다시 DTO를 WebLayer에 응답

Service Layer는 내부에서 로직을 수행하기 위해 Domain Model을 사용

Repository Layer는 Entity와 BasicType 을 파라미터로 받고, Entity를 응답

 

Spring 요청 전달 과정

 

 


ClientDispatch ServletRequest를 보냅니다. 여기서 HTTP Request, 대표적으로 Method (GET, POST, PUT, PATCH, DELETE) 와 URL, 그리고 보내는 JSON Data를 포함.

Dispatch Servlet HandlerMapping을 통해 요청에 대응되는 Controller를 검색하고, 응답을 받음

Handler Adapter를 통해 Controller에 Request에 대한 처리를 요청

Controller, Service, Repository를 거쳐 비즈니스 로직을 수행한 후 Response를 응답

다시 Handler Adpater가 응답을 Dispatch Servlet에 전달

최종적으로 HTTP Response 형태의 응답이 Client에 전달

 

위 그림에서 DispatchServlet, HandlerAdapter, HandlerMapping은 Spring에서 제공하는 영역이고,

Controller, Service, Repository는 우리가 구현하는 영역이다

※ DispatchServletFrontController 라고도 하는데  앞단에서 사용자의 요청을 컨트롤하여 다른 컨트롤러에 전달하기 때문에 DispatchServlet의 역할이 매우 중요하다

 

 

DI , IOC

 

DI(Dependency Injection)

객체가 자체적으로 필요로 하는 의존성을 생성하는 것이 아니라, 외부에서 주입받는 디자인 패턴

객체간의 결합도를 낮추기 위해 사용하며 주로 Contructor 기반 주입, Field 기반 주입, Setter 기반 주입이 있다

IOC를 구현하는 방법 중 하나이며 주로 DI를 사용하기 때문에 DI Container라고 불림

사용하는 이유? 

  1. 의존되는 객체의 불변성 확보
  2. 순환 참조 방지
  3. 테스트 코드 작성의 용이

 

IOC (Inversion of Control)

객체의 생성과 생명주기를 외부에서 제어하는 디자인 패턴

Framework에서 IoC 를 제공할 때, 이를 IoC Container 라고도 부름

 

 

 

🤔 어떻게 활용할까?

IOC의 방법 중 하나인 DI를 활용하면 테스트코드 작성에도 용이하며  DI를 사용하면 추상화 인터페이스에 의존하도록 강제되기 때문에 객체지향 설계의 행심 개념 중 하나인 추상화와 결합도를 낮추는 것에 적합하기 때문에 객체지향 프로그래밍과 매우 잘 어울리는 디자인 패턴이다. 따라서 DI를 활용하는것은 객체지향 설계에 있어서도 매우 중요하다.

📓 오늘의 한줄

"There is nothing to writing. All you do is sit down at a typewriter and bleed."

- Ernest Hemingway -

 

 

'TIL' 카테고리의 다른 글

Swagger  (0) 2024.05.09
Tactical Design & REST API  (0) 2024.05.08
데이터 타입 런타임 에러  (0) 2024.05.06
(알고리즘) 3진법 뒤집기  (0) 2024.05.05
(알고리즘) 최대공약수와 최소공배수 구하기  (0) 2024.05.04