Spring은 Java 애플리케이션 개발에 사용되는 오픈소스 경량급 애플리케이션 프레임워크이다. 아래 두 가지 키워드로 Spring의 정의를 명확하게 이해할 수 있다.
프레임워크 (Framework)
프레임워크는 소프트웨어 개발에 필요한 기본 구조와 기능을 제공하여 개발을 더 쉽고 빠르게 해주는 도구이다. 쉽게 말하면, 프레임워크는 미리 만들어진 코드의 뼈대라고 할 수 있다. 프레임워크를 사용하면 개발이 더 쉬워지지만, 제공된 구조와 규칙에 따라야 한다는 제약이 있다. 예를 들어, Spring 프레임워크에서 특정 작업을 수행하는 코드는 정해진 위치에 들어가야 한다.
오픈 소스 (Open Source)
오픈 소스는 소스 코드가 공개되어 누구나 자유롭게 사용할 수 있고, 수정 및 배포할 수 있는 소프트웨어를 의미한다. 즉, Spring은 모든 사용자에게 무료로 제공되고, 필요에 따라 Spring 코드를 일부 수정해서 사용하여도 무방하다.
요약하면, Spring은 Java 애플리케이션 개발에 필요한 기본 구조와 기능을 제공하는, 자유롭게 사용 가능한 프레임워크이다.
라이브러리와 프레임워크 모두 일반적인 문제 해결에 다른 사람이 작성한 코드를 사용하는 방법이다. 그렇다면 이 둘의 차이점은 무엇일까? 핵심은 바로 통제권에 있다.
라이브러리의 경우, 코딩 과정에서 개발자가 필요할 때 특정 라이브러리를 호출하게 된다. 필요하지 않다면 호출하지 않아도 되고, 같은 기능을 수행하는 다른 라이브러리를 호출하는 것도 가능하다. 이 경우 코드 흐름에 대한 통제권은 개발자에게 있다.
프레임워크의 경우, 개발자가 프레임워크를 호출하는 것이 아니라, 프레임워크의 규칙에 맞춰서 코딩을 진행하는 것이다. 프레임워크 사용 시 개발자는 해당 프레임워크의 틀 안에서 작업을 진행하게 되고, 특정 코드가 들어가야 하는 위치 등의 규칙은 프레임워크가 결정한다. 이 경우 코드 흐름에 대한 통제권은 프레임워크에 있다.
쉬운 예시를 통해 비교하면, 프레임워크는 주방, 라이브러리는 주방 도구로 비유할 수 있다. 싱크대의 위치, 가스레인지의 위치 등 주방의 "뼈대"는 원하는 대로 변경할 수 없다. 물을 끓이기 위해서 가스레인지에 냄비를 올리고, 설거지는 싱크대에서 하는 등, 정해진 위치에서 원하는 작업을 수행해야 한다. 반면, 주방 도구는 쉽게 가져오거나 바꿀 수 있고, 현재 작업에서 어떤 도구를 사용할지 자유롭게 선택할 수 있다.
Spring Framework의 특징은 흔히 위의 그림으로 표현된다. 위의 그림은 Spring Framework의 주요 특징인 POJO, IoC, DI, AOP, PSA를 내포하고 있다.
POJO는 Spring의 가장 핵심적인 특징이라고 할 수 있다. POJO는 Plain Old Java Object의 약자로, Java만을 통해서 생성한 객체를 의미한다. 순수한 Java 객체를 사용하는 것이 어떤 의미가 있는 것일까?
순수한 Java 객체 외에 외부 기술을 사용하면 해당 기술과의 종속성이 생기게 되고, 기술을 대체하는 경우 전체 코드를 수정해야 한다는 문제점이 생기게 된다. 반면, POJO를 사용하는 경우 특정 기술이나 환경에 대한 종속성이 없어지고, 코드가 간결해짐에 따라 디버깅이 쉬워진다. IoC, DI, AOP, PSA는 이러한 POJO 프로그래밍 패러다임을 위해 스프링 부트가 지원하는 기술이라고 볼 수 있다.
IoC는 객체의 생성과 그 객체의 생명 주기 관리를 개발자가 아닌 프레임워크가 담당하게 하는 디자인 패턴이다.
Spring에서는 애플리케이션 컨텍스트(Application Context)가 이러한 역할을 담당하고, 관리되는 객체를 빈(Bean) 이라고 한다.
DI는 객체가 필요로 하는 의존성을 외부에서 주입해주는 방식으로, IoC의 구현 방식 중 하나이다. 이를 통해 객체가 자신의 의존성을 직접 생성하지 않고, 외부에서 주입받음으로써 객체 간의 결합도를 낮출 수 있다.
Spring에서는 @Autowired 어노테이션을 통해 의존성 주입을 쉽게 구현할 수 있다.
AOP는 관심사의 분리라고 해석할 수 있다. 이는 프로그램을 두 가지 관점으로 바라보겠다는 의미인데, 하나는 공통 관심사항, 다른 하나는 핵심 관심사항이다. 핵심 관심사항은 애플리케이션의 주요 비즈니스 로직을 의미하고, 공통 관심 사항은 모든 핵심 관심 사항에 공통적으로 적용되는 사항들, 예를 들면 보안, 로깅 등을 의미한다. AOP는 중복되는 공통 관심사항을 독립된 모듈로 분리하여, 핵심 비즈니스 로직과 혼합되지 않도록 하는 것이다.
PSA는 특정 기술이나 환경에 종속되지 않는 일관된 방식으로 서비스를 추상화하는 개념이다. 예를 들어, Spring Framework와 MySQL 데이터베이스를 연동하여 사용하다가, 데이터베이스를 MariaDB로 변경하더라도 동일하게 사용이 가능하다. 이는 Spring Framework가 여러 데이터베이스 서비스에 대해 공통된 추상화를 제공하기 때문이다. 이처럼 Spring 프레임워크는 다양한 환경과 기술에서 일관된 프로그래밍 모델을 제공하며, JDBC, JPA, Hibernate 등 다양한 기술 스택을 일관된 방식으로 사용할 수 있게 한다.
Spring Framework의 문제점은 강력한 기능을 제공하기 위해 많은 설정과 구성이 필요하고, 의존성 관리 문제를 개발자가 설정하는 등, 사용이 복잡하다는 점이다. 이에 따라, Spring Boot는 Spring Framework를 보다 쉽게 사용할 수 있도록 만들어진 프레임워크이다.
Spring Boot는 Spring Framework에서 제공하는 여러 기능(Spring MVC, Spring JPA, Spring Security 등)을 자동으로 설정하여, 개발자가 보다 쉽게 사용할 수 있도록 한다. Spring Boot는 설정과 의존성 처리 등을 자동으로 처리하며, 내장 서버를 제공하여 쉽게 웹 애플리케이션을 실행할 수 있다. 요약하면, Spring은 다양한 설정을 통해 유연하고 확장 가능한 엔터프라이즈 애플리케이션을 개발하는 데 사용되며, Spring Boot는 이러한 설정을 자동화하여 빠르고 쉽게 애플리케이션을 개발하고 실행하는 데 사용된다.
Spring Framework의 특징들은 직관적으로 이해가 되더라도, 실제로 해당 기능들이 어떻게 구현되고 작동하는지 명확한 이해가 쉽지 않다. 다음 게시글부터는 Spring Framework의 각 특징들을 예시와 함께 자세하게 알아보고자 한다.