본문 바로가기
error...

멀티 모듈 프로젝트 - No bean named 'entityManagerFactory' available

by 어렵다어려웡 2022. 7. 13.
  1. No bean named 'entityManagerFactory' available

멀티 모듈로 구성을 하면서 해당 문제가 발생했다.

말 그대로 entityManagerFactoryBean 을 사용할 수 없다는 것이다.

 

moinda-core 패키지에서 JPA 의존성을 직접 사용하는 구조로 되어 있으며

moinda-api 패키지를 통해서 애플리케이션을 실행하는 구조이기 때문에 서버구동시에

moinda-core 패키지의 Entity 들을 전부 스캔하고 Bean 으로 등록을 해야한다.

 

 

애플리케이션 실행 패키지(moinda-api)의 클래스

@PropertySources({
        @PropertySource("classpath:application-core.properties")
})
@EntityScan("com.social.moinda.core")
@EnableJpaRepositories("com.social.moinda.core")
@EnableJpaAuditing
@SpringBootApplication(scanBasePackages = "com.social.moinda")
public class MoindaApplication {
    public static void main(String[] args) {
        SpringApplication.run(MoindaApplication.class, args);
    }
}

테스트 코드

class MemberApiControllerTest extends BaseApiConfig {

    @MockBean
    private MemberCommandService memberCommandService;

    @DisplayName("회원가입 성공 테스트")
    @Test
    void signupSuccessTest() throws Exception {

        MemberCreateDto createDto = new MemberCreateDto("user1@email.com", "하하", "12121212", "12121212");

        mockMvc.perform(post(MEMBER_API_URL)
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(toJson(createDto)))
                .andExpect(status().isCreated());

        assertThatNoException();
    }
}

@WebMvcTest
public class BaseApiConfig {

    @Autowired
    protected MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    protected static final String MEMBER_API_URL = "/api/member";

    protected String toJson(Object obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

@WebMvcTest 어노테이션은 Controller 계층을 테스트를 하는데 JPA 관련 Bean 을 로딩하지 않는다. entityManagerFactoryJPA 관련 Bean 들이 생성되어야 생성될 것이기 떄문에

 

Application 클래스에 선언해둔 어노테이션들은 테스트코드를 실행할 경우 사용대상이 되지 않는다..

따라서 해당 설정들을 따로 분리시켜서 Config로 선언하면 되더라..

@PropertySources({
        @PropertySource("classpath:application-core.properties")
})
@EntityScan("com.social.moinda.core")
@EnableJpaRepositories("com.social.moinda.core")
@EnableJpaAuditing
@Configuration
public class JpaConfiguration {
}

@SpringBootApplication(scanBasePackages = "com.social.moinda")
public class MoindaApplication {
    public static void main(String[] args) {
        SpringApplication.run(MoindaApplication.class, args);
    }
}