프레임워크
프레임워크 개념
비기능적 요구사항(성능, 보안, 확장성, 안정성 등)을 만족하는 구조와 구현된 기능을 안정적으로 실행하도록 제어해주는 잘 만들어진 구조의 라이브러리의 덩어리.
프레임워크는 애플리케이션들의 최소한의 공통점을 찾아 하부 구조를 제공함으로써 개발자들로 하여금 시스템의 하부 구조를 구현하는데 들어가는 노력을 절감하게 해 준다.
예) 게시판 서비스를 만들 때
파일 첨부 구현하는데 시간 많이 듦 -> 파일 첨부 기능은 프레임워크가 지원해 주고 개발자는 게시판 메인 기능에 집중.
즉 프레임워크는 비기능적인 요소들을 구현해야 하는 불합리함을 극복해 주어 개발자가 기능적인 요구사항에 집중할 수 있도록 해준다. 디자인 패턴과 마찬가지로 반복적으로 발견되는 문제를 해결하기 위한 특화된 해결책을 제공한다.
디자인 패턴과 프레임워크의 관련성
- 디자인 패턴
- 프레임워크의 핵심적인 특징.
- 프레임워크 안에 특정 디자인 패턴이 적용되어 있다. 예) 스프링 -> MVC 디자인 패턴
- 애플리케이션을 설계할 때 필요한 구조적인 가이드라인이 되어 줄 수는 있지만, 구체적으로 구현된 기반 코드를 제공하지 않는다. (추상적인 개념)
- 프레임워크
- 디자인 패턴과 함께 패턴이 적용된 기반 클래스 라이브러리를 제공해서 프레임워크를 사용하는 구조적인 틀과 구현 코드를 함께 제공한다.
- 디자인 패턴 + 라이브러리 = 프레임워크
프레임워크의 구성 요소
IoC(Inversion of Control)
제어의 역전. 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신해 줌.
즉, 컨테이너 역할을 해 주는 프레임워크에게 제어하는 권한을 넘겨서 개발자의 코드가 신경 써야 하는 부분을 줄이고자 하는 전략.
쉽게 정리하면, 개발자가 일일이 new 키워드를 써서 필요한 인스턴스를 생성하는 것이 아닌, 프레임워크에게 제어 권한을 넘겨 프레임워크가 클래스를 인스턴스화해주는 것이다. 개발자는 프레임워크가 만들어 준 인스턴스를 사용한다.
- IoC는 제어 흐름이 일반적인 프로그램 흐름과 반대로 동작하기 때문에 제어의 역전이라고 한다.
- 스프링 컨테이너는 IoC를 지원하며, 메타데이터(XML 설정)를 통해 beans를 관리하고 애플리케이션의 중요 부분을 형성한다.
- 스프링 컨테이너는 관리되는 bean들을 의존성 주입(Dependency Injection)을 통해 IoC를 지원한다.
Bean: 스프링이 직접 만들어서 관리하는 자바 객체
IoC(Inversion of Control) 추가 설명
스프링 컨테이너는 관리되는 bean들을 의존성 주입(Dependency Injection)을 통해 IoC를 지원한다. 라는 부분이 너무 어려워서 AI를 활용해 더 정리해 봤다.
IoC의 핵심: 객체의 생성과 연결이라는 제어권을 프레임워크가 가져감으로써, 구성 요소 간의 결합도를 낮춘다.
1. 제어의 주체 변화 (IoC의 실현)
일반적인 프로그래밍에서는 어떤 클래스가 다른 클래스를 필요로 할 때(의존성), 해당 클래스 내부에서 직접 필요한 객체를 생성(New)한다.
-> "내가 사용할 도구는 내가 직접 선택하고 만든다"는 흐름.
하지만 의존성 주입(DI) 환경에서는 클래스가 스스로 객체를 만들지 않는다. 대신 "나는 이런 기능을 가진 객체가 필요해"라고 선언만 해둔다. 그러면 외부의 IoC 컨테이너(스프링)가 객체를 대신 생성하여 적절한 시점에 전달해 준다.
결과적으로 객체의 생명주기 관리라는'제어의 주도권'이 개발자에게서 프레임워크로 넘어가게 되므로, DI는 IoC를 달성하기 위한 구체적인 방법론이 된다.
2. 의존성의 외부 주입 (Dependency Injection)
여기서 '의존성(Dependency)'이란 한 객체가 기능을 수행하기 위해 다른 객체를 참조해야 하는 상태를 말하며, '주입(Injection)'은 이를 외부에서 넣어주는 행위를 말한다.
- 컴파일 타임 의존성 제거: 클래스 내부 코드에 특정 구현체의 이름이 명시되지 않는다. 추상적인 인터페이스에만 의존하게 설계된다.
- 런타임 의존성 결정: 프로그램이 실행되는 시점에 IoC 컨테이너가 설정 정보(메타데이터)를 확인하여, 인터페이스를 구현한 실제 객체를 찾아 연결해 준다.
3. 왜 이것이 '지원'인가?
스프링 컨테이너는 애플리케이션에 필요한 모든 객체(Bean)를 미리 생성하여 보관하고 있다. 그리고 각 객체가 서로 어떤 관계를 맺고 있는지 알고 있다.
- 조립기 역할: 컨테이너는 객체들 사이의 의존 관계를 파악한다.
- 연결 로직 자동화: 필요한 객체를 생성자(Constructor)나 수정자(Setter)를 통해 꽂아준다.
이 과정을 통해 개발자는 객체 간의 관계를 코드로 직접 기술(제어) 하지 않아도 되므로, 자연스럽게 제어의 역전(IoC) 상태가 유지되는 것.
4. 요약
- 의존성 주입(DI)은 객체가 직접 의존성을 해결하는 대신 외부에서 이를 주입받는 '동작 방식'이다.
- 이 방식을 통해 프로그램의 흐름을 결정하는 주도권이 프레임워크로 넘어가는 '제어의 역전(IoC)' 현상이 완성된다.
- 즉, DI는 IoC라는 철학을 구현하는 핵심 기술적 수단.
클래스 라이브러리
프레임워크는 특정 부분의 기술적인 구현을 라이브러리 형태로 제공한다.
라이브러리와 프레임워크의 차이점
실행 제어가 어디서 일어나는 가를 보면 된다.
- 라이브러리
- 개발자가 클래스에서 직접 호출하여 사용.
- 실행의 흐름에 대한 제어를 개발자가 담당.
- 프레임워크
- 프레임워크에서 개발자가 만든 클래스를 호출.
- 실행의 흐름에 대한 제어를 프레임워크가 담당.
디자인 패턴
위에서 프레임워크와의 관련성을 보며 정리했듯, 디자인 패턴은 애플리케이션 설계 시 필요한 구조적인 가이드라인이다.
디자인 패턴 + 라이브러리 = 프레임워크
스프링에서 사용되는 주요 디자인 패턴
- 싱글톤 패턴
- 팩토리 패턴
- 프록시 패턴
- 템플릿 메서드 패턴
- 옵저버 패턴
Spring Framework 개요
스프링 프레임워크란?
Java 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크이다.
- 애플리케이션 프레임워크
- 특정 계층이나 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크
- 경량급 프레임워크
- 단순한 웹컨테이너에서도 엔터프라이즈 개발의 고급기술을 대부분 사용 가능
- 엔터프라이즈 개발 용이
- 개발자가 복잡하고 실수하기 쉬운 Low Level에 많이 신경 쓰지 않으면서 비즈니스 로직 개발에 전념할 수 있게 함
- 오픈소스
- 오픈소스의 장점을 충분히 취하면서 동시에 단점과 한계를 잘 극복함
스프링 프레임워크 특징
- 컨테이너 역할
- Spring 컨테이너는 자바 객체의 생명주기를 관리함.
- IoC(Inversion of Control) 이용
- 애플리케이션 간의 느슨한 결합을 제어함.
- DI (Dependency Injection) 지원
- 설정 파일이나 어노테이션을 통해서 객체 간의 의존관계를 설정.
- AOP 지원
- 트랜잭션, 로깅, 보안과 같은 모듈들을 실제 핵심 모듈에서 분리해서 적용.
- POJO (Plain Old Java Object) 지원
- Spring 컨테이너의 자바 객체는 특정한 인터페이스를 구현하거나 특정 클래스를 상속받지 않아도 됨
- 트랜잭션 처리를 위한 일관된 방법을 지원
- 어떤 트랜잭션을 사용하든 설정을 통해 정보를 관리하므로 트랜잭션 구현에 상관없이 동일한 코드 사용 가능
- 영속성과 관련된 다양한 API 지원
- 데이터베이스 처리를 위한 ORM 프레임워크들과의 연동 지원
스프링 프레임워크 주요 기능
- Core: 다른 기능을 수행하는데 필요한 기반 기능 제공
- Context: 스프링 기본 기능. 애플리케이션의 각 기능을 하는 빈에 대한 접근 방법 제공.
- DAO: JDBC 기능을 좀 더 편리하게 사용할 수 있도록 함
- ORM: 하이버네이트, 마이바티스 같은 영속성 관련 프레임워크와 연동된 기능 제공
- AOP: 관점 지향 기능 제공
- Web: 웹 애플리케이션 개발에 필요한 기능 제공
- WebMVC: 스프링에서 MVC 구현에 관련된 기능 제공
빌드 도구 옵션
- Maven
- XML 기반 설정
- 중앙 저장소를 통한 의존성 관리
- 생명주기 기반 빌드 프로세스
- Gradle
- Groovy 기반 DSL 사용
- Maven과 호환되는 저장소 사용
- 유연한 테스크 정의 가능
<!-- pom.xml 예시 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
// build.gradle 예시
dependencies {
compile 'org.springframework:spring-context:4.3.18.RELEASE'
}
Spring Project 생성
1. Dynamic Web Project 생성
JDK는 설치되어 있으니까 패스하고, 이클립스에서 Dynamic Web Project를 생성한다.
지난번에 했던 서블릿, JSP 프로젝트와 다른 점은 Source folder를 추가해야 한다는 것이다.
기본으로 src/main/java 폴더가 있다. Add Folder를 눌러 3개의 폴더를 추가한다. 이 4개 폴더가 Maven 기반 웹 프로젝트 기본 디렉터리 구조이다.

그리고 Build Path -> Configure Build Path를 눌러 자바 버전을 1.8로 바꿔준다. Project Facets에서도 1.8로 바꿔줘야 한다.
그리고 Configure -> Convert to Maven Project를 눌러 Maven Project로 전환한다.

그러면 파일 구조가 이렇게 된다. Deployed Resources 폴더, target 폴더, pom.xml 파일이 추가된 것을 볼 수 있다.
2. Spring Dependencies 추가
이제 Spring Dependencies를 추가한다.
mvnrepository에서 Spring Web MVC를 검색하고 4.3.18 버전 maven 소스를 복사해서 pom.xml의 </build> 밑에 붙여준다.
<dependencies>
<!-- Source: https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
그러면 Maven Dependencies 폴더가 추가된다.
maven 프로젝트의 구성 요소들

| 구성 요소 | 설명 |
| pom.xml | 프로젝트 정보가 표시되며 스프링에서 사용되는 여러가지 라이브러리를 설정해 다운로드 할 수 있음 |
| src/main/java | 자바 소스 파일이 위치 |
| src/main/resources | 프로퍼티 파일이나 XML 파일 등 리소스 파일이 위치 |
| src/main/webapp | WEB_INF 등 웹 애플리케이션 리소스가 위치 |
| src/test/java | jUnit 등 테스트 파일이 위치 |
| src/test/resources | 테스트 시 필요한 resource 파일이 위치 |
3. STS(Spring Tool Suite) 설치
이제 STS(Spring Tool Suite)를 설치한다.
Help -> Eclipse Marketplace를 눌러 spring 검색 후 3.9.14 버전을 찾아 설치해 준다.

엄청 오래 걸린다. 20분은 넘게 걸린다.
4. Spring Project 생성
New Project를 생성한다.
Spring 폴더 안 Spring Legacy Project를 선택하고 Next를 누른다. 그러면 Spring MVC Project가 나와야 하는데 안 나온다.
원래는 나왔는데 최근 몇 년 전부터 안 나온다고 한다. 그래서 따로 https-content.xml을 다운 받아 워크스페이스.metadata.plugins\org.springsource.ide.eclipse.commons.content.core 경로에 넣어준다.
(참고: https://classroom.emilylecture.com/8)

그럼 이렇게 Spring MVC Project가 나온다.

프로젝트 이름을 springEx로 하고 Next를 누르니 STS MVC Project invalid thread access 에러가 뜬다.
아래 블로그에서 zip 파일을 다운 받아 워크스페이스 \.metadata\.sts\content\org.springframework.templates.mvc-3.2.2 경로에 넣어 주었다. 그러면 에러가 안 뜬다.
(참조: https://nirsa.tistory.com/405#google_vignette)
top-level package 이름을 com.mySpring.myapp으로 하고 Finish를 누른다.

짜잔~ 이렇게 springEx 프로젝트가 생겼다.
❕느낀점
오늘 드디어 스프링 프레임워크를 배우게 되었다.
본격적으로 들어가기에 앞서 개념부터 배우는데 너무 어렵다.. 일단 IoC랑 DI부터 막혔다.
처음 들어보는 생소한 용어가 많아서 진도를 많이 나가지 않았는데도 머릿속이 복잡해진 것 같다.
개념 이해를 일단 하고, 개념적으로 확실히 이해가 안 되는 것은 나중에 실습하면서 차근차근 이해해야겠다.
스프링 파이팅..!
'Spring' 카테고리의 다른 글
| [TIL-260325] 스프링 프레임워크 기초: Ajax Response, RESTful 컨트롤러, MyBatis (0) | 2026.03.26 |
|---|---|
| [TIL-260324] 스프링 프레임워크 기초: Session, Interceptor, 로그인/로그아웃 기능 (0) | 2026.03.24 |
| [TIL-260320] 스프링 프레임워크 기초: Spring WebMVC 실습, bean config 설정 분리 (0) | 2026.03.20 |