-
(개발지식) 12 - 프레임워크(Framework) 란? + Spring vs SpringBoot개발/개발지식 2024. 1. 24. 15:35
■ 프레임워크(Framework) 란?
: 프레임 워크는 Application 개발 시 필수적인 코드, 알고리즘, 데이터베이스 연동 등과 같은 기능들을 위해
어느정도 뼈대(구조)를 제공해주는 것이다.
이런 뼈대 위에 개발자가 코드를 작성해서 Application 을 완성한다.
뼈대가 있기 때문에 객체 지향 개발을 하면서도 일관성 부족과 같은 문제를 해결해주는 장점이 있다.
따라서 소프트웨어에서 프레임워크를 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합이라 한다.
■ 라이브러리(Library) 란?
: 프레임워크를 검색하면 가장 많이 나오는 개념 중 하나가 라이브러리다.
그렇다면 라이브러리란 무엇일까?
라이브러리란 특정 기능에 대한 도구 혹은 함수들을 모은 집합이다.
즉, 프로그래머가 개발하는데 필요한 것을 모아둔 것이다.
따라서 라이브러리를 간단하게 정의한다면 단순 활용이 가능한 도구들의 집합이다.
■ 프레임워크와 라이브러리의 차이
: 프레임워크와 라이브러리의 차이는 흐름(Flow) 에 대한 제어 권한이 어디에 있느냐의 차이이다.
프레임워크는 전체적인 흐름을 자체적으로 가지고 있어 프로그래머가 그 안에 필요한 코드를 작성한다.
반대로 라이브러리는 사용자가 흐름에 대해 제어를 하며 필요한 상황에 가져다 쓰는 것이다.
그래서 많은 게시글에 프레임워크는 제어의 역전이 있다고 한다.
※ 제어의 역전이란?
: 어떠한 일을 하도록 만들어진 프레임워크에 제어의 권한을 넘김으로써
클라이언트 코드가 신경써야 할 것을 줄이는 전략이다.
일반적으로 개발자는 프로젝트를 생성하고 Main 함수를 만들어 시작지점 형성한다.
그리고 이 Main 함수에서 어떻게 흘러갈 것인지 프로그래머가 순서를 부여하며 흐름을 제어하는 게 일반적이다.
하지만 프레임워크의 경우 실행의 흐름을 프레임워크 자체가 가지고 있어
우리의 코드를 프레임워크 안에 넣어서 진행해야 한다. (적합한 곳에 코드를 넣어야 한다.)
실제로 Maven과 같은 프로젝트도 생성하면 어느정도 뼈대가 만들어져 있고,
그 안에 필요에 따라 우리의 코드를 넣는 것을 확인할 수 있다.
따라서 이렇게 일반적으로 프로그래머가 가지고 있어야 할 제어의 권한을
프레임워크에게 주었기 때문에 제어권한의 일반적인 흐름 순서가 바뀌었다라 여겨 제어의 역전이라 한다.
■ 스프링 프레임워크(Spring Framework) 란?
: 스프링은 자바 백엔드 개발에 자주 사용되는 핵심 기술로,
특히 엔터프라이즈용 자바 애플리케이션을 개발하는 데 이용되는 오픈소스 경량급 애플리케이션 프레임 워크이다.
그렇다면 이 뜻이 무엇일까?
1. 엔터프라이즈용 자바 애플리케이션
: 기업에서 운영하는 웹 서비스에는 비즈니스 로직이 있다.
비즈니스 로직이란 기업이 제공하는 서비스를 코드로 구현한 것으로,
사용자의 요구사항을 해결하기 위한 실질적인 코드이다.
스프링 등장 이전에는 비즈니스 로직 구현을 위해 기술 자체에 대한 공부가 추가적으로 필요했지만,
지금은 개발 초기 설정과 기술만 잘 선택한다면 기술보다는 애플리케이션 로직 자체에 더 집중하여
비즈니스 로직 구현이 가능하다.
따라서 스프링 프레임워크는 비즈니스 애플리케이션 개발에 필요한 로직과 설정을
비교적 가볍게 진행할 수 있어 자바 백엔드 개발자 사이에 활용도가 높다.
2. 오픈소스형 프레임워크
: 스프링 프레임워크는 모든 사용자에게 무료로 열려 있어
개인 및 기업들이 스프링을 사용하여 애플리케이션 개발을 진행할 수 있다.
특히 기업형 애플리케이션을 위해 필요하다면 스프링 코드를 일부 수정하여 사용해도 무관하다는 특징이 있다.
오픈소스 프레임워크이지만 스프링소스 라는 IT 기업에서 이를 관리하고 있으며,
소스 코드 수정 및 개선하는 일에는 스프링소스의 한정 인원만 참여할 수 있다.
따라서 오픈소스 프레임워크이지만 안정적인 개발과 개선이 보장된다.
3. 경량급
: 스프링은 수십개의 세부 모듈 및 수십만줄의 방대한 코드로 이루어져있는 프레임워크이다.
하지만 스프링 이전에 사용하던 기술들과 비교해봤을 때,
스프링을 사용하면 개발자가 작성해야 할 코드가 상대적으로 단순하다.
이전에는 EJB(Enterprise Java Bean) 라는 기술을 주로 사용했으나 여전히 복잡했다.
이에 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야만 했던
불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 이전보다 낮출 수 있게 되었다.
4.애플리케이션 프레임워크
: 프레임워크가 앞서 말했듯이 어떤 목적을 쉽게 달성하기 위한 뼈대로,
특정 업무 분야 혹은 하나의 기술에 집중한다.
애플리케이션 프레임워크는 특정 업무 분야 및 특정 기술이 아니라,
애플리케이션 개발에 필요한 모든 과정에 집중한다.
즉, 애플리케이션 프레임워크란 애플리케이션을 개발함에 있어 필요한 모든 업무 분야 및
모든 기술과 관련된 코드들의 뼈대를 제공한다.
■ 스프링의 특징
● POJO(Plain Old Java Object) 프로그래밍을 지향
: POJO 란 순수 Java만을 통해서 생성한 객체를 의미한다.
순수 자바만을 사용한다는 것은 Java 및 Java 의 스펙에 정의된 기술만 사용한다는 의미이다.
즉, 어떤 객체가 외부의 라이브러리나 외부의 모듈을 가져와 사용한다면 그 객체는 POJO 라 할 수 없다.
POJO 는 말 그대로, 다른 기술을 사용하지 않은 순수한 Java 만을 사용하여 만든 객체를 뜻한다.
POJO 를 지향하는 이유는 만약 객체가 외부 기술을 사용한다 가정해보자.
만약 그 외부 기술이 더 이상 사용하지 않거나(Deprecated),
신기술이 나오게 된다면 우리는 기존 코드를 모두 고쳐야 한다.
하지만 순수 Java 만을 사용한 객체는 특정 기술이나 환경에 종속되지 않는다.
따라서 이를 통해 외부 기술이나 규약의 변화에 보다 유연하게 대처할 수 있으며,
객체지향 설계를 제한없이 적용하게 되어 코드가 단순해지고 테스트와 디버깅이 쉬워진다는 장점을 가진다.
■ 스프링이 지원하는 기술 (loC/DI, AOP, PSA)
POJO 프로그래밍을 위해 Spring 은다음과 같은 3가지 기능을 제공한다.
1. IoC / DI (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)
상단에 인터페이스 I 의 메서드를 하단의 객체 B와 C가 각각 상속받아 구현하도록 한다.
클래스 A의 경우 생성자를 통해 외부로부터 인스턴스를 받아와 i 를 초기화한다.
그리고 methodOfA 에서 외부로부터 받아온 인스턴스의 메서드 i.example() 호출한다.
그렇다면 여기서 A가 어떤 객체를 생성해서 그에 해당하는 메소드를 사용해야하는지 결정해야 한다.
여기서 그것을 결정하는 게 스프링이다.
스프링은 애플리케이션 로직 외부에서 A가 사용할 객체를 별도로 설정 가능하다.
만약 개발자가 설정 클래스 파일에 A가 사용할 객체를 C로 설정하면, (뼈대에 코드를 입력)
애플리케이션이 동작하면서 스프링이 설정 클래스 파일을 해석하고,
개발자가 설정해둔대로 C객체를 생성하여 A의 생성자의 인자로 C를 전달한다.
즉 이와 같이 스프링 뼈대 안에 개발자가 맞춰서 흘러가는 이것을 IoC(제어의 역전) 이라고 하며,
그 과정에서 C를 A의 생성자를 통해 주입하는 것을 DI(의존성 주입) 이라고 한다.
※ 의존성 주입이란?
: 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서
클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여
유연성을 확보하고 결합도를 낮추는 것이다.
의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.
다음과 같이 Store 객체가 Pencil 객체를 사용하고 있는 경우에는 Store 객체가 Pencil 객체에 의존성이 있다고 표현한다.
두 객체간의 관계(의존성)을 맺어주는 것을 의존성 주입이라고 하고
생성자 주입, 필드 주입, 수정자 주입 등 다양한 방법이 있다. (주로 생성자 주입을 권장함)
https://mangkyu.tistory.com/150
2. AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)
: 애플리케이션 개발할 때 구현해야 하는 기능은 크게 1) 핵심 관심 사항 2) 공통 관심 사항 으로 분류할 수 있다.
핵심 관심 사항은 애플리케이션의 핵심 기능과 관련된 관심 사항이다.
공통 관심 사항은 모든 핵심 사항에 공통적으로 적용되는 관심 사항을 의미한다.
따라서 다음 주문앱을 확인해보면 핵심 관심 사항으로는 주문하기, 주문 변경하기, 메뉴 등록하기 임을 알 수 있다.
공통 관심 사항은 로깅, 보안 관련 코드이다.
이렇게 공통 관심 사항 코드가 중복되게 되는데 이러한 공통 관심 사항과 관련된 기능들을 별도의 객체로 분리하고,
객체의 메서드를 통해 공통 관심 사항을 구현하도록 해야한다.
즉, 공통 기능을 비즈니스 로직으로부터 분리하는 것을 AOP(관심 지향 프로그래밍) 이라고 한다.
3. PSA (Portable Service Abstraction, 일관된 서비스 추상화)
: 스프링의 경우, 데이터베이스를 변경해야 할 때 동일한 사용방법을 유지한 채로 데이터베이스를 바꿀 수 있다.
왜냐하면 스프링은 데이터베이스 서비스를 추상화한 인터페이스를 제공해주기 때문이다.
스프링은 Java 를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스를 제공하는데,
이를 JDBC(Java DataBase Connectivity) 라고 한다.
데이터베이스를 만든 각 회사는 자신의 데이터베이스에 접근하는 드라이버를 Java 코드 형태로 배포하는데,
이 드라이버에 해당하는 Java 코드의 클래스가 JDBC를 구현한다.
따라서 JDBC를 기반으로 데이터베이스 접근 코드를 작성하면
이후 데이터베이스를 바꾸어도 기존에 작성한 데이터베이스 접근 로직을 그대로 사용 가능하다.
이렇게 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용할 수 있도록 한 것을
PSA(Portable Service Abstraction, 일관된 추상화) 라고 한다.
■ 스프링부트(SpringBoot) 란?
: 스프링에서는 다음 코드와 같이 애플리케이션을 만들때 여러가지 설정이 필요하다.
이러한 설정을 간편하게 처리해주는 프레임워크가 바로 스프링부트다.
스프링부트는 다음과 같은 설정만 하면 된다.
왜냐하면 스프링 부트가 기존의 복잡한 설정을 대신해주고 있기 때문이다.
더불어 이전에는 배포 시 별도의 외장 웹 서버(ex 톰캣)를 설치하고 War 파일로 빌드하여 배포했으나,
스프링부트는 자체적인 웹 서버를 내장하고 있어 빠르고 간편하게 개발 기술을 배포할 수 있다.
스프링부트는 독립적으로 실행 가능한 Jar 파일로 프로젝트 빌드도 가능해
클라우드 서비스 및 도커와 같은 가상화 환경에 빠르게 배포할 수 있다.
■ 스프링(Spring) 과 스프링부트(SpringBoot) 의 차이 정리
1. 스프링은 개발자가 직접 설정 파일을 작성하나
스프링 부트는 프로젝트 설정과 라이브러리 의존성을 자동으로 처리해준다.
2. 스프링은 외장 웹 서버를 설치해야 하나,
스프링부트는 내장 서버를 제공하여 쉽게 웹 어플리케이션을 실행할 수 있다.
이런 특징으로 봤을 때 사용 목적에 따라서 스프링 또는 스프링부트를 사용하면 된다.
스프링 프레임워크를 보다 세밀하게 제어하고자 하는 경우에는 Spring을,
빠르고 간단하게 스프링 애플리케이션을 개발하고자 하는 경우에는 Spring Boot 를 사용하면 된다.
※ Auto Configuration 이란?
: 자동 구성(Auto Configuration) 은 수많은 빈들을 자동으로 등록해주는 기능이다.
이를 통해 반복적으로 빈을 등록하고 설정하는 부분을 줄이고 편리한 개발을 할 수 있다.
https://www.elancer.co.kr/blog/view?seq=158https://yamyam-spaghetti.tistory.com/56
https://www.inflearn.com/blogs/3315
https://udemy.wjtb.co.kr/newsletter/id/10000593
'개발 > 개발지식' 카테고리의 다른 글
(개발지식) 13 - 인텔리제이 단축키(윈도우 기준) (0) 2024.04.08 (개발지식) 11 - REST / RESTful / RESTful API 란? (0) 2024.01.16 (개발지식) 10 - Dispatcher-Servlet(디스패처 서블릿) (0) 2024.01.15 (개발지식) 9 - 인터넷 기본 도메인, 호스팅, 포워딩 (0) 2023.12.14 (개발지식) 8 - 포트 끊기 ( Web server failed to start. Port 80 was already in use.) (0) 2023.09.14