JAVA/SpringBoot

게시판 프로젝트 2, CRUD

whyHbr 2023. 11. 6. 16:31
728x90
반응형

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인터페이스에 선언한 메서드의 리턴 타입과 동리한 타입으로 선언해주면 된다. 

 

 

728x90