요새 아기가 태어나서 공부에 집중을 못했는데..
하튼 맘 잡고 열심히 할 수 있기를 기도하며
다시 시작합니다!
이번 과정은
앞선 게시물에 이어서 진행합니다.
지금 진행 중인 부분은 도뎡님의 블로그 다섯 번째 게시물입니다.
https://congsong.tistory.com/15
스프링 부트(Spring Boot) - 게시판 CRUD 처리하기 [Thymeleaf, MariaDB, IntelliJ, Gradle, MyBatis]
본 게시판 프로젝트는 단계별(step by step)로 진행되니, 이전 단계를 진행하시는 것을 권장드립니다. 본 포스팅은 DBeaver를 기준으로 작성된 글이며, 만약 MariaDB가 설치되어 있지 않으시다면, 선행
congsong.tistory.com
5. MyBatis 플러그인 설치하기
인텔리제이에서 MyBatis를 원활하게 사용하기 위해 플러그인을 설치합니다.
자세한 내용은 위에 작성해 놓은 도뎡님 블로그에서 참고해 주세요.
6. MyBatis XML Mapper 생성하기
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(context.getRResoures(classpath:/mappers/**/*Mapper.xml"))
return factoryBean.getObject();
}
여기서 "factoryBean.setMapperLocation"은 Mapper 파일을 저장할 경로를 의미합니다.
1. mappers 폴더와 XML Mapper 파일 추가하기
- 위치 : src/main/resources/mappers/PostMapper.xml
2. SQL 쿼리 작성하기
<?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="com.study.Board2.domain.post.PostMapper">
<sql id="PostColumns">
id
, title
, content
, writer
, view_cnt
, notice_yn
, delete_yn
, created_date
, modified_date
</sql>
<insert id="save" parameterType="com.study.Board2.domain.post.PostRequest">
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.Board2.domain.post.PostResponse">
SELECT
<include refid="PostColumns"/>
FROM
tb_post
WHERE
id = #{value}
</select>
<update id="update" parameterType="com.study.Board2.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.Board2.domain.post.PostResponse">
SELECT
<include refid="PostColumns"/>
FROM
tb_post
WHERE
delete_yn = 0
ORDER BY
id DESC
</select>
</mapper>
- <mapper> 태그
- namespace 속성에 Mapper 인터페이스 경로 선언
- --> XML Mapper에서 메서드명과 동일한 id를 가진 SQL 쿼리 실행
- <sql> 태그 & <include> 태그
- 반복되는 쿼리 처리용 태그(변수에 넣고 불러와서 사용하는 느낌?!)
- parameterType
- SQL 쿼리 실행에 필요한 파라미터 타입
- 단일 파라미터가 아닌 경우, 객체를 전달받음
- resultType
- SQL 쿼리 실행 결과를 매핑할 타입
- Mapper 인터페이스에 선언한 메서드의 return 타입과 동일하게 선언
- #{ } 표현식
- MyBatis - #{ } 표현식을 이용해서 전달받은 파라미터 기준으로 쿼리 실행
7. SELECT 컬럼과 멤버 변수 바인딩하기
MyBatis에서 SELECT 결과값은 Response 클래스의 멤버 변수와 매핑 필요
- DB 테이블 : 스네이크 케이스 (_)
- 자바 변수명 : 카멜 케이스 (소문자+대문자+소문자)
- --> properties(application.properties) 또는 mybatis-config에 설정을 추가
mybatis.configuration.map-underscore-to-camel-case=true
8. DatabaseConfig 클래스 수정하기
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setMapperLocations(context.getResources("classpath:/mappers/*.xml"));
factoryBean.setConfiguration(mybatisConfig());
return factoryBean.getObject();
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public org.apache.ibatis.session.Configuration mybatisConfig() {
return new org.apache.ibatis.session.Configuration();
}
- factoryBean.setMapperLocations()
- PostMapper.xml 파일 추가(XML Mapper)로 주석 해제
- mybatisConfig()
- application.properties에서 mybatis.configuration으로 시작하는 모든 설정을 스프링 컨테이너에 빈(Bean)으로 등록
- factory.setConfiguration()
- mybatisConfig() - 빈(Bean)을 이용해서 MyBatis 옵션 설정
9. CRUD 테스트하기
1. 테스트 클래스 추가 & 코드 작성하기
package com.study.Board2;
import com.study.Board2.domain.post.PostMapper;
import com.study.Board2.domain.post.PostRequest;
import com.study.Board2.domain.post.PostResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class PostMapperTest {
@Autowired
PostMapper postMapper;
@Test
void save(){
PostRequest params = new PostRequest();
params.setTitle("제목");
params.setContent("내용");
params.setWriter("작성자");
params.setNoticeYn(false);
postMapper.save(params);
List<PostResponse> posts = postMapper.findAll();
System.out.println("전체 게시글 개수 : "+posts.size());
}
- postMapper
- @Autowired를 이용해서 스프링 컨테이너에 등록된 PostMapper 빈(Bean)을 클래스에 주입
- save()
- 게시글 생성 메서드
- 실행 순서
- PostRequest 객체 생성
- set() 메서드로 값 셋팅
- PostMapper.save() 호출
- 메서드 호출시 PostMapper.xml의 save 쿼리 실행
- #{변수명} 표현식
- PostRequest 객체 멤버 변수에 접근
- pk인 id -> auto_increment로 자동 증가
2. save() 테스트 & 테이블 SELECT 하기
Junit 테스트 진행
3. findById() 테스트하기
@Test
void findById(){
PostResponse post = postMapper.findById(1L);
try{
String postJson = new ObjectMapper().registerModule(new JavaTimeModule()).writeValueAsString(post);
System.out.println(postJson);
}catch (JsonProcessingException e){
throw new RuntimeException(e);
}
}
- post 객체
- 앞에서 생성된 게시글의 pk인 '1'을 인자로 전달 후 상세 정보 조회
- postJson
- springboot 기본 내장 라이브러리(Jackson) 사용
- 조회한 1번 게시물 응답 객체를 JSON 문자열로 전환
4. update() 테스트하기
@Test
void update(){
//게시글 수정
PostRequest params = new PostRequest();
params.setId(1L);
params.setTitle("수정한 제목");
params.setContent("내용 수정했어요");
params.setWriter("작성자");
params.setNoticeYn(true);
postMapper.update(params);
//게시물 상세 정보 조회
PostResponse post = postMapper.findById(1L);
try{
String postJson = new ObjectMapper().registerModule(new JavaTimeModule()).writeValueAsString(post);
System.out.println(postJson);
}catch (JsonProcessingException e){
throw new RuntimeException(e);
}
}
- update()
- save()와 저장하는 개념 동일
- 게시물 수정해서 pk id 파라미터 전달 필요
5. delete() 테스트하기
@Test
void delete(){
System.out.println("삭제 이전 게시물 수 : "+postMapper.findAll().size());
postMapper.deleteById(1L);
System.out.println("삭제 이후 게시물 수 : "+postMapper.findAll().size());
}
길고도 길었습니다 ㅎㅎ
앞으로는 더욱 꾸준하게 할 수 있기를 바라며,
그래도 하나 완료한 거에 큰 뿌듯함을 느끼며..!
'프로젝트 > 게시판 만들기' 카테고리의 다른 글
스프링 부트 - 게시판 만들기 3탄 (1) | 2024.11.20 |
---|---|
스프링부트 - 게시판 만들기 2탄 (3) | 2024.11.16 |
스프링부트 - 게시판 만들기 1탄 (6) | 2024.11.15 |