FeGwan-Training / FeGwan

0 stars 0 forks source link

Chapter 2. 프레임워크와 스프링 부트 #33

Closed HoFe-U closed 1 year ago

HoFe-U commented 1 year ago

Discussed in https://github.com/FeGwan-Training/FeGwan/discussions/32

Originally posted by **HoFe-U** July 11, 2023 ## Chapter 2. 프레임워크와 스프링 부트 > 애플리케이션을 만들때는 Framework 없이 개발하는 것은 어렵고 고된 일이다. HTTP 의 request 나 response 를 사용하는 방법도 다양한데 왜 Framework 중에서 Spring Framework 를 사용하는지 알아보도록 하자. > ### 2.1 스프링 투어가 스프링 부트를 선택한 이유 스프링 프레임워크로 application 을 개발한 코드가 얼마나 프레임워크에 의존성이 생기는건지 알아보면된다. 스프링 컨테이너(== Bean Factory) 로 관리하게 되면 ApplicationContext가 제공하는 트랜잭션 관리, 비동기 프로그래밍, AOP 등 여러 기능을 사용할 수 있다. **그럼 이런 기능들을 계속해서 사용하며 어떻게 되나??** ⇒ 위와같은 기능들을 계속해서 사용하게 되면 다른 프레임워크를 사용하기 어려운 상태(lock-in) 이 된다. 그럼 처음부터 Spring Framework 를 사용하면 되는것 아닌가? ⇒ 이것도 쉽지많은 않은게 over-engineering 이 될수 있기 때문이다. (스프링 프레임워크 설정하는 시간과 노력, 경험까지 많이 필요하기 때문에 문제가 될 수 있다) 위와 같은 점 때문에 Spring boot 프레임워크를 제공하여 여러 편의 기능을 제공하게 하여 자동 설정기능을 통해 더 쉽게 애플리케이션을 개발할 수 있게 만들어주는 기능을 제공한다고 알 수있다. ### 2.2 스프링 프레임 워크 > 스프링은 개발하기 복잡하고 어려운 EJB를 대체하고자 설계되었는데… 힘든 개발을 했던 겨울이가고 개발하기 편리한 봄(Spring) 이 왔다는 것을 의미한다. > **Spring Framework 의 특징** - POJO(Plain Old Java Object) 기반의 경량 컨테이너 제공 - 복잡한 비지니스 영역의 문제를 쉽게 개발하고 운영하기 위한 철학 - 여러 개의 개별 단위로 구성되어 있는 모듈식 프레임워크 - 높은 확장성 및 범용성, 광범위한 생태계 시스템 - 엔터프라이즈 애플리케이션에 적합한 경량급 오픈 소스 프레임워크 **POJO 기반의 경량 컨테이너** > 일단 POJO 가 뭘까?(POJO : Plain Old Java Object)는 특정 기술에 종속되지 않는 순수 자바 객체를 의미한다. 프레임워크와 코드가 침투(invasive) 될 수 있다. 이를 통해 프레임워크와 개발자의 코드가 강하게 결합되는 문제가 발생하지 않게 하기위해 POJO 기반의 코드 작성을 지향해야 한다. > Spring application 은 POJO 객체와 스프링 컨테이너를 포함한다. 개발자는 POJO 클래스를 개발하고 스프링 컨테이너는 이 POJO 객체들을 관리하는데 이의 (Life cycle 을 관리한다). 이때 Spring Container(Bean Factory)가 관리하는 객체를 Spring Bean 이라고 한다. **복잡한 비지니스 영역의 문제를 쉽게 개발하고 운영하기 위한 철학** ![그림](https://user-images.githubusercontent.com/88470887/252520076-2edea021-a1b4-4ced-8b27-35afcb302322.png ) 상단의 그림은 스프링 트라이앵글(the spring triangle) 이라고 불리는 그림인데 3가지 핵심요소를 정의한 것이다. 1. DI (Dependency Injection) - 의존관계를 DI Container 가 주입하는 방식이라고 볼수있다(추후 자세히 설명) 2. AOP(Aspect Oriented Programming) - 시스템이 사용자에게 직접 서비스하는 기능을 정리한 것이 기능적 요구사항(functional requirement) 라고하고 개발에 필요한 기능들을 non-functional requirement) - 예를 들면 트랜잭션을 시작하고 커밋하는 코드들은 비기능적 요구사항으로 AOP 에서 처리를 할 수 있는 것이다. 3. PSA(Portable Service Abstractions) - 데이터 액세스 추상화: Spring Framework는 다양한 데이터베이스 및 데이터 액세스 기술과의 상호 작용을 추상화하여 개발자가 특정 데이터베이스에 종속되지 않고 일관된 방식으로 데이터 액세스를 수행할 수 있도록 합니다. JDBC, JPA, MyBatis 등 다양한 데이터 액세스 기술을 지원하며, 개발자는 데이터 액세스 코드를 변경하지 않고도 데이터베이스를 전환하거나 업그레이드할 수 있습니다.(쉽게생각해서 spring-data-xxx) - 트랜잭션 관리 추상화: Spring Framework는 트랜잭션 관리를 추상화하여 개발자가 다양한 트랜잭션 관리 기술을 사용할 수 있도록 합니다. JDBC, JPA, Hibernate 등 다양한 트랜잭션 관리자와 통합될 수 있으며, 개발자는 트랜잭션 관리 코드를 변경하지 않고도 트랜잭션 관리자를 전환할 수 있습니다. **(PlatformTranscationManager 를 구현한 클래스를 사용)** - 웹 개발 추상화: Spring Framework는 웹 애플리케이션 개발을 위한 다양한 추상화를 제공합니다. MVC (Model-View-Controller) 아키텍처를 지원하며, 서블릿 컨테이너와 독립적으로 작동할 수 있는 개발 환경을 제공합니다. 또한, 다양한 웹 기술과의 통합을 지원하여 개발자가 특정 웹 기술에 종속되지 않고 웹 애플리케이션을 개발할 수 있도록 합니다. - 보안 추상화: Spring Framework는 보안 관련 기능을 추상화하여 개발자가 일관된 방식으로 보안을 구성할 수 있도록 합니다. 인증, 인가, 세션 관리 등 다양한 보안 기능을 제공하며, 개발자는 애플리케이션의 보안 요구 사항에 맞게 구성할 수 있습니다. **모듈식 프레임워크** ![modular framework](https://user-images.githubusercontent.com/88470887/252524163-7ad7e06d-d3a3-44c0-8513-2c53fc6c0dfc.png ) Spring 은 위에있는 모듈들을 레고 블록처럼 조합하여 필요한 기능만 사용할 수 있다. 위와같은 형식을 모듈식(modular) 이라고 한다. - Spring Core Container 는 에 이제 Spring 의 Core 기능들이 있다. - spring-core - spring-beans - spring-context - spring-context-support - spring-expression ⇒ 위와 같은 기능들은 이제 Spring Boot 에서는 기본으로 포함하고 있다. **높은 확장성과 범용성, 생태계 시스템** > 엔터프라이즈 애플리케이션이나 마이크로서비스 아키텍처로 확장되면서 용도에 맞는 여러 기술이 필요해지는데 이를 여러 형태로 확장할 수 있는 범용적인 애플리케이션을 만들 수 있다. > 하나의 예를 들면 Spring-data 의 서브 프로젝트를 보면 아래와 같다. - Spring Data JDBC : java application 이 JDBC를 사용하도록 하는 project - Spring Data JPA : JPA 를 사용하는 project - Spring Data LDAP : LDAP 프로토콜을 사용하는 project - Spring Data MongoDB : MongoDB 를 사용하는 project - Spring Data Redis : Redis를 사용하는 project - Spring Data GemFire : 인메모리 데이터 그리드인 GemFire 를 사용하는 project - Spring Data Couchbase : NoSQL인 CouchBase 를 사용하는 project - Spring Data Elasticsearch : 검색엔진 ElasticSearch 를 사용하는 project ### **2.3 스프링 부트 소개** > 스프링 부트는 기본적으로 앞서 진행했던 스프링 프레임워크의 범위를 포함한다 즉 스프링 프레임워크를 기반으로 개발된 프레임워크라고 볼 수 있다. 결론은 Spring Boot 를 잘 사용하기위해서는 스프링 프레임워크의 기능을 잘 이해해야 한다. > **단독 실행 가능한 스프링 애플리케이션** 스프링 부트 프로젝트는 빌드 플러그인을 제공하고있다. 이를 실행하면 단독 실행이 가능한 JAR 파일을 만들 수 있다. **이렇게 되면 장점이 뭘까?** 1. java 명령어와 -jar 옵션을 사용하면 간단하게 애플리케이션을 실행할 수 있다. 2. scale out 방식의 고가용성을 확보할 수 있다. **간편한 설정을 위한 `스타터` 의존성 제공** 기능별로 라이브러리 의존성을 포함한 starter 를 제공하는데 이것들은 build 관리 툴에서 사용할 수 있다. **이게 왜 중요하냐?** - 마이크로서비스 아키텍처 환경에서 만든다고 생각한다면 모든 팀에서 사용하는 모듈을 스타터로 만들면 일관성 있는 애플리키이션 개발이 가능이 가능하기 때문이다. 이것이외에도 모니터링등 지표를 확인할 수 있는 Actuator 나 xml 설정을 안하게 해주는 auto-configure 또한자바 설정으로 가능해 진다. **애플리케이션에 내장된 WAS** 스프링 부트의 spring-boot-starter-web 을 이용한 경우에는 tomcat 이 내장되어있다. 내장된 WAS 덕분에 앞서 말한 단독 실행이 가능한 application 배포가 가능한것이다. **그럼 내장된 tomcat 을 바꾸는건 어려운거 아닌가요?** ⇒ build 툴에서 해당 dependency 만 추가하게 된다면 Jetty 나 UnderTow 같은걸로 쉽게 변경이 가능하다. ### 2.5 정리 및 회고 - 오랜만에 해당내용을 읽어보니 다시 기억이 새롭게 나는것같다 - Spring Boot 가 처음시작하는 부분은 제외시켰다( 아는것같아서…)