7월 9일
*게시판 만들기
1.영속계층 이어서 만들기
1-1.insert 하기
(1)Mapper 인터페이스 작성하기
package com.keduit.mapper;
import java.util.List;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
//메서드를 만들때 고민해봐야 될것, 첫번째는 메서드명,두번째는 매개변수,세번째는 리턴타입인데, 리턴타입은 모르겠으면 일단 void로 설정
void insert(BoardVO vo);
}
(2)Mapper.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">
<!--dtd라는건 xml문서가 어떻게 구성되는지,어떤 태그들을 몇번 쓸수 있게했는지 알수있는 문서이다.xml 태그들을 지원한다.-->
<mapper namespace="com.keduit.mapper.BoardMapper">
<!-- select이라는 태그를 쓰면 result를 어떻게 처리할껀지 고민해봐야함. 보통 resultMap,resultType을 많이 쓴다.
resultType은 VO,DTO등의 객체를 담을 수 있는 클래스의경로를 명시하고 사용하면됨, resultMap은 개발자가 직접 POJO클래스에 매핑-->
<select id="getList" resultType="com.keduit.domain.BoardVO">
select* from t_board order by bno desc
</select>
<!-- MyBatis가 #은 ? 로바뀌고 해당getter를 호출한다. -->
<insert id="insert">
INSERT INTO t_board(bno,title,content,writer)
VALUES(seq_board.nextval,#{title},#{content},#{writer})
</insert>
</mapper>
(3)Mapper test 하기
package com.keduit.mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.keduit.domain.BoardVO;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardMapperTest {
@Autowired
private BoardMapper boardMapper;
@Test
public void testGetList() {
log.info("testGetList..............");
boardMapper.getList();
}
@Test
public void testInsert() {
BoardVO vo=new BoardVO();
log.info("testInsert................");
vo.setTitle("제목 입니다.");
vo.setContent("내용 입니다.");
vo.setWriter("작성자 입니다.");
boardMapper.insert(vo);
}
}
1-2.insertSelectkey 구하기
(1)Mapper 인터페이스 작성하기
package com.keduit.mapper;
import java.util.List;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
void insertSelectkey(BoardVO board);
}
(2)Mapper.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">
<!--dtd라는건 xml문서가 어떻게 구성되는지,어떤 태그들을 몇번 쓸수 있게했는지 알수있는 문서이다.xml 태그들을 지원한다.-->
<mapper namespace="com.keduit.mapper.BoardMapper">
<insert id="insertSelectkey">
<!-- order는 어떤 sql문 부터 실행하는지 실행순서를 정해줌,keyProperty는 나온 결과를 가지고 어떻게 세팅해 줄거야?
resultType은 결과데이터는 타입은 뭐야?-->
<selectKey order="BEFORE" keyProperty="bno" resultType="long">
select seq_board.nextval from dual
</selectKey>
INSERT INTO t_board(bno,title,content,writer)
VALUES(#{bno},#{title},#{content},#{writer})
</insert>
</mapper>
(3)Mapper test 하기
package com.keduit.mapper;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardMapperTest {
@Autowired
private BoardMapper boardMapper;
@Test
public void testinsertSelectkey() {
BoardVO board=new BoardVO();
log.info("testinsertSelectkey................");
board.setTitle("title 입니다.");
board.setContent("context 입니다.");
board.setWriter("writer 입니다.");
boardMapper.insertSelectkey(board);
}
}
1-3.읽고,삭제하고,수정하기
(1)Mapper 인터페이스 작성하기
package com.keduit.mapper;
public interface BoardMapper {
BoardVO read(Long bno);
int delete(Long bno);
int update(BoardVO board);
}
(2)Mapper.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">
<!--dtd라는건 xml문서가 어떻게 구성되는지,어떤 태그들을 몇번 쓸수 있게했는지 알수있는 문서이다.xml 태그들을 지원한다.-->
<mapper namespace="com.keduit.mapper.BoardMapper">
<!-- select이라는 태그를 쓰면 result를 어떻게 처리할껀지 고민해봐야함. 보통 resultMap,resultType을 많이 쓴다.
resultType은 VO,DTO등의 객체를 담을 수 있는 클래스의경로를 명시하고 사용하면됨, resultMap은 개발자가 직접 POJO클래스에 매핑-->
<select id="read" resultType="com.keduit.domain.BoardVO">
select * from t_board where bno=#{bno}
</select>
<delete id="delete">
delete from t_board where bno=#{bno}
</delete>
<update id="update">
update t_board
set title=#{title},content=#{content},writer=#{writer},updatedate=sysdate
where bno=#{bno}
</update>
</mapper>
(3)Mapper test 하기
package com.keduit.mapper;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardMapperTest {
@Autowired
private BoardMapper boardMapper;
@Test
public void testRead() {
BoardVO board=new BoardVO();
log.info("testRead................");
board=boardMapper.read(5L);
log.info(board);
}
@Test
public void testDelete() {
log.info("testDelete................");
int count=boardMapper.delete(7L);
log.info(count);
}
@Test
public void testupdate() {
log.info("testupdate................");
BoardVO board=new BoardVO();
board.setBno(8L);
board.setTitle("uptate title test");
board.setContent("uptate content test");
board.setWriter("uptate write test");
log.info("count:"+boardMapper.update(board));
}
}
2.비즈니스 계층 구현하기

비즈니스 계층은 고객의 요구 사항을 반영하는 계층으로 업무단위(트랜잭션)로 나눠서 설계한다.
예를 들어 고객이 구매를 할때 상품관리 부분에서는 재고가 빠지고 회원관리 부분에서는 포인트가 쌓인다는 가정하에 두가지 작업이 한번에 이뤄질때 서비스 계층이 필요하다.
왜?여러개의 Mapper와 DAO를 사용하는 경우가 존재함
@Service
어노테이션은 controller처럼 빈으로 등록을 해줌
(1)초기설정
src>main>java 에서 com.keduit.service 에서 package 만들고, BoardService인터페이스와 BoardServiceImpl 클래스 만들기
그리고 BoardService를 스캔해주기 위해서 root-context.xml에 아래와 같이 설정하기
그럼 스프링에서 빈으로 등록해서 관리해줌.
<context:component-scan base-package="com.keduit.service"/>
(2)BoardServiceImpl이 잘 적용 되었는지 @ToString 어노테이션으로 테스트해보기
package com.keduit.service;
@Service //스프링아 해당클래스는 빈으로 등록해죠
@Log4j
@RequiredArgsConstructor //해당 어노테이션은 final로 선언한 변수를 찾아서 주입해줌
@ToString
public class BoardServiceImpl implements BoardService{
private final BoardMapper mapper;
}
아래는 src>test>java 에서 테스트 클래스 만듬
package com.keduit.service;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardServiceTest {
@Autowired //스프링아 주입해죠
private BoardService service;
@Test
public void testPrint() {
log.info(service);
}
}
(3)BoardService 인터페이스 작성
인터페이스를 쓰는 이유는 유연성을 높이기 위함
package com.keduit.service;
import java.util.List;
import com.keduit.domain.BoardVO;
//비즈니스 계층이기 때문에 DB용어가 아니라 고객과 소통하기 위한 변수명을 지어준다.
public interface BoardService {
void register(BoardVO board);
Long selectInsertKey(BoardVO board);
BoardVO get(Long bno);
int modify(BoardVO board);
int remove(Long bno);
List<BoardVO> getList();
}
(4)BoardServiceImpl 클래스 작성
package com.keduit.service;
@Service //스프링아 해당클래스는 빈으로 등록해죠
@Log4j
@RequiredArgsConstructor //해당 어노테이션은 final로 선언한 변수를 찾아서 주입해줌
@ToString
public class BoardServiceImpl implements BoardService{
private final BoardMapper mapper;
@Override
public void register(BoardVO board) {
mapper.insert(board);
}
@Override
public BoardVO get(Long bno) {
return mapper.read(bno);
}
@Override
public int modify(BoardVO board) {
return mapper.update(board);
}
@Override
public int remove(Long bno) {
return mapper.delete(bno);
}
@Override
public List<BoardVO> getList() {
return mapper.getList();
}
@Override
public Long selectInsertKey(BoardVO board) {
mapper.insertSelectkey(board);
return board.getBno();
}
}
(5)BoardServiceImpl test
package com.keduit.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.keduit.domain.BoardVO;
import com.keduit.mapper.BoardMapperTest;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardServiceTest {
@Autowired //스프링아 주입해죠
private BoardService service;
@Test
public void testPrint() {
log.info(service);
}
@Test
public void testGetList() {
service.getList().forEach(board->log.info(board));
}
@Test
public void testRegister() {
BoardVO board=new BoardVO();
board.setTitle("Title 입니다.");
board.setContent("Content 입니다.");
board.setWriter("Writer 입니다.");
service.register(board);
}
@Test
public void testGet() {
BoardVO board=new BoardVO();
board=service.get(11L);
log.info(board);
}
@Test
public void testModify() {
BoardVO board=new BoardVO();
board.setBno(11L);
board.setTitle("제목수정");
board.setContent("내용수정");
board.setWriter("글쓴이수정");
log.info("count:"+service.modify(board));
}
@Test
public void testRemove() {
log.info("count:"+service.remove(10L));
}
@Test
public void testSelectInsertKey() {
BoardVO board=new BoardVO();
board.setTitle("제목수정");
board.setContent("내용수정");
board.setWriter("글쓴이수정");
long bno=service.selectInsertKey(board);
log.info("새로운글 등록 완료:"+bno);
}
}