1. 프레임워크가 나온 이유
프레임워크는 개발자마다 능력 차이가 존재하는 상황에서, 이러한 차이를 줄이고 효율적으로 개발할 수 있도록 돕기 위해 등장했습니다.
2. 스프링과 다른 프레임워크의 차이
스프링 프레임워크가 중요한 이유는 다음과 같습니다:
- 엔터프라이즈급 프레임워크들이 가진 복잡성을 해소하였습니다.
- 프로젝트의 전체 구조 설계에 매우 유용합니다.
- 다른 프레임워크들을 포용하는 특성이 있어 통합성이 뛰어납니다.
- 개발 생산성 향상 및 다양한 개발 도구의 지원이 가능합니다.
3. 스프링의 주요 특징
- POJO 기반: 자바의 기본 구성 기반을 따릅니다.
- DI(Dependency Injection): 의존성 주입을 지원합니다.
- AOP(Aspect-Oriented-Programming): 관점 지향 프로그래밍을 지원합니다.
- MVC 구조를 편리하게 관리할 수 있습니다.
- WAS(웹 애플리케이션 서버)에 종속되지 않는 개발 환경을 제공합니다.
4. 의존성 주입(DI)이란?
의존성이란, 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없음을 의미합니다.
예를 들어, A 객체가 B 객체 없이는 동작하지 못할 경우, "A가 B에 의존적이다"라고 표현할 수 있습니다.
예시:
- 음식점에서 주방장 없이 장사를 할 수 없으면, 그 음식점은 주방장에게 의존적입니다.
주입은 외부에서 필요한 객체를 밀어 넣는 것을 의미합니다.
예를 들어, 프랜차이즈 본사에서 식재료를 제공하는 경우, 본사는 식재료를 주입하는 것입니다.
결국 의존성 주입은 외부에서 필요한 객체를 주입받는 방식으로, 개발자가 직접 객체를 생성하거나 연결할 필요 없이, 스프링이 이를 자동으로 처리해줍니다.
5. 의존성 주입 테스트
이제 실제로 스프링에서 의존성 주입을 테스트하는 예제를 만들어보겠습니다.
Restaurant 객체에 Chef 객체를 주입하는 예제를 통해 확인할 수 있습니다.
스프링에서는 생성자 주입과 setter 주입을 지원합니다.
Lombok 라이브러리와 spring-test 라이브러리를 사용하여 설정합니다.
1. pom.xml 수정
<!-- Lombok 라이브러리 추가 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<!-- spring-test 라이브러리 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
<!-- log4j 설정 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 예제 클래스 생성
- Restaurant와 Chef 클래스 작성
- org.zerock.sample 패키지를 생성하고 Restaurant와 Chef 클래스를 생성합니다.
// Chef.java
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Chef {
}
// Restaurant.java
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;
@Component
@Data
public class Restaurant {
@Setter(onMethod_ = @Autowired)
private Chef chef;
}
- @Component: 해당 클래스가 스프링에서 관리되어야 하는 대상임을 나타냅니다.
- @Setter(onMethod_ = @Autowired): Lombok을 이용해 setter 메소드를 자동으로 생성하고, **@Autowired**를 통해 스프링이 Chef 객체를 주입합니다.
3. XML을 이용한 의존성 주입
root-context.xml 파일에서 의존성 주입을 설정합니다.
- root-context.xml 설정
- root-context.xml은 스프링 프레임워크에서 관리해야하는 객체를 설정하는 설정파일
- 'root-context.xml' 아래쪽에 NameSpaces 탭에서 context라는 항목을 체크한다.
이후 Source 탭에 아래 코드를 추가한다.<context:component-scan base-package="org.zerock.sample"> </context:component-scan>
이 설정을 통해 스프링은 org.zerock.sample패키지에서**@Component**로 선언된 클래스들을 찾아 인스턴스를 생성하고 관리합니다
- 이 후 Bean Graph 탭을 보면
Restaurant , chef 객체 가 설정되어 있다.
4. 테스트 코드를 작성해 의존성 주입 확인
src/test/java 경로에 SampleTests.java를 작성합니다. ※ JUnit은반드시 4.10 이상 버전을 사용하자.
package org.zerock.sample;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Setter(onMethod_ = @Autowired)
private Restaurant restaurant;
@Test
public void testExist() {
assertNotNull(restaurant);
log.info(restaurant);
log.info("----------------------------------");
log.info(restaurant.getChef());
}
}
- @RunWith(SpringJUnit4ClassRunner.class): 스프링 테스트 컨텍스트에서 JUnit을 실행할 것을 지정합니다.
- @ContextConfiguration: 스프링 설정 파일의 경로를 지정합니다.
- @Test: JUnit의 테스트 메서드임을 나타냅니다.
6. 스프링 4.3 이후 단일 생성자의 묵시적 자동 주입
스프링 4.3 이후부터는 단일 생성자가 있을 경우, 묵시적 자동 주입이 가능합니다.
즉, @Autowired 어노테이션을 생략해도 자동으로 생성자 주입이 이루어집니다.
※스프링이 동작하면서 생기는 일
- 스프링 프레임워크가 시작되면 메모리 영역을 만들게 되는데 이를 컨텍스트라고 한다. 이때 ApplicationContext라고 한다
- 스프링은 자신이 객체를 생성하고관리해야 하는 객체들에 대한 설정이 필요합니다. 이에 대한 설정이 root-context.xml 파일
- root-context.xml에 설정되어 있는 <context:component-scan>태그의 내용을 통해서 'org.zerock.sample'패키지를 스캔하기 시작합니다.
- 해당 패키지에 있는 클래스들 중에서스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스를 생성합니다.
- Restaurant 객체는 Chef 객체가 필요하다는 어노테이션(@Autowired) 설정이 있으므로 , 스프링은 Chef 객체의레퍼런스를 REstaurant 객체에 주입합니다.
그러므로
스프링에서 의존성 주입을 통해 객체 간의 관계를 스프링이 자동으로 관리해 주기 때문에, 개발자는 복잡한 객체 생성을 신경 쓸 필요가 없습니다.
XML 설정 또는 Java 기반 설정을 통해 간편하게 의존성 주입을 테스트하고 적용할 수 있습니다.
※java configuration으로 의존성 주입 https://ohj9575.tistory.com/171
java 클래스파일(Configuration)을 이용한 의존성 주입
Java Configuration 기본 세팅 구축하는 방법Java 기반 설정을 통해 스프링 애플리케이션을 설정하는 방법을 소개합니다.이 방법은 기존 XML 설정을 Java 클래스를 사용해 대체하는 방식으로, 코드의 가
ohj9575.tistory.com
'Spring(스프링)' 카테고리의 다른 글
java 클래스파일(Configuration)을 이용한 의존성 주입 (0) | 2024.10.21 |
---|---|
java 개발환경 구축 (※Java Configuration) (1) | 2024.10.21 |
Java 개발을 위한 준비(※개발환경 기초,세팅) (1) | 2024.10.21 |
[ STS ] 깃허브(github) 연동 , 프로젝트 import 하기 (2) | 2024.10.20 |