1. 결정적인 차이: 제어의 흐름 (Inversion of Control)
- 라이브러리: '나'가 주체가 됩니다. 내가 필요할 때 라이브러리를 직접 호출해서 사용합니다. (내가 도구를 골라 쓰는 것) - 제어의 흐름을 개발자가 가짐
- 프레임워크: '프레임워크'가 주체가 됩니다. 프레임워크가 정해준 규칙대로 코드를 작성하면, 프레임워크가 내 코드를 대신 실행 (틀 안에 내가 들어가는 것) - 제어의 흐름을 프레임워크가 가짐
비유로 이해하기
- 라이브러리는 '연장'. 내가 집을 짓다가 망치가 필요하면 망치를 꺼내 쓰고, 드릴이 필요하면 드릴을 꺼내 씁니다. 언제 어떤 도구를 쓸지는 전적으로 내가 결정합니다.
- 프레임워크는 '모델하우스'. 이미 거실, 안방, 주방의 위치(틀)가 정해져 있습니다. 나는 그 안에서 벽지의 색깔을 고르거나 가구(코드)를 채워 넣을 뿐입니다. 실제 집이 돌아가게 하는 시스템은 모델하우스의 규칙을 따릅니다.
2. 예시 비교
라이브러리 (Library)
- Java의 Math 클래스: 삼각함수나 제곱근 계산이 필요할 때 내가 직접 부릅니다.
- Jackson (JSON 라이브러리): 객체를 JSON으로 바꿀 때 내가 메서드를 호출합니다.
- Lombok: 반복되는 Getter/Setter를 자동으로 만들어주지만, 결국 내가 코드를 작성할 때 보조 도구로 씁니다.
프레임워크 (Framework)
- Spring (자바): 우리가 방금 공부한 AppConfig처럼, 내가 객체를 직접 new 하지 않아도 스프링이 알아서 생성하고 조립하고 실행까지 해줍니다.
- JUnit (테스트): 내가 main 메서드를 실행하는 게 아니라, @Test 어노테이션만 붙여놓으면 JUnit이라는 프레임워크가 내 메서드를 직접 실행합니다.
- Android: 앱이 켜질 때 실행되는 생명주기(Lifecycle)가 이미 정해져 있고, 개발자는 그 단계에 맞는 코드만 채워 넣습니다.
3. 비교표
| 구분 | 라이브러리 (Library) | 프레임워크 (Framework) |
| 제어권 | 사용자(나)가 가짐 | 프레임워크가 가짐 (IoC) |
| 호출 관계 | 내가 라이브러리를 호출함 | 프레임워크가 내 코드를 호출함 |
| 자유도 | 높음 (필요한 것만 골라 씀) | 낮음 (정해진 규칙을 따라야 함) |
| 목적 | 특정 기능을 수행하는 부품 | 애플리케이션의 전체적인 틀 |
'INFLEARN' 카테고리의 다른 글
| [스프링 핵심 원리 - 기본편] 5. Spring Container (0) | 2026.03.13 |
|---|---|
| [스프링 핵심 원리 - 기본편] 4. 순수 Java 코드 → Spring 전환 (0) | 2026.03.12 |
| [스프링 핵심 원리 - 기본편] 2. DIP, OCP 예시 보충 (0) | 2026.03.12 |
| [스프링 핵심 원리 - 기본편] 1. SOLID 원칙 (0) | 2026.03.12 |
| [스프링 입문] 9. AOP 와 프록시 (0) | 2026.03.06 |