CRUD란
Create, Read,Update, Delete
DB에 게시글을 관리할 테이블을 생성한다.
생성전,
show databases; //현재 있는 데이터베이스 보기
use board; // board 사용
crate table 'tb_post' (
'id' bigint(20) not null auto_increment comment 'pk' , //각 행에 대해 자동으로 증가하는 primary key
'title' varchar(100) not null comment '제목',
'content' varchar(3000) not null comment '내용',
''writer' varchar(20) not null comment '작성자',
'view_cnt' int(11) not null comment '조회수',
'notice_yn' tinyInt(1) not null comment '공지글여부', // 공지사항 여부를 나타내는 0은 아니오, 1은 네
'delete_yn' tinyint(1) not null '삭제여부', //삭제 여부를 나타내는 , 0은 아니오, 1은
'created_data' datetime not null default current_timestamp() commment '생성일시', //기본 값은 햔재 날
'modified_data' datatime default null comment '최종 수정 일시',
primary key ('id')
)comment '게시글';
-----------------------------
- 게시글 요청 request클래스 생성
게시글 생성insert 과 수정update에 사용할 요청 클래스 생성.
package com.study.domain.post;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
@Getter @Setter
public class PostRequest {
private Long id; // PK
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private Boolean noticeYn; // 공지글 여부
private List<MultipartFile> files = new ArrayList<>(); // 첨부파일 List
private List<Long> removeFileIds = new ArrayList<>(); // 삭제할 첨부파일 id List
}
@Getter, @Setter
롬복 라이브러리에서 제공하는 기능. 롬복 설치해야 사용 가능
클래스에 선언된 모든 멤버 변수에 대한 getter와 setter를 생성해주는 역할을 한다.
-게시글 응답 response 클래스 생성
사용자에게 보여줄 데이터를 처리할 응답용 클래스이다. 응답 클래스에는 테이블의 모든 칼럼을 멤버 변수로 선언해주면 된다.
package com.study.domain.post;
import lombok.Getter;
import java.time.LocalDateTime;
@Getter
public class PostResponse {
private Long id; // PK
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private int viewCnt; // 조회 수
private Boolean noticeYn; // 공지글 여부
private Boolean deleteYn; // 삭제 여부
private LocalDateTime createdDate; // 생성일시
private LocalDateTime modifiedDate; // 최종 수정일시
}
- mapper인터페이스 생성
데이터 베이스와의 통신 역할을 할 mapper인터페이스를 생성한다.
package com.study.domain.post;
import com.study.common.dto.SearchDto;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface PostMapper {
/**
* 게시글 저장
*
* @param params - 게시글 정보
*/
void save(PostRequest params);
/**
* 게시글 상세정보 조회
*
* @param id - PK
* @return 게시글 상세정보
*/
PostResponse findById(Long id);
/**
* 게시글 수정
*
* @param params - 게시글 정보
*/
void update(PostRequest params);
/**
* 게시글 삭제
*
* @param id - PK
*/
void deleteById(Long id);
/**
* 게시글 리스트 조회
*
* @return 게시글 리스트
*/
List<PostResponse> findAll(SearchDto params);
/**
* 게시글 수 카운팅
*
* @return 게시글 수
*/
int count(SearchDto params);
}
save() : 게시글을 생성하는insert 쿼리를 호출한다. 파라미터로 전달받는 params는 요청(PostRequest)클래스 객체이며 params에는 저장할 게시글의 정보가 담기게 된다.
findById(): 특정 게시글을 조회하는 select쿼리를 호출, 파라미터로 id(pk)를 전달받아 sql쿼리의 where조건을 사용, 쿼리가 실행되면 메서드의 리턴 타입인 응답post response 클래스 객체의 각 멤버 변수에 결괏값이 매핑 된다.
update() : 게시글의 정보를 수정하는 update쿼리를 호출한다. save()와 마찬가지로 요청 post request클래스의 객체를 파라미터로 전달받으며, params에는 수정할 게시글 정보가 담기게 된다. save()와의 차이는 update쿼리의 where 조건으로 사용되는 id(pk)에도 값이 담긴다는 점이다.
deleteById(): 게시글을 삭제 처리하는 update 쿼리를 호출한다. findById와 마찬가지로 id(pk)를 파라미터로 전달받아 sql 쿼리의 where조건으로 사용되며 sql 쿼리가 실행되면 삭제여부 (delete_yn) 칼럼의 상태 값을 0false에서 1true 로 업데이트한다.
findAll(): 게시글 목록을 조회하는 select 쿼리를 호출한다. findByid()는 id(pk)를 기준으로 하나의 게시글을 조회한다면 해당 메서드는 여러개의 게시글 (postresponse) 을 List에 담아 리턴해주는 역할을 한다.
count() : 전체 게시글 수를 조회하는 select 쿼리를 호출한다. 페이징 기능을 구현하면서 사용된다.
-mappers폴더와 XML Mapper추가
<?xml version="1.0" encoding="UTF-8" ?>
http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.domain.post.PostMapper">
<!--tb_post테이블 전체 칼럼 -->
<sql id="postColumns">
id
, title
, content
, writer
, view_cnt
, notice_yn
, delete_yn
, created_date
, modified_date
</sql>
<!--게시글 저장 -->
<insert id="save" parameterType="com.study.domain.post.PostRequest" useGeneratedKeys="true" keyProperty="id">
INSERT INTO tb_post(
<include refid="postColumns"/>
)VALUES (
#{id}
,#{title}
,#{content}
,#{writer}
,0
,#{noticeYn}
,0
,NOW()
,NULL
)
</insert>
<!--게시글 상세 조회 -->
<select id="findById" parameterType="long" resultType="com.study.domain.post.PostResponse">
SELECT
<include refid="postColumns"/>
FROM
tb_post
WHERE
id = #{value}
</select>
<!--게시글 수정-->
<update id="update" parameterType="com.study.domain.post.PostRequest">
UPDATE tb_post
SET
modified_date = NOW()
, title = #{title}
, content = #{content}
, writer = #{writer}
, notice_yn = #{noticeYn}
WHERE
id = #{id}
</update>
<!--게시글 삭제-->
<delete id="deleteById" parameterType="long">
UPDATE tb_post
SET
delete_yn = 1
WHERE
id = #{id}
</delete>
<!--게시글 리스트 조회-->
<select id="findAll" resultType="com.study.domain.post.PostResponse">
SELECT
<include refid="postColumns" />
FROM
tb_post
WHERE
delete_yn = 0
ORDER BY
id DESC
</select>
</mapper>
<mapper> :태그의 namespace속성에 mapper 인터페이스의 경로를 선언해주면 mapper,와 xml mapper가 연결된다.
mapper인터페이스는 xml mapper에서 메서드명과 동일한 id를 가진 sql 쿼리를 찾아 실행한다.
<sql>, <include>: 공통으로 사용되거나 반복적으로 사용되는 쿼리를 처리할 수 있다.
parameterType: sql쿼리 실행에 필요한 파라미터의 타입을 의미한다. 하나의 파라미터가 아닌 경우엔 일반적으로 객체를 전달받아 쿼리를 실행한다.
resultType: sql쿼리의 실형 결과를 매핑할 결과 타입을 의미한다. mapper인터페이스에 선언한 메서드의 리턴 타입과 동리한 타입으로 선언해주면 된다.
'JAVA > SpringBoot' 카테고리의 다른 글
게시판 프로젝트 - REST API 방식으로 댓글 등록 기능 구현 (0) | 2023.11.06 |
---|---|
게시판 프로젝트 - REST API 방식 (0) | 2023.11.06 |
게시판 프로젝트 - 댓글 CRUD 처리 (0) | 2023.11.06 |
게시판 - CRUD 글 등록 , 조회, 상세 페이지 조회, 삭제 (1) | 2023.11.06 |
IntelliJ, SpringBoot, MariaDB, Thymeleaf, MyBatis로 만드는 게시판 1 (0) | 2023.11.06 |