스프링

Spring CRUD

짱코딩러 2022. 10. 21. 14:31

테이블과 VO를 생성한 뒤, 테스트용 값들을 넣어줍니다.(☆커필밋수☆)

 

root-context.xml에 Mapper인터페이스 클래스를 적어준다.

	<!-- Mapper 인터페이스를 이용해서 실제 SQL 처리가 되는 클래스를 자동으로 생성 -->
	<!-- mapper 인터페이스를 담을 패키지를 지정해주면 댐~! -->
	<mybatis-spring:scan base-package="org.zerock.mapper" />

 

create

 

BoardMapper 인터페이스 생성

BoardMapper.java

package org.zerock.mapper;

public interface BoardMapper {

	@Select("select * from tbl_board where bno >0")
	public List<BoardVO> getList();
}

 

콘솔에 데이터가 잘 뿌려지는지 확인

BoardServiceTests.java

package org.zerock.service;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTests {

	@Setter(onMethod_ = {@Autowired})
	private BoardService service;
	
	@Test
	public void testGetList() {
		service.getList().forEach(board -> log.info(board));
	}

 

이제 SQL을 작성할 BoardMapper.xml 파일을 생성해 준다.(이제 아까 select어노테이션은 지워주자)

src/main/recources /org/zerock/mapper/BoardMapper.xml

mapper태그 안에 SQL문을 작성해준다.

BoardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
  <!-- mybatis3를 참조해서 만들겟다! -->
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zerock.mapper.BoardMapper">
	<select id="getList" resultType="org.zerock.domain.BoardVO">
		<![CDATA[select * from tbl_board where bno > 0]]>
		<!-- cdata로 감싸주면 연산자 자유롭게 사용 가넝~! 원래도 자유롭게 사용가능하긴 함 ㅎ -->
	</select>
</mapper>

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

mapper가 인터페이스, xml이 쿼리문이고, tests로 구현해보는 중인거임

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

insert

BoardMapper 인터페이스

public void insert(BoardVO board);
public void insertSelectKey(BoardVO board);

 

BoardMapper.xml

<!-- [1] 그냥 INSERT -->
	<insert id="insert">
		insert into tbl_board (bno, title, content, writer)
		values(seq_board.nextval, #{title} ,#{content},#{writer})
		<!-- ${}얘가 물음표에 set까지 해줌 -->
	</insert>
<!-- [2] INSERT 되고, PK값 알아오기 -->
	<insert id="insertSelectKey">
	<!-- 변수를 만들어서 key값을 들고온거임!(미리) -->
	<selectKey keyProperty="bno" order="BEFORE" resultType="long">
		select seq_board.nextval from dual
	</selectKey>
		insert into tbl_board (bno, title, content, writer)
		values(#{bno}, #{title} ,#{content},#{writer})
		<!-- ${}얘가 물음표에 set까지 해줌 -->
	</insert>

 

콘솔에 데이터가 잘 뿌려지는지 확인

BoardServiceTests.java

그냥 insert를 했을 때는 bno가 null값이 뜨고,

selectKey를 미리 구하고 insert 했을 때는 bno의 값이 뜬다.

	@Test
	public void testInsert() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 추가되는 게시글");
		board.setContent("새로 추가되는 게시글 내용");
		board.setWriter("작성자");
		mapper.insert(board);
		log.info(board);  //Lombok이 만들어주는 toString()을 이용해 BoardVO 값을 확인 할 수 있다.
		//BoardVO(bno=null, title=새로 추가되는 게시글, content=새로 추가되는 게시글 내용, writer=작성자, regdate=null, updateDate=null)
		log.info("after insert : " + board.getBno());
	}

	@Test
	public void testInsertSelectKey() {
		BoardVO board = new BoardVO();
		board.setTitle("새 작성글 select key");
		board.setContent("새 작성 내용");
		board.setWriter("user02");
		mapper.insertSelectKey(board);
		log.info(board);
		log.info("after insertSelectKey : " + board.getBno());
	}

 

detail

BoardMapper 인터페이스

public BoardVO read(Long bno);

 

BoardMapper.xml

	<select id="read" resultType="org.zerock.domain.BoardVO">
		select * from tbl_board where bno= #{bno}
	</select>

 

BoardServiceTests.java

	@Test
	public void testRead() {
		BoardVO board = mapper.read(4L);	//long타입이므로 L붙여줌
		log.info(board);
	}

 

delete, update

BoardMapper.java

	public int delete(Long bno);
	public int update(BoardVO board);

 

BoardMapper.xml

	<delete id="delete">
		delete from tbl_board where bno = #{bno}
	</delete>
	<update id="update">
		update tbl_board 
		set title = #{title}, 
			content=#{content}, 
			writer=#{writer},
			updateDate = sysdate
		where bno= #{bno}
	</update>

 

BoardServiceTests.java

	@Test
	public void testDelete() {
		log.info("DELETE count : " + mapper.delete(4L));
	}

	@Test
	public void testUpdate() {
		BoardVO board = new BoardVO();
		board.setBno(22L);
		board.setTitle("변경된 제목");
		board.setContent("변경된 내용");
		board.setWriter("변경자");
		int count = mapper.update(board);
		log.info("Update count : "+count );
	}

 

 

sevice

BoardService 인터페이스 

package org.zerock.service;

public interface BoardService {
	public List<BoardVO> getList();
	public void register(BoardVO board);
	public BoardVO get(Long bno);
	public boolean remove(Long bno);
	public boolean modify(BoardVO board);
}

 

BoardServiceImpl.java  @Service

package org.zerock.service;

@Service	//비즈니스영역을 담당하는 객체임을 표시
@AllArgsConstructor	//@setter @Autowired 생략가넝(필요한 파라미터 자동주입)
@Log4j
public class BoardServiceImpl implements BoardService {
	
	//@Setter(onMethod_ = @Autowired)
	private BoardMapper mapper;
	
	@Override
	public List<BoardVO> getList() {
		log.info("getList.........");
		return mapper.getList();
	}

	@Override
	public void register(BoardVO board) {
		log.info("register........."+board);
		mapper.insertSelectKey(board);
	}

	@Override
	public BoardVO get(Long bno) {
		log.info("get........."+bno);
		return mapper.read(bno);
	}

	@Override
	public boolean remove(Long bno) {
		log.info("remove........."+bno);
		return mapper.delete(bno) == 1;
	}

	@Override
	public boolean modify(BoardVO board) {
		log.info("modify........."+board);
		return mapper.update(board) == 1;	//성공했으면 1
	}

}

 

root-context.xml에 추가

<!-- @Service붙은애 있나 봐바~~ -->
<context:component-scan base-package="org.zerock.service"></context:component-scan>

 

테스트

BoardServiceTests.java

package org.zerock.service;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTests {

	@Setter(onMethod_ = {@Autowired})
	private BoardService service;
	
	@Test
	public void testExist() {
		log.info("serviceㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
		log.info(service);
		assertNotNull(service);
	}
	@Test
	public void testRegister() {
		log.info("Registerㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
		BoardVO board = new BoardVO();
		board.setTitle("제목 새로 작성한다.");
		board.setContent("내용 새로 작성한다.");
		board.setWriter("김새로");
		service.register(board);
		log.info("생성된 게시물의 번호 : "+board.getBno());
	}
	@Test
	public void testGetList() {
		service.getList().forEach(board -> log.info(board));
	}
	@Test
	public void testGet() {
		log.info(service.get(2L));
	}
	@Test
	public void testDelete() {
		log.info("remove result ========= "+service.remove(27L));
	}
	@Test
	public void testModify() {
		BoardVO board = service.get(21L);
		if(board == null) {return;}
		board.setTitle("수정수정수정!!!");
		log.info("modify result ========= "+service.modify(board));
	}
}