2월 05, 2024

@BeforeEach 사용하여 Reflections 초기화해주기, BeanFactory Test Code Java로 구현해보기

1. BeanFactory란? 

Spring에서 핵심이 되는 개념으로, Bean을 생성하고 의존관계를 설정하는 기능을 담당하고 있는 컨테이너를 의미한다. 


import java.util.Set;

public class BeanFactory {
private final Set<Class<?>> preClass;
public BeanFactory(Set<Class<?>> preClass) {
this.preClass = preClass;
}
}


위와 같이 BeanFactory의 코드를 작성해줄 수 있다. 



그리고 BeanFactory의 테스트코드를 작성하기 전 기초가 되는 코드를 아래와 같이 작성할 수 있다. 


2. BeanFactory 테스트 코드 전 초기화 코드


import static org.junit.jupiter.api.Assertions.*;

import org.example.annotation.Controller;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.reflections.Reflections;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

class BeanFactoryTest {
    private BeanFactory beanFactory;
private Reflections reflections;

@BeforeEach
void setUp(){
reflections = new Reflections("org.example");
Set<Class<?>> preClass= getClassAnnotatedWith(Controller.class);
beanFactory = new BeanFactory(preClass);
}

private Set<Class<?>> getClassAnnotatedWith(Class<? extends Annotation>... annotations) {
Set<Class<?>> beans = new HashSet<>();
for (Class<? extends Annotation> annotation: annotations){
beans.addAll(reflections.getTypesAnnotatedWith(annotation));
}
return beans;
}
}


여기서 Test Code의 

@BeforeEach annotation은 각 test code를 수행하기 전 위 코드를 먼저 수행한다는 뜻이다. 

각 Test Code가 돌기 전 

org.example 밑에 있는 Class를 돌면서 Reflections를 초기화해준다. 

그리고 Controller Annotation을 만들어주었다고 치면 


Controller Annotation이 붙은 class들의 set을 찾아 Set<Class<?>>로 return 받을 수 있다. 


이를 위하여 별도의 getClassAnnotatedWith라는 메소드를 만들었고 이는 parameter로 들어온 Annotation들이 붙어있는 class들을 찾아 Class들의 Set으로 반환하는 메소드이다. 


그러면 이러한 set들로 bean을 생성해주는 것까지 BeanFactoryTest class의 초기화단계라고 해줄 수 있다. 


여기서 Parameter로 여러 Annotation을 받을 수 있기 때문에 getClassAnnotatedWith 메소드에서는 가변인자로 Annotation Class를 받아주었다. 가변인자 관련해서는 다음 포스팅에서 더 자세히 다루어보도록 하겠다.