스프링/6. 스프링 DB-2

3. 간이 프로젝트의 설정부

sdafdq 2023. 10. 7. 20:21

빈을 등록해 주는 곳이다.

 

@Configuration
public class MemoryConfig {

    @Bean
    public ItemService itemService() {
        return new ItemServiceV1(itemRepository());
    }

    @Bean
    public ItemRepository itemRepository() {
        return new MemoryItemRepository();
    }

}

서비스와 리포지토리를 빈으로 등록해 줬다.

 

요청이 들어오면 서블릿 컨트롤러에서 먼저 받고, 어디를 요청한 것인지 url에서 찾는 등 해서 등록한 컨트롤러를 조회하여 찾고, 그 컨트롤러를 실행한다.

 

편리하게 갈아끼기 위해 수동으로 등록했다.

 

컨트롤러는 컴포넌트 스캔이 될 것이다. (다른 것도 사실 @Service나 @Repository 붙여놔서 컴포넌트 스캔 때 자동으로 될 테지만, 근데 아래 코드 보면 컴포넌트 스캔 범위를 따로 지정해 줌.)

 

 

 

그 다음, 메모리 저장소 이기 때문에 애플리케이션 끄면 다 사라지는 거라서

@Slf4j
@RequiredArgsConstructor
public class TestDataInit {

    private final ItemRepository itemRepository;

    /**
     * 확인용 초기 데이터 추가
     */
    @EventListener(ApplicationReadyEvent.class)
    public void initData() {
        log.info("test data init");
        itemRepository.save(new Item("itemA", 10000, 10));
        itemRepository.save(new Item("itemB", 20000, 20));
    }

}

이벤트 리스너를 애플리케이션이 준비가 되었을 때로 해서

메모리 저장소에 추가시켜 준다. @EventListener는 스프링이 제공해 주는거다.

 

 

또 이렇게 만들어 놓고, 저걸 빈으로 등록해야 쓸 수 있는데,

@Import(MemoryConfig.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {

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

	@Bean
	@Profile("local")
	public TestDataInit testDataInit(ItemRepository itemRepository) {
		return new TestDataInit(itemRepository);
	}

}

이건 이제 뭐랄까 본격적으로 이게 스프링을 시작하는 main()함수 이다.

 

빈으로 저렇게 TestDataInit 등록한다.

그리고 @import 해 줘서 위에 설정한 Config를 import 해 준다.

그럼 @Configuration 이기에 알아서 다 안에 있는 내용이 실행 될 것이다.

 

@SpringBootApplication 이거 자체는 이제 이것이 스프링을 실행하는? 시작하는 애플리케이션이다? 그거고,

scanBasePackages = "hello.itemservice.web" 이거는 컴포넌트 스캔 하는데 저 패키지 내부만.

그럼 web에다가 우리가 컨트롤러 등록해 놨으니 거기만 읽는 것이다. 

그래서 서비스나 리포지토리를 우리가 명시적으로 등록해 준 것이다.

 

 

 

그 다음 @Profile("local") 이거는 "local"이라는 프로필의 경우에만 저 아래 코드를 빈으로 등록한다는 이야기인데,

이름이 local인가 보니 현재 외부의 DB가 아닌 메모리 저장소를 사용해서 local이라고 이름 붙인 거 같다.

나중에 정말 DB 사용할 때 프로필 이름을 local이 아니고 다른 걸로 해서 저 init()이 빈으로 등록되지 않게끔 할 듯.

 

 

이벤트 리스너도 빈으로 등록해 놔야,

스프링이 먼저 빈으로 등록하고 빈 중에 EventListener가 있는 지 확인해서 이벤트 리스너에 등록 함.

 

다음 application.properties

spring.profiles.active=local

보면 프로파일을 활성화 하는데 어떤 프로파일을 활성화 하나면 local이란 프로파일을 활성화 한다는 것이다.

그럼 위에 @Profile("local")이니 저게 제대로 빈으로 등록이 될 듯.

 

프로필은 PC마다, 운영환경, 테스트 때 라던지 환경에 따라 다른 설정을 사용할 때 하는 것.

아 그러니까, 출시 전까진 뭐 test 이렇게 해놨다가 test 되는 어떤 위처럼 미리 저장소에 한번 등록해보는 그런 거? 인 듯?

그러다 정말 출시 직전에는 이제 바꿔서 test 관련된거 빈으로 등록 안하게 시키고 등..

 

로컬PC에서는 내 로컬 DB를 쓰고 싶고, 실제로 운영하는 운영환경에서는 실제 외부 DB에 접근해서 써야 하고 등.

이런 거 나눌 때.

 

기본 값은 default임.

 

 

참고로, application.properties는 test에도 있음.

그래서 만약 test에 있는 걸 돌리면 저 application.properties가 실행되는 거임.

 

/test 및 그 하위에서 실행한 거면 저걸로 실행됨.

 

보통 테스트는, 테스트를 위해 깨끗한 환경에서 할 필요가 있다.

근데 예를 들어 내가 DB에 뭔갈 저장하고 몇개 저장했는지 그 수를 확인하는 것을 했을 때, 만약 위의 저 init()이 실행되면 제대로 테스트를 못함.

 

그래서 보통 테스트는 깨끗한 환경에 내가 뭘 추가하고 그 환경을 감시해보는 그렇게 함.

 

/test 하위에 있는 걸로 실행하면 test가 가지고 있는 application.properties를 사용하고, 

그게 아니라면 /main의 application.properties를 사용.

 

 

 

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

6. Jdbc 템플릿  (0) 2023.10.08
5. DB생성  (0) 2023.10.08
4. 테스트 환경  (0) 2023.10.08
2. 학습을 위한 간이 프로젝트  (0) 2023.10.07
1. 데이터 접근 기술들  (0) 2023.10.07