▷ 영속 계층은 데이터베이스 기준으로 해 설계를 나눠 구현하지만, 비즈니스 계층은 로직을 기준으로 처리
◎ 쇼핑몰에서 상품 구매 예시
1. 쇼핑몰 로직이 '물건을 구매한 회원에게는 포인트 올려준다'고 하면 영속 계층의 설계는 '상품', '회원'으로 나누어 설계 2. 비즈니스 계층은 상품 영역, 회원 영역을 동시에 사용해서 하나의 로직 처리를 하므로 아래와 같은 구조
설계를 할 때는 원칙적으로 영역을 구분해서 작성해야 하며 일반적으로 비즈니스 영역에 있는 객체들은 '서비스'라는 용어 사용
1. 비즈니스 계층 설정
1. org.codehows.service 패키지 생성 2. 각 계층 간의 연결은 인터페이스를 이용해 느슨한 연결을 함, 게시물을 위해 인터페이스와 클래스 선언
(1) BoardService 인터페이스
package org.codehows.service;
import java.util.List;
import org.codehows.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();
}
▷ 메소드의 이름은 현실적인 로직의 이름 지정 ▷명백하게 반환해야 할 데이터가 있는 'select'를 해야하는 메소드는 리턴 타입 지정 가능 ▷게시물은 특정한 게시물을 가져오는 get() 메소드와 전체 리스트 구하는 getList()의 경우 처음부터 메소드 리턴 타입 결정 가능
(2) BoardServiceImpl 클래스
package org.codehows.service;
import java.util.List;
import org.codehows.domain.BoardVO;
import org.codehows.mapper.BoardMapper;
import org.springframework.stereotype.Service;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@Log4j
@Service
@AllArgsConstructor
public class BoardServiceImpl implements BoardService {
//spring 4.3 이상에서 자동 처리
private BoardMapper mapper;
@Override
public void register(BoardVO board) {}
@Override
public BoardVO get(Long bno) {
return null;
}
@Override
public boolean modify(BoardVO board) {
return false;
}
@Override
public boolean remove(Long bno) {
return false;
}
@Override
public List<BoardVO> getList() {
return null;
}
}
▷여기서 중요한 것은 @Service라는 어노테이션 ▷@Service는 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해 사용 ▷작성된 어노테이션은 패키지를 읽어 들이는 동안 처리됨 ▷BoardServiceImpl가 정상적으로 동작하기 위해 BoardMapper 객체가 필요
▷@Autowired와 같이 직접 설정해 줄 수 있고, Setter를 이용해 처리할 수도 있음 ▷Lombok을 이용한다면 아래와 같이 만들 수 있음
@Log4j
@Service
public class BoardServiceImpl implemets BoardService{
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper;
...
▷ 스프링 4.3 부터는 단일 파라미터를 받는 생성자의 경우 필요한 파라미터를 자동으로 주입 가능 ▷@AllArgsContstructor는 모든 파라미터를 이용하는 생성자를 만들기 때문에 실제 코든느 BoardMapper를 주입 받는 생성자가 만들어지게 됨
(1) 스프링의 서비스 객체 설정(root-context.xml)
▷ 비즈니스 계층의 인터페이스와 구현 클래스가 작성되었다면 스프링의 빈으로 인식하기 위해 root-context.xml에
@Service 어노테이션이 있는 org.codehows.service 패키지를 스캔하도록 추가해야함
▷ BoardServiceTests 첫 테스트는 BoardService 객체가 제대로 주입 가능한지 확인하는 작업 ▷정상적으로 BoardService 객체가 생성되고 BoardMapper가 주입되었다면 아래와 같이 BoardService 객체와 데이터베이스 관련 로그가 같이 출력됨
(1) 등록 작업의 구현과 테스트
▷ 등록 작업은 BoardServiceImpl에서 파라미터로 전달되는 BoardVO 타입의 객체를 BoardMapper를 통해 처리