Spring

[중앙정보처리학원] Spring* Mybatis 활용

해보구 2024. 5. 21. 14:35

Board 라는 클래스에 Mybatis를 적용하려 한다\

 

<!--  SELECT 조회 결과를 담을 Entity 클래스 별칭 설정하기  -->
    <typeAliases>
        <typeAlias type="com.study.springstudy.database.chap01.Person" alias="person" />
        <typeAlias type="com.study.springstudy.springmvc.chap03.entity.Score" alias="score" />
        <typeAlias type="com.study.springstudy.springmvc.chap04.entity.Board" alias="board" />
    </typeAliases>


<!--  SQL을 적어놓은 ...Mapper.xml 파일들을 사용등록하는 영역  -->
    <mappers>
        <mapper resource="mappers/PersonMapper.xml" />
        <mapper resource="mappers/ScoreMapper.xml" />
        <mapper resource="mappers/BoardMapper.xml" />
    </mappers>

mybatis-config.xml 파일 에 (없으면 생성)

 

이렇게 추가해준다 typeAliases는 board라는 다섯글자로 경로를 줄여서 타입하도록 하기 위해 작성하고

매퍼는 등록해준다 BoardMapper.xml 이 없다면 생성해준다.

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.study.springstudy.springmvc.chap04.mapper.BoardMapper">

    <insert id="save">
        INSERT INTO tbl_board
        (writer, title, content)
        VALUES
        (#{writer}, #{title}, #{content})
    </insert>

    <select id="findAll" resultType="board">
        SELECT * FROM tbl_board
    </select>

    <select id="findOne" resultType="board">
        SELECT * FROM tbl_board
        WHERE board_no = #{boardNo}
    </select>

    <delete id="delete">
        DELETE FROM tbl_board
        WHERE board_no = #{boardNo}
    </delete>

    <update id="upViewCount">
        UPDATE tbl_board
        SET view_count = view_count + 1
        WHERE board_no = #{boardNo}
    </update>








</mapper>

 

BoardRepositoryimpl 에 있는 sql 코드를 가져와 컨트롤러에 필요한 각각 함수이 이름을 작성해주고 

where 절에는 스네이크케이스로 sql에서 받는 문자인 board_no (예를들어) 와 자바에서 사용중인 변수명 boardNo를 해준다.

 

///  컨트롤러 ///

//    private final BoardRepository repository;
    private final BoardService service;

 @GetMapping("/list")
    public String list(Model model) {
        System.out.println("/board/list GET");

   
        List<BoardListResponseDto> boardList = service.getList();
        
        model.addAttribute("bList", boardList);

        return "board/list";

 

컨트롤러에 있는 findAll을 예로들자. 

우선 의존 레파지토리를 service로 바꿔준다. 그리고 service에 있는 findAll 기능이 들어간 함수명을 적어주도록 한다.

 

 

@PostMapping("/write")
    public String write(BoardWriteRequestDto dto) {
        System.out.println("/board/write POST! ");

        // 1. 브라우저가 전달한 게시글 내용 읽기
        System.out.println("dto = " + dto);

        // 2. 해당 게시글을 데이터베이스에 저장하기 위해 엔터티 클래스로 변환
        Board b = dto.toEntity();

        // 3. 데이터베이스 저장 명령
        service.save(b);

        return "redirect:/board/list";
    }

 

service.save(b)로 역시 바꿔주고 나머지 함수들의 출처로 service로 변경해주도록 한다.

 

@RequiredArgsConstructor
@Service
public class BoardService {

    private final BoardMapper repository;

    public List<BoardListResponseDto> getList() {
        List<Board> boardList = repository.findAll();
        return  boardList.stream()
                .map(BoardListResponseDto::new)
                .collect(Collectors.toList());

    }
    // 삭제 중간처리
    public boolean delete(int boardNo) {
        return repository.delete(boardNo);
    }

    public boolean save(Board b) {
        return repository.save(b);
    }

    public Board findOne(int bno) {
        return repository.findOne(bno);
    }

    public void upViewCount(int bno) {

    }
}

 

명령의 순서는 그래서 컨트롤러 ➟ 서비스 ➟ Mapper 로 돌아가게 된다.

서비스는 매퍼로 다시 돌아간다.

 

@Mapper
public interface BoardMapper {
    // 게시물 목록 조회
    List<Board> findAll();

    // 게시물 상세 조회
    Board findOne(int boardNo);

    // 게시물 등록
    boolean save(Board b);

    // 게시물 삭제
    boolean delete(int boardNo);

    // 조회수 상승
    void upViewCount(int boardNo);

}