본문 바로가기

개발지/Today I learn

[1208] 자바 스프링 - Spring Framework

#Framework

- Framework란?

  ▪ Frame의 뜻에서 알 수 있듯이 프로그래밍에서 Frame 역시 개발에 필요한 틀, 외형적 구조를 제공해주는 의미.

  ▪ 자바에서 Framework로 제공되는 예시로 Collections Framework가 있다. 

    Collections Framework에서는 자바에서 사용되는 Map, Set, List 등의 자료구조를 미리 저장해 놓았다가 제공한다.

    다시 말해 Colleciotns은 자바의 인터페이스(Interface) 클래스는 추상 메서드만 정의되어 있는 뼈대만 갖춘 클래스인

    Map, Set, List 같은 인터페이스와 그 인터페이스들을 구현한 구현체들의 지밥과 같다.

  ▪ 정리하자면, Framework프로그래밍을 하기 위한 틀이나 구조를 제공하는 역할을 한다.

 

- Framework의 장단점

  • 효율적으로 코드 작성이 가능해짐.
    : 개발하려는 애플리케이션의 기본 구조에 필요한 기능들(데이터 저장, 통신 등)을 라이브러리 형태로 제공하여준다.
  • 애플리케이션 관리가 편해짐
    : Framework의 규약에 맞게 코드를 작성해야 하기 때문에, 오류가 생겼을 때 더 빠르게 찾아낼 수 있다.
      또한 제 3자가 봤을 때에도 빠르게 코드를 파악하고 수정할 수 있다. 마찬가지로 규약에 맞게 쓰여진 코드로 인해
      다른 애플리케이션으로의 확장(특정 기능 코드의 재사용)이 쉬워진다.
  • Framework에 대한 추가 학습 필요
  • 규약을 벗어난 개발이 어려움.

 

#Spring Framework

- Spring Framework란?

  • Spring Framework는 웹 애플리케이션 개발을 위한 Framework 중 하나.
  • Django, Express, Flask 등 여러 프레임워크 중 자바 기반의 스프링이 가지는 장점은 다음과 같다.
    (1) POJO(Plan Old Java Object) 기반의 구성
    (2) DI(Dependecy Injection) 지원
    (3) AOP(Aspect Oriented Programming). 관점지향 프로그래밍 지원
    (4) Java 언어를 사용(자바의 장점)

    Spring Framework의 특징.

- 스프링 프레임 워크의 핵심 1. POJO

  • 위의 그림은 스프링 프레임워크의 핵심이자 특징인 POJO, DI, AOP, PSA를 모두 나타내고 있다.
  • 그 중 중심에 있는 POJO는 그 밖에 있는 개념들을 통해 완성되는 특징이다.

▶ POJO란?

: POJO프로그래밍은 POJO을 이용한 프로그래밍 방법을 의미한다. 그렇다면 POJO는 무엇인가?

POJO. Plain Old Java Object 의 의미는 약자인 POJO는 PO와 JO를 나눠서 생각하면 알 수 있다.

PO(Plain Old)자바로 생성한 순수한 객체를 의미한다.

JO(Java Object)자바의 객체를 의미한다.

 

그렇기 때문에 POJO 프로그래밍에는 기본적인 규칙이 존재한다.

  1. 자바, 자바의 스펙(사양)에 정의된 것 외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
  2. 특정환경에 종속적이지 않아야 한다.

 

▶ POJO 프로그래밍을 하는 이유?

: 가장 중요한 이유는 객체지향적 설계를 적용하기 위해서이다. Spring을 객체지향적으로 사용하기 위해서이다.

이 객체지향적인 프로그래밍을 위해 Spring은 위 그림에서 나온 DI, AOP, PSA를 지원하고 있는 것이다.

 

- 스프링 프레임 워크의 핵심 2. IoC / DI

▶ Ioc(Inversion of Control)란?

: 애플리케이션의 흐름의 주도권이 뒤바뀐 것을 의미한다. 

  일반적으로 작성된 코드는 앞에서부터 뒤로 순서에 따라 실행되며 제어된다.

public class SayHello {
    public static void main(String[] args) {
        System.out.printlnl("Hello World!");
    }
}

위의 코드에서 Java는 main메서드 안에서 System 클래스의 static 멤버 변수 outprintln()을 통해 명령을 수행합니다.

 

그러나 웹상에서 작동하는 애플리케이션의 실행은 외부의 클라이언트의 요청에 의해서 실행되어야 합니다.

그러므로 웹 애플리케이션의 주도권을 스프링 컨테이너에게 맡겨 요청이 있을때마다 코드가 실행되도록 만드는데, 이를 의존성 주입(DI)이라고 하며, 이 때 주도권을 가진 컨테이너를 IoC컨테이너라고 한다.

 

▶ DI(Dependecy Injection)란?

: 해석하면 의존성 주입이란 뜻. 객체 간의 의존성을 가지고 있는 것을 의미한다.

서로 다른 클래스가 있을 때 한 클래스의 객체를 다른 클래스가 전달받는 것을 '의존성 주입'이라고 한다.

 

▶ DI가 필요한 이유?

: 의존 객체를 생성할 때, 클래스들 간에 강하게 결합되는 것을 피하기 위해서. (객체 생성시에 애플리케이션 코드 내부에 new키워드로 객체 생성시 강하게 결합.)스프링은 new생성자를 통한 객체 생성을 대신해줌으로써 클래스 간에 강한 결합이 되는 것을 방지해준다.= 개발자는 스프링을 통해 의존성 주입을 함으로써 클래스 간에 강한 결합을 피할 수 있다. 

 

- 스프링 프레임 워크의 핵심 3. AOP

▶ AOP(Aspect Oriented Programming)란?

: 번역 시 관심 지향 프로그래밍이라는 뜻을 가지고 있다.

관심 지향 프로그래밍이란 애플리케이션에서 필요한 기능 중 공통적으로 적용되는 공통 기능에 대한 관심을 말한다.

AOP애플리케이션의 애플리케이션의 핵심 업무 로직에서 공통 기능 로직들(로깅, 보안, 트랙잭션 등)을 분리하는 것.

 

▶ 공통 관심 사항과 핵심 관심 사항

: 공통 관심 사항(Cross-cutting concern)이란 애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들을 말함.

 핵심 관심 사항은 애플리케이션의 주목적을 담당하는 핵심 로직에 대한 관심을 뜻한다.

예를 들어 블로그에서 글을 등록하고 조회하는 기능은 핵심 관심 사항에 해당하며,

그 외 블로그 주인만 글을 등록할 수 있게 하는 보안에 대한 부분은 공통 관심 사항에 해당한다.

 

▶ AOP가 필요한 이유?

: 핵심 로직에서 공통 기능을 분리하는 이유와 같다.

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

여러 서비스에서 공통적으로 사용하는 코드를 서비스마다 작성하는 것은 효율적이지 못할 뿐더러 객체 지향 설계 원칙에 어긋난다. 그래서 공통화 가능한 중복된 코드를 분리하여 재사용할 수 있도록 만드는 것이다. 

 

- 스프링 프레임 워크의 핵심 4. PSA

▶ PSA(Portable Service Abstraction)란?

: 객체지향 프로그래밍에서 추상화클래스의 특성만을 추출해서 일반화하는 것.

PSA서비스의 기능에 일관된 방식으로 접근하여 기술을 유연하게 사용할 수 있도록 하는 것.(일관된 서비스 추상화)
추상화된 상위 클래스를 통해(접근해) 하위 클래스의 기능을 사용하도록 만든 것이다.

 

▶ PSA가 필요한 이유?

: 서비스를 이용하는 접근 방식을 일관적으로 유지하여 애플리케이션의 사용 기술이 변경될 때, 최소한의 수정만으로 변경된 요구 사항을 반영하기 위함이다.

즉, 애플리케이션의 요구 사항 변경에 유연하게 대처하기 위해서 PSA가 필요하다.