갑작스레 눈뜨니까 썼던 글이 다 사라졌다.
실수로 창 닫기를 눌렀는데 뭐가 어떻게 된건지, 기존 오토세이브 된 부분까지, 전부 삭제된 상태로 백지로 저장되어있었다,
미치는 줄 알았다.
그래서 그냥 정리할 겸 다시 써본다. (긍정적이게 생각해본다..)
기존 방법은 무엇이었을까? 컴포넌트 스캔 방식이다.
쉽게말해, @Componet
, @Service
, @Repositoy
와 같은 어노테이션을 클래스에 써주므로써 자바 컨테이너에 등록하고, 생성자에 @Autowired
를 통해서 이러한 컴포넌트 빈을 연결해주는 방식이다.
후에 서술하겠지만, 생성자를 통해 DI가 실현되므로, 사용하므로 생성자 주입 방식이다.
기존 방법이 컴포넌트 스캔이라는 건 알겠다.
그럼 직접 등록하는 방법이라는 게 뭘까?
어노테이션을 써서 컨테이너에 자동으로 등록하는 것이 아닌, 코드를 손수 만들어서 자바 컨테이너에 등록해보자는 말이다.
자 소스코드(자바 클래스)파일을 하나 만들어보자. 이름은 SpringConfig라고 하겠다.
이 SpringConfig 클래스에는 특별한 어노테이션이 붙게 되는데 바로 @Configuration
이다.
이 Config파일은 컴파일 시, 자동으로 읽히게 되고 스프링 컨테이너에 등록된다.
즉, @Bean
을 통해서 클래스에서 어노테이션을 사용하는 것이 아닌, Config 파일에서 서비스와 레포지토리를 스프링 컨테이너에 등록한다.
또한 의존성 주입 시, 자동으로 의존성 객체를 찾아 주입하는 @Autowired
를 사용하지 않고, Configuration 클래스에서 @Bean
을 통해 직접 Repository 스프링 빈을 생성하고, 등록 한다.
이 또한 사실 나중에 기술할 것이지만, Repository는 데이터 베이스와 직접적으로 CRUD를 수행하는 클래스이므로 Bean에 등록할 때, 사실 Configration 클래스를 통해서 등록하는 것이 아닌 주로 다른 방법을 사용한다.
SpringDataJPA 라는 방법을 사용할 때가 바로 그 예인데, SpirngDataJPA는 쉽게말해 JPA를 확장시킨 더욱 사용자가 편하게 데이터베이스에 CRUD를 수행할 수 있도록 하는 자바 스프링 인터페이스이다.
- SpirngDataJPA 인터페이스에는 findAll, findById, saveAll, save, delete, getOne 등 웬만한 데이터베이스에 접근하고 다루는 기능(함수)들은 다 정의되어 있다.
이러한 SpringDataJPA 인터페이스 상속받아 클래스를 선언하는 과정에서는 자동으로 레포지토리가 생성되어, 스프링 컨테이너에 추가되게 된다.
이러한 스프링 컨테이너에 추가된 SpringDataJPA 인터페이스는 SpirngConfig의 생성자의 @Autowired
를 통해서 Configuration 클래스에 DI되는 형태로 할당되게 된다.
이 memberRepository를 Configuraion으로 불러오는 이유는 아래 MemberService의 생성자에서 memberRepository를 필요로 하기 때문이다.
데이터베이스 접근을 위한 JPA 연결과, application.properties 등에 관해서도 따로 다뤄보겠다.