Spring framework 기초

SangYu Lee·2022년 10월 12일
0

codestates backend

목록 보기
21/30

keyword - Spring FrameWork

Framework란

개발자가 맨땅에서 모든 걸 만든다고 하면 얼마나 오래걸릴까? 애플리케이션의 통신, 데이터베이스 관리 등등을 모든 프로젝트를 만들 때마다 다시 구현해야 한다면 너무 힘들 것이다. 프로젝트마다 공통적인 부분을 미리 뼈대로 만들어놓으면 더 쉽고 빠르고 간편하지 않을까? 그게 바로 framework이다.

  • 개발자가 효율적으로 관리하고, 핵심 로직에 집중할 수 있게 해준다
  • 그렇지만 배워야 할 게 있고 기본 틀을 뜯어고치기가 어렵다

여기서 Library와의 차이도 중요하다. Library는 개발자가 원할 때 사용하는 도구이다. framework는 건물의 구조와 같다면, Library는 창문이나 가구처럼 쉽게 배치하고 바꿀 수 있으며 소프트웨어적으로는 개발자가 '주도권'을 가지고 있는 것이다. framework의 경우에는 개발자가 모르는 로직일 수 있으며 framework 자체로 알아서 동작하기 때문에 개발자에게 주도권이 있지 않다.

Spring

먼저 예전에는 EJB(Enterprise Java Beans)라는 기술을 사용하였다. 이론적으로는 거의 완벽했지만 서버 구축 가격이 너무 비쌌고 느려서 개발자들이 많이 스트레스를 받았다고 한다. Rod Johnson(로드 존슨)이라는 개발자가 EJB의 대안으로 썼던 약 3만줄의 코드를 핵심으로 Juergen Hoeller(유겐 휠러), Yann Caroff(얀 카로프)가 spring을 함께 개발했다고 한다. 'EJB라는 겨울'이 지나고 온 봄이라는 뜻으로 spring이라는 이름을 갖게 되었다.

스프링이라는 것은 여러가지 기술의 모음이다.

스프링 데이터

  • crud 를 편리하게 관리하게 해준다.

스프링 rest docs

  • api 문서화를 편리하게 해준다.

스프링 프레임워크

  • 핵심 기술 : 스프링 DI 컨테이너, AOP, 이벤트, 기타
  • 웹 기술 : 스프링 mvc, 스프링 webFlux
  • 데이터 접근 기술 : 트랜잭션, jdbc, orm xml 지원
  • 기술 통합 : 캐시, 이메일, 원격접근, 스케줄링
  • 테스트 : 스프링 기반 테스트 지원
  • 언어 : 코틀린, 그루비

왜 Spring Framework를 많이 사용할까

  • EJB에서는 불가능했던 객체지향적인 프로그래밍을 가능하게 해준다.
  • 기업용 엔터프라이즈를 위한 더 안정적이고 확장이 용이한 시스템을 구축할 수 있다.

결국 종합적으로 제일 좋아서이다. 이런 장점을 가지게 해주는 Spring Framework의 특징으로는 크게 4가지가 있다.

1. POJO(Plan Old Java Object)기반의 구성
순수 자바 객체라는 의미이지만 두가지는 만족시켜야 한다.
  1. Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
  2. 특정 환경에 종속적이지 않아야 한다. (Tomcat이나 Jetty 등)

POJO를 지향함으로써 얻을 수 있는 것은

  1. 특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
  2. 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거 함으로써 코드가 깔끔해진다.
  3. 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
  4. 특정 기술이나 환경에 종속적이지 않기 때문에 테스트 역시 단순해진다.
  5. 객체지향적인 설계를 제한없이 적용할 수 있다.

결국 spring이라는 것이 EJB가 객체지향적인 java의 특징을 살리지 못했기 때문에 나온 것이라 최대한 객체지향적인 것을 추구하는 것이다. 그래서 spring에서 IOC/DI, AOP, PSA 3가지를 통해 POJO 프로그래밍을 지원하고 있다.

[참고] 객체 지향 설계의 5가지 원칙
SRP(Single Responsibility Principle, 단일 책임의 원칙)
OCP(Open Close Principle, 개방폐쇄의 원칙)
LSP(The Liskov Substitution Principle, 리스코브 치환의 원칙)
ISP(Interface Segregation Principle, 인터페이스 분리의 원칙)
DIP(Dependency Inversion Principle, 의존성 역전의 원칙)


출처: https://itvillage.tistory.com/entry/객체지향-설계-원칙-SOLID-원칙


2. DI(Dependency Injection) 지원
 IOC(Inversion of Control)
서블릿 컨테이너처럼 어플리케이션의 주도권이 사용자가 아닌 프레임워크에 있는 경우를 IOC(제어 역전)라고 한다.
 DI(Dependency Injection)
Spring framework에서는 new 생성자 등을 통해 객체 간에 강한 결합(tight coupling)이 이루어져 있는 것을 interface등과 같은 추상화된 요소를 통해 약한 결합으로 만들어 주는 것을 DI라고 한다. 클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어 지고 있는 것이다. 느슨한 결합을 통해 객체의 변화에도 유연하고 효율적으로 대처할 수 있게 되는 것이 목적이다.
3. AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
AOP는 어플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하여 코드의 간결성을 유지하고, 객체 지향 원칙에 맞는 코드를 구현하고 재사용이 쉽게 만든다.

핵심 관심 사항

  • 어플리케이션의 주 목적과 관계된 관심사항 ex) 음식주문, 라이더배치, 매장위치관리

공통 관심 사항(부가 관심 사항)

  • 로깅, 보안, 트랜스액션 등

4. PSA(Portable Service Abstraction)

애플리케이션에서 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.
PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함이다.

유어클래스에서는 데이터베이스를 예로 들어 설명하였다. 클라이언트는 데이터베이스와 관련된 기능을 요청하기만하면, spring framwork에서 sqlite이든, oracle db이든 알아서 데이터베이스와 관련된 기능을 처리해준다. 클라이언트는 무슨 데이터베이스인지도 모르지만 그냥 요청하면 spring framework가 처리해주는 것이다.

요즘 비슷한 느낌을 받는 게 있다. 내가 사는 건물 1층을 허물고 주차장을 만든다고 한다. 그래서 공사를 하는데 최대한 상하수도 사용을 자제해달라고 요청받았다. 근데 나는 왜 상하수도 사용을 자제해야 하는지 모른다. 그냥 수도를 트니 물이 나왔고 하수구로 물이 빠지니 알아서 잘 처리되겠거니 하기 때문에 내가 물을 사용하는 것이 공사에 어떻게 방해가 되는지 모르는 것이다. 비슷하게 클라이언트도 그냥 spring framework에게 데이터베이스 연결해'줘'라고 하면 해주는 것이다.

profile
아이스커피

0개의 댓글