스프링은 인터페이스를 어떻게 빈(Bean)으로 만들까?

스프링은 인터페이스를 어떻게 빈(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.mapperMapperFactoryBean 클래스가 해당 인터페이스를 구현한다.

그리고 이 MapperFactoryBean 클래스는

스프링 프레임워크의 org.springframework.beans.factory에 존재하는 FactoryBean 인터페이스를 구현한다.

 

 

대충 위와같은 구조를 갖는 것 같다.

스프링 프레임워크의 인터페이스를 어댑터로 활용하여 마이바티스가 스프링 프레임워크에 결합되는 구조였던 것이다 !

 


© 2022. All rights reserved.