yahayaha

7. 비즈니스 계층과 테스트. 본문

spring/프로젝트

7. 비즈니스 계층과 테스트.

yaha 2024. 1. 21. 12:32

비즈니스 계층은 고객의 요구사항을 반영하는 계층.

 

프레젠테이션 계층( L6 )과 영속 계층의 중간 다리 역할을 함.

 

영속 계층은 데이터베이스를 기준으로 해서 설계를 나눠 구현을 함.

 

하지만 비즈니스 계층은 로직을 기준으로 처리하게 됨.

 

쇼핑몰 상품을 구매한다고 가정. 해당 쇼핑몰의 로직이 물건을 구매한 회원에게는 포인트를 올려준다함.

 

그러면 영속 계층의 설계는 상품과 회원으로 나눠서 설계하게 됨.

 

하지만 비즈니스 계층은 상품 영역과 회원 영역을 동시에 사용해서 하나의 로직을 처리함.

 

일반적으로 비즈니스 영역에 있는 객체들은 서비스(Service)라는 용어를 씀.

 

먼저 서비스 패키지를 하나 만들어줌.

 

 

 

스프링 어노테이션 중에 @Service라는 어노테이션이 있는데 컨트롤러나 컨트롤러처럼 동작을 하게됨. 그리고 빈으로 등록이 됨. 하지만 빈으로 등록이 되려면 패키지를 스캔을 해야 BoardService타입으로 바라볼 수 있기 떄문.

 

)인터페이스를 쓰는 목적 중 하나는 실제 객체를 뭔지 모르게 하는것. 실제 객체를 뭔지 몰라도 그 타입만 봐도 코딩을 할 수 있도록 유연하게 만드는게 목적.)

 

빈으로 등록하기 위해서 root-contextx에 가서 component-scan을 작성해줘야함.

 

<context:component-scan base-package="org.zerock.service"></context:component-scan>

 

 

그리고 BoardServiceImpl는 혼자서는 일을 할 수 없음.

 

BoardServiceImpl는 BoardMapper가 없으면 동작을 못하기에 

 

BoardMapper를 주입해줌.

@Service
@Log4j
@RequiredArgsConstructor
@ToString
public class BoardServiceImpl implements BoardService{

	private final BoardMapper mapper;
	
}

 

@RequiredArgsConstructor는 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성함.

 

final로 고정을 해주면 자동으로 주입을함.

 

주입이 되었는지 확인하려면 ToString을 사용해서 테스트를 실행.

 

패키지와 테스트클래스 생성

 

 

테스트코드 작성.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTests {
	
	@Autowired
	private BoardService service;
	
	@Test
	public void testPrint() {
		log.info(service);
	}
}

 

 

 

 

테스트까지 성공이 되었으면 서비스 계층을 구현할 준비가 완료됨.

 

 

중복되는 부분이 많으니 최대한 빠르게 진행.

 

import java.util.List;

import org.zerock.domain.BoardVO;

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

}


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

@Service
@Log4j
@RequiredArgsConstructor
@ToString
public class BoardServiceImpl implements BoardService{

	private final BoardMapper mapper;

	@Override
	public void register(BoardVO board) {
		// TODO Auto-generated method stub
		
		mapper.insert(board);
		
	}

	@Override
	public BoardVO get(Long bno) {
		// TODO Auto-generated method stub
		return mapper.read(bno);
	}

	@Override
	public int modify(BoardVO board) {
		// TODO Auto-generated method stub
		return mapper.update(board);
	}

	@Override
	public int remove(Long bno) {
		// TODO Auto-generated method stub
		return mapper.delete(bno);
	}

	@Override
	public List<BoardVO> getList() {
		// TODO Auto-generated method stub
		return mapper.getList();
	}
	
}

 

 

테스트는 간단하게 등록하는 것 만 실행.

 

	@Test
	public void testDetList() {
		service.getList().forEach(board ->  log.info(board));
	}

 

order by 기준으로 역순으로 조회가 되는걸 확인.

 

insertSelectKey 활용

 

key값을 받아서 조회를 하려고함. 이럴때를 위해 코드를 약간 수정.

 

public Long register(BoardVO board);


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

@Override
	public Long register(BoardVO board) {
		mapper.insertSelectkey(board);
		
		return board.getBno();
		
	}

 

 

이렇게 테스트를 돌려보면.

 

새로운 게시물이 생성된걸 확인.

 

'spring > 프로젝트' 카테고리의 다른 글

9. 프레젠테이션(웹) CRUD 구현  (0) 2024.01.23
8. 프레젠테이션(웹) CRUD 구현  (0) 2024.01.21
6. CRUD (update)  (1) 2024.01.20
5. CRUD (delete)  (0) 2024.01.20
4. CRUD (read)  (0) 2024.01.20