대부분의 세팅은 다 끝냈다고 생각했습니다.
scm_api에서는 Http 요청을 받는 부분(controller)과 요청 로직을 처리하는 부분(service)
scm_domain에서는 도메인을 기준으로 도메인 관련 로직을 처리하는 부분(service), 디비와 도메인을 처리하는 부분(repository)
위와 같은 구조로 프로젝트 구조를 계획하고 있었습니다.
(물론 개발하면서 이상하다고 생각이 들거나, 공부하다가 꺠우치면 바꿀수 있곘죠)
1. 문제
아무튼 scm_api에서 요청 로직을 처리하는 AuthService가 있고 scm_api에서 도메인 비즈니스 로직을 처리하는 AccountService, 디비와 도메인을 처리하는 AccountRepository가 존재합니다.
실행을 시키면 정상적으로 데이터가 저장될 것이라 생각을 했지만 실행을 해보면
Parameter 0 of constructor in com.domain.account.service.AccountService required a bean of type 'com.domain.account.repository.AccountRepository' that could not be found.
분명 @Service, @Repository로 빈 등록은 잘되었을꺼고 ComponentScan도 잘 먹을 꺼라고 생각을 해서 당황을 했습니다.
하지만 ComponentScan은 Main클래스에 있는 @SpringBootApplication 어노테이션을 시작으로 스캔을 시작하고 패키지 외부에 있는 클래스는 스캔이 되지 않는다고 합니다.
2. 해결
@EnableJpaRepositories
Repository 빈을 찾지 못하는것 같아서 찾아보니 @EnableJpaRepositories를 이용해서 JPA Repository 빈을 활성화할수 있다고 합니다.
scm_api에 JpaConfig설정 파일을 만들고 @EnableJpaRepositories를 적용해보려고 하니 해당 어노테이션은 jpa에서 제공하는 어노테이션입니다.
제가 생각했을때 웹 관련 기능만 제어하기 위해 모듈을 분리했는데 도메인 관련 의존성이 scm_api에 추가되는건 의도와 다르다고 생각을 했습니다.
@Import
Configuration 설정 파일을 그룹화 할 수 있는 어노테이션입니다.
두개 이상의 패키지가 존재할 예정이기 때문에 Entity와 Repository의 빈을 사용할수 있도록 설정을 한 Config파일을 생성합니다.
그리고 scm_api에서는 Jpa와 관련된 설정 파일을 그룹화해서 관리하기 위해 JpaConfig클래스를 설정해서 빈으로 등록했습니다.
이렇게 하면 도메인별로 빈 활성화와 관련해서 관리할 수 있고 scm_api에서는 jpa 의존성을 추가하지 않고도 애플리케이션 실행시 빈을 팩토리에 저장해서 사용할 수 있게 됩니다.
//scm_domain
@Configuration
@EntityScan(basePackages = "com.domain.account")
@EnableJpaRepositories(basePackages = "com.domain.account.repository")
public class AccountJpaConfig {
}
@Configuration
@EntityScan(basePackages = "com.domain.mr")
@EnableJpaRepositories(basePackages = "com.domain.mr.repository")
public class MergeRequestJpaConfig {
}
//scm_api
@Configuration
@Import({AccountJpaConfig.class, MergeRequestJpaConfig.class})
public class JpaConfig {
}
애플리케이션을 실행하면 빈 생성도 정상적으로 된것 같고 의존성 주입도 잘되어서 저장이 잘되는 것을 확인 할 수 있었습니다.
드디어 기능 구현을 할 수 있겠네요.
감사합니다.
참고
[스프링 핵심기술] - @Component와 @ComponentScan
백기선님의 스프링 프레임워크 핵심 기술이라는 강좌를 들으며 공부한 내용을 정리한 글입니다. 이전에 ApplicationContext와 다양한 빈 설정 방법 글에서 잠깐 다루었던 내용 중 @ComponentScan과 @Compone
jjingho.tistory.com
https://parkadd.tistory.com/106
[Spring Data JPA] JpaRepository를 상속받기만 하면 빈으로 등록된다?
Spring Data Jpa를 사용하면서 우리가 사용하는 Repository 인터페이스는 아래와 같습니다. import org.springframework.data.jpa.repository.JpaRepository; public interface AccountRepository extends JpaRepository { } 이 코드만 봐서
parkadd.tistory.com
https://hilucky.tistory.com/244
[Spring] @Import 어노테이션 사용
@Import 어노테이션 @Configuration으로 설정한 설정 파일을 두 개 이상 사용하는 경우 @Import 어노테이션 사용 예 @Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { return new DriverManagerData
hilucky.tistory.com
'프로젝트' 카테고리의 다른 글
[토이프로젝트] - 6. 인증 (0) | 2024.11.23 |
---|---|
[토이프로젝트] - 4. Spring Boot 멀티 모듈 yml 설정 (0) | 2024.10.13 |
[토이프로젝트] - 3. Vue - SpringBoot 연동 (1) | 2024.10.13 |
[토이프로젝트] - 2. Vue 설치 (8) | 2024.10.09 |
[토이프로젝트] - 1. 멀티모듈 세팅 (4) | 2024.10.09 |