위클리페이퍼04-1: Spring과 Spring Boot
Q1. Spring Framework가 탄생하게 된 배경과 이를 통해 해결하고자 했던 문제점에 대해 설명하세요.
Q1-1 답변
01. Spring Framework의 탄생 배경
기존에 사용하던 EJB는 아래와 같은 문제점이 존재했다.
- WAS에 종속되어, 다른 환경에서 재사용하거나 이식하는 것이 어려움
- 객체지향 언어인 Java의 철학과 어긋나는 구조를 강제하는 경우가 많음
- 의존 객체를 내부에서 직접 생성
- 인터페이스 구조 강제
- XML을 중심으로 하는 방대한 설정을 요구하여, 구성 파일이 복잡해졌고, 이로 인해 유지보수 비용이 증가
- 컨테이너 기반으로 동작하기 때문에, 일반적인 Java 환경에서 단위 테스트가 불가능하거나 제한적
이로 인해, 점차 관심에서 멀어지게 되는 상황이 됨
이런 상황에서 로드 존슨(Rod Johnson)이 EJB를 대체할 수 있는 경량 프레임워크의 필요성을 역설하면서 자신이 설계한 프레임워크의 초기 버전을 공개했다. 이것이 훗날 Spring Framework로 발전하게 된다.
02. Spring Framework가 해결하고자 했던 문제점
- 기존 Java EE 환경에서는 EJB 컴포넌트를 사용하기 위해 특정 인터페이스를 구현하거나, 컨테이너에 배포되어야 했다. 이런 문제는 개발자의 기술적 제약을 강제하고, 테스트와 재사용성을 크게 제한함.
- 이런 한계를 극복하고자 POJO 기반 설계와 IoC/DI로 컨테이너 종속성을 낮추고, 테스트를 쉽게 만듦
- 복잡한 구성 문제는 설정 방식 단순화로 개선
- 초기 XML → 애너테이션/Java Config
- 트랜잭션, 로깅, 보안 같은 공통 관심사는 AOP로 분리해 중복을 줄임.
Q1-2. 정리
기존 J2EE의 문제점
- 2000년대 초반 J2EE(현재 Jakarta EE)는 엔터프라이즈 애플리케이션 개발의 표준이었으나, 과도하게 복잡한 설정과 무거운 스펙으로 인해 개발 생산성이 떨어졌습니다.
- 컴포넌트 간 강한 결합도로 인해 유닛 테스트가 어려웠고, 코드의 재사용성도 낮았습니다.
Spring Framework의 등장
- 2003년 로드 존슨이 ‘Expert One-on-One J2EE Design and Development’라는 책을 통해 J2EE의 복잡성을 해결할 수 있는 방안을 제시했습니다.
- 이 책에서 제시된 코드가 Spring Framework의 기반이 되었으며, POJO(Plain Old Java Object) 기반의 경량 프레임워크를 지향했습니다.
Spring이 해결한 문제들
- 의존성 주입과 제어의 역전을 통해 컴포넌트 간 결합도를 낮추었습니다.
- AOP(관점 지향 프로그래밍)를 도입하여 횡단 관심사를 효과적으로 처리할 수 있게 되었습니다.
- 선언적 트랜잭션 관리를 통해 비즈니스 로직에 집중할 수 있게 되었습니다.
Q2. 프레임워크와 라이브러리의 차이점을 제어 흐름의 주체와 사용 방식을 중심으로 설명하고, Spring Framework와 일반 Java 라이브러리를 예시로 들어 설명하세요.
Q2 답변
01. 제어 흐름의 주체
- 프레임워크
- 프레임워크의 동작에 따라 개발자가 작성한 코드를 이용
- 예시: Spring Framework에서는 Spring 컨테이너가 제어
- 라이브러리
- 사용자가 작성한 것에 따라 라이브러리가 동작
- 예시: 사용자가 원할 때
Spring이나Math같은 Java 라이브러리import
02. 사용 방식
- 프레임워크
- 프레임워크가 제공하는 규칙에 개발자가 따라야 한다.
- 예시: Spring MVC에서
@Controller,@Service같은 정해진 어노테이션을 따라야 함.
- 라이브러리
- 개발자가 필요한 기능만 선택해서 사용
- 예시: 숫자 계산이 필요한 곳에
Math같은 Java 라이브러리 사용
Q2-2. 정리
제어 흐름의 주체
- 프레임워크
- 프레임워크가 전체적인 흐름을 제어하고 사용자가 작성한 코드를 호출합니다.
- IoC(Inversion of Control, 제어의 역전) 개념이 적용됩니다.
- 예: Spring Framework에서는 개발자가 작성한 코드를 Spring 컨테이너가 제어하고 관리합니다.
- 라이브러리
- 사용자가 흐름을 제어하고 필요한 시점에 라이브러리를 호출합니다.
- 개발자가 애플리케이션의 흐름을 완전히 제어할 수 있습니다.
- 예: Java의 문자열 처리 라이브러리인
String클래스는 개발자가 필요할 때 호출하여 사용합니다.
사용 방식의 차이
- 프레임워크
- 프레임워크가 정한 규칙과 설계를 따라야 합니다.
- 애플리케이션의 아키텍처를 결정합니다.
- 예: Spring MVC에서는
@Controller,@Service와 같은 정해진 어노테이션과 구조를 따라야 합니다.
- 라이브러리
- 개발자가 필요한 기능만 선택적으로 사용할 수 있습니다.
- 기존 코드의 구조를 변경하지 않고도 사용 가능합니다.
- 예: Jackson 라이브러리는 JSON 처리가 필요한 부분에만 선택적으로 사용할 수 있습니다.
이러한 차이로 인해 프레임워크는 애플리케이션의 전체적인 구조와 설계를 제공하는 반면, 라이브러리는 특정 기능을 제공하는 도구로 사용됩니다. 프레임워크를 사용하면 개발의 일관성과 생산성을 높일 수 있지만, 그만큼 프레임워크가 정한 규칙을 따라야 하는 제약이 있습니다.
Leave a comment