티스토리 뷰

Spring | Spring Boot

[Spring] 스프링(Spring)이란?

까리한 새우 2024. 3. 20. 12:38

스프링(Spring)이란?

스프링(Spring)엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크입니다.

무슨 말이지 이해가 안될 것 같으니 좀더 자세히 살펴보도록 하겠습니다.

 

 

 

엔터프라이즈용 Java 애플리케이션 개발을 편하게 해주는..

"엔터프라이즈용" 이라는 단어는 대규모 기업이나 조직에서 사용되는 소프트웨어 애플리케이션을 의미합니다.

기업에서 운영하는 웹 서비스에는 비즈니스 로직이라는 것이 있습니다.

여기서 비즈니스 로직이란, 기업에 제공하는 서비스 코드를 구현한 것으로, 사용자의 요구사항을 해결하기 위한 실질적인 코드입니다.

비즈니스 로직을 구현하는 기술 자체가 정말 복잡하고 어려웠기 때문에, 스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 위해 기술 자체에 대한 공부가 추가적으로 필요한 상황이였습니다.

 

스프링이 등장함으로써, 보다 쉽고 효율적으로 개발할 수 있도록 다양한 도구와 기술을 지원합니다.

예를 들어 Java를 이용한 기술인 JSP, MyBatis, JPA 등 여러가지 기술이 있는데, 이 기술들이 여러 프로젝트에서 많이 사용됩니다.

스프링은 이러한 기술들을 더 편하게 사용할 수 있게 해줍니다.

이러한 스프링 기술은 개발 과정을 간소화해주고 반복 작업을 줄여줍니다.

 

또한 스프링은 Java 애플리케이션 개발이라는 말 그대로 Java 언어를 기반으로 하는 웹 프레임워크이며, Java로 다양한 애플리케이션을 만들기 위한 프로그래밍 틀이라고 할 수 있겠습니다.

 

 

오픈소스..

스프링은 모든 사용자에게 열려있습니다. 

즉, 어떤 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발할 수 있으며, 필요하다면 스프링의 코드를 일부 사용하고 수정하거나 배포할 수 있습니다. 

또한 스프링은 오픈소스 프레임워크이지만, 안정적인 개발과 개선이 보장됩니다.

 

 

경량급..

스프링에서 경량급이라는 용어는 스프링이 복잡하고 무거운, 위에서 설명한 엔터프라이즈급 애플리케이션 개발을 보다 가볍고 유연하게 만들어준다는 것입니다.

스프링을 사용하기 전에 작성했던 코드보다 스프링을 사용하였을 때 개발자가 작성해야 할 코드가 상대적으로 단순해졌습니다.

즉, 경량급 애플리케이션 프레임워크라는 것은 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야만 했던 불필요하거나 반복되는 복잡한 코드들을 제거하여 코드의 복잡성을 낮출 수 있음을 의미합니다. 

 


 

스프링(Spring) 특징

 

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

Java 프로그래밍을 해보신 분들은 당연한 이야기겠지만, 우리가 Java 코딩시에 객체를 생성할 때, new 연산자, 인터페이스 호출, 데이터 클래스 호출 등등의 방식으로 객체를 생성합니다.

Ioc 란 인스턴스(객체)의 생성부터 소멸까지 객체 생명주기 관리를 개발자가 하는 것이 아닌 스프링(컨테이너)가 대신 해주는 것을 말합니다. 즉, 제어권이 개발자가 아닌 스프링이 대신 해준다고 해서 제어 반전이라고 합니다. (제어가 바뀌었다?)

 

IoC의 핵심은 객체의 생성과 객체 간의 관계 설정, 의존성 등을 프로그램 코드 내부가 아닌 외부(예: 프레임워크)에서 관리하는 것입니다.

이로 인해 개발자는 비즈니스 로직에 더 집중할 수 있고, 코드의 결합도는 낮아지며, 유연성과 확장성이 향상됩니다.

 

 

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

의존성 주입이라고 불리는 DI는 소프트웨어 설계 패턴 중 하나로, 객체간의 의존성을 외부에서 주입하는 방식입니다.

의존성 주입을 사용하면 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있고 모듈간의 결합도도 낮출 수 있습니다.

 

Java에서 데이터를 저장하고 가져오는 기능을 외부의 데이터베이스를 사용할 수도 있고, JDBC, MyBatis, JPA 등 다른 프레임워크를 이용해 작성할 수 있습니다. 이때 Spring을 이용하면 그때마다 필요한 부분을 편리하게 변경하면서 적절한 상황에 필요한 기능을 해낼 수 있습니다.

 

자세한 내용은 따로 포스팅 예정이며 지금은 간단하게 정리하자면, 개발자가 아닌 스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)라고 하며, 그 과정에서 A-1 혹은 A-2를 A의 생성자를 통해 주입해주는 것을 DI(Dependency Injection, 의존성 주입)라고 합니다.

 

 

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

애플리케이션을 개발할 때 구현해야 하는 기능들은 크게 공통 관심 사항과 핵심 관심 사항으로 분류할 수 있겠습니다.

핵심 관심 사항을 예로 들자면 애플리케이션의 핵심 기능과 관련된 관심 사항으로, 음식 주문 애플리케이션을 예로 든다면 메뉴 등록하기, 메뉴 변경하기, 가격 지불하기 등이 있을 것입니다.

 

반면에, 공통 관심 사항은 모든 핵심 관심 사항에 공통적으로 적용되는 관심 사항들을 의미합니다.

예를 들어, 우리가 음식 주문 애플리케이션을 이용할 때 무조건 로그인을 한 사용자만 사용이 가능하다고 예를 들겠습니다.

그럴 경우 모든 로직에 (주문하기, 변경하기, 지불하기) 로그인을 하였는지 검토하는 로직이나, 트랜잭션 관리, 로깅, 보안 등과 관련된 기능들이 공통적으로 적용되어야 합니다.

 

만약 핵심 로직 하나하나에 공통된 기능들(로그인 여부확인, 트랜잭션, 로깅관리 등등)이 매번 들어간다면 코드 중복이 발생하고, 또한 공통된 기능을 수정해야 할 때 모든 코드를 하나하나 수정해주어야 하는 정말로 불필요하고 비효율적인 작업을 진행해야 합니다.

 

이러한 문제를 해결하기 위해 공통 관심 사항과 관련된 기능들을 별도의 객체로 분리해낸 다음, 분리해낸 객체의 메서드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있도록 해야하며, 이는 코드의 가독성과 유지보수성이 향상 시킵니다.

이렇게 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직(핵심 관심 사항)으로부터 분리해내는 것을 AOP(Aspect Oriented Programming, 관심 지향 프로그래밍) 라고 합니다.

 

 

4. POJO (Plain Old Java Object) 방식 

POJO란, Plain Old Java Object, 즉 순수 Java 만을 통해서 생성한 객체를 의미합니다.

순수 Java 만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술을 사용한다는 뜻입니다.

 

POJO의 주요 특징

1. 특별한 클래스를 상속받지 않는다.

POJO는 특정 프레임워크의 클래스를 상속받거나 인터페이스를 구현할 필요가 없다. 

따라서, 특정 API나 라이브러리에 종속되지 않는다.

 

2. 필드에 접근하는 getter/setter 메서드를 가진다.

객체의 필드는 대체로 private 접근 제한자를 사용하며, 필드에 접근하기 위한 getter 와 setter 메서드를 제공합니다.

 

내가 POJO에 대한 개념이 익숙치 않고 이해가 되지 않았을 때, 포스팅을 위해 내용을 정리하면서 들었던 생각은 

"분명 스프링은 순수 Java 만을 통해서 생성한 객체를 의미하고 순수 Java만을 사용한다고 하였는데, 스프링은 특정 기술과 API, 라이브러리를 자주 주로 사용하지 않나? 근데 이게 POJO 개념과 일치한 걸까?" 라는 생각을 했다.

 

내가 찾은 답은 이렇다.

 

스프링 프레임워크가 POJO 프로그래밍 모델을 채택하고 있다는 것은 스프링이 개발자들이 순수한 자바 객체를 사용하여 애플리케이션을 개발할 수 있도록 지원한다는 의미이고 특정 기술과 API, 라이브러리에 강하게 의존하는 구조 대신에 느슨한 결합과 유연성을 중시하는 설계 철학을 가지고 있다는 의미이다.

 

스프링 프레임워크는 JDBC, JPA, JSP, Thymeleaf 등 다양한 기술과 통합될 수 있지만, 이러한 통합은 개발자가 선택할 수 있도록 유연하게 설계가 되어있다. 즉, 이러한 기술들과의 통합을 위한 지원은 제공하나, 필요에 따라 이들 없이도 애플리케이션을 구축할 수 있다.

 

다시말해, 스프링 애플리케이션의 핵심 비즈니스 로직은 순수한 자바 객체(POJO)로 작성될 수 있으며, 이는 스프링의 핵심 가치 중 하나인 "비침투성(non-invasiveness)" 과도 일치한다.

 

여기서 비침투성(Non-invasiveness)은 스프링 프레임워크가 강조하는 중요한 개념으로, 개발자가 스프링 특정 인터페이스나 클래스를 상속하거나 구현하지 않아도 되는 것을 의미하는 중요한 개념이다. 

 

또한 위에서 알아본 IoC/DI, AOP 등의 기술들은 POJO 프로그래밍을 위해 스프링이 지원하는 기술이라고 이해할 수 있다.

 


 

참고(출처)

https://jerryjerryjerry.tistory.com/62

https://www.codestates.com/blog/content/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

+ 전지전능한 챗GPT 4.0님