Spring 기본 개념

배고픈귤·2025년 8월 13일

Backend

목록 보기
7/11

IoC(제어의 역전)

제어의 역전(Inversion of Control)에서 ‘제어’란 객체의 생성, 사용, 소멸과 같은 실행 흐름을 의미한다.
기존에는 이러한 제어를 개발자가 직접 관리했지만, Spring 같은 프레임워크가 이를 대신 관리하면서 제어 권한이 프레임워크로 넘어가게 되었다.
이로 인해 유지보수가 용이해지고 코드가 간결해진다.
IoC를 구현하는 방법은 여러 가지가 있지만, 대표적으로 의존성 주입(Dependency Injection)이 있다.

DI(의존성 주입)

의존성이란 A 객체가 B 객체를 사용해야 할 때, A가 B를 의존한다고 표현한다.
기존에는 A 객체 내부에서 B 객체를 직접 생성했기 때문에, 만약 B 대신 C 객체를 사용해야 한다면 A의 코드를 수정해야 했다.
이렇게 의존 대상이 고정되어 있으면 결합도(coupling)가 높아져 변경이 어렵다.

이를 해결하기 위해 객체 생성 로직을 외부로 분리하고, A는 오직 인터페이스에만 의존하도록 만든다.
실제 어떤 구현체를 사용할지는 외부에서 주입(Injection)해 주는 방식이다.
이를 통해 DIP(Dependency Inversion Principle) 원칙을 지킬 수 있으며, 결합도를 낮추고 유연성을 높일 수 있다.

API(Application Programming Interface)

API는 소프트웨어끼리 정보를 주고받기 위한 규칙(인터페이스)이다.
클라이언트와 서버 간 통신 규칙 중 하나인 REST API는 URL과 HTTP 메서드(GET, POST, PATCH, DELETE 등)로 구성된다.
이러한 규칙을 통해 서로 다른 시스템 간에도 데이터를 주고받을 수 있다.

라이브러리

라이브러리는 자주 사용하는 기능을 미리 구현해 모아 놓은 코드 집합이다.
개발자는 필요한 기능을 제공하는 라이브러리를 import 하여 원하는 위치에서 호출해 사용할 수 있다.
실행 흐름을 포함한 전체 구조 제어는 여전히 개발자가 담당한다.

프레임워크

프레임워크는 소프트웨어 개발을 위해 기본적인 뼈대와 규칙, 실행 흐름을 제공하는 구조이다.
개발자는 이 규칙에 맞게 필요한 코드를 작성하고, 실행 흐름은 프레임워크가 주도한다.

예를 들어 Spring의 경우 다음과 같다.

•	Controller: 요청/응답 처리
•	Service: 비즈니스 로직
•	Repository: 데이터 접근
•	Database: 데이터 저장

또한 @Annotation, 네이밍 규칙 등 정해진 규칙이 존재하며, 이를 기반으로 Spring 컨테이너가 객체를 관리하고 실행한다.
라이브러리와 달리 프레임워크는 흐름 제어 권한을 가진다(제어의 역전).

AOP(관점 지향 프로그래밍)

AOP(Aspect-Oriented Programming) 는 핵심 로직 전후에 반복적으로 등장하는 횡단 관심사(cross-cutting concerns) 를 분리하여 관리하는 기법이다.
예를 들어 쇼핑몰 결제 기능에서 핵심 로직은 ‘결제’이지만, 이 외에도 로깅, 권한 체크, 예외 처리, 트랜잭션 관리 등은 여러 기능에서 공통적으로 사용된다.
AOP를 사용하면 이러한 공통 기능을 독립된 모듈로 정의하고, 실행 시점에 지정한 순서에 따라 자동으로 적용할 수 있다.

장점: 코드 간결화, 유지보수성 향상, 핵심 로직 집중 가능
단점: 과도한 사용 시 흐름 추적이 어려워지고, 코드 이해도가 떨어질 수 있음

서블릿

서블릿(Servlet) 은 클라이언트의 요청을 분석하고, 알맞은 형식의 응답을 반환하는 Java 기반 서버 프로그램이다.
개발자는 핵심 비즈니스 로직에 집중하고, 요청·응답 처리와 같은 부가 기능은 서블릿이 담당한다.

동작 과정

1.	클라이언트가 요청을 보내면 서버(예: Tomcat)가 이를 수신한다.
2.	서버 내부의 서블릿 컨테이너가 URL 매핑을 통해 해당 요청을 처리할 서블릿을 찾는다.
3.	첫 요청이면 서블릿 인스턴스를 생성하고 init() 메서드를 호출한다. 이후 요청에서는 기존 인스턴스를 재사용한다.
4.	HTTP 메서드(GET, POST 등)에 따라 doGet() 또는 doPost() 메서드를 실행한다.
5.	요청 데이터를 처리하고 응답 데이터를 생성한다.
6.	서블릿 컨테이너가 응답을 HTTP 응답 메시지로 변환하여 클라이언트에 전송한다.
7.	서버가 종료되거나 서블릿이 내려갈 때 destroy() 메서드가 호출되어 리소스를 해제한다.

0개의 댓글