본문 바로가기
[ java ]

Spring Boot 란? 스프링과 스프링부트 차이점

by 히앤님 2024. 3. 23.
반응형
SMALL

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

🍀 스프링(Spring) 이란?

자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크

- JAVA로 다양한 어플리케이션을 만들기 위해 개발을 더 쉽게 할 수 있도록 도와주는 프레임워크

- 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공(jsp, MyBatis, JPA 등등)

- 전자정부 표준 프레임워크의 기반 기술로서 쓰이고 있다.

- 중복코드 사용률을 줄이고 비지니스 로직을 더 간단하게 해주며, 오픈소스를 좀 더 효율적으로 가져다 쓸 수 있음.

 

🍀 스프링의 특징

˙ 경량 컨테이너로서 자바 객체를 직접 관리한다.

˙ POJO(Plain Old Java Object) 방식의 프레임워크

    - POJO : 단순하고 가벼운 자바 객체(우리가 자바에서 개발하는 지극히 평범한 객체)

˙ IoC(Inversion of Control; 제어 반전) 지원

    - 필요에 따라 컨트롤의 제어권을 사용자가 갖지 않고 스프링에서 사용자의 코드를 호출

˙ DI(Dependency injection; 의존성 주입)를 통한 객체 간의 관계 구성

˙  AOP(Aspect-Oriented Programming; 관점 지향 프로그래밍) 지원

˙ 영속성과 관련한 다양한 서비스 지원

    - iBATIS, 하이버네이트 등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스 제공

˙  확장성이 높다.

    - 수많은 라이브러리가 스프링에서 지원되고 있기 때문에 사용에도 라이브러리를 별도로 분리하기도 용이하다.

 

🍀 스프링의 개발을 더 쉽게 해주는 기술들

1.  POJO(Plain Old Java Object) 방식

- POJO는 Java EE를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하여 나타난 용어이다.
- 별도의 프레임 워크 없이 Java EE를 사용할 때에 비해 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기 용이하고, 객체가 가볍다.
- 즉, getter/setter를 가진 단순한 자바 오브젝트를 말한다.

기존에는 프레임워크가 너무 무겁고 내용도 방대했다. 이러한 니즈를 충족하기 위해 경량 프레임워크인 스프링이 등장했다. 기존에 Java EE의 경우 미리 설계되어있는 인터페이스나 클래스를 상속받아서 무거운 객체들을 만들어야만 했는데, Spring은 일반적인 java 코드만으로 객체를 구성할 수 있게 된다. 따라서 더 유연하고 가볍게, 생산성을 높이며 프로그래밍이 가능해진다.

 

▼ JAVA EE란?

더보기

JAVA EE는 엔터프라이즈 에디션의 자바 플랫폼이다.

  • 자바 플랫폼 Java SE  (Standard Edition)
  • 자바 플랫폼 Java EE  (Enterprise Edtion)
  • 자바 플랫폼 Java ME (Micro Edtion)
  • Java FX 

모든 자바 플랫폼들은 자바 가상 머신(JVM)과 API로 구성되어 있다. JVM이 어플리케이션을 동작시키기 위한 프로그램이고 API는 개발에 필요한 함수들을 패키지로 묶어서 배포한다.

기본은 JAVA SE가 스탠다드라는 이름 답게 흔히 많이 쓰는 java.lang.*, java.io.*, java.util.* 등등 java 프로그래밍 언어를 배울때 사용하는 대부분의 패키지를 포함한다.

 

그렇다면 JAVA EE는 뭘까? JAVA SE 위에 구축된 버전으로 대규모, 다계층, 확장 가능한 특징이 있으며 대규모일 때 안정적이고 안전한 네트워크 애플리케이션을 개발 및 실행하기 위한 API를 추가로 포함한다. JAVA EE가 servlet, JSON, REST API, 웹소켓 등을 지원한다.

 

근데 이를 대규모로 지원하려다보니 용량도 크고 포함한 패키지가 많아서 속도가 느려지기도 한다는 말이다.


 

2. IoC(Inversion of Control, 제어 반전)

Spring에 가장 핵심적인 기능. 한마디로 알아서 해주는 비서가 하나 생겼다.

개발자는 JAVA 코딩시 new 연산자, 인터페이스 호출, 데이터 클래스 호출 방식으로 객체를 생성하고 소멸시킨다.

IoC란 인스턴스 (객체)의 생성부터 소멸까지 객체 생명주기 관리를 개발자가 하는게 아닌 스피링(컨테이너)가 대신 해주는 것을 말한다.

IoC는 개발자가 실수할 수 있는 생명주기 관리를 대신 해준다. 프로젝트 규모가 커질수록 객체와 자원을 이용하는 방법이 더 복잡해져 코드가 꼬일 수 있는데 이를 Spring의 IoC가 대신 자동 관리해준다.

ex) Spring IoC Container 에 Bean으로 등록된 것들을 의존성 주입하기 위해 어노테이션 @Autowired를 사용한다.

단, 제어권은 개발자가 아닌 IoC에게 있으며 IoC가 개발자의 코드를 호출하여 그 코드로 생명주기를 제어한다.

 

3. DI(Dependency Injection, 의존성 주입)

프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부의 설정파일을 통해 정의되는 방식이다.
코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다.

쉽게 말하자면 게임 캐릭터라는 하나의 객체가 존재하는데, 그 객체를 더 잘 이용하기 위해서 무기, 방패 등 아이템을 가져와 결합시키는 것이다. 이 객체는 무기와 방패를 뺐다 꼈다 자유자재로 할 수 있으며 아이템을 갈아끼우는데 어떤 상황에 구애받지도 않는다.(그리고 그 아이템을 갈아끼우는걸 IoC Container가 해준다.)

JAVA에서 데이터를 저장하고 가져오는 기능을 외부의 Oracle Database를 사용할 수도 있고, JDBC, iBatis, JPA 등 다른 프레임 워크를 이용해 짤 수도 있다. 이때 Spring을 이용하면 그때마다 필요한 부분을 뺐다 꼈다 하면서 적절한 상황에 필요한 기능을 해낼 수 있다.

 

▼ Spring은 DI를 지원하는 조립기다. 의존성 주입을 지원하는 방식은 크게 3가지이다.

 

더보기

1) 생성자 주입

public class Car {
    private Tire tire;

    public Car(Tire tire) {
        this.tire = tire;
    }
}

생성자 주입은 위에서 보았던 예시처럼 생성자를 사용해서 외부에서 주입을 해주는 것.

 

2) setter 주입

public class Car {
    private Tire tire;

    public Tire getTire() {
        return tire;
    }

    public void setTire(Tire tire) {
        this.tire = tire;
    }
}



public class Client {
    public static void main(String[] args) {
        Tire tire = new KoreaTire();
        Car car = new Car();
        car.setTire(tire);   // setter 의존성 주입
    }
}

생성자를 통해 의존성을 주입하면 한번 장착한 타이어는 더 이상 타이어를 교체할 수 없다는 문제점이 존재한다. 운전자가 원할 때 타이어를 교체하고 싶다면 setter 의존성 주입을 사용해야 한다.

 

3) 필드 주입

 생성자 의존성 주입을 할 때도 생성자에 실수로 필드를 적지 않을 수 있다. 이러면 컴파일 에러가 발생하지 않기 때문에.. 테스트 코드를 실행해보기 전까지는 알 수 없다.

 

그래서 이러한 경우를 사전에 방지하고자 필드에 final 키워드를 사용하는 것을 권장한다. final 키워드가 붙어있는데 생성자에 초기화 되지 않는다면 컴파일 에러가 발생하기 때문에 개발자의 실수를 사전에 막을 수 있다는 장점이 있다.


 

 

4. AOP(Aspect Object Programming, 관점 지향 프로그래밍)

AOP : 관점별로 나눠 모듈화해서 필요할때마다 끼워쓴다.

어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화하는 방법이다. 즉, 코드를 부분적으로 나눠서 중복되는 코드들을 Aspect(관점별로)를 이용해서 모듈화한(=묶는)다.

로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리 할 수 있다.

각각의 클래스가 있다고 가정하자. 각 클래스들은 서로 코드와 기능들이 중복되는 부분이 많다. 코드가 중복될 경우 실용성과 가독성 및 개발 속도에 좋지 않다. 중복된 코드를 최대한 배제하는 방법은 중복되는 기능들을 전부 빼놓은 뒤 그 기능이 필요할때만 호출하여 쓰면 훨씬 효율성이 좋다.

즉, AOP는 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법이다.

 

5. PSA (Portable Service Abstraction, 일관된 서비스 추상화)

환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조를 의미한다. POJO 원칙에 따라 가벼워지고 생산성이 높아진 Spring은 PSA 방식으로 추상화가 되어있어 가능하다.

Java Framework에서 사용 가능한 라이브러리들은 다양하지만 각자의 사용 방법이 다르다. 만약 MySQL 사용하던 시스템에서 DB를 Maria DB로 변경한다면 기존 소스를 일일히 수정해줘야 하지 않겠는가? 이럴 때 Spring을 사용하면 동일 사용방법을 유지한 채로 DB를 변경할 수 있다. Spring이 데이터베이스 서비스를 추상화한 인터페이스를 제공해주기 때문이다.(이 경우 Java를 이용해서 DB에 접근하는 방법을 규정한 인터페이스를 JDBC라고 한다.)

쉽게 말해 중간 어댑터(Adapter)가 하나 있는 것이다. 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한다.

 

🍀 Spring  MVC 구조

  • 모델-뷰-컨트롤러 패턴 : 소프트웨어 디자인 패턴 중 하나
  • M (Model) / V (View) / C (Controller)
    • Model : 어플리케이션의 정보나 데이터, DB 등을 말합니다.
    • View : 사용자에게 보여지는 화면, UI를 말합니다. 모델로부터 정보를 얻고 표시합니다.
    • Controller : 데이터와 비즈니스 로직 사이의 상호 동작을 관리합니다. 즉, 모델과 뷰를 통제합니다. MVC 패턴에서 View와 Model이 직접적인 상호 소통을 하지 않도록 관리합니다.

MVC 패턴은 크게 MVC 1 패턴과, 스프링이 채택한 MVC 2 패턴으로 나눌 수 있습니다.

MVC1

MVC1 패턴의 경우 View와 Controller를 모두 JSP가 담당하는 형태를 가집니다. 즉 JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽습니다.

단순한 프로젝트에는 괜찮겠지만 내용이 복잡하고 거대해질수록 이 패턴은 힘을 잃습니다. JSP 하나에서 MVC 가 모두 이루어지다보니 재사용성도 매우 떨어지고, 읽기도 힘들어집니다. 즉 유지보수에 있어서 문제가 발생합니다.


MVC2

MVC2 패턴은 널리 표준으로 사용되는 패턴입니다. 요청을 하나의 컨트롤러(Servlet)가 먼저 받습니다. 즉 MVC1과는 다르게 Controller, View가 분리되어 있습니다. 따라서 역할이 분리되어 MVC1패턴에서의 단점을 보완할 수 있습니다. 그러므로 개발자는 M, V, C 중에서 수정해야 할 부분이 있다면, 그것만 꺼내어 수정하면 됩니다. 따라서 유지보수에 있어서도 큰 이점을 가집니다.

MV2는 MVC1 패턴보다 구조가 복잡해질 수 있지만, 개발자가 이러한 세부적인 구성까지 신경쓰지 않을 수 있도록 각종 프레임워크들이 지금까지 잘 발전되어 왔습니다. 그 중에서 대표적인 것이 바로 스프링 프레임워크입니다.

 

스프링 프레임워크 MVC2 패턴

스프링에서는 유저의 요청을 받는 DispathcerServlet이 핵심입니다. 이것이 Front Controller의 역할을 맡습니다.

Front Controller(프런트 컨트롤러)란, 우선적으로 유저(클라이언트)의 모든 요청을 받고, 그 요청을 분석하여 세부 컨트롤러들에게 필요한 작업을 나눠주게 됩니다.

 

즉, Front Controller

1. 클라이언트 요청에 맞는 Controller 클래스에 매핑해주는 HandlerMapping에게 검색을 요청하고 => "야 찾았어!"

2. 위에서 매핑된 Controller가 비지니스 로직을 수행하고 => "일하는중"

3. 로직을 수행한 결과물들을 가지고 있는 ViewResolver에게 "이런 이름을 가진 view를 줘" 라고 요청하고 => "결과물 여기"

4. ViewResolver에게 받은 알맞은 결과물을 클라이언트에게 결과화면으로 리턴합니다. => "니가 원하던거 줄께"

 

와 같은 역할을 하게 됩니다.


스프링 부트 프레임워크 (Spring Boot Framework)

🍀 스프링 부트(Spring Boot) 란?

스프링이 기존 기술에서 복잡성을 줄인 프레임워크지만, 그럼에도 불구하고 사용 시 여러 사항들을 설정해줘야 한다.
Spring Boot는 이러한 설정 내용을 간략히 줄여준 프레임워크다. 그렇게 될 수 있는 이유는 Spring Boot가 기존의 복잡한 설정을 대신 해주기 때문이다.
 
Spring Boot는 자체적인 웹 서버를 내장하고 있어, 기존 스프링보다 빠르고 간편하게 배포할 수 있다. 또한 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어, 클라우드 서비스 및 도커와 같은 가상화 환경에도 빠르게 배포 가능하다.

 

반응형
LIST

댓글