[스프링부트] 스프링 프레임워크, 특징

HONG·2023년 9월 11일

기술면접

목록 보기
2/6
post-thumbnail

1. WAS, WS의 차이

WAS (Web Application Server)

  • 비즈니스 로직을 넣을 수 있음
  • ex) Tomcat, PHP, ASP, .NET

WS (Web Server)

  • 비즈니스 로직을 넣을 수 없음
  • ex) Nginx, Apache

차이점

Web Application ServerDB 연산이나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server를 의미한다. 이는 HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어이다. Web Container, Servlet Container 라고도 불리며, 대표적인 예로는 Tomcat, Jetty 등이 존재한다.

반면 Web Server클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠인 HTML, CSS, Image 파일 등을 제공하는 서버를 의미한다. 대표적인 예로는 Apache Server, Nginx 등이 존재한다.

이처럼 Web Application Server 와 Web Server 를 분리하는 이유는,
자원 이용의 효율성 및 장애 대응, 배포 및 유지/보수의 편의성을 위해서이다.



2. 프레임워크, 라이브러리의 차이

프레임워크 (Framework)
특정한 문제 해결을 위해 어느 정도의 뼈대, 즉 구조를 제공해주는 것

라이브러리 (Library)
특정 기능 사용을 위한 도구나 함수들의 모음


차이점

프로그램의 전체 흐름에 대한 제어권에서 차이가 발생한다.

프레임워크프로그램의 전체적인 흐름을 자체적으로 가지고 있으며, 프레임워크가 사용자가 작성한 코드를 호출해서 사용한다.

반면 라이브러리사용자가 프로그램의 전체적인 흐름을 제어하며, 사용자가 코드로써 라이브러리의 특정 기능을 직접 가져다 사용하는 것을 의미한다.



3. Spring Framework

Spring Framework란

  • Java의 오픈소스 애플리케이션 프레임워크 중 하나
  • Java 기반 엔터프라이즈 애플리케이션 개발을 위해 다양한 서비스를 제공해주는 프레임워크
  • 동적인 웹사이트를 개발하기 위한 여러 가지 서비스를 제공
  • 다양한 애플리케이션을 만들기 위해 기본적인 틀을 구성해줌으로써 개발자가 비즈니스 로직에 집중하게 끔 도와줌
  • 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준 프레임워크의 기반 기술

3-1. Spring Framework의 특징

(1) DI

Dependency Injection, 의존성 주입

클래스 및 계층 간에 필요한 의존 관계를 Bean 설정 정보를 바탕으로 IoC Container가 자동으로 연결해주는 것을 의미한다.

각각의 계층이나 서비스들 간에 의존성이 존재할 경우, 설정 파일이나 어노테이션을 통해 객체 간의 의존 관계를 미리 설정해두면 스프링 컨테이너가 의존 관계를 자동으로 연결해준다.

의존성 주입은 생성자 주입 / setter 주입 / 필드 주입, 총 3가지 방법이 있다. Spring에서 가장 권장하는 방법은 생성자를 통한 주입 방법인데, 순환 참조를 방지하고, 불변성을 가지며, 테스트에 용이하기 때문이다.

  • 장점: 코드의 재사용성 향상, 테스트하기 쉬운 코드

(2) IOC

Inversion of Control, 제어의 역전

개발자가 작성한 프로그램의 제어권이 개발자가 아닌 프레임워크에 넘어가 Spring에서 사용자의 코드를 호출하는 것을 말한다.

사실 Spring Framework만의 특징은 아니고, 많은 프로그램들이 IoC를 적용하고 있다.

Spring에서는 인스턴스의 생성부터 소멸까지, 개발자가 아닌 IoC 컨테이너에서 대신 관리한다.

그리고 IoC 컨테이너에 객체들을 생성하면, 객체끼리 의존성을 주입(DI)하는 역할을 하고, 이 때 컨테이너에 등록한 객체들을 ‘빈’이라고 한다.

  • 장점: 코드의 결합도 감소, 유지보수성 향상

(3) AOP

Aspect Oriented Programming, 관점 지향 프로그래밍

AOP는 공통된 작업들을 따로 떼어내서 모아두고, 필요한 곳에 간단하게 붙여서 사용할 수 있도록 해주는 개발 기법이라고 할 수 있는데, 쉽게 말해 “잘게 쪼개진 특정 관심사를 떼어내고 따로 다루는 것”이다.

AOP의 사용 예로는 로깅, 트랜잭션, 보안 등이 있는데, 이처럼 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

핵심 비즈니스 로직에 부가 기능을 하는 모듈이 중복되어 분포되어 있을 경우 사용할 수 있다.

  • 장점: 중복 코드 제거, 재활용성의 극대화, 변화수용의 용이성

[참고: AOP 용어]

  • Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지 정의
  • Joinpoint : Advice를 적용이 가능한 지점을 의미 (before, after 등등)
  • Pointcut : Joinpoint의 부분 집합으로, 실제로 Advice가 적용되는 Joinpoint를 나타냄
  • Weaving : Advice를 핵심 로직 코드에 적용하는 것
  • Aspect : 여러 객체에 공통으로 적용되는 공통 관심 사항을 말함 ex) 트랜잭션, 보안


3-2. DI 종류와 차이 (=Spring Bean을 주입받는 방법)

  1. 생성자 주입
    객체를 생성할 때 해당 객체가 필요로 하는 모든 의존성을 생성자를 통해 주입 받는다.
    → 의존성이 누락되는 경우 방지, 불변성 보장
    ⇒ 불변, 필수 의존 관계에 사용

  2. Setter 주입
    의존성을 주입 받는 setter 메소드를 통해 객체에 주입한다.
    setter 메소드를 통해 의존성 변경 가능 → 주입된 의존성도 나중에 변경 가능
    ⇒ 선택, 변경 가능성이 있는 의존 관계에 사용. 스프링 빈을 선택적으로 등록 가능

  3. 필드 주입
    객체의 필드를 통해 의존성을 주입하는 방법으로, @Autowired 를 사용한다.
    외부에서 변경이 불가능하여 테스트하기 힘들며, DI 프레임워크 없이는 작동하기 힘들다.
    ⇒ 애플리케이션과 관계 없는 테스트코드나, @Configuration 같은 스프링 설정 목적으로 사용

  • +) Bean이 주입 될 때 같은 이름 및 같은 타입의 빈이 존재한다면,
    @Primary 어노테이션으로 우선순위 설정할 수 있고,
    @Qulifier 어노테이션으로 Bean 이름을 통해서 주입 받을 수 있고,
    해당 타입의 빈을 모두 List를 통해서 주입 받을 수 있다.


3-3. IoC 컨테이너

IoC 컨테이너란 Spring Bean, 즉 IoC Container에서 관리하는 객체의 생성과 관계 설정, 사용, 제거 등 전체 라이프 사이클을 관리해주는 작업을 하는 컨테이너를 의미한다.

IoC Container의 대표적인 명세는 BeanFactory 인데, 요즘은 이를 상속하는 ApplicationContext 를 사용하는 추세이다.

ApplicationContextBeanFactory 를 상속하는 인터페이스로, BeanFactory 의 기능뿐만 아니라 메세지 다국화, 이벤트 발행 기능, 리소스 로딩 기능 등 여러 기능을 명세하고 있다.

참고: ChatGPT 의 설명

Spring Framework에서 IoC (Inversion of Control) 컨테이너의 핵심 인터페이스로서, BeanFactory와 ApplicationContext는 둘 다 Bean 관리 및 의존성 주입을 처리하는 데 사용됩니다. 그러나 두 인터페이스 간에는 몇 가지 차이점이 있습니다.

BeanFactory:

  1. 지연 로딩 (Lazy Loading): BeanFactory는 빈을 "게으르게" 로딩합니다. 즉, 빈이 처음으로 요청될 때까지 빈이 생성되지 않고, 실제로 사용될 때 빈이 생성됩니다. 이것은 자원을 절약하고 애플리케이션 시작 시 초기화 시간을 줄이는 데 도움이 됩니다.
  2. Bean 인스턴스 캐싱: BeanFactory는 생성된 빈 인스턴스를 캐싱하여 동일한 빈을 여러 번 요청할 때마다 새로 생성하지 않도록 합니다. 이것은 싱글톤 범위의 빈을 관리하는 데 유용합니다.
  3. XML 또는 프로퍼티 파일 기반 설정: 주로 XML 또는 프로퍼티 파일을 사용하여 Bean 정의와 구성 정보를 제공하는 데 사용됩니다.
  4. 가장 낮은 수준의 인터페이스: Spring IoC 컨테이너의 가장 기본적인 인터페이스이며, 애플리케이션에 필요한 기능을 최소한으로 제공합니다.

ApplicationContext:

  1. 좀 더 강력한 기능: ApplicationContext는 BeanFactory의 확장 버전으로, 더 많은 기능을 제공합니다. 더 많은 기능은 보안, 이벤트 발행 및 처리, 국제화 지원 등을 포함합니다.
  2. 지연 로딩 및 미리 로딩: ApplicationContext는 기본적으로 빈을 미리 로딩하여 애플리케이션 시작 시 모든 빈을 생성하고 초기화합니다. 이것은 애플리케이션 시작 시간이 오래 걸릴 수 있지만, 빈이 처음 요청될 때까지 대기하지 않습니다.
  3. XML, 어노테이션, Java 기반 설정 지원: ApplicationContext는 다양한 설정 방법을 지원하며, XML 외에도 어노테이션과 Java 기반 설정을 통해 빈을 정의하고 구성할 수 있습니다.
  4. 다양한 미리 정의된 빈: ApplicationContext는 다양한 미리 정의된 빈(예: 메시지 소스, 이벤트 발행자 등)을 포함하고 있습니다.
  5. ApplicationEvent 및 ApplicationListener: ApplicationContext는 이벤트 발행 및 이벤트 리스너를 지원하여 애플리케이션 내에서 이벤트 기반 프로그래밍을 수행할 수 있게 해줍니다.

일반적으로 대부분의 Spring 애플리케이션에서는 ApplicationContext를 사용하는 것이 권장됩니다. ApplicationContext는 더 많은 기능을 제공하며 더 편리한 방법으로 빈을 관리하고 구성할 수 있습니다. BeanFactory는 일반적으로 특수한 상황에서 더 낮은 수준의 컨트롤이 필요할 때 사용됩니다.



3-4. Spring IoC Container의 Bean 등록 방법

IoC Container에 Bean을 등록하는 방법으로는

  1. xml 설정 파일을 이용하는 방법
  2. Configuration 클래스에서 어노테이션을 사용해서 Bean을 등록하는 방법: @Configuration
  3. Bean 등록을 하고 싶은 클래스에서 어노테이션을 통해서 Bean을 등록하는 방법: @Service

등이 존재한다.

2, 3번의 방법 같이 어노테이션 기반의 Bean 등록 시에는 Component Scan을 필수적으로 해야하지만, Spring Boot의 경우 Component Scan까지 자동으로 구성해줘서 매우 편리하게 사용할 수 있다.



3-5. Spring AOP (OOP, AOP)

OOP (객체 지향 프로그래밍)
객체를 중심으로 프로그램을 구축하는 패러다임이다.
데이터와 메서드(동작)를 하나로 묶어서 관리하고, 객체 간의 상속 및 다형성을 활용하여 코드 재사용성을 높이는 데 초점을 둔다.

[ 목표 ]

  • 코드의 모듈화, 추상화, 캡슐화, 상속, 다형성 등을 통해 객체 간의 관계 구축
  • 코드의 가독성과 재사용성 향상

AOP (관점 지향 프로그래밍)
OOP의 보완적인 개념으로, 프로그램의 횡단 관심사를 중심으로 프로그램을 구축한다.
횡단 관심사는 여러 부분에서 반복적으로 발생하는 기능 또는 로직(예: 로깅, 트랜잭션 관리)을 의미한다.

[ 목표 ]

  • 횡단 관심사를 분리하여 모듈화 & 객체의 핵심 비즈니스 로직에서 횡단 관심사를 분리
    → 코드의 결합도 감소, 유지보수성 향상

정리

OOP객체와 클래스를 중심으로 코드를 모델링하고 구성하는 데 중점을 두며,
AOP횡단 관심사를 중심으로 코드를 모듈화하고 분리하는 데 중점을 둔다.

실제로 공통 기능을 모든 모듈에 적용하기 위한 방법으로 상속을 이용하는데, Java에서는 다중 상속이 불가능하다. 그리고 기능 구현 부분에서 핵심 코드와 공통 기능 코드가 섞여 있어 보기에도 불편하고 효율성이 떨어지는 문제가 있다. 이를 해결하기 위해 AOP가 등장했다.

이러한 두 패러다임은 상호 보완적으로 사용되어 복잡한 소프트웨어 개발과 유지보수를 더욱 효과적으로 처리하는 데 도움을 준다.



4. Spring, Spring Boot의 차이

가장 큰 차이점은 Auto Configuration의 차이.

  • Spring : 프로젝트 초기 다양한 환경 설정 필요
  • Spring Boot : 설정의 많은 부분을 자동화 → 사용자가 편하게 스프링 활용 가능
    • spring boot starter dependency만 추가해주면 설정 완료
    • 내장 Tomcat → 서버 바로 실행 가능

Spring Framework 와 Spring Boot의 가장 큰 차이는 Auto Configuration, 즉 자동 설정의 차이이다.
Spring Boot는 Spring Boot Starter Project를 통해서 특정 어플리케이션 개발을 위한 설정을 자동으로 구성해주고, 관련 라이브러리 간의 호환성 문제를 해결해준다.

예를 들어, Spring MVC 프로젝트를 Spring Framework 기반으로 구성한다면, 컴포넌트 스캔 / 관련 Bean 설정 / DispatcherServlet 설정 / View Resolver 설정 / JDBC 설정/ 웹 jar 설정 등 다양한 설정이 필요하고 이 때 버전 간의 호환성 문제가 발생할 수도 있지만,

Spring Boot Starter Web을 사용해서 프로젝트를 구성한다면 초기 구성에 걸리는 비용 문제와 호환성 이슈 등을 해결할 수 있다. 또한 Spring Boot에서는 내장 Servlet Container인 tomcat이 자동적으로 설정된다.

0개의 댓글