본문 바로가기
프로그래밍 언어

[스프링부트] 등장 배경, 주요 특징, 핵심 4가지

by 내기록 2023. 5. 30.
반응형

목차 LIST

     

     

    프레임워크란?

    소프트웨어 개발을 수월하게 하기 위한 소프트웨어 개발 환경입니다. 프레임워크는 frame(틀)과 work(일하다)의 합성어로 일하기 쉬운 틀을 제공하는 것입니다. 프레임워크는 정해진 틀에서 개발해야 한다는 단점이 있지만 개발 효율은 높다는 장점이 있습니다.

    프레임워크는 애플리케이션을 개발할 때 전체적인 구조를 잡기 위해 사용하는 것이고, 라이브러리는 개발을 하는 과정에서 필요한 기능을 구현하기 위해 사용하는 것입니다.

    스프링과 스프링 부트?

    스프링의 등장 배경

    엔터프라이즈 어플리케이션이라는 용어는 대규모의 복잡한 데이터를 관리하는 애플리케이션입니다. 은행 시스템을 생각해보면, 몇 천만명의 사람이 한꺼번에 잔고를 조회하고 입금이나 출금 요청을 하거나 새로운 통장을 개설하기도 합니다.

    이렇게 엔터프라이즈 애플리케이션은 많은 사용자의 동시 요청을 처리해야 하므로 서버 성능과 안정성, 보안이 매우 중요합니다. 그런데 이런 것들을 신경쓰면서 사이트 기능 즉, 비즈니스 로직까지 개발하기는 매우 어렵습니다. 엔터프라이즈 애플리케이션을 위한 개발 환경은 제공받고 기능 개발에만 집중할 수 있다면 얼마나 좋을까요?

    이런 상황에서 스프링 프레임워크가 등장했습니다. 스프링 프레임워크는 앞서 언급한 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구로 개발자들은 이제 기능 개발에 집중할 수 있게 되었습니다.

    스프링부트?

    스프링은 장점이 많지만 설정이 매우 복잡하다는 단점이 있습니다. 그래서 스프링의 단점을 보완하기 위해 스프링 부트를 출시했습니다.

    즉, 스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구입니다.

     

    스프링부트의 주요 특징

    • 톰캣, jetty, 언더토우 같은 웹 애플리케이션 서버(Web Application Server, WAS)가 내장되어 있어서 따로 설치하지 않고 독립적으로 실행할 수 있다.
    • 빌드 구성을 단순화하는 스프링 부트 스타터를 제공한다.
    • XML 설정을 하지 않고 자바 코드로 모두 작성할 수 있다.
    • JAR을 이용해서 자바 옵션만으로 배포가 가능하다.
    • 애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터(spring actuator)를 제공한다.

    스프링부트는 스프링에 속한 도구입니다.

     

    차이 1) 구성의 차이

    스프링은 애플리케이션 개발에 필요한 환경을 수동으로 구성해야 하지만 스프링 부트는 코어와 스프링 MVC의 모든 기능을 자동으로 로드하므로 수동으로 개발 환경을 구성할 필요가 없습니다.

     

    차이 2) 내장 WAS의 유무

    스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에 배포됩니다. WAS란 간단히 웹 애플리케이션을 실행하기 위한 장치를 말합니다. 하지만 스프링 부트는 WAS를 자체적으로 가지고 있어서 jar 파일만 만들면 별도의 WAS 설정을 하지 않아도 애플리케이션을 실행할 수 있습니다. 참고로 스프링 부트의 내장 WAS에는 톰캣, 제티, 언더토우가 있어서 상황에 맞게 선택할 수 있습니다.

     

    스프링 스프링 부트

    목적 엔터프라이즈 애플리케이션 개발을
    더 쉽게 하기 위함
    스프링의 개발을 더 쉽고
    빠르게 하기 위함
    설정 파일 개발자가 수동으로 구성 자동 구성
    XML 일부 파일은 XML로 직접 생성 관리 사용X
    인메모리
    데이터베이스 지원
    지원하지 않음 자동 설정 지원
    서버 프로젝트를 띄우는 서버(톰캣, 제티)를 별도로 수동 설정 내장형 서버를 제공해 별도 설정이 필요없음

     

    스프링 핵심 개념

    제어의 역전과 의존성 주입

    스프링은 모든 기능의 기반을 제어의 역전(IoC)과 의존성 주입(DI)에 두고 있습니다.

    IoC?

    Inversion of Control으로 제어의 역전을 뜻합니다.

    다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말합니다.

    클래스 B 객체를 직접 생성하지 않고 다른데서 받아와서 사용하고 있다고 추측할 수 있습니다. 실제로 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 합니다.

    Public class A {
    	b = new B(); // new 키워드로 클래스 B의 객체 생성
    }
    
    Public class A {
    	private B b; // 코드에서 객체를 생성하지 않고 다른데서 받아온 객체를 b에 할당
    }
    

    DI?

    앞서 말한 것처럼 스프링에서는 객체들을 관리하기 위한 제어의 역전을 사용합니다. 그리고 제어의 역전을 구현하기 위해 사용하는 방법이 DI(Dependency Injection) 즉 의존성 주입입니다.

    DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻입니다. @Autowired 라는 애너테이션은 스프링 컨테이너에 있는 빈 이라는 것을 주입하는 역할을 하는데요. 빈은 스프링 컨테이너에서 관리하는 객체를 말합니다.

    이전 코드에서는 개발자가 직접 B 객체를 생성했지만 아래 코드에서는 B b; 라고 선언만 했을 뿐 직접 객체를 생성하지는 않고 있습니다. 즉 객체를 주입받고 있습니다.

    Public class A {
    	// A에서 B를 주입받음
    	@Autowired
    	B b;
    }
    

    이렇게 코드를 작성할 수 있는 이유는 스프링 컨테이너에서 객체를 주입했기 때문입니다. 쉽게 말하면 스프링 컨테이너가 B 객체를 만들어 클래스 A에 준 것입니다.

    정리하면, 객체를 사용하고 싶은 경우 객체를 직접 생성하지 않고 스프링 컨테이너에서 객체를 주입받아 사용합니다. 이 IoC/DI 개념은 스프링의 핵심 개념이라고 할 수 있을 만큼 중요합니다.

     

    빈과 스프링 컨테이너

    스프링 컨테이너?

    스프링 컨테이너는 앞서 본 것처럼 빈을 생성하고 관리합니다. 즉 빈이 생성되고 소멸되기 까지의 생명 주기를 스프링 컨테이너가 관리하는 것입니다. 또한 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원하기도 합니다.

    빈?

    빈은 스프링 컨테이너가 생성하고 관리하는 객체로 앞선 코드에서 B가 바로 빈입니다. 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등 여러 방법을 제공합니다. 즉 여러 방법으로 빈을 등록할 수 있습니다.

    예를 들어, MyBean 이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록됩니다. 이렇게 되면 스프링 컨테이너에서 이 클래스를 관리합니다. 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꿔 관리합니다. 이 예제에서는 myBean이 됩니다.

    @Component // 클래스를 빈으로 등록
    Public class MyBean{
    }
    

    앞으로 빈은 스프링 객체라고 생각하면 좋습니다.

     

    AOP : 관점 지향 프로그래밍

    http://wiki.gurubee.net/pages/viewpage.action?pageId=26740833

    AOP (Aspect Oriented Programming) 으로 관점 지향 프로그래밍입니다.

    의미를 풀어보면 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미합니다.

    예를 들어 계좌 이체, 고객 관리 프로그램이 있을 때 각 프로그램에는 로깅 로직과 데이터베이스 연결 로직이 포함됩니다. 핵심 관점은 계좌 이체, 고객 관리 로직이고, 부가 관점은 로깅, 데이터베이스 연결 로직입니다.

    로깅과 데이터베이스 연결은 모두 계좌 이체와 고객 관리에 필요합니다. 여기에 AOP 관점을 적용하면 부가 관점에 해당하는 로직을 모듈화합니다. 즉 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있게 해줍니다. 그 결과 핵심 관점 코드에만 집중할 수 있게 될 뿐만 아니라 프로그램의 변경과 확장에도 유연하게 대응할 수 있습니다.

     

    SPA: 이식 가능한 서비스 추상화

    PSA(Portable Service Abstraction)으로 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말합니다.

    대표적인 PSA 예는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션입니다. 스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 등이 있는데 여기서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원합니다.

    또 다른 예시로는 WAS도 PSA의 예시 중 하나라고 볼 수 있습니다. 코드는 그대로 두고 WAS를 톰캣에서 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있기 때문입니다.

     

     

    스프링 핵심 4가지 정리

    IoC : 객체의 생성과 관리를 개발자가 아닌 프레임워크가 대신한다.
    DI : 외부에서 객체를 주입받아 사용한다.
    AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발한다.
    PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 한다.

     

     

    References

    스프링 부트 3 백엔드 개발자 되기: 자바 편

    반응형

    댓글