web

코드로 배우는 스프링웹 프로젝트 03

늉_늉 2020. 9. 29. 01:24

스프링의 의존성 주입은 1) 생성자 주입, 2) Setter주입을 사용한다.

 

 

Setter주입은 setXXX()와 같은 메서드를 작성하고 (혹은 Lombok 으로 생성하고) @Autowired 어노테이션을 통해서 스프링으로 부터 자신이 필요한 객체를 주입해 주도록한다.

 

 

생성자 주입은 이러한 주입을 생성자를 통해처리. 

 

Chef 라는 존재는 호텔에서도 필요하다고 가정 

 

[ex00]

package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.Getter;
import lombok.ToString;

@Component
@ToString
@Getter
public class SampleHotel {
	
	private Chef chef;
	
	public SampleHotel(Chef chef) {
		
		this.chef = chef;  //클래스변수 Chef는 매개변수로 받은 chef를 대입
	}

	
}

 

 

 

->기존과 달리 생성자를 선언하고 Chef를 주입하도록 작성되었다. 

     기존과 다른점은 @Autowired 어노테이션 없이 처리되고 있다.

 

 

 

 

test실행코드

 

 

 

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 HotelTests {

	@Setter(onMethod_ = {@Autowired})
	private SampleHotel hotel;
	
	@Test
	public void testExist() {
		
		assertNotNull(hotel);
		
		log.info(hotel);
		log.info("---------------------------------");
		log.info(hotel.getChef());
	}

}

 

 

 

 

생성자 자동주입과 Lombok을 결합하면 SampleHotel은 아래와 같이 변경 할 수있다.

 

 

[jex00]

 

 

package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.ToString;

@Component
@ToString
@Getter
@AllArgsConstructor    // 인스턴스변수로 선언된 모든것을 파라미터로 받는 생성자를 자성
public class SampleHotel {

	private Chef chef;
}

 

 

만일 여러개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성하고 싶다면 

 

 

@NonNull과 @RequiredArgsConstructor 어노테이션을 이용 할 수 있다.

 

 

package org.zerock.sample;

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@Component
@ToString
@Getter
// @AllArgsConstructor // 인스턴스변수로 선언된 모든것을 파라미터로 받는 생성자를 자성
@RequiredArgsConstructor
public class SampleHotel {

	@NonNull
	private Chef chef;
}

 

 

 

@RequiredArgsConstructor는 @NonNull이나 final이 붙은 인스턴스 변수에 대한 생성자를 만들어낸다.

 

 

 

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 org.zerock.config.RootConfig;

import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
@Log4j
public class HotelTests {

	@Setter(onMethod_ = {@Autowired})
	private SampleHotel hotel;
	
	@Test
	public void testExist() {
		
		assertNotNull(hotel);
		
		log.info(hotel);
		log.info("---------------------------------");
		log.info(hotel.getChef());
	}
}

github.com/hjjju/codeProject