SqlSessionTemplate 사용한 ServiceImpl 클래스
여태까지 나는 ServiceImpl 클래스에서 항상 SqlSessionTemplate을 주입받아 사용해왔다.
하지만, 또 다른 방법이 있어 기록하고자한다.
Mapper 인터페이스를 사용한 ServiceImpl 클래스
하지만 위 ServiceImpl을 보면 MemberMapper 라는 녀석을 주입받아 사용한다. 그리고 mapper 패키지에 MemberMapper라는 녀석이 보인다. 얘는 뭐하는 놈일까?
MemberServiceImpl 클래스에서 private MemberMapper memberMapper 필드를 @Autowired로 주입하고
사용하는 이유는 Spring에서 데이터 액세스를 수행하는 객체에 대한 의존성을 주입하기 위해서이다.
SqlSessionTemplate 대신 Mapper 인터페이스 사용
SqlSessionTemplate은 MyBatis에서 데이터베이스에 대한 SQL 세션을 관리하는 클래스로,
MyBatis를 사용하여 SQL 쿼리를 실행하기 위해 사용된다.
대부분의 경우 SqlSessionTemplate을 사용하여 SQL 세션을 직접 관리하게 된다.
그러나 Spring에서는 MyBatis의 Mapper 인터페이스를 사용하여 SQL 쿼리를 실행할 수 있다.
이 방식은 SqlSessionTemplate을 직접 사용하는 것보다
1. 간결하고 유지보수가 용이하며,
2. 인터페이스 기반으로 작성된 코드가 가독성이 좋기 때문이다.
Mapper 인터페이스를 만들어 사용하는 이유
추상화와 유연성: Mapper 인터페이스를 사용하면 MyBatis를 추상화하여 데이터 액세스에 대한 세부 사항을 숨길 수 있다. 이를 통해 데이터 액세스 코드의 유연성이 향상된다.
코드 가독성: 인터페이스 기반의 Mapper는 SQL 쿼리를 자바 메소드로 매핑하여 코드를 보다 읽기 쉽게 만든다.
SQL을 메소드로 바로 호출할 수 있어서 코드의 가독성이 좋아진다.
유지보수 및 리팩터링: Mapper 인터페이스를 사용하면 SQL 관련 코드를 메소드로 캡슐화할 수 있어, SQL 쿼리가 변경되더라도 해당 인터페이스의 메소드만 수정하면 된다. 이는 유지보수 및 리팩터링을 용이하게 한다.
따라서 MemberServiceImpl 클래스에서 MemberMapper를 사용하는 것은 Spring의 의존성 주입(Dependency Injection) 기능을 이용하여 데이터베이스 액세스를 위한 MyBatis Mapper 인터페이스의 구현체를 주입받아 사용하는 것이다. 이렇게 하면 코드의 가독성과 유지보수성이 높아지며, 데이터 액세스에 대한 구현과 추상화를 도와준다.
MemberMapper 인터페이스
이 코드는 myBatis의 Mapper 인터페이스에 대한 정의를 포함하고 있다. MyBatis는 자바 객체와 SQL 문 사이의 매핑을 담당하는 프레임워크로, SQL을 직접 작성하는 대신 자바 인터페이스를 사용해 SQL을 호출하고 결과를 매핑한다.
또한, @Mapper 어노테이션은 아래에서 MapperScan을 통해 지정해줘야 가능하다.
WebMvcConfiguration
@Mapper 를 사용하기 위해 MapperScan을 사용한다.
bulid.gralde
MapperScan을 사용하기 위해선 의존성에 두줄 추가해줘야한다.
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
implementation 'mysql:mysql-connector-java:8.0.28'
위에 코드가 MapperScan을 사용할 수 있는 것이지만, db를 하기 위해선 아래 코드도 추가로 설정하자.
mapper
이전에는 namespace에 MemberDto의 경로를 넣어주었지만, 현재 코드에서는 MemberMapper의 경로를 넣어주었다.
또한, 이전에는 select절을 조회하기 위해서는 resultMap을 항상 썼지만, 꼭 써야하는 것은 아니다.
resultMap은 SQL 결과를 어떻게 자바 객체로 매핑할지를 정의하는데 사용된다. 그러나 MyBatis에서는 다양한 방법으로 매핑할 수 있으며, 간단한 쿼리의 경우에는 resultMap을 직접 정의하지 않고도 간편하게 매핑할 수 있다.
다음은 각 SQL 쿼리에서 사용된 resultType에 따라 MyBatis가 매핑을 자동으로 처리하는 방법이다
<select id="idCheck" parameterType="string" resultType="int">
resultType이 int로 설정되어 있으므로, MyBatis는 결과를 int로 매핑한다.
<select id="login" parameterType="map" resultType="MemberDto">
resultType이 MemberDto로 설정되어 있으므로, MyBatis는 결과를 MemberDto 객체로 매핑하는 식이다.
MyBatis는 resultType에 지정된 클래스에 해당하는 객체를 생성하고, 결과를 해당 클래스의 필드에 자동으로 매핑한다.
따라서 간단한 경우에는 resultMap을 따로 정의하지 않고 resultType을 통해 자동 매핑을 사용하는 것이 편리할 수 있다.
그러나 복잡한 매핑이 필요하거나 결과에 대한 매핑을 세밀하게 제어해야 하는 경우에는 resultMap을 정의하여 사용하는 것이 더 유용할 수 있다.
'✨ Back-end > etc' 카테고리의 다른 글
[Spring] 자바스크립트 JSON 문자열, 컨트롤러에서 객체로 변환 (0) | 2023.09.19 |
---|---|
[Spring] 검증(Validation) -1 타임리프(thymeleaf) (0) | 2023.09.19 |
[Spring-Legacy] validate 유효성 검사 (0) | 2023.09.14 |
[Spring] SessionAttribute (0) | 2023.09.14 |
[Spring] 구글 차트 DB에 넣어 Ajax로 시각화하기 (2) | 2023.09.14 |
댓글