관리 메뉴

너와 나의 스토리

[Spring] 게시판 만들기(1) - 디비 세팅/DTO 생성/Mapper 영역 본문

개발/Spring Boot

[Spring] 게시판 만들기(1) - 디비 세팅/DTO 생성/Mapper 영역

노는게제일좋아! 2021. 1. 11. 21:06
반응형

2021/01/11 - [개발] - [Spring] MySQL 연동 - 설정하기

2021/01/11 - [개발] - [Spring] 마이바티스(MyBatis)란? & 연동하는 방법

위에 두 포스팅을 통해 세팅을 미리 진행한 후, 다음의 작업을 수행하였습니다.

 

 

1. 디비 먼저 세팅하기 

  • JPA 사용할 경우, 디비 먼저 생성할 필요 없음
    • JPA가 사용되는 entity에 맞는 테이블을 알아서 생성해 주기 때문
    • 즉, 데이터 중심이 아니라 객체를 중심으로 생각하고 개발하게 됨
  • 그렇지만 여기서는 먼저 전통적인 웹 애플리케이션을 개발하고 추후 JPA를 사용하도록 변경할 예정이기 때문에 디비 구성부터 시작
  • 나는 database로 "board" 생성하고 그 안에 다음의 테이블 생성했음
CREATE TABLE t_board(
    board_idx INT(11) NOT NULL AUTO_INCREMENT COMMENT '글 번호',
    title VARCHAR(300) NOT NULL COMMENT '제목',
    contents TEXT NULL COMMENT '내용',
    hit_cnt SMALLINT(10) NOT NULL DEFAULT '0' COMMENT '조회수',
    created_datetime DATETIME NOT NULL COMMENT '작성시간',
    creator_id VARCHAR(50) DEFAULT NULL COMMENT '수정자',
    updated_datetime DATETIME DEFAULT NULL COMMENT '수정시간',
    updater_id VARCHAR(50) DEFAULT NULL COMMENT '수정자',
    deleted_yn CHAR(11) NOT NULL DEFAULT 'N' COMMENT '삭제 여부',
    PRIMARY KEY (board_idx)
);
  • 일반적으로 자바는 카멜표기법을 사용하지만 데이터베이스는 _(underscore)를 사용하는 스네이크(snake_case) 표기법을 사용한다.

 

 

2. DTO 만들기

  • board 폴더에 "board.dto" (board/board/dto)생성 후, 그 밑에 BoardDto 클래스를 생성한다.
package com.example.board.board.dto;

import lombok.Data;

@Data
public class BoardDto {
    private int boardIdx;
    private String title;
    private String contents;
    private int hitCnt;
    private String creaatorId;
    private String createdDatetime;
    private String updaterId;
    private String updateDatetime;
}

 

 

3. MyBatis 설정하기

  • 데이터베이스에서 데이터를 조회하면 board_idx라는 이름으로 조회되지만 DTO 변수는 boardIDx라는 이름을 가지고 있기 때문에 양측의 데이터를 매핑해줘야 한다.
  • application.properties 파일에 다음 설정을 추가해준다.
mybatis.configuration.map-underscore-to-camel-case=true
  • DBConfig 클래스에 다음의 코드를 추가한다.
@Bean
@ConfigurationProperties(prefix="mybatis.configuration")
public org.apache.ibatis.session.Configuration mybatisConfig(){
	return new org.apache.ibatis.session.Configuration();
}
  • sqlSessionFactory함수에 [sqlSessionFactoryBean.setConfiguration(mybatisConfig());] 부분을 추가해준다.
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/sql-*.xml")); // Mapper 파일 위치 설정
        sqlSessionFactoryBean.setConfiguration(mybatisConfig());
        return sqlSessionFactoryBean.getObject();
    }

 

4. Mapper 영역

  • MyBatis는 데이터 접근 객체인 DAO를 만드는 것보다 sqlSessionDaoSupport나 SqlSessionTemplate을 사용하기를 권장한다.
    • 이렇게 함으로써 마이바티스 스프링 연동 모듈은 다른 빈에 직접 주입할 수 있는 mapper를 생성할 수 있다.
    • 또한, 매퍼를 사용하면 일일이 DAO를 만들지 않고 인터페이스만을 이용해서 좀 더 편하게 개발할 수 있다.
  • board 패키지 밑에 mapper 패키지 생성하고, 그 밑에 BoardMapper 인터페이스를 생성한다.
package com.example.board.board.mapper;

import com.example.board.board.dto.BoardDto;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface BoardMapper {

    List<BoardDto> selectBoardList() throws Exception;

}

 

5. SQL 작성하기

  • MyBatis는 쿼리를 XML에 작성하고 아이디를 이용하여 매핑한다.
  • src/main/resources 폴더 밑에 mapper 폴더를 생성하고, 그 밑에 sql-board.xml 파일을 생성한다.
<?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="board.board.mapper.BoardMapper">

    <!--게시글 목록에 필요한 내용인 글 번호, 제목, 조회 수, 작성일을 조회 -->
    <select id="selectBoardList" resultType="com.example.board.board.dto.BoardDto">
		<![CDATA[
        SELECT
            board_idx,
            title,
            hit_cnt,
            DATE_FORMAT(created_datetime, '%Y.%m.%d %H:%i:%s') AS created_datetime
        FROM
            t_board
        WHERE
            deleted_yn = 'N'
        ORDER BY board_idx DESC
        ]]>
	</select>

</mapper>
  • selectBoardList에 selectBoardList라는 이름의 쿼리와 매핑하기 위해서는 그 전체 경로인 board.board.mapper.BoardMapper.selectBoardList가 필요하다.
  • 쿼리의 아이디를 지정할 때 각각의 쿼리에 전체 경로를 일일이 명시하는 것은 중복된 작업이므로 네임스페이스에서 공통적으로 사용되는 경로를 지정해서 네임스페이스와 쿼리 아이디가 합쳐져서 호출되게끔 한다.

 

 

 

참고:

- [스프링 부트 시작하기: 차근차근 따라 하는 단계별 실습]

반응형
Comments