본문 바로가기
to Developer/Spring

Spring Framework

by EH헌 2024. 1. 29.

Spring Framework (스프링 프레임워크)


프레임워크 (Framework)

프레임워크란 응용 프로그램이나 소프트웨어 솔루션 개발을 수월하기 위해 구조, 틀이 제공된 소프트웨어 환경 이다.


Spring

스프링은 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크 이다.
동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.

  • POJO 기반의 구성으로 자바 코드를 이용해서 객체를 구성하는 방식 그대로 스프링에서 사용할 수 있다.
  • 덕분에 높은 생산성과 유연한 테스트를 할 수 있다.
  • DI(의존성 주입)을 통한 객체 관계 구성을 지원한다.
  • 객체의 생성부터 소멸까지 객체 생명주기 관리를 사용자가 아닌 특별한 객체에게 맡긴다. (IoC)
  • AOP(횡단 관심사 분리) 지원
  • MVC 구조로 계층이 분리되어 관리하기 수월하다.
  • 배치 애플리케이션 스프링 배치가 있다.

1. POJO

평범한 구식 자바 객체로, 프레임워크 인터페이스나 클래스를 구현하거나 확장하지 않은 단순 클래스 를 의미한다.
JAVA에서 제공하는 API외에는 종속되지 않아 코드가 간결하고 테스트 자동화에 유리 하다.
Spring에서는 도메인과 비즈니스 로직을 수행하는 대상 이 POJO 대상이 될 수 있다.


2. DI (Dependency Injection)

DI는 스프링 프레임워크에서 지원하는 IoC의 형태 이다.
클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것이다.

  • 장점
    • 스프링 자체에서 설정을 통해 연관 관계를 맺어줌으로써 객체간 결합도를 낮춰준다.
    • 클래스의 재사용성을 높이고, 유지보수가 편리해진다.
    • 의존성 주입으로 인해 stub, mock 객체를 사용해 unit 테스트의 이점이 생긴다.
  • 단점
    • 의존성 주입을 위한 선행 작업이 필요해 간단한 프로그램에서는 번거롭다.
    • 코드 추적이 어렵다.

주입 방식

  • 수정자 주입
    • 대부분 의존 관계 주입은 한번 일어나면 종료시점까지 변경할 일이 거의 없다.
    • Setter를 통해 주입하게 되면 변경될 위험이 존재
    • Setter를 public으로 열어야함
  • 필드 주입
    • 외부에서 변경이 불가능해서 테스트하기 어렵다.
  • 생성자 주입
    • 생성자 주입을 권장
    • 생성자 호출 시점에 딱 1번만 호출되는 것을 보장
    • final 키워드를 통해 불변하게 설계 가능
    • 의존성 주입이 누락되는 것을 방지할 수 있음(IDE에서 컴파일 오류로 알려줌)

3. IoC (Inverse of Control 제어의 역전)

객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미.
개발자는 프레임워크에 필요한 부품을 개발하고 조립하는 방식으로 개발을 하고 최종 호출은 개발자가 아니라 프레임워크의 내부에서 결정된 대로 이뤄지게 되는데 이런 현상을 제어의 역전이라고 한다.


4. AOP(Aspect Oriented Programming)

관점 지향 프로그래밍으로 공통 관심 사항과 핵심 관심 사항을 분리 하는 것을 의미한다.
소스 코드에서 여러 번 반복해서 사용하는 코드(흩어진 관심사)를 Aspect로 모듈화하여 핵심 로직에서 분리해 재사용하는 것이라고 볼 수 있다.
여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법이다.
특정 로직(로그, 성능테스트, 권한)을 모든 메서드에 적용하고 싶을 때, 일일이 추가하는 것이 아니라 로직을 만들어서 적용할 수 있다.
따라서, 비즈니스 로직 앞/뒤에 공통 관심 사항을 수행해 중복 코드를 줄인다.

주요 용어

  • Aspect
    • 흩어진 관심사를 모듈화 한 것
      • 모듈 : 외부에서 재사용할 수 있는 패키지들을 묶은 것
    • advice + pointcut을 모듈화 한 것
  • Target
    • advice의 대상이 되는 객체
    • Pointcut으로 결정
  • Advice
    • 실질적인 부가 기능 로직을 정의하는 곳
    • 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
  • Join point
    • 추상적인 개념 으로 advice가 적용될 수 있는 모든 위치
      • ex) 메서드 실행 시점, 생성자 호출 시점, 필드 값 접근 시점 등등..
    • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점
  • Pointcut
    • 조인 포인트 중에서 advice가 적용될 위치를 선별하는 기능
    • 스프링 AOP는 프록시 기반이기 때문에 조인 포인트가 메서드 실행 시점 뿐이 없고 포인트컷도 메서드 실행 시점만 가능
  • Advisor
    • 스프링 AOP에서만 사용되는 용어로 advice + pointcut 한 쌍
  • Weaving
    • pointcut으로 결장한 타겟의 join point에 advice를 적용하는 것
  • AOP 프록시
    • AOP 기능을 구현하기 위해 만든 프록시 객체
    • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시

AOP 적용 방식

  • 컴파일 시점
    • .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가 기능 로직을 추가
    • 모든 지점에 적용 가능
    • AspectJ가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별할 컴파일러가 필요한 점과 복잡하다는 단점이 있다.
  • 클래스 로딩 시점
    • .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가 기능 로직 추가
    • 모든 지점에 적용 가능
    • 특별한 옵션과 클래스 로더 조작기를 지정해야하므로 운영하기 어렵다.
  • 런타임 시점
    • 스프링이 사용하는 방식
    • 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식
    • 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용
    • 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능 -> 스프링 빈에만 AOP를 적용 가능
    • 특별한 컴파일러나, 복잡한 옵션, 클래스 로더 조작기를 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있기 때문에 스프링 AOP는 런타임 방식을 사용

5. Spring batch

단발성으로 대용량 데이터를 처리하는 애플리케이션을 배치 애플리케이션이라고 하고 스프링 진영에는 스프링 배치가 있다.
스프링 배치는 레이저 구조 3개로 구분된다.

  • 애플리케이션 레이어
    • 개발자가 작성한 모든 배치 작업과 사용자 정의 코드를 포함한다.
  • 코어 레이어
    • 배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스들을 포함(jobLauncher, job, step, flow 등)한다.
  • 인프라 레이어
    • 잡을 실행의 흐름과 처리를 위한 틀을 제공
    • 애플리케이션과 코어 모두 인프라 위에서 빌드된다.

자료 참고
[참고 1] [참고 2]

'to Developer > Spring' 카테고리의 다른 글

Ajax  (0) 2024.02.14
WAS, Servlet  (0) 2024.02.01
Spring Container, Bean  (0) 2024.01.30
Dispatcher Servlet  (0) 2024.01.26
MVC 패턴  (0) 2024.01.26