

당신은 면접장에 와 있다.
Spring을 이용하여 웹 기반 애플리케이션을 개발하셨다고 하는데, Spring이 어떤 역할을 하죠?
식은땀이 흐른다. 내가 개발한 애플리케이션에 대한 설명만 밤새도록 준비했는데, 정작 이걸 개발하는 데 활용한 Spring 프레임워크에 대한 정의는 사전캠프 때 잠깐 보고 말았던 것이다.
'아! Spring에 대한 이해를 확실히 다졌더라면!'
아래와 같이 답변하면 된다.
Spring은 Java 백엔드 개발의 필수 프레임워크워크입니다. 엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스, 경량급 애플리케이션 프레임워크입니다.
면접관의 표정이 밝아진다.
'먹혔다. 조금 더 치고 들어가 보자.'
"Spring은 오픈소스라는 점에서 무료이지만, 소스 코드 수정이나 개선은 스프링소스에서 관리하기 때문에 타 오픈소스 대비 안정성이 굉장히 높은 프레임워크라고 할 수 있습니다. 또 경량급 소프트웨어로서 개발 과정에서 불필요한 코드 작성을 줄여 준다는 장점이 있습니다. 애플리케이션 개발에 필요한 업무 및 기술과 관련된 코드들의 프레임워크가 기본적으로 제공되기 때문에, 애플리케이션 개발 프로젝트에서 꾸준하게 사용했습니다!

이렇게 기술 인터뷰가 이루어지면 좋겠지만 어디 그러겠는가.
Spring의 또 다른 특징은 무엇이 있을까?
POJO 프로그래밍 지향
- Plain Old Java Object - 순수 Java만을 통해서 생성한 객체
- Java 및 Java의 스펙에 정의된 기술만 사용한다(외부 라이브러리/모듈 사용 X)
POJO 프로그래밍이란 기술 국산화로 보면 된다.

예를 들어 보자.
사용하던 외부 라이브러리나 모듈이 deprecated되거나(더이상 사용 또는 업데이트되지 않음 처리) 신기술이 등장하여 기존 코드를 고쳐야 하는 경우, 코드를 바꿔줘야 한다. 처음부터 외부에 의존하지 않으면 이 문제를 예방할 수 있다. 이게 POJO다. 마치 기술을 국산화해서 수입 중단이나 수입 물량 축소에 대비하는 것과 같다.
그런데 POJO 프로그래밍이 쉬웠으면 다 그렇게 했겠지. 어려우니까 이를 뒷받침하는 기술이 필요하다.
대표적으로 IoC/DI, AOP, PSA가 있다. 오늘은 이에 대해 배워보자.
1. IoC/DI (Inversion of Control / Dependency Injection)
제어의 역전 / 의존성 주입 - 이름 한 번 야릇하다.
표현하기 어렵고 뜻을 알기 어렵다는 뜻이다.

상황 : 가~하까지의 객체들이 있고, 각 객체는 B라는 클래스를 사용하고 있다. 즉 B에 의존하고 있다. 이때 B를 C라는 클래스로 대체하려고 한다. 그러면 가~하의 의존 관계를 모두 바꿔줘야 한다. 번거롭다.

이 문제를 해결하려면, 중간에 다리를 놔 주면 된다. 이를 인터페이스라고 하자. 가~하는 모두 인터페이스를 참조한다.
인터페이스는 기존에 B를 참조하고 있다가 참조를 C로 바꿔준다.
짜잔, 모든 클래스가 B 대신 C를 사용할 수 있게 되었다.

여기서 한 가지 차이가 더 있다. 기존에 가~하에서는 B를 사용하기 위해 B라는 객체를 생성했다.
조금 더 비유적으로 말하자면 B라는 프로그램의 복사본을 자기 안으로 가져온 뒤, 직접 B의 기능에 접근했다는 말이다.

하지만 인터페이스를 사용하는 환경(스프링 환경)에서는 직접 객체를 생성할 필요가 없다. 인터페이스에서 B 또는 C의 객체를 생성하고, 가~하는 인터페이스에 접근해서 인터페이스가 가진 객체의 특정 기능을 호출하기만 하면 된다.


| Before | After |
| B 클래스에 해당하는 부분을 가~하 전체에서 바꿔줘야 했음 | 인터페이스가 받는 부분을 B에서 C로만 변경 |
| 직접 new 키워드를 사용하여 인스턴스를 생성함 | 자신이 사용할 객체를 스스로 생성하지 않고, 생성자를 통해 외부(인터페이스)로부터 받아옴 |
그렇다면 위의 예시에서 제어의 역전과 의존성 주입을 어떻게 설명할 수 있을까?
여기서 인터페이스에 해당하는 게 스프링이라고 보면 된다. 기존에는 개발자가 직접 객체 간 의존 관계를 만들어 주었다면, 스프링에서는 설정 클래스 파일이라는 인터페이스에 어떤 객체가 어떤 객체를 사용하는지(의존하는지)에 대한 정보를 기록해 놓음으로써 의존 관계를 맺어주기 때문에 제어가 역전된다. 이에 더해 각 객체가 사용하는(의존하는) 객체를 자체적으로 생성하지 않고 생성자를 통해 외부(인터페이스)로부터 주입받기 때문에 의존성을 주입받는다고 할 수 있다.
2. AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)
IoC/DI를 잘 이해했다면 이는 더 쉽다.
애플리케이션은 여러 핵심 사항(Aspects)들로 이루어진다. 핵심 사항들이 바로 비즈니스 로직이다.
그리고 여러 핵심 사항에 공통적으로 적용되는 공통 사항들이 있다.
핵심사항들과 달리 공통 사항들은 말그대로 모든 핵심 사항들에 공통적으로 적용된다 (마치 위의 예시에서 가~하가 B 또는 C를 참조했던 것처럼)
공통 사항에 변경이 일어날 경우를 대비해서 어떻게 관리하면 좋을까? 당연히 공통 사항들을 별도의 객체로 분리하여 외부(인터페이스)에서 객체를 생성하게 한 뒤, 객체를 받아서 사용하면 된다.
관심 지향 프로그래밍이란 이처럼 애플리케이션 전반에 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 의미한다.
3. PSA (Portable Service Abstraction, 일관된 서비스 추상화)
데이터를 저장하고 있는 데이터베이스는 웹 서버와 실시간으로 소통하며 웹 클라이언트의 요청을 처리한다.
그런데 중간에 데이터베이스를 바꿔야 할 일이 생기면, 사용 방법이 달라지기 때문에 데이터베이스 쪽 코드를 다 수정해야 한다.
스프링은 여기서도 중간자 역할을 한다. 데이터베이스 서비스를 추상화한 인터페이스를 제공해줌으로써 말이다. 이를 Java Database Connectivity, 줄여서 JDBC라고 한다.
이것이 가능한 이유는 각 데이터베이스 개발사에서 자신들의 데이터베이스에 접근하는 드라이버를 Java 코드 형태로 배포하기 때문이다. 이 드라이버에 해당하는 Java 코드의 클래스가 JDBC를 구현한다.
이처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용할 수 있도록 한 것이 PSA다.
느낀 점
이렇게 정리하고 보니 자바도, Spring도 결국 추상화라는 방법을 통해 다양한 환경에서, 다양한 클래스와 데이터베이스를 편리하게 활용할 수 있도록 돕는 도구라는 생각이 든다. 사용법과 특성이 다른 다양한 도구들을 일원화된 경로로 모아 일관된 방법으로 사용할 수 있게 하는 것. 생각해보면 인류의 발전은 멀리 있는 재화나 서비스, 또는 정보들을 취합해서 얻기 위해 중개 플랫폼을 개발하면서 이루어진 게 아닌가. 개발을 공부하는 과정에서 추상화/일원화/인터페이스화가 매우 중요함을 깨닫는다.
출처
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
스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법
스프링은 Java 백엔드 개발에 있어 떼어놓을 수 없는 프레임워크입니다. Java 백엔드의 핵심 기술이 되는 스프링 프레임워크와 스프링 부트가 무엇인지, 나아가 스프링 부트를 활용하여 프로젝트
www.codestates.com
더 많은 정보가 궁금하다면
2025.11.18 - [Backend] - [나의 개발일지] 3. Java와 클래스
[나의 개발일지] 3. Java와 클래스
이번 포스팅에서는 Java에 대해서 대략적으로 알아보도록 하자 1. Java란 어떤 언어인가?Chatgpt에 따르면, Java는 다음과 같은 패러다임, 철학, 용도를 위해 만들어진 언어이다. 일단 요약을 먼저 보
montmer27.tistory.com
2025.11.18 - [Backend] - [SQL Exercise] 4. 필터링, 비교 연산자
[SQL Exercise] 4. 필터링, 비교 연산자
아래와 같은 sparta_students(학생) 테이블이 있습니다.idnametrackgradeenrollment_year1르탄이Node.jsA20232배캠이SpringB20223구구이UnityC20214이션이Node.jsB2022 13.sparta_students 테이블에서 모든 학생의 이름(name)과 트
montmer27.tistory.com
2025.11.14 - [커리어 파인튜닝] - [커리어 파인튜닝] 3. 데이터 엔지니어 커리어 로드맵
[커리어 파인튜닝] 3. 데이터 엔지니어 커리어 로드맵
[3줄요약] 실패데이터엔지니어는 비정형 데이터를 구조화, 분석 가능한 형태로 전달하기 위해, 데이터 수집, 정제 및 처리, 저장, 전달, 품질 관리 및 자동화 업무를 수행한다.데이터 엔지니어링
montmer27.tistory.com
'ETC > etc3' 카테고리의 다른 글
| [SQL Exercise] 6. 문자열 데이터 조작하기 CAST로 데이터 타입 변환하기 (0) | 2025.11.28 |
|---|---|
| [SQL Exercise] 5. 조건문을 이용한 카테고리 분류해보기 (0) | 2025.11.27 |
| [나의 개발일지] 3. Java와 클래스 (0) | 2025.11.18 |
| [SQL Exercise] 4. 필터링, 비교 연산자 (0) | 2025.11.18 |
| [SQL Exercise] 3. 필터링과 정렬 (0) | 2025.11.18 |