카테고리 없음

[SPRING BOOT] 게시판 CRUD API 만들기

worri-pi 2021. 12. 24. 04:01

 

1.BoardVO 만들기

package com.example.demo.mvc.domain;

import java.util.Date;

public class Board {
	private int boardSeq;
	private String title;
	private String contents;
	private Date regDate;
	public int getBoardSeq() {
		return boardSeq;
	}
	public void setBoardSeq(int boardSeq) {
		this.boardSeq = boardSeq;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContents() {
		return contents;
	}
	public void setContents(String contents) {
		this.contents = contents;
	}
	public Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
}

2.Repository(mapper) 클래스 만들기

package com.example.demo.mvc.repository;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.mvc.domain.Board;


@Repository
public interface BoardRepository {
	List<Board> getList();
	Board get(int boardSeq);
	void save(Board board);
	void update(Board board);
	void delete(int boardSeq);	
}

 

3.Service 클래스 만들기

package com.example.demo.mvc.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.demo.mvc.domain.Board;
import com.example.demo.mvc.repository.BoardRepository;

@Service
public class BoardService {
	@Autowired
	private BoardRepository repository;
	
	/*
	 * 목록리턴
	 * @return
	 */
	public List<Board> getList(){
		return repository.getList();
	}

	/*
	 * 상세정보리턴
	 * @param boardSeq
	 * @return
	 */
	public Board get(int boardSeq) {
		return repository.get(boardSeq);
	}

	/*
	 * 등록 처리
	 * @param board
	 */
	public void save(Board board) {
		repository.save(board);
	}

	/*
	 * 업데이트 처리
	 * @param board
	 */
	public void update(Board board) {
		repository.update(board);
	}

	/*
	 * 삭제처리
	 * @param boardSeq
	 */
	public void delete(int boardSeq) {
		repository.delete(boardSeq);
	}
}

 

4.Controller 만들기

package com.example.demo.mvc.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.mvc.domain.Board;
import com.example.demo.mvc.service.BoardService;

@RestController
@RequestMapping("/board")
public class BoardController {
	@Autowired
	private BoardService boardService;
	
	/*
	 * 목록리턴
	 * @return
	 */
	@GetMapping
	public List<Board> getList(){
		return boardService.getList();
	}

	/*
	 * 상세정보리턴
	 * @param boardSeq
	 * @return
	 */
	@GetMapping("/{boardSeq}") //boardSeq를 url path로 받게 한다. 
	public Board get(@PathVariable int boardSeq) { 
		return boardService.get(boardSeq);
	}

	/*
	 * 등록/수정 처리
	 * @param board
	 */
	@GetMapping("/save") //실무에서는 data를 저장,삭제 할 때 Get보다는 POST,PUT,DELETE를 사용하는 것이 좋다.
	public void save(Board board) {
		boardService.save(board);
	}

	/*
	 * 삭제처리
	 * @param boardSeq
	 */
	@GetMapping("/delete/{boardSeq}")
	public void delete(@PathVariable int boardSeq) {
		boardService.delete(boardSeq);
	}
}

 

5.MybatisConfiguration 만들기

package com.example.demo.configuration;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/*
 * mybatis 설정
 * @author dong
*/
@Configuration
@MapperScan(basePackages = "com.example.demo.mvc.repository") //BoardRepository를 스캔하기 위해 basePackages 설정
public class MybatisConfiguration {
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(@Autowired DataSource datasource,ApplicationContext applicationContext) throws Exception{
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(datasource);
		factoryBean.setMapperLocations(applicationContext.getResources("classpath:mybatis/sql/*.xml")); //내가 만든 mybatis/sql에 있는 모든 xml 을 불러온다
		return factoryBean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sqlSessionTemplate(@Autowired SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

6.Mapper SQL 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="com.example.demo.mvc.repository.BoardRepository">
	<select id="getList" parameterType="com.example.demo.mvc.domain.Board" resultType="com.example.demo.mvc.domain.Board">
		SELECT
			B.BOARD_SEQ,
			B.TITLE,
			B.CONTENTS,
			B.REG_DATE
		FROM T_BOARD B
		ORDER BY B.REG_DATE DESC
	</select>
	
	<select id="get" parameterType="int" resultType="com.example.demo.mvc.domain.Board">
		SELECT
			B.BOARD_SEQ,
			B.TITLE,
			B.CONTENTS,
			B.REG_DATE
		FROM T_BOARD B
		WHERE B.BOARD_SEQ = #{boardSeq}
	</select>
	
	<insert id="save" parameterType="com.example.demo.mvc.domain.Board">
		INSERT INTO T_BOARD
		(
			TITLE,
			CONTENTS,
			REG_DATE
		)
		VALUES
		(
			#{title},
			#{contents},
			NOW()
		)
	</insert>
	
	<update id="update" parameterType="com.example.demo.mvc.domain.Board">
		UPDATE T_BOARD
		SET
			TITLE = #{title},
			CONTENTS = #{contents}
		WHERE BOARD_SEQ = #{boardSeq}
	</update>
	
	<delete id="delete" parameterType="int">
		DELETE FROM T_BOARD
		WHERE BOARD_SEQ = #{boardSeq}
	</delete>
</mapper>

 

mariadb 와 springboot를 연결할 때 에러가 생겨, 따로 포스팅 했다.

 

 

 

https://worri-pi.tistory.com/163

 

mariadb 와 springboot 연결 에러

Could not connect to address=(host=localhost)(port=3306)(type=master) : (conn=5) Access denied for user 'shson'@'localhost' (using password: NO) 외부에서 mysql에 접속하지 못해 발생한 오류이다. 외부..

worri-pi.tistory.com

 

 

브라우저 접속 데이터출력 확인

 

 

 

7. Mybatis 옵션 추가

MybatisConfiguration 변경

package com.example.demo.configuration;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/*
 * mybatis 설정
 * @author dong
*/
@Configuration
@MapperScan(basePackages = "com.example.demo.mvc.repository") //BoardRepository를 스캔하기 위해 basePackages 설정
public class MybatisConfiguration {
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(@Autowired DataSource datasource,ApplicationContext applicationContext) throws Exception{
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(datasource);
		factoryBean.setMapperLocations(applicationContext.getResources("classpath:mybatis/sql/*.xml")); //내가 만든 mybatis/sql에 있는 모든 xml 을 불러온다
		SqlSessionFactory factory =factoryBean.getObject();
		factory.getConfiguration().setMapUnderscoreToCamelCase(true);
		return factoryBean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sqlSessionTemplate(@Autowired SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

 

 

8.save 실행

BoardService 수정

public int save(Board board) {
	repository.save(board);
	return board.getBoardSeq();
}

BoardController 수정

@GetMapping("/save") 
	public void save(Board board) {
		boardService.save(board);
	}

Board.xml 수정

<insert id="save" parameterType="com.example.demo.mvc.domain.Board" useGeneratedKeys="true" keyProperty="boardSeq">
	INSERT INTO T_BOARD
	(
		TITLE,
		CONTENTS,
		REG_DATE
	)
	VALUES
	(
		#{title},
		#{contents},
		NOW()
	)
</insert>

save 실행

 

 

9.update 실행

BoardService 수정

public void save(Board parameter) {
	//조회하여 리턴된 정보
	Board board = repository.get(parameter.getBoardSeq());
	if(board==null) {
		repository.save(parameter);
	}else {
		repository.update(parameter);
	}
}

BoardController 수정

@GetMapping("/save") //실무에서는 data를 저장,삭제 할 때 Get보다는 POST,PUT,DELETE를 사용하는 것이 좋다.
	public int save(Board parameter) {
		boardService.save(parameter);
		return parameter.getBoardSeq();
	}

 

 

10.delete 실행

출처 : https://www.youtube.com/watch?v=YYlXmkpjRrU

728x90