본문 바로가기
Spring Boot

230210 Spring Boot 개별적인 bean 생성, 테스트코드

스프링 부트에서의 개별적인 bean 설정

-기존 스프링에서 xml로 설정했던 bean은 스프링 부트에서 java로 생성하게 된다.
-웹 설정은 WebMvcConfigurer인터페이스를 구현한다.
-이때, 스프링부트 버전에 따라 다르므로 사용이 가능한지 한번 확인해야한다. 2버전대에선 가능

-이 java파일은 필요하지 않으면 생성하지 않을 수도 있다.


@Configuration : 스프링 설정 파일임을 의미
@Bean : 빈으로 등록

@PropertySource : Application.properties를 참조 가능
@Value : Application.properties에 값을 직접 참조
=>이 둘은 자바코드로 읽을 때.


@Bean
public void test() {
	System.out.println("실행됨");
}

 

서버실행하면 콘솔창에 실행됨 이 나옴.


=>@Bean이 있는 메서드에
return new 생성클래스();를 하면 빈으로 등록된다.

@Bean //해당 메서드 실행하게됨
public TestBean testBean() {
	System.out.println("테스트 빈 실행됨2");
	return new TestBean();//빈으로 등록
}


여기서도, 의존성주입이 이루질 수 있다.

 


ApplicationContext

-springframework에 있는 걸로 import

@Autowired

ApplicationContext는 영속성을 가진 IOC컨테이너. 
-빈을 보관하고 있는 장소.

getBean메서드를 가지고 있다.
생성한 빈, 컨트롤러, 서비스, 레파지토리 등등을 다 가져올 수 있음.



@Value는 application.properties에 있는 값을 바로 참조해서 사용할 수 있게 해준다.
@Value("${application.properties에 있는 키}")로 사용

마찬가지로 springframework에 있는 걸로 사용

 

 

 

 

WebConfig.java

package com.simple.basic.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.simple.basic.controller.HomeController;

@Configuration //개별적인 스프링 빈 설정 파일
public class WebConfig implements WebMvcConfigurer{
	
	//빈을 보관하고 있는 장소(스프링 컨테이너)
	@Autowired
	ApplicationContext applicationContext;
	
	//properties파일에 선언된 변수를 바로 참조
	@Value("${server.port}")
	String port;
	
	@Bean //해당 메서드 실행하게됨.
	public void test() {
		
		//생성한 빈
		TestBean t = applicationContext.getBean(TestBean.class);
		System.out.println(t);
		t.hello();
		
		//컨트롤러
		HomeController h = applicationContext.getBean(HomeController.class);
		System.out.println(h);
		
		//가지고 있는 빈의 갯수
		int c=applicationContext.getBeanDefinitionCount();
		System.out.println("빈의 개수:"+c);
		
		//application.properties파일에 선언된 값
		System.out.println("properties파일에 선언된 값: "+port);
	}
	
	
	@Bean //해당 메서드 실행하게됨
	public TestBean testBean() {
		System.out.println("테스트 빈 실행됨2");
		return new TestBean();//빈으로 등록
	}
	
}

 

TestBean.java

package com.simple.basic.config;

public class TestBean {

	public void hello() {
		System.out.println("hello");
	}
}

 

 

 

콘솔출력문

테스트 빈 실행됨2
com.simple.basic.config.TestBean@4b2d8c2b
hello
com.simple.basic.controller.HomeController@53a62046
빈의 개수:164
properties파일에 선언된 값: 8383

 


테스트코드 작성

TDD개발과 테스트코드 
TDD : Test Driven Development
작은 단위별로 테스트코드를 작성하고, 해당 테스트를 통과하기 위한 코드를 작성해나가는 것.
스프링부트는 보다 쉬운 테스트코드를 제공한다.




@SpringBootTest(스프링 테스트 클래스)
@Test(해당 메서드를 테스트로 실행)

src/test/java아래에
베이스패키지 하위에 생성.


gradle에 테스트용 모듈이 있다. 

testImplementation 'org.springframework.boot:spring-boot-starter-test'


어떻게 생성해야하는지 예시파일도 만들어져있다.

->BootBasicApplicationTests.java

+)테스트코드를 실행하면, 스프링 빈 설정파일의 메서드가 먼저 실행되고 이후에 테스트코드가 실행된다.

 

BootTest.java

package com.simple.basic;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.simple.basic.controller.HomeController;

@SpringBootTest //스프링부트 테스트 클래스
public class BootTest {

	@Autowired
	HomeController homeController;
	
	@Test
	public void testCode01() {
		System.out.println(homeController.home());
	}
	
}

 

JUnit으로 실행.

 

콘솔출력문

테스트 빈 실행됨2
com.simple.basic.config.TestBean@6c42f2a1
hello
com.simple.basic.controller.HomeController@17a703f5
빈의 개수:147
properties파일에 선언된 값: 8383
2023-02-10 19:52:32.209  INFO 27748 --- [           main] com.simple.basic.BootTest                : Started BootTest in 3.306 seconds (JVM running for 5.245)
home