스프링은 인터페이스를 어떻게 빈(Bean)으로 만들까?
개발일기
스프링 프레임워크는 클래스의 인스턴스를 만들어 빈(Bean)
이라는 이름으로
스프링 컨테이너
에 등록한다는 부분은 숙지를 하였다.
그리고 이 빈이 등록될 때의 명명 규칙은 카멜 케이스였다.
예를 들어 BoardService
라는 파스칼 케이스의 클래스가 있을 경우
boardService
라는 카멜 케이스의 빈으로 등록을 한다.
그래서인지 스프링MVC와 마이바티스를 공부하던 중 마이바티스 맵퍼는 인터페이스로 작성하는 부분을 유심히 보았다.
자바를 공부할 때 분명 인터페이스 클래스는 자체적으로 인스턴스를 생성할 수 없다고 공부하였다.
그럼에도 불구하고 왜 인터페이스일까? 인터페이스를 만들면 어떻게 빈으로 등록한다는 걸까?
public interface BoardMapper {
public List<BoardDTO> getList();
public void insert(BoardDTO board);
public void insertSelectKey(BoardDTO board);
public BoardDTO read(long bno);
public int delete(Long bno);
public int update(BoardDTO board);
}
BoardMapper
인터페이스가 boardMapper
라는 이름의 빈으로 등록이 되었다.
우선 직관적으로 생각했을 때
BoardMapper
인터페이스를 구현하는 어떤 클래스를 만들어
이 클래스의 이름을 boardMapper
라는 이름의 빈으로 스프링 컨테이너에 등록하는 걸까?
라고 가정하고 토비의 스프링도 열심히 뒤져보고 코드도 까뒤집어보았다.
운이 좋게도 이 생각이 맞는 것 같다.
<!-- MyBatis-Scan -->
<mybatis-spring:scan base-package="com.springExample.mapper"/>
root-context.xml
에 마이바티스가 맵퍼를 스캔하는 패키지를 지정해주고
마이바티스가 해당 패키지에서 인터페이스를 스캔할 경우
org.mybatis.spring.mapper
의 MapperFactoryBean
클래스가 해당 인터페이스를 구현한다.
그리고 이 MapperFactoryBean
클래스는
스프링 프레임워크의 org.springframework.beans.factory
에 존재하는 FactoryBean
인터페이스를 구현한다.
대충 위와같은 구조를 갖는 것 같다.
스프링 프레임워크의 인터페이스를 어댑터로 활용하여 마이바티스가 스프링 프레임워크에 결합되는 구조였던 것이다 !