Back-end/TroubleShooting

๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ NoSuchBeanDefinitionException: No qualifying bean of type 'jakarta.persistence.EntityManagerFactory' available

์„œ์ฑ„๋ฆฌ 2024. 7. 23. 16:37

๐ŸŒฑ ๋ฌธ์ œ ์ƒํ™ฉ

ํ˜„์žฌ ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ ‡๊ฒŒ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

admin ๋ชจ๋“ˆ๊ณผ app ๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋ฉฐ, core.domain ๋ชจ๋“ˆ ํŒจํ‚ค์ง€์— ์žˆ๋Š” Entity๋ฅผ ๋ชจ๋‘ ์Šค์บ”ํ•˜์—ฌ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

 

@SpringBootApplication
@ComponentScan(basePackages = {"com.chaewsstore.core.domain"})
public class AdminApplication {

    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }
}

AdminApplication ํด๋ž˜์Šค์— ์„ ์–ธ๋˜์–ด ์žˆ๋Š” @SpringBootApplication ์–ด๋…ธํ…Œ์ด์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค๊ฐ€ ์œ„์น˜ํ•œ ํŒจํ‚ค์ง€(com.chaewsstore.admin)์™€ ๊ทธ ํ•˜์œ„ ํŒจํ‚ค์ง€์—์„œ๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์Šค์บ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 'com.chaewsstore.domain' ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”ํ•˜๋ ค๋ฉด @ComponentScan ๋˜๋Š” @SpringBootApplication์˜ scanBasePackage ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์บ” ๋ฒ”์œ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๊ธฐ์กด์—๋Š” ์ž˜ ๋Œ์•„๊ฐ€๋˜ ํ…Œ์ŠคํŠธ์—์„œ ์•„๋ž˜์˜ Exception์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

@ExtendWith(RestDocumentationExtension.class)
@WebMvcTest(ProductController.class)
class ProductControllerUnitTest {

    @MockBean
    private ProductUseCase productUseCase;

    private MockMvc mockMvc;

    private final ObjectMapper objectMapper = new ObjectMapper();

    ...
}
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'queryDslConfig': Injection of persistence dependencies failed.
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'jakarta.persistence.EntityManagerFactory' available

์ด๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด EntityManagerFactory Bean์„ ์ฐพ์ง€ ๋ชปํ•ด ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ด๋‹ค. @ComponentScan์„ ํ†ตํ•ด Domain ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•œ QueryDslConfig๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•ด ์ฃผ์—ˆ๋Š”๋ฐ ์™œ ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๊นŒ?

 

๐ŸŒฑ ๋ฌธ์ œ ๋ฐœ์ƒ ์ด์œ  - @WebMvcTest

ControllerUnitTest์— ์‚ฌ์šฉ๋œ @WebMvcTest๋Š” ์›น ๊ณ„์ธต(์ปจํŠธ๋กค๋Ÿฌ)๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— JPA ๊ด€๋ จ ์„ค์ •์ด๋‚˜ Bean๋“ค์€ ๋กœ๋”ฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ AdminApplication ํด๋ž˜์Šค์— ์„ ์–ธํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋กœ entityManagerFactory์™€ ๊ฐ™์€ JPA ๊ด€๋ จ Bean๋“ค์ด ๋กœ๋”ฉ๋˜์ง€ ์•Š์•„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

 

๐ŸŒฑ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

ํ•ด๋‹น ์„ค์ •๋“ค์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด Config ํŒŒ์ผ๋กœ ์„ ์–ธํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

@ComponentScan(basePackages = {"com.chaewsstore.core.domain"})
@Configuration
public class DomainConfig {

}
@SpringBootApplication
public class AdminApplication {

    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }
}