본문 바로가기
Spring/게시판프로젝트

[Spring] 게시판 프로젝트5 - Business 계층 구현

by 태옹 2021. 7. 4.

Business계층

- 고객의 요구사항을 반영하는 계층

- 업무의 로직을 단위로 설계함 (트랜잭션 단위로 반영)

- 여러개의 Mapper나 DAO를 사용하는 경우가 존재함

- xxxService의 형태로 작성

 

예를 들어 Persistence tier(영속 계층)에서 '상품'과 '회원'을 VO로 만들어서 관리를 한다면 이를 동시에 이용해야하는 '구매 서비스'는 Business tier(서비스 계층)으로 분류하게 된다.

 

서비스 패키지 설정

service패키지 먼저 생성해주고 인터페이스(BoardService.java)와 클래스(BoardServiceImpl.java)를 추가한다.

(참고로 인터페이스인 경우에 아이콘 위에 I 표시가 붙어있음)

 


서비스 계층 구현

 

1. BoardService.java 인터페이스에 아래 메소드 추가

package com.taeong.service;

import java.util.List;

import com.taeong.domain.BoardVO;

public interface BoardService {
	public void register(BoardVO board);		//등록
	public BoardVO get(Long bno);			//글 조회
	public boolean modify(BoardVO board);		//수정
	public boolean remove(Long bno);		//삭제
	public List<BoardVO> getList();			//리스트 조회
}

 

2. BoardServiceImpl.java 클래스 작성 (BoardService인터페이스를 구현해야 함)

 

@Log4j : log를 남기기 위해 사용하는 어노테이션
@Service : 서비스 계층인 경우에 사용하는 어노테이션
@AllArgsConstructor : 생성자 자동으로 만들어주는데 이거는 부연해서 설명해보겠음

 

일단 상세구현이 아니라 로그를 기록하는 방식으로 작성해보면

@Log4j
@Service
@AllArgsConstructor
public class BoardServiceImpl implements BoardService {

	private BoardMapper mapper;
	
	@Override
	public void register(BoardVO board) {
		log.info("[SERVICE]register..."+board);
		mapper.insertSelectKey(board);
	}

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

	@Override
	public boolean modify(BoardVO board) {
		log.info("[SERVICE]modify..."+board);
		return mapper.update(board)==1;	//update()의 반환형은 int이기 때문에!
	}

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

	@Override
	public List<BoardVO> getList() {
		log.info("[SERVICE]getList...");
		return mapper.getList();
	}
}

 

3. 우리가 @Service 어노테이션을 사용했기 때문에 service패키지를 스캔하도록 root-context.xml에 등록하는 작업이 필요함

(1) root-context.xml 들어가서 하단의 namespaces

(2) context - 어쩌구 부분에 체크

(3) 아래의 코드를 root-context.xml의 source부분에 추가

<context:component-scan base-package="com.taeong.service"></context:component-scan>

 

4. 테스트

테스트를 위해 BoardServiceTests.java를 아래의 위치에 만들어줌

 

(1) import, 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);
		assertNotNull(service);	//null이 아님을 시험
	}
}

@RunWith(SpringJUnit4ClassRunner.class) : JUnit을 사용하기 위한 코드
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") : root-context.xml의 위치를 알려줌
@Log4j : log를 남기기 위해 사용하는 어노테이션

 

로그를 보면 BoardService 객체가 제대로 주입이 되는 것을 확인할 수 있다.

 

 

(2) 등록 작업 테스트

@Test
public void testRegister() {
    BoardVO board = new BoardVO();
    board.setTitle("새로 작성하는 글");
    board.setContent("새로 작성하는 내용");
    board.setWriter("태옹");
    
    service.register(board);
    log.info("생성된 게시물의 번호: " + board.getBno());
}

 

암튼 이런식으로 다른 서비스CRUD 테스트를 진행해볼 수 있다.

BoardServiceTests.java의 전체코드를 보면 다음과 같다.

@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);
		assertNotNull(service);
	}

	@Test	//글 등록
	public void testRegister() {
		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(1L));
	}

	@Test	//글 삭제
	public void testDelete() {
		// 게시물 번호의 존재 여부를 확인하고 테스트할 것
		log.info("REMOVE RESULT: " + service.remove(2L));
	}

	@Test	//글 수정
	public void testUpdate() {
		BoardVO board = service.get(6L);
		if (board == null) {
			return;
		}
		board.setTitle("제목 수정합니다.");
		log.info("MODIFY RESULT: " + service.modify(board));
	}
}

댓글