영속 계층은 데이터베이스를 기준으로 설계를 나눠구현하지만, 비지니스 계층은 로직을 기준으로 해서 처리한다.
쇼핑몰에서 상품을 구매한다.
해당 쇼핑몰의 로직이 `물건을 구매한 회원에게는 포인트를 올려준다`라고 가정하면
영속계층: `상품`, `회원`
비지니스계층: 구매서비스(`상품영역`, `회원영역`을 동시에 사용하여 하나의 로직을 처리하도록 설계)
비즈니스 계층의 설정
설계를 할 때 각 계층 간의 연결은 인터페이스를 이용해 느슨한연결을 한다.
service패키지 생성
/BoardService 클래스 생성(인터페이스)
/BoardServiceImpl 클래스 생성(구현 클래스)
BoardMapper객체를 주입받는 생성자를 생성하려면
1. 모든 파라미터를 이용하는 생성자를 만드는 @AllArgsConstructor을 사용
2. @Sertter를 사용한다.
1. 스프링의 서비스 객체 설정(root-context.xml)
인터페이스와 구현클래스를 스프링 Bean으로 등록하기: root-context.xml에 두 클래스가 있는 패키지인 Service를 등록
<context:component-scan base-package="org.zerock.service">
</context:component-scan>
비지니스 계층의 구현과 테스트
객체가 제대로 주입이 가능한지 확인하기 위해 테스트
src/test/java/
org.zerock.service.BoardServicetests클래스 생성
- log.info() // 주입이 되면 로그에 주입된 걸 확인하기 위해
- assertNotNull() // 객체가 null인지 확인하는 test메서드로 null일경우 ComparisonFailure와 같이 예상값과 실제값이 다를 경우 발생하는 예외발생
1. 등록 작업의 구현과 테스트
BoardServiceImpl에서 파라마터로 전달되는 BoardVO타입의 객체를 BoardMapper를 통해 처리한다.
* @Autowired를 사용하여 의존성을 주입하면, Spring 프레임워크는 해당 타입의 구현체를 찾아서 해당 필드에 주입함
2.목록(리스트) 작업의 구현과 테스트
BoardServiceImpl 클래스에서 현재 테이블에 저장된 모든 데이터를 가져오는 getList()
BaordServiceImpl
@Override
public List<BoardVO> getList() {
log.info("getList.....");
return mapper.getList();
}
BoardServiceTests
@Test
public void testGetList() {
// for문
List<BoardVO> boardVOList = boardService.getList(); // 리스트 전체를 가져옴
for(int i = 0;i<boardVOList.size();i++) {
BoardVO boardVO = boardVOList.get(i);
log.info(boardVO);
}
// // 향상된 for문: getList()를 한번만 출력하고, 그 요소를 순차적으로 실행
// for(BoardVO boardVO : boardService.getList()) {
// log.info(boardVO);
// }
// 람다식: getList()를 한번만 호출하고, 순회함
// boardService.getList().forEach(boardVO -> log.info(boardVO));
}
3. 조회 작업의 구현과 테스트
조회는 게시물의 번호가 파라미터이고 BoardVO의 인스턴스가 리턴이 된다.
4. 삭제/수정 구현과 테스트
@Override
public boolean modify(BoardVO boardVO) {
log.info("modify....."+ boardVO);
return mapper.update(boardVO) == 1;
// INFO : jdbc.resultset - 1. ResultSet.getLong(bno) returned 1
}
@Override
public boolean remove(Long bno) {
log.info("remove....."+ bno);
return mapper.delete(bno) == 1;
// INFO : jdbc.resultset - 1. ResultSet.getLong(bno) returned 1
}
@Test // 삭제/수정 구현과 테스트
public void testUpdata() {
BoardVO boardVO = boardService.get(53L);
if(boardVO == null) {
return;
}
boardVO.setTitle("제목 수정합니다.");
log.info("MODIFY RESULT: "+ boardService.modify(boardVO));
// INFO : org.zerock.service.BoardServiceTests - MODIFY RESULT: true
}
@Test // 삭제/수정 구현과 테스트
public void testDelete() {
//게시물 번호 존재 여부를 확인하고 테스트할 것
log.info("REMOVE RESULT: "+ boardService.remove(55L));
// INFO : org.zerock.service.BoardServiceTests - REMOVE RESULT: true
}