[TIL] Day15_Spring Framework

오진선·2024년 2월 19일
0

TIL

목록 보기
8/29
post-thumbnail

Today I Learned

Spring이란?

1. Spring 개요

1) Spring Framework : java 기반의 오픈소스 애플리케이션 프레임워크

2) Spring의 역사

  • 2002년 로드 존슨이 자신의 저서에서 선보인 코드를 시작으로 발전
  • 2003년 6월에 최초로 공개됨
  • 이름의 유래 : Java EE(엔터프라이즈 에디션)의 스펙을 구현한 EJB가 기술의 복잡도가 증가해서 성능이 느렸던 것을 탈피하여, EJB 시절을 "겨울"에 빗대어 겨울 후의 "봄"으로 새로운 시작한다는 것을 의미.

2. Spring의 특징

1) POJO(Plain Old Java Object) 지향

  • Pojo는 Java로 생성하는 순수한 객체를 뜻하는 말
  • 객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고, 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 의미
  • 스프링에서는 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결
  • Spring은 POJO 프로그래밍을 지향하는 프레임워크로 최대한 다른 환경이나 기술에 종속적이지 않도록 하기 위한 POJO 프로그래밍 코드를 작성하기 위해 Spring 프레임워크에서는 IoC/DI, AOP, PSA를 지원함

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

(1) AOP란?

  • OOP의 단점을 보완하기 위한 보조적인 기술
  • 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임

(2) AOP의 특징

  • 핵심적인 관심 사항(Core Concern)과 공통 관심 사항(Cross-Cutting Concern)으로 분리시키고 각각을 모듈화
  • 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행
  • 공통 관심 사항을 핵심 관심사항으로부터 분리시켜 핵심 로직을 깔끔하게 유지 가능
  • 코드의 가독성, 유지보수성⤴️
  • 각각의 모듈에 수정이 필요하면 다른 모듈의 수정 없이 해당 로직만 변경
  • 공통 로직을 적용할 대상을 선택 가능

3) 제어 역전(Inversion of Control, IoC)

  • 프로그래머가 직접 프로그램의 흐름을 제어하는 코드를 작성하지 않고, 그 대신 외부 프레임워크의 흐름 제어를 받도록 하는 소프트웨어 개발 원칙
  • 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출하는 방식
  • IoC 컨테이너 : 개체 간의 의존성 정보를 등록하고 어떤 클래스의 인스턴스 또는 어떤 인터페이스를 구현하는 인스턴스를 요청하면 알아서 의존성이 해결된(resolved) 인스턴스를 만들어 줌
  • DL (Dependency Lookup) / DI (Dependency Injection) 두 방법을 가지고 있음
  • 객체의 생성과 객체 간 의존관계에 대한 코드가 클래스 소스 상에서 완전히 사라짐
  • 유지보수가 편리

4) 의존성 주입(Dependency Injection, DI)

  • 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식
  • 결합도⬇️ 객체의 유연성⬆️
  • 테스트 작성 용이
  • 단, 한 객체가 다른 객체를 주입받으려면 반드시 DI 컨테이너에 의해 관리되어야 함

5) PSA (Portable Service Abstraction)

  • 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것이 서비스 추상화(Service Abstraction)
  • PSA는 하나의 추상화로 여러 서비스를 묶어둔 것
  • 일관된 방식으로 해당 서비스의 기능을 사용가능
  • Java 객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용 가능

3. Spring을 사용하는 이유

1) 포괄적인 데이터 접근 가능

  • JDBC, JPA 등 다양한 데이터 접근 기술을 추상화하여 제공
  • 복잡한 에러 처리나 리소스 관리에서 자유로움

2) 풍부한 통합 지원

  • JMS, E-mail, 스케줄링 등 다양한 서비스를 지원
  • 개발자가 통합 코드를 직접 작성하는 수고를 덜어줌

3) 안정적인 트랜잭션 관리

  • 선언적 트랜잭션 관리를 제공하며, 코드 기반의 트랜잭션 관리도 지원
  • 데이터의 일관성을 유지하면서 코드의 복잡성⬇️

4) 다른 프레임워크의 포용

  • 스프링은 전체 구조에 집중했기에 특정영역의 프레임워크와 공존하는 방식으로 사용 가능
profile
₍ ᐢ. ̫ .ᐢ ₎

0개의 댓글