공부/프로그래밍

[Spring] Mybatis 에서 Mapper(매퍼) 연결하는 2가지 방법에 대한 선택 가이드.

demonic_ 2017. 4. 20. 12:08

Mybatis 에서 SQL을 저장한 MAPPER를 연결하는 방법은 크게 2가지 이다.


1) Mapper namespace 를 직접 입력하여 호출하는 방법.

2) Interface 클래스를 만들어서 매핑, 호출하는 방법.



서로의 장단점이 있는데 

### 1번은 

장점

- 설정이 간단하다.(mybatis xml 파일 설정.)

- 파일을 추가로 생성할 필요가 없다.

- 코딩이 줄어든다.



단점

- namespace 와 SQL ID를 풀로 써야하기 때문에 오타로 인한 에러유발이 가능하다.

- 쿼리에 대한 주석을 넣으려면 Mapper 파일을 직접 열어야 하는데, 해당 Mapper파일을 Find로 직접 찾아야 한다.

- 어떤 ID들이 있는지 확인하려면 쿼리가 긴게 많을경우 알아보기가 힘들다.

- SqlSession 을 이용하여 조회할 경우 조회의 성격에 대해 알아야 한다.

. 단일이면 selectOne, 여러행의 경우 selectList  등 분류해서 메서드를 사용해야 한다.


### 2번은

장점 

- Mapper 를 열어보지 않아도 어떤 ID값을 가지고 있는지 한눈에 알아볼 수 있다

. 쿼리를 제외하고 호출하는 부분만 있기 때문에 한번에 볼 수 있다.

- SQL을 호출하려는 주석을 Interface 파일에 넣어줄 수 있기 때문에 주석만 제대로 달려있다면 SQL에 대한 내용을 확인하기 쉽다.

- 오타에 대한 우려가 적어진다.

. 자바측에서 메서드를 호출하기 때문에 이클립스에서 자동으로 오류체크 해줌.

. 다만 Mapper의 SQL ID와는 정확히 매칭시켜줘야 하는 번거로움이 있긴 함.

- 인터페이를 통해 MultiRow인지 SingleRow인지 알기 때문에 SqlSession 안에 있는 특정 메소드를 분리하여 사용할 필요가 없다.



단점

- 파일이 하나더 생성 된다.(Mapper를 추가할때마다 생성해줘야함)

- 작성해야 할 코딩이 1줄이상 늘어난다.

- 파일의 Package와 파일명을 namespace에 맞춰서 생성해야 한다.

- 설정에 코딩이 몇줄 더 들어간다.



유지보수 관리입장에서는 2번이 좀더 낫다는 의견이 있다.

그 이유중 하나로 1번의 경우 쿼리를 호출하는데 'com.ns.test.getTestList' 와 같은 풀네임을 쓴다면 이중 하나라도 오타가 나면 불편하고, 이 쿼리가 어떤 용도로 쓰이는지 알아보기 위해서는 Ctrl + H 를 이용해 Mapper를 직접 찾아봐야 하는 경우가 있기 때문이다

(대체로 Service에 적혀있는 주석과 SQL호출 목적의 주석이 동일한 경우가 많지만 복잡한 로직일수록 복수의 쿼리가 호출될 수 있고 각각의 주석을 간략하게 달아줄 순 있지만 그렇게 될경우 Service의 길이가 길어지는 단점이 있다.)

반대로 개발속도는 1번이 빠를수밖에 없는데 적은 코딩수는 주석을 상세히 안다는( ...) 경우가 종종 존재하기 때문.(하하;)



위의 상황에 맞춰 취향껏 쓰면 되겠다.