빈을 등록해 주는 곳이다.
@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 |