Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- 개성국밥
- PersistenceContext
- vfr video
- preemption #
- 코루틴 빌더
- 오블완
- mp4fpsmod
- JanusWebRTCGateway
- 달인막창
- Value too long for column
- 코루틴 컨텍스트
- 자원부족
- 깡돼후
- tolerated
- VARCHAR (1)
- terminal
- taint
- kotlin
- JanusGateway
- pytest
- Spring Batch
- 티스토리챌린지
- PytestPluginManager
- 겨울 부산
- JanusWebRTCServer
- JanusWebRTC
- python
- table not found
- k8s #kubernetes #쿠버네티스
Archives
너와 나의 스토리
[Spring] 게시판 만들기(1) - 디비 세팅/DTO 생성/Mapper 영역 본문
반응형
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가 필요하다.
- 쿼리의 아이디를 지정할 때 각각의 쿼리에 전체 경로를 일일이 명시하는 것은 중복된 작업이므로 네임스페이스에서 공통적으로 사용되는 경로를 지정해서 네임스페이스와 쿼리 아이디가 합쳐져서 호출되게끔 한다.
참고:
- [스프링 부트 시작하기: 차근차근 따라 하는 단계별 실습]
반응형
'개발 > Spring Boot' 카테고리의 다른 글
[Spring] @Transaction과 AOP를 이용해서 트랜잭션 처리하기 & 차이점 (0) | 2021.01.13 |
---|---|
[Spring] 게시판 만들기(2) - Service/Controller/View (0) | 2021.01.11 |
[Spring] 마이바티스(MyBatis)란? & 연동하는 방법 (0) | 2021.01.11 |
[Spring] MySQL 연동 - 설정하기 (0) | 2021.01.11 |
Spring DI, CI (0) | 2020.08.23 |
Comments