ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING BOOT] 게시판 CRUD API 만들기
    카테고리 없음 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
Designed by Tistory.