이 장에서는 Spring Framework가 구현하는 Inversion of Control(IoC) 원칙을 다룹니다. IoC는 종속성 주입(DI)이라고도 합니다. 객체가 생성자 인수, 팩터리 메서드에 대한 인수 또는 객체 인스턴스가 생성되거나 팩터리 메서드에서 반환된 후 인스턴스에 설정된 속성을 통해서만 객체의 종속성(즉, 상호 작용하는 다른 객체)을 정의하는 프로세스입니다.
그런 다음 컨테이너는 빈(Bean)을 생성할 때 이러한 종속성을 주입합니다. 이 프로세스는 기본적으로 Service Locator 패턴과 같은 메커니즘을 사용하거나 클래스를 직접 생성하여 종속성의 초기화(instantiation) 또는 배치(location)를 제어하는 빈 자체를 뒤집는 것(Inversion of Control)입니다.
팩토리 메서드 패턴
Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.
서비스 로케이터 패턴
서비스 로케이터 뒤에 있는 기본 아이디어는 애플리케이션에 필요할 수 있는 모든 서비스를 보유하는 방법을 아는 개체를 갖는 것입니다. 따라서 이 애플리케이션의 서비스 로케이터에는 필요할 때 '서비스'를 반환하는 메서드가 있습니다.
org.springframework.beans
및 org.springframework.context
패키지는 Spring Framework의 IoC 컨테이너의 기반입니다. BeanFactory
인터페이스는 모든 유형의 객체를 관리할 수 있는 고급 구성(configuration) 메커니즘을 제공합니다. ApplicationContext
는 BeanFactory
의 하위 인터페이스이며 다음을 추가합니다.
WebApplicationContext
처럼 웹 어플리케이션 레이어에 특정 컨텍스트 제공BeanFactory
는 configuration 프레임워크와 기본 기능을 제공하고, ApplicationContext
는 더 많은 기능을 추가합니다. ApplicationContext
는 BeanFactory
의 완전한 상위 집합이며 Spring IoC를 설명하기 위해 사용됩니다.
Spring에서 애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 빈이라고 합니다. Bean은 Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체입니다. 그렇지 않으면 빈은 애플리케이션의 많은 객체 중 하나일 뿐입니다. Bean과 이들 간의 종속성은 컨테이너에서 사용하는 구성 메타데이터에 반영됩니다.
자바 빈(Java Bean)
자바 빈(JavaBean)은 1996년에 도입된 개념입니다. 자바 빈은 자바 컴포넌트의 재사용성을 촉진하기 위해 썬 마이크로시스템즈(Sun Microsystems)에서 개발되었습니다.
자바 빈은 일종의 규칙이나 컨벤션으로, 특정한 이름 규칙과 메서드 규칙을 따르는 자바 클래스를 가리킵니다. 일반적으로 자바 빈은 다음과 같은 특징을 가집니다:
private
으로 선언하고, getter
와 setter
메서드를 제공하여 속성에 접근할 수 있도록 합니다.Serializable
인터페이스를 구현하여 직렬화(serialization)를 지원합니다.스프링 빈과 자바 빈의 차이
자바 빈은 자바 클래스의 한 형태를 가리키는 것으로, 특정한 이름 규칙과 메서드 규칙을 따르는 일반적인 자바 클래스를 의미합니다. 주로 UI 컴포넌트나 데이터 모델 등을 캡슐화하는 데 사용됩니다. 자바 빈은 단순히 클래스의 형태를 말하며, 그 자체로 특별한 기능을 가지고 있지는 않습니다.
스프링에서의 "빈(Bean)"은 스프링 프레임워크의 핵심 개념 중 하나입니다. 스프링 빈은 스프링 컨테이너에 의해 생성, 관리되는 객체를 가리킵니다. 스프링 빈은 스프링 컨테이너에 등록되어 의존성 주입(Dependency Injection)과 라이프사이클 관리 등의 기능을 수행합니다. 스프링 빈은 일반적으로 자바 빈의 형태를 가지고 있지만, 스프링의 컨테이너에서 관리되는 특별한 역할을 수행합니다.
스프링이 XML을 사용한 이유
설정의 분리: XML을 사용하면 애플리케이션의 설정(데이터) 정보를 외부 파일로 분리하여 관리할 수 있으며, 변경이 필요할 때 손쉽게 수정할 수 있습니다. 이는 유연성과 유지보수성을 향상시키는 데 도움이 됩니다.
플러그인 아키텍처: XML을 사용하면 스프링 애플리케이션의 다양한 기능을 플러그인 형태로 추가할 수 있습니다. 스프링은 XML을 사용하여 AOP(Aspect-Oriented Programming), 트랜잭션 관리, 보안 설정 등의 다양한 기능을 쉽게 구성할 수 있습니다.
자바 코드와의 분리: XML을 사용하면 자바 코드(로직)와 애플리케이션의 설정(데이터)을 명확하게 분리할 수 있습니다. 이를 통해 설정 변경이 필요할 때 자바 코드를 수정하지 않고도 애플리케이션의 동작을 수정할 수 있습니다. 또한, XML을 사용하면 동일한 애플리케이션을 다양한 환경에서 쉽게 재구성할 수 있습니다.
기존 기술과의 호환성: 스프링이 처음 출시된 시기에는 XML이 널리 사용되는 기술이었습니다. 따라서 XML을 사용하여 스프링을 개발하는 것은 기존의 개발자들이 쉽게 적응할 수 있도록 하고, 다른 기술과의 통합을 용이하게 할 수 있었습니다.
그러나 현재는 XML 대신에 자바 기반의 설정을 선호하는 추세가 있습니다. 스프링 3.0부터는 자바 기반의 설정인 JavaConfig가 도입되었고, 스프링 부트(Spring Boot)와 같은 최신 스프링 프로젝트에서는 XML 대신에 주로 자바 기반의 설정을 사용하는 경향이 있습니다. 이는 코드의 가독성과 유지보수성을 향상시키는 데 도움이 됩니다.
XML 대신 자바 기반 설정 선호 이유
지금은 XML 대신 자바 기반의 설정을 선호하는 이유는 몇 가지가 있습니다:
가독성: 자바 코드는 XML보다 가독성이 높습니다. 코드의 구조와 의도를 명확하게 표현할 수 있으며, IDE의 지원을 받을 수 있어서 개발자들이 코드를 이해하고 유지보수하는 데 도움이 됩니다.
타입 안정성: 자바 코드는 컴파일 시에 타입 안정성을 보장받을 수 있습니다. XML은 런타임 시에 오류가 발생할 수 있으며, 이를 방지하기 위해서는 추가적인 검증이 필요합니다.
코드 중복 최소화: 자바 기반의 설정은 메서드 호출과 상속을 통해 설정을 재사용할 수 있습니다. 이를 통해 설정의 중복을 최소화하고 코드의 재사용성을 높일 수 있습니다.
프로그래밍 언어의 강력한 기능 활용: 자바 기반의 설정은 프로그래밍 언어의 강력한 기능을 활용할 수 있습니다. 예를 들어, 조건문, 반복문, 변수 등을 사용하여 동적인 설정을 구성할 수 있습니다.
통합 개발 환경의 지원: 대부분의 통합 개발 환경(IDE)은 자바 코드를 지원하고, 코드 자동 완성, 리팩토링, 디버깅 등의 기능을 제공합니다. 이러한 기능을 통해 개발자는 코드를 더욱 효율적으로 작성할 수 있습니다.
XML DTD, DOM, Schema
XML DTD (Document Type Definition):
XML DOM (Document Object Model):
XML Schema:
XML과 JSON의 차이
XML과 JSON은 모두 데이터를 표현하고 전송하는 데 사용되는 형식이지만, 서로 다른 구조와 문법을 가지고 있습니다. 최근에는 JSON이 XML에 비해 더 간결하고 가벼운 형식이라는 점에서 인기를 얻고 있습니다.
구조:
가독성:
용도:
Groovy, XML, Spring 프레임워크