읽은 책 정리/코드로 배우는 스프링 웹 프로젝트

[Spring] 스프링의 특징과 의존성주입

포포015 2020. 12. 13. 15:15

프레임 워크는 말그대로 '뼈대나 근간을 이루는 코드 들의 묶음' 이라고 할수 있음.

뼈대가 왜필요한지?

 - 개발자는 각개인 능력차이가 큰직종이고, 따라서 구성에 따라 프로젝트의 결과 역시 큰차이를 낳는다.

 프레임 워크는 바로 이런 상황을 극복하기 위한 코드의 결과물

 프레임워크를 이용한다는 의미는 프로그램의 기본흐름이나 구조를 정하고, 

 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발.

 

스프링의 주요특징 

- POJO 기반의 구성

- 의존성주입(DI)를 통한 객체 간의 관계 구성

- AOP 지원

- 편리한 MVC 구조

- WAS의 종속적이지 않은 개발환경

 

스프링에서는 'ApplicationContext'라는 존재가 객체를 생성하고, 필요한 객체들을 주입하는 역할을 해주는 구조.

따라서 스프링을 이용하면 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고,

이러한 객체들을 엮는 작업을 하는형태의 개발을 하게됨. ApplicationContext가 관리하는 객체들을 '빈'이라는 용어로 씀

 

- 의존성 주입 테스트

스프링에서는 생성자를 이용한 주입과 setter메서드를 이용한 주입으로 의존성주입을 구현함

(lombok)을 이용해서 setter메서드를 자동으로 구현되도록 할것이고 ,스프링 동작을 테스트할것이므로 

pom.xml에 Lombok 라이브러리 ,spring-test 라이브러리 추가 , junit 4.12로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${org.springframework-version}</version>
    <scope>test</scope>
</dependency>
 
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
    <scope>provided</scope>
</dependency>
cs

예제 클래스 생성

패키지를 생성하고 Restaurant 클래스와 Chef 클래스 생성.

(일반적으로 스프링에서 의존성 주입은 Chef를 클래스가 아닌 인터페이스로 설계하는게 좋음)

 

- Chef 클래스

1
2
3
4
5
6
7
8
9
10
11
12
package org.zeorck.sample;
 
import org.springframework.stereotype.Component;
 
import lombok.Data;
 
@Component
@Data
public class Chef {
 
}
 
cs

- Restaurant 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package org.zeorck.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;
}
 
cs

@Data 어노테이션은 lombok의 setter를 생성하는 기능과 생성자,toString()등을 자동생성

@Compnente는 스프링에게 해당 클래스가 스프링에게 관리해야하는 대상임을 표시

@Setter는 자동으로 setChef()를 컴파일시 생성(onMethod 속성은 생성되는 setChef()에 @Autowired 어노테이션 추가)

@ Autowired란 ? 참조 - articles09.tistory.com/28

 

@Autowired 어노테이션/@Autowired란? -사좋배 공유

자동 주입 기능을 사용하는 것은 매우 간단하다. 다음의 두가지만 사용하면 된다. 1.자동 주입 대상에 @Autowired 어노테이션 사용. 2.XML 설정에 설정 추가 위 두가지를 하면, @Autowired가 적용된 의존

articles09.tistory.com

 

스프링은 클래스에서 객체를 생성하고 객체를 생성하고 객체들의 의존성에 대한 작업까지 내부에서 모든것이 처리됨.

스프링에서 관리되는 객첼르 흔히 '빈(Bean)'이라 부르고, 이에대한 설정은 XML과 Java 를 이용해 처리

 

XML을 사용할경우 'roo-context.xml'로 스프링 프레임워크에서 namepaces-context체크 - 패키지를 스캔하도록 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
        
    <context:component-scan base-package="org.zeorck.sample"></context:component-scan>
        
</beans>
 
cs

JAVA 를 사용할경우 root-context.xml을 대신하는 클래스에 @ComponentScan 어노테이션 추가

1
2
3
4
5
6
7
8
9
10
package org.zerock.config;
 
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan(basePackages = {"org.zerock.sample"})
@Configuration
public class RootConfig {
 
}
 
cs

 

스프링 동작 순서

1. 스프링 프레임워크가 시작되면 스프링이 사용하는 메모리 영역을 만든다(컨텍스트) 

 스프링에서는 ApplicationContext 라는 이름의 객체 생성

2. 스프링은 자신이 객체를 생성하고 관리해야하는 객체들에 대한 설정필요 = root-context.xml 파일

3. root-context.xml에 설정되 있는 <context:component-scan>태그의 내용을 통해 패키지 스캔

4.해당 패키지에 있는 클래스 중 스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스 생성

5. 위에 있는 Restaurant 객체는 Chef 객체가 필요하다는 어노테이션(@Autowired)설정이 있으므로

   Chef객체의 레퍼런스를 Restaurant 객체에주입

 

코드에 사용된 어노테이션들

Lombok 관련 어노테이션 Spring 관련 어노테이션 테스트 관련 어노테이션
@Setter, @Data, @Log4j @Autowired, @Component @RunWith, @ContextConfiguration, @Test

@Setter - 말그대로 setter메서드를 생성해주는 역할

@Data - @ToString,@Getter,@Setter등 자주사용되는 메서드를 생성

@Log4j - 로그객체 생성 > @Log로도 이용가능

@Component - 해당클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시

             @Component가 있는 클래스를 스프링이 읽어 주도록 // root-context.xml 에@ComponentScan 미리 지정

@Autowired - 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입

@ContextConfiguration - 스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지 명시

@Runwith - 테스트시 필요한 클래스를 지정

@Test - junit에서 해당메서드가 jUnit 상에서 단위테스의 대상인지 알려줌