[Spring]DAO와 Mapper의 차이점

Imagem de capa

Spring 프로젝트를 진행하면서 다양한 프로젝트 소스를 참고하다가 한가지 고민이 생겼다. 필자는 스프링 프로젝트의 구조를 잡을 때 1) Controller.java - Service.java - Mapper.java - Mapper.xml 형식으로 구조를 잡았는데, 다른 스프링 프로젝트 구조를 보면 2) Controller.java - Service.java - DAO.java - Mapper.xml 형식으로 구조를 잡고 있었다. 단순히 순서상으로만 보면 Mapper.java와 DAO.java만 변경하면 되는 것처럼 보이지만, 1)의 구조에서 Mapper.java는 단순 인터페이스지만, 2)구조에서 DAO.java는 인터페이스와 클래스의 결합된 형태였고, 그 외에도 여러 다른 점들이 눈에 띄었다.

Mapper 인터페이스를 활용한 프로젝트와 DAO를 활용한 프로젝트의 명확한 차이점을 확인하기 위해서 두가지 구조로 프로젝트를 만들어 볼 것이다. 우선 DAO와 Mapper의 정의에 대해 설명하고 두 구조로 프로젝트를 만들어 보자.


[DAO와 Mapper인터페이스의 정의]

1.DAO란?

Mapper인터페이스란?

Mapper인터페이스를 사용하지 않을 경우

Mapper인터페이스를 사용하는 방법


[Controller.java - Service.java - Mapper.java - Mapper.xml구조로 프로젝트 생성]

우선 원래 프로젝트를 수행 시 구축했던 Mapper 인터페이스 구조를 만들어보자

1. 프로젝트 구조

2. applicationContext.xml

3. dispatcher-servlet.xml

4. pom.xml

5. Controller.java

6. Service.java

7. Mapper.java

8. Mapper.xml

9. 실행결과


[Controller.java - Service.java - DAO.java - Mapper.xml구조로 프로젝트 생성]

다음은 DAO를 활용하여 프로젝트를 생성하겠다. Mapper인터페이스를 활용한 구조와 차이점은 빨간색으로 표시하도록 하겠다.

1. 프로젝트 구조 mapper(인터페이스) 패키지 대신 dao 패키지를 생성하였다.

2. applicationContext.xml Mapper.xml의 위치를 설정해주어야 하고, sqlSession 을 bean으로 선언해주어야 한다. sqlSession은 개발자들이 DAO와 DB를 직접 연결 맺고 종료할 필요가 없게 해주며 기본적인 트랜잭션 관리나 쓰레드 처리의 안정성 등을 보장해준다. 또한 base-package에 등록한 mapper는 삭제하고, dao를 추가하였다.

3. dispatcher-servlet.xml(변화 없음)

4. pom.xml(변화 없음)

5. Controller.java(변화 없음)

6. Service.java 매퍼 객체 호출에서 DAO 객체 호출로 변경되었다.

7. DAO.java Mapper 인터페이스가 삭제되고 DAO인터페이스와 서비스가 신규 추가되었다. DB와 연동하는 sqlSession 객체를 생성했으며, sqlSession을 통해서 selectOne, insert 등의 메소드를 써서 Mapper.xml에 접근하여 SQL을 수행한다. selectOne의 arguments로는 Mapper.xml의 패키지명 + Mapper명 + Mapper sql id명을 결합한 값이 들어간다.

8. Mapper.xml(변화 없음)

9. 실행결과(변화 없음)


[결론]

1) Controller.java - Service.java - Mapper.java - Mapper.xml 구조와 2) Controller.java - Service.java - DAO.java - Mapper.xml 를 비교해 보았다. 결국 1)구조가 Mybatis3.0 이후로 나온 방식이기 때문에 더 최근에 나온 방식이며 사용하기도 더 편리하다. 단 DB에 접근하는 Layer명을 Mapper로 할지 DAO로 할지(혹은 Repository)로 할지는 개발자 기호에 맞게 정해서 구조를 잡으면 될 것 같다. DB와 연동되는 인터페이스의 용어가 Mapper보단 DAO가 좋다 싶으면 1)구조로 가되 명명규칙만 DAO로 변경하면 된다. 단 xml파일의 수정이 조금 필요하다.(Mapper.xml과 인터페이스의 파일명이 일치하지 않는 경우 추가 조치가 필요하다.)

프로젝트 구조 이런식으로 DB연동 인터페이스(BoardDAO.java)와 Mapper.xml(BoardMapper.xml)의 파일명이 다른 경우 applicationContext.xml에 mapper.xml 위치를 명시해 줘야 한다.


*출처 :