모아이티

[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part 1 - 의존성 주입 본문

Spring 게시판 만들기

[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part 1 - 의존성 주입

Yun's kitchen 2021. 3. 2. 17:19

의존성이란?

-> 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것 즉 A라는 객체는 B 객체 없이는 동작하지 않을 때 

'A가 B에 의존적이다'라고 표현합니다.

 

주입이란?

-> 음식점으로 예를 들어보자면 식당에서 식재료가 필요하면 식당 주인이

 

A. 직접 장을 보러 가는 경우

B. 본사에서 식재료를 구입하는 경우

 

가 있는데 이처럼 수동적인지 능동적인지에 대한 문제를 다룹니다.

 

그래서 의존성 주입이란?

-> '어떤 객체가 필요한 객체를 외부에서 밀어 넣는다'

 

이 방식을 왜 사용할까?

-> 본사에서 음식을 배달해주면 주인 입장에서 편리합니다. 주인은 요리만 하면 된다는 장점이 있습니다.

이와 마찬가지로 코드로 설명하면

 

'주입을 받는 입장에서 어떤 객체인지 신경 쓸 필요가 없다',

'어떤 객체에 의존하든 자신의 역할은 변하지 않는다'  

 

= 내가 필요한 객체를 요청만 하면 외부에서 알아서 객체를 생성해준다.

 

"스프링은 이런 트랜잭션의 관리를 어노테이션이나 XML로 설정할 수 있기 때문에 개발자가 매번 상황에 맞는 코드를 작성할 필요가 없도록 설계되었습니다."

 

 

아래에서는 의존성 주입 테스트 실습을 진행하겠습니다.


실습

1. sample 패키지 생성, Chef 클래스 생성

 

root-context.xml - namespaces - context에 체크 후 저장 

<context:component-scan base-package="org.zerock.sample"></context:component-scan>

org.zerock.sample 패키지를 추가

 

Chef 클래스로 돌아가서 @Data 어노테이션을 추가하면 Chef 클래스에 toString, equals, hashCode가 생성된다.

 

2. Restaurant 클래스 생성

@Autowird로 Chef 클래스를 의존성 주입을 시켜준다.

 

3. 테스트 코드

pom.xml에서 junit을 찾은 후 4.12로 변경시킨다.

<!-- Test 코드 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version> <!-- 4.12로 변경 -->
			<scope>test</scope>
		</dependency> 

 

log4j에서 exclusions 부분 삭제

log4j 버전 1.2.17로 변경

 

 

3. Test 코드 작성

src/test/resources - org.zerock.sample패키지 생성 - SampleTests 클래스 생성

 

<!-- spring-test 추가 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

pom.xml에 spring-test dependency 추가

 

SampleTest.java에 Test어노테이션 추가 

package org.zerock.sample;

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.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
	
	@Autowired
	private Restaurant restaurant;

	@Test
	public void test1() {
		System.out.println("test1////////////////////");
		log.info("test1/////////////////");
		log.info(restaurant);
	}
}

 

test 코드 결과가 나오고 주입받은 restaurant 객체도 알맞게 결과가 나온다.


의존성 주입 추가 설명

SampleHotel 클래스 생성

package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.ToString;
//필드 주입
//setter 주입
//생성자 주입
@Component
@ToString
public class SampleHotel {

	private Chef chef;

	//생성자
	public SampleHotel(Chef chef) {
		super();
		this.chef = chef;
	} 
	
	
}

SampleTests.java

package org.zerock.sample;

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.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
	
	@Autowired
	private Restaurant restaurant;

	@Autowired
	private SampleHotel hotel;
	
	@Test
	public void testHotel() {
		log.info(hotel);
	}
	
	
	@Test
	public void test1() {
		System.out.println("test1////////////////////");
		log.info("test1/////////////////");
		log.info(restaurant);
	}
}

SampleHotel을 주입받고 log를 찍어본다.  

 

package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;
import lombok.ToString;
//필드 주입
//setter 주입
//생성자 주입
@Component
@ToString
@RequiredArgsConstructor
public class SampleHotel {

	private final Chef chef;

	
	
	
}

 

요즘에는 @RequiredArgsConstructor 이 방법이 많이 쓰인다고 한다. 그리고 주입받을 변수에 final을 꼭 붙이기!

 

@RequiredArgsConstructor 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 준다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다.


 

출처

- 코드로 배우는 스프링 웹 프로젝트(책)
- Youtube 구멍가게 코딩단 

 

 

Comments