Spring Framework

DY_DEV·2023년 4월 3일
0

codestates_TIL

목록 보기
1/1
  • framework: 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것
  • 프로그래밍 상에서의 Framework은 기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공

장점

  • 효율적으로 코드를 작성
  • 정해진 규약이 있어 어플리케이션을 효율적으로 관리할 수 있다.

단점

  • 학습에 많은 시간이 소요됨

프레임워크와 라이브러리의 차이

Library는 애플리케이션을 개발하는 데 사용되는 일련의 데이터 및 프로그래밍 코드.개발할 때 필요한 기능을 미리 구현해놓은 집합체다.

  • 프레임워크는 자동차의 뼈대, 라이브러리는 부품을 의미.
  • 어플리케이션에 대한 제어권의 차이가 있다.
  • 제어권이 개발자에게 있는지, 프레임워크에 있는지.

spring framework의 IoC(Inversion Of Control, 제어의 역전) 특징을 기억하자.


Spring framework

장점

  • POJO(Plan Old Java Object)기반의 구성
  • DI(Dependency Injection) 지원
  • AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
  • Java 언어를 사용함으로써 얻는 장점
    • 정적 타입 언어로서 변수의 타입, 메서드의 입력과 출력이 어떤 타입을 가져야 하는지를 강제 > 여러 사람과 함께 작업 시 타인의 코드 혹은 내가 작성했던 코드를 수정, 보완을 용이하게 할 수 있다. 또한 웹 서버 구축시 런타임 오류를 사전에 방지할 수 있다.

스프링을 많이 쓰는 이유?

기업용 엔터프라이즈 시스템용 애플리케이션 개발에 있어서 개발 생산성과 어플리케이션의 유지 보수를 더 용이하게 하는 최선의 프레임워크이기 때문에.

기업용 엔터프라이즈 시스템

기업용 엔터프라이즈 시스템이란 기업의 업무(기업 자체 조직의 업무, 고객을 위한 서비스 등)를 처리해주는 시스템을 의미합니다. 기업용 엔터프라이즈 시스템은 대량의 사용자 요청을 처리해야 하기 때문에 서버의 자원 효율성, 보안성, 시스템의 안전성이나 확장성 등을 충분히 고려해서 시스템을 구축하는 것이 일반적입니다.

JSP java server page

초창기 자바 웹 애플리케이션 개발의 수단.

  • 사용자에게 보여지는 View 페이지쪽 코드와 사용자의 요청을 처리하는 서버쪽 코드가 섞여있는 형태의 개발 방식입니다.
  • 웹 브라우저를 통해서 사용자에게 보여지는 클라이언트 측 html/Javascript 코드와 사용자의 요청을 처리하는 서버 측 Java 코드가 뒤섞여 있는 방식입니다.

서블릿(Servlet)

클라이언트 웹 요청 처리에 특화된 java 클래스의 일종

  • Spring을 사용한 웹 요청을 처리할때에도 내부적으로는 Servlet을 사용
  • 서블릿 방식의 코드에서는 클라이언트의 요청에 담긴 데이터를 꺼내오는 작업을 개발자가 직접 코드로 작성 해야되고, 캐릭터셋도 지정 해주어야 하는데 반면에 Spring MVC 방식의 코드에서는 눈에 보이지 않지만 그런 작업들을 Spring에서 알아서 처리해줍니다.

POJO(Plain Old Java Object)

  • PO: 자바로 생성하는 순수한 객체

  • POJO 프로그래밍: POJO를 이용해서 프로그래밍 코드를 작성하는 것

    • 규칙1: Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
    • 코드 및 세부규칙
      public class MessageForm extends ActionForm{ // (1)
      	
      	String message;
      
      	public String getMessage() {
      		return message;
      	}
      
      	public void setMessage(String message) {
      		this.message = message;
      	}
      	
      }
      
      public class MessageAction extends Action{ // (2)
      	
      	public ActionForward execute(ActionMapping mapping, ActionForm form,
      		HttpServletRequest request, HttpServletResponse response)
              throws Exception {
      		
      		MessageForm messageForm = (MessageForm) form;
      		messageForm .setMessage("Hello World");
      		
      		return mapping.findForward("success");
      	}
      	
      }
      • 특정 기술을 상속 해서 코드를 작성하는 경우, 만약 어플리케이션의 요구사항이 변경돼서 다른 기술로 변경을 원할 시 사용할 클래스를 전면적으로 수정하거나 제거해야되는 상황이 발생한다.
      • 또한 자바는 다중 상속을 지원하지 않기 때문에 extends 키워드를 사용해서 한번 상속을 하게되면, 위 클래스를 상속받아서 하위 클래스를 확장하는 객체지향 설계 기법을 적용하기 어려워지게 됩니다.
    • 규칙2: 특정 환경에 종속적이지 않아야 한다.
      • 만약 시스템 요구사항이 변경되어서 다른 서블릿 컨테이너를 사용하게 된 경우 최악의 경우 코드를 전부 변경해야하는 상황을 직면할 수 있다.
  • 해당 프로그램의 필요성

    • 특정환경, 기술에 비종속적, 재사용이 가능하다. 또한 확장 가능한 유연한 코드를 작성할 수 있음.
    • 코드가 깔끔해진다.
    • 때문에 디버깅도 상대적으로 쉬워진다.
    • 테스트 또한 단순.
    • 객체지향적인 설계를 제한없이 적용할 수 있다.
  • spring은 pojo프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA 기능을 제공한다.

IoC(Inversion of Control)

어플리케이션 흐름의 주도권이 뒤바뀐 것.

  • 일반적으로 자바 콘솔 어플리케이션의 경우 main() 메서드가 종료되면 어플리케이션의 실행이 종료된다.
  • 웹에서 동작하는 애플리케이션의 경우 클라이언트가 외부에서 접속해서 사용하는 서비스이기 때문에 main()메서드가 종료되지 않아야 한다.
  • 서블릿 컨테이너에는 서블릿 사양에 맞게 작성된 서블릿 클래스만 존재. 별도의 main()는 존재하지 않는다.

엔트리 포인트(Entry point): main() 처럼 어플리케이션이 시작되는 지점

main() 이 없어도 어플리케이션이 실행되는 이유?

= 서블릿 컨테이너의 경우, 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너 내의 컨테이너 로직(service())이 서블릿을 직접 실행시켜 주기 때문에 main() 메서드가 필요없다.

DI(Dependency Injection)

IoC 개념을 조금 구체화 시킨 것

객체지향에서 의존성: 객체 간의 의존성

A 클래스가 B 클래스의 기능을 사용 할 때, ‘A클래스는 B클래스에 의존한다. = A클래스의 프로그래밍 로직 완성을 위해 B 클래스의 기능을 사용한다.

생성자를 통해 어떤 클래스의 객체를 전달 받는 것 > 의존성 주입

“외부에서 객체를 주입한다.” = 생성자의 파라미터로 객체를 전달하는 것.

클래스의 생성자로 객체를 전달 받는 코드가 존재 = 객체를 외부에서 주입 받는 것. 의존성 주입이 이루어지는 것

의존성 주입시 주의할 점

  • 현재 클래스 내부에서 외부 클래스의 객체를 생성하기 위한 new 키워드를 쓸지 말지 여부를 결정하는 것

  • 스텁(Stub)은 메서드가 호출되면 미리 준비된 데이터를 응답하는 것입니다. > 고정된 데이터라 몇 번을 호출해도 동일한 데이터를 리턴(멱등성)

  • new 키워드를 사용해서 객체를 생성하게 되면 참조 할 클래스가 바뀌게 될 경우, 이 클래스를 사용하는 모든 클래스들을 수정할 수 밖에 없습니다.

  • new 키워드를 사용해서 의존 객체를 생성하느 ㄴ경우 클래스들 간에 강하게 결합((Tight Coupling) 이라고 함.

  • 의존성 주입을 하더라도 의존성 주입의 해택을 보기 위해서는 클래스들 간의 강한 결합은 피해야된다. > 느슨한 결합(Loose Coupling) 사용

느슨한 결합

= 인터페이스를 사용

  • 어떤 클래스가 인터페이스 같이 일반화된 구성 요소에 의존하고 있을때, 느슨한 결합이라고 한다.

  • 캐스팅(Upcasting): 인터페이스 타입의 변수에 그 인터페이스의 구현 객체를 할당하는 것.

  • new 키워드를 사용하면 느슨한 관계를 만들 수 없다. > spring으로 해결

spring이 의존 객체들을 주입해준다.

  • 애플리케이션 흐름의 주도권이 사용자에게 있지 않고, Framework이나 서블릿 컨테이너 등 외부에 있는 것 즉, 흐름의 주도권이 뒤바뀐 것을 IoC(Inversion of Control)라고 한다.
  • DI(Dependency Injection)는 IoC 개념을 조금 구체화 시킨 것으로 객체 간의 관계를 느슨하게 해준다.
  • 클래스 내부에서 다른 클래스의 객체를 생성하게 되면 두 클래스 간에 의존 관계가 성립하게 된다.
  • 클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어 지고 있는 것이다.
  • new 키워드를 사용하여 객체를 생성할 때, 클래스 간에 강하게 결합(Tight Coupling)되어 있다고 한다.
  • 어떤 클래스가 인터페이스 같이 일반화 된 구성 요소에 의존하고 있을 때, 클래스들 간에 느슨하게 결합(Loose Coupling)되어 있다고 한다.
  • 객체들 간의 느슨한 결합은 요구 사항의 변경에 유연하게 대처할 수 있도록 해준다.
  • 의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.
  • Spring에서는 애플리케이션 코드에서 이루어지는 의존성 주입(DI)을 Spring에서 대신 해준다.

AOP(Aspect Oriented Programming)

관심 지향 프로그래밍

  • AOP라는 것은 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것

OOP = 객체지향 프로그래밍, 객체 간의 관계를 지향한다. 그럼 관심을 지향한다는건?

  • 어플리케이션에 필요한 기능 중 공통적으로 적용되는 공통 기능에 대한 관심을 의미.
  • 공통 관심 사항(Cross-cutting concern)
  • 핵심 관심 사항(Core concern):어플리케이션의 주목적을 달성하기 위한 핵심 로직에 대한 관심사 (반대> 부가적인 관심 사항 = 공통 관심 사항)

AOP의 필요성

  1. 코드의 간결성을 유지한다.
  2. 객체 지향 설계 원칙에 맞는 코드를 구현할 수 있다.
  3. 코드의 재사용이 용이하다
  • 핵심 로직에 공통적인 기능을 가지는 코드들이 혼재해 있으면 코드 자체가 복잡해진다.

  • 코드에서 rollback, commit 등이 섞여서 사용되면 AOP가 적용되지 않은 것. > 어플리케이션의 다른 기능에도 중복되어 나타날 확률이 높다.

  • 해결: 중복된 코드를 공통화해서 재사용 가능하도록 만든다. > spring에선 이미 이런 트랜잭션 처리 기능을 AOP를 통해서 공통화 했음.

  • @Transactional 어노테이션 사용.

  • AOP를 활용하면 애플리케이션에 전반에 걸쳐 적용되는 공통 기능(트랜잭션, 로깅, 보안, 트레이싱, 모니터링) 등을 비즈니스 로직에서 깔끔하게 분리하여 재사용 가능한 모듈로 사용할 수 있다.

  • 자바에서 AOP로 적용 가능한 공통 기능의 종류

    1. 로깅(logging): 애플리케이션에서 발생하는 이벤트를 기록하는 기능으로, 디버깅이나 성능 최적화에 유용합니다.
    2. 보안(security): 애플리케이션의 보안 기능을 구현하기 위한 기능으로, 권한 체크나 인증 기능을 추가할 수 있습니다.
    3. 트랜잭션(transaction): 데이터베이스 연산이나 파일 입출력 등의 작업을 트랜잭션으로 묶어서 관리하는 기능으로, 데이터의 일관성을 유지할 수 있습니다.
    4. 캐싱(caching): 자주 사용되는 데이터를 메모리에 저장하여 처리 속도를 높이는 기능으로, 데이터베이스나 파일에서 데이터를 읽는 비용을 줄일 수 있습니다.
    5. 예외 처리(exception handling): 예외 상황이 발생했을 때 처리하는 기능으로, 예외 발생 시 로깅이나 재시도 등의 작업을 수행할 수 있습니다.
    6. 성능 모니터링(performance monitoring): 애플리케이션의 성능을 측정하고 모니터링하는 기능으로, 애플리케이션의 병목 현상을 파악하고 최적화할 수 있습니다.
  • 트레이싱이란?

    자바에서의 트레이싱(Tracing)은 애플리케이션의 실행 과정에서 발생하는 이벤트나 상태 정보를 기록하고 분석하는 기술을 말합니다. 트레이싱을 통해 애플리케이션의 동작을 디버깅하거나, 성능 문제를 찾아 해결하거나, 다양한 이슈들을 분석할 수 있습니다.

PSA(Portable Service Abstraction)

= 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것. (psa. 일관된 서비스 추상화)

일반적으로 서버 / 클라이언트 측면에서는 서버 측 기능을 이용하는 쪽을 클라이언트라고 합니다. 우리가 알고 있는 대표적인 클라이언트는 바로 웹 브라우저입니다.

서비스 추상화: 추상화의 개념을 어플리케이션에서 사용하는 서비스에 적용하는 기법

PSA가 필요한 이유

PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함입니다.

= 어플리케이션의 요구사항에 유연하게 대처 가능.

Spring에서 PSA가 적용된 분야로는 트랜잭션 서비스, 메일 서비스, Spring Data 서비스 등이 있습니다.

  • 객체지향 프로그래밍 세계에서 어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는것을 추상화(Abstraction)라고 한다.
  • 클라이언트가 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 일관된 서비스 추상화(PSA)의 기본 개념이다.
  • 애플리케이션에서 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.
  • PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함이다.

0개의 댓글