이전 포스트에 이어서
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.smallbeginjava11.mapper.CategoryMapper">
<select id="getAllCategory" resultType="Category">
SELECT * FROM category;
</select>
</mapper>
이전 application.properties에서 resultType 패키지 설정 했으니 DTO명만 작성
커넥션 테스트 용으로 category 테이블 내용 전체를 select하는 쿼리만 작성했다.
이때 DAO가 있는게 좋을까 고민도 했다.
처음 공부할 때 spring으로 프로젝트를 진행할 때도 DAO DTO가 다 있었다.
그 당시 CS 개념, 스프링에 대한 이해도가 현저히 떨어지는데 포트폴리오 만드는데만 급급했다.
아무것도 모르는 수준은 아니지만 DAO 없이 진행하다가 꼬일까봐 걱정도 했으나
어쨌든 모르는 것을 알기 위해 공부하는 것이니까!
Mapper Interface에서 @Repository 를 사용하여
DAO 클래스 대신 직접 데이터에 접근 하도록 한다.
package com.project.smallbeginjava11.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.project.smallbeginjava11.DTO.Category;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface CategoryMapper {
List<Category> getAllCategory();
}
List 타입으로 DB 데이터를 객체화 시킬 것이다.
@Mapper가 있어야 Mapper인걸 스프링부트에서 인지하니 필요하다.
그리고 Mapper가 직접 데이터에 접근하는 DAO 역할을 하므로 @Repository도 필요하다.
메소드 명은 xml 쿼리에서 작성한 id 값과 무조건 동일하게 한다.
매퍼 인것도 인지 되고 id와 메소드 명이 일치하므로
정상적으로 mybatis 연결이 된다.
참고
@Repository = DAO 역할을 하는 클래스에 사용
매퍼에서 repository와 SQL을 매핑 시켜줬으니
사용자의 요구를 처리하기 위한 비즈니스 로직을 구현해야 한다.(비즈니스 레이어 ⊃ 서비스)
항상 service 개념 헛갈리면
https://www.kurien.net/post/view/24
다시 정독하자..
위에서 매퍼 인터페이스는 DAO 대신 데이터 접근 뒤 DTO에 넣어줬다.
저 데이터를 가져오기 위해서 Service Interface 작성
package com.project.smallbeginjava11.service;
import java.util.List;
import com.project.smallbeginjava11.DTO.Category;
public interface CategoryService {
public List<Category> getAllCategory();
}
인터페이스로 기본 동작을 스케치 정도만 했다면
상속 받은 클래스로 비즈니스 로직을 구체화 한다.
package com.project.smallbeginjava11.serviceImpl;
import com.project.smallbeginjava11.DTO.Category;
import com.project.smallbeginjava11.mapper.CategoryMapper;
import com.project.smallbeginjava11.service.CategoryService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class CategoryServiceImpl implements CategoryService {
private final CategoryMapper categoryMapper;
@Override
public List<Category> getAllCategory(){
return categoryMapper.getAllCategory();
}
}
categoryMapper 변수는 어차피 CategoryMapper 타입이며 Read only에 수정될 일 없으므로
final 선언
@RequiredArgsConstructor를 통해 categoryMapper에 CategoryMapper에 대한 의존성을 생성자를 통해 주입
인터페이스에서 선언한 추상 메소드 getAllCategory 구체화