WeeklyPaper 주제: 프레임워크와 라이브러리의 차이점을 제어 흐름의 주체와 사용 방식을 중심으로 설명하고, Spring Framework와 일반 Java 라이브러리를 예시로 들어 설명하세요.
프레임워크 (Framework)
프레임워크는 단어에서 볼 수 있는것처럼 틀이나 기본적인 구조로 생각해볼 수 있다. 주택, 아파트, 학교 등 여러가지의 빌딩이 존재하지만 설계할 때는 기본적으로 공통으로 들어가는 틀이 있다.
이와 같이 코딩으로 생각하자면, 프레임워크는 전반적인 실행 흐름을 프레임워크가 담당하고 개발자는 그 안에서 정의된 방식에 따라 코드를 작성는 방식으로 진행해야 한다.
그래서 그런지, 프레임워크는 무척 편리하기도 하지만 동시에 개발자의 유연성과 자유도가 떨어지고, framework마다 작동 기능이 다르기 때문에 learning curve도 있는 편이다.
Spring은 대표적인 Java의 프레임워크로, IoC(Inversion of Control, 제어의 역전)와 DI(Dependency Injection, 의존성 주입)를 기반으로 동작한다. IoC란 객체의 생성과 제어를 개발자가 아닌 프레임워크가 대신하는 것이다. DI는 프레임워크가 필요한 의존 객체를 자동으로 주입해주는 개념이다.
예를 들면, Spring의 IoC/DI를 적용하지 않은 코드를 보자:
public class MemberService {
private MemberRepository repo;
public MemberService() {
this.repo = new MemberRepository(); // 개발자가 직접 생성
}
}
이 코드에서는 개발자가 직접 new 키워드를 사용해서 new MemberRepository() 등 인스턴스를 직접 하고 있다 (제어가 개발자에게 있다).
이 방식은 객체 생성과 의존성 연결을 개발자가 직접 담당하므로, 코드 간 결합도가 높고 테스트도 어렵다.
Spring에게 제어권을 주면 어떻게 될까?
@Service
public class MemberService {
private final MemberRepository repo;
@Autowired
public MemberService(MemberRepository repo) {
this.repo = repo; // Spring이 자동으로 주입
}
}
이렇게 쓰게 되면, Spring이 알아서 주입을 해주므로 이제 개발자는 직접 new 키워드를 사용해서 인스턴스화를 안해도 된다. 모든 객체의 생성과 연결은 이제 Spring이 컨트롤하고 있으며, 이것이 바로 제어의 역전(Inversion of Control, IoC)이다.
즉, Spring은 단순한 코드 모음이 아니라 전체 제어 흐름을 담당하는 프레임워크이며, 개발자는 그 구조 안에서 필요한 기능만 정의하면 된다.
라이브러리 (Library)
그러면 라이브러리는 어떻게 다를까?
라이브러리는 프레임워크와 달리, 제어 흐름의 주도권은 개발자에게 있다. 개발자가 필요할 때 원하는 기능을 직접 호출해서 사용하는 구조다.
여기서 프레임워크와 가장 큰 차이가 들어나는데, 프레임워크는 전체 프로그램의 흐름을 통제하고 개발자가 그 안에 코드를 끼워 넣는 반면, 라이브러리는 개발자가 필요할 때만 함수를 가져다 쓰는 방식이다.
예를 들어, Java의 표준 라이브러리 중 하나인 Collections는 대표적인 라이브러리이다.
List<String> names = Arrays.asList("Mary", "John", "Katy");
Collections.sort(names);
여기서 Collections.sort()는 개발자가 직접 호출하며, 제어 흐름은 여전히 개발자가 작성한 코드에 있다. 어떤 시점에 어떤 데이터를 정렬할지는 전적으로 개발자가 결정한다.
'Spring' 카테고리의 다른 글
| [SpringBoot] @Controller와 @RestController의 차이점과 요청 처리 흐름 (0) | 2025.07.03 |
|---|---|
| [Spring] Spring AOP 개념과 실제 활용 사례 (0) | 2025.07.01 |
| [SpringBoot] 웹 서버와 WAS의 차이, 그리고 스프링 부트 내장 톰캣 (1) | 2025.06.24 |
| [SpringBoot] Spring Boot의 다양한 Bean 등록 방법 (0) | 2025.06.23 |
| [Spring] Spring Framework의 탄생 배경과 목적 (0) | 2025.06.16 |