Spring Framework

박채은·2022년 12월 8일
0

Spring

목록 보기
4/35

Framework란?

소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것

Framework는 뼈대, 이라는 의미를 가지고 있다.
즉, 소프트웨어적인 관점에서 어떤 애플리케이션을 만들기 위한 뼈대/틀/구조를 제공하는 것이라고 이해하면 된다.

우리가 굳이 직접 처음부터 만들지 않아도, 여러 기능들을 편리하게 사용할 수 있도록 만들어놓은 뼈대!

Spring 프레임워크 뿐만 아니라, 다양한 프레임워크가 존재한다.
그 예시로 Collection Framework가 있다.
Collection Framework은 자료 구조를 바탕으로 만든 Map, Set, List 같은 Collection들이 해당 데이터를 처리하기 쉽도록 여러 기능들을 제공하는 인터페이스와 클래스의 집합이다.

Framework의 장점

  • 기본 구조를 이미 제공하기 때문에 개발자가 애플리케이션의 핵심 로직을 개발하는데 집중할 수 있다.
    -> 효율적
  • Framework의 규약에 맞게 코드를 작성하기 때문에, 유지/보수 시에 문제점을 빠르게 파악할 수 있고 수정하기도 편하다.

Framework의 단점

  • Framework에 대한 부가적인 학습 필요
  • Framework에는 규약이 정해져 있기 때문에 덜 자유롭고, 덜 유연하다.

Framework vs Library

라이브러리는 다른 누군가가 필요한 기능을 미리 구현해둔 코드로, 우리는 평상 시에 필요한 라이브러리를 골라서 사용한다.

둘의 차이점은 "애플리케이션에 대한 제어권이 누구에게 있냐"이다.

  • 라이브러리: 주도권이 개발자에게 있음
    (우리는 선택적으로 라이브러리를 사용함)
  • 프레임워크: 주도권이 프레임워크에게 있음
    (우리는 Spring Framework에 따라 코드를 작성함, 주도권이 개발자에게 없음)

Spring Framework

Java 애플리케이션 개발을 위한 포괄적인 인프라를 지원하는 Java 플랫폼

✔️ 여러 Java Framework이 있지만, 사람들은 왜 특히 Spring을 많이 사용할까?

Spring은 재사용과 확장에 용이하여 개발 생산성을 향상 시키고, 애플리케이션 유지/보수가 쉽기 때문이다. 또한, 보안성, 시스템의 안정성, 효율성이 필요한 기업용 엔터프라이즈 시스템을 구축하기에 좋다.

하지만 Spring Framework도 단점이 있는데, 애플리케이션의 기본 구조를 잡는 설정 작업(web.xml)이 어렵다는 것이다.
이런 설정의 어려움을 개선해서 나온 framework가 Spring Boot이다.


Spring의 특징

  1. POJO(Plain Old Java Object)
  2. IoC(Inversion of Control)/DI(Dependency Injection)
  3. AOP(Aspect Oriented Programming)
  4. PSA(Portalbe Service Abstraction)

✅ 스프링은 POJO 프로그래밍을 지향하는 Framework이다.
스프링의 주요 기술인 IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 기술들이다.


POJO

  • POJO = 순수한 자바 객체
  • POJO 프로그래밍: 특정 기술이나 규약, 환경에 종속되지 않으며 객체 지향적 원리를 따르는 프로그래밍 기법
  • 환경과 규약에 종속적이지 않기 때문에 재사용과 확장이 가능하고, 유연하다.
  • 코드가 깔끔해지고, 디버깅 및 테스트하기에 쉬워진다.
  • 객체 지향적 설계를 제한없이 적용할 수 있다.

IoC/DI

  • IoC(제어의 역전)
    • 애플리케이션 흐름의 주도권이 뒤바뀐 것
    • ex) Framework에서 애플리케이션 흐름의 주도권이 사용자가 아닌, 외부(Framework나 서블릿 컨테이너 등)에 있는 것
  • DI(의존성 주입)
    • IoC 개념을 구체화한 것
    • 객체의 의존성을 역전시켜서, 객체간의 결합도를 줄이고 유연한 코드를 작성할 수 있다.
      -> DI는 객체 지향 설계의존 관계 역전 원칙을 준수한다.
    • DI를 개발자가 하지 않아도, Spring에서 대신 해준다.

간단한 예시 - IoC/DI

객체 간의 의존성

A 클래스가 B 클래스의 기능을 사용한다.
= A 클래스는 B 클래스의 도움을 받는다.
= A 클래스는 B 클래스에 의존한다.
= A, B 클래스는 의존 관계이다.

A 클래스가 B 클래스에 의존한다면, A 클래스 내부에 B 클래스의 객체를 생성해야 한다.

객체를 생성해서 의존 관계를 형성하는 방법은 2가지가 있다.

  1. new 키워드 사용: 강하게 결합됨
  2. 의존성 주입: 느슨하게 결합됨

의존 관계 역전 원칙(DIP)

예를 들어, 베스킨라빈스에서 파인트를 구매한다고 생각해보자.
DI를 사용하지 않은 상태는 다음과 같을 것이다.

파인트 클래스 내부에는 바닐라, 초코, 체리 아이스크림의 클래스가 new 키워드를 통해서 생성되어 있다.
상위 모듈인 Pint하위 모듈인 Vanilla, Chocolate, Cherry에 의존하고 있고, 강하게 결합되어 있다.
이는 객체 지향 설계에 맞지 않다!

객체 지향 설계에 맞게 수정하려면, Vanilla, Chocolate, Cherry 클래스를 추상화한 Icecream 인터페이스가 있어야 하며 세 클래스는 인터페이스에 의존해야 한다.
또한, 상위 모듈인 PintVanilla, Chocolate, Cherry 클래스에 의존하는 것이 아니라 Icecream 인터페이스에 의존해야 한다.
원래 상위 모듈이 하위 모듈에 의존했는데 이 의존 관계가 역전된 것이다.

상위 모듈은 하위 모듈에 의존하지 않고, 상위 모듈과 하위 모듈 둘 다 추상화(인터페이스)에 의존해야 한다.


의존성 주입

위에서 말했듯이, new 키워드를 통해서 객체를 생성한다면, 두 클래스는 결합도가 높다.
결합도가 높으면 요구 사항의 변경에 유연하게 대처할 수 없다.
따라서 클래스 간의 결합도를 낮춰야 하고, DI를 통해 결합도를 낮출 수 있다.

1) 클래스 내부에서 new 키워드를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달해준다.

2) 클래스가 인터페이스에 의존하도록 한다.
-> 생성자의 인자로 인터페이스를 두면, 주입되는 객체가 인터페이스의 구현체이기만 하면 어떤 클래스든 주입 받을 수 있기 때문에 결합도가 낮아진다.


AOP

  • OOP(Object Oriented Programming): 객체 지향 프로그래밍
  • AOP(Aspect Oriented Programming): 관심 지향(= 공통 관심사) 프로그래밍
  • 공통 관심 사항 : 애플리케이션에서 공통적으로 사용되는 기능에 대한 관심사
    ex) 보안, 로킹, 트랜잭션, 모니터링, 트레이싱 등
  • 핵심 관심 사항 : 비지니스 로직, 애플리케이션의 목적을 달성하기 위한 핵심 로직에 대한 관심사

AOP은 애플리케이션에서 비즈니스 로직과 공통 기능을 분리하여 재사용 가능한 모듈로 사용할 수 있도록 만드는 것이다.

AOP의 장점

  • 코드의 간결성 유지
  • 코드의 재사용
  • 객체 지향 설계 원칙에 맞는 코드 구현

PSA

PSA(Portable Service Abstraction): 서비스를 추상화 시켜, 서비스의 기능에 접근하는 방식을 일관되게 유지한다.

  • PSA를 통해서 애플리케이션의 요구 사항 변경에 유연하게 대처할 수 있습니다.
  • Spring에서 PSA가 적용된 분야로는 트랜잭션 서비스, 메일 서비스, Spring Data 서비스 등이 있다.

추상화

✅ 추상화: 어떤 클래스의 본질적인 특성만을 추출해서 일반화하는 것

자바에서 추상화를 할 수 있는 방법은 두 가지이다.

  1. 추상 클래스
  2. 인터페이스

상위 모듈(추상 클래스나 인터페이스)과 이를 구현한 하위 모듈이 있을 때, 상위 모듈의 타입인 변수에 구현 객체를 할당한다.
=> 업캐스팅

ex) Child라는 상위 클래스가 있고, 이를 구현한 NewBornBaby, Infant, Toddler 클래스가 있다.
세 하위 클래스는 상위 클래스가 선언해둔 메소드를 모두 가지고 있고 각자의 클래스에 맞게 구체화되어 있다.

상위 모듈의 타입인 변수에 구현 객체를 할당하면 모든 하위 클래스의 기능들을 모두 사용할 수 있고, 어떤 하위 클래스를 사용하더라도 일관된 방식으로 서비스 기능을 사용할 수 있다.

public class ChildManageApplication {
    public static void main(String[] args) {
        Child newBornBaby = new NewBornBaby(); // (1)
        Child infant = new Infant(); // (2)
        Child toddler = new Toddler(); // (3)

        newBornBaby.sleep();
        infant.sleep();
        toddler.sleep();
    }
}

기타 개념

1) 객체 지향 설계 원칙(SOLID)

2) 서플릿 - 웹 요청 처리에 특화된 Java 클래스

  • Spring은 웹 요청을 처리할때에 내부적으로 Servlet을 사용한다.
  • 아파치 톰캣(Apache Tomcat)은 서블릿들이 웹 애플리케이션으로 실행될 수 있도록 해주는 서블릿 컨테이너 중 하나이다.
  • Spring MVC 내부에서는 서블릿을 기반으로 웹 애플리케이션을 동작하며, 스프링 부트는 기본적으로 아파치 톰캣이 내장되어 있다.
  • 서플릿 컨테이너가 서플릿을 제어하고 있기 때문에, 애플리케이션의 주도권은 서블릿 컨테이너가 갖게 되므로 여기서 IoC에 적용된 것이다.

3) 자바 콘솔 애플리케이션 vs 웹 애플리케이션

  • 자바 콘솔 애플리케이션에서는 main 메서드에서 프로그램이 시작되고 이를 엔트리 포인트라고 한다. main 메서드가 끝나면 애플리케이션도 종료된다.
  • 하지만 웹 애플리케이션의 경우에는 main 메서드가 존재하지 않고, 항상 클라이언트의 요청을 받아야 하기 때문에 프로그램이 종료되지도 않는다. 클라이언트의 요청이 들어오면, 서플릿 컨테이너컨테이너 로직(service 메서드)에 따라 서블릿을 직접 실행시켜주기 때문에 main이 필요없다.

몰랐던 단어

  • 엔드 포인트 : 클라이언트의 요청을 받는 곳
    • 클라이언트 측면에서 서버의 엔드포인트(Endpoint)란 클라이언트가 서버의 자원(리소스, Resource)을 이용하기 위한 끝 지점을 의미합니다.
  • 엔트리 포인트 : main() 메서드처럼 애플리케이션이 시작되는 지점
  • 스텁 : 메서드가 호출되면 미리 준비된 데이터를 응답하는 것, 고정된 데이터이기 때문에 몇 번을 호출해도 동일한 데이터를 리턴한다.(멱등성을 가진다.)
  • 멱등성 : 몇 번을 호출해도 동일한 데이터를 리턴하는 것
  • 업캐스팅 : 인터페이스 타입의 변수에 그 인터페이스의 구현 객체를 할당하는 것

0개의 댓글