[Spring framework] 비즈니스 계층 CRUD
비즈니스 계층은 고객의 요구사항을 반영하는 계층으로 프레젠테이션 계층과 영속 계층의 중간 다리 역할을 하게 됩니다. 영속 계층은 데이터베이스를 기준으로 해서 설계를 나눠 구현하지만, 비즈니스 계층은 로직을 기준으로 해서 처리하게 됩니다.
예시로 쇼핑몰에서 상품을 구매한다고 하고, 해당 쇼핑몰의 로직이 '물건을 구매한 회원에게 포인트를 올려준다'고 하면 영속 계층의 설계는 '상품'과 '회원'으로 나누어서 설계하게 됩니다. 반면 비즈니스 계층은 상품 영역과 회원 영역을 동시에 사용해서 하나의 로직을 처리하게 되므로 다음과 같은 구조를 만들게 됩니다.
busisness ◀───▶ Persistence tier
[ 구매 서비스 ] ←→ [ 상품 처리 객체 ]
↖↘ [ 회원 처리 객체 ]
일반적으로 비즈니스 영역의 객체들은 서비스(Service)라는 용어를 많이 사용합니다.
비즈니스 계층의 설정
com.project.service 라는 패키지를 작성합니다. 그리고 하위에 BoardService 인터페이스와 BoardServiceImpl 클래스를 작성합니다. 계층 간 연결은 인터페이스를 이용해서 느슨한(loose) 연결(결합)을 합니다.
BoardService 인터페이스 작성
BoardService 메서드 이름은 현실적인 로직의 이름을 붙이는 것이 관례입니다.
BoardService 인터페이스를 구현하는 구현체는 BoardServiceImpl 클래스로 작성합니다.
BoardServiceImpl 클래스에 가장 중요한 부분은 @Service라는 어노테이션입니다. @Service는 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해 사용합니다. 작성된 어노테이션은 패키지를 읽어 들이는 동안 처리됩니다.
BoardServiceImpl가 정상적으로 동작하기 위해서는 BoardMapper 객체가 필요합니다.
이는 @Autowired와 같이 직접 설정해 줄 수 있고, Setter를 이용해서 처리할 수도 있습니다. Lombok을 이용한다면 아래와 같은 방식으로 만들수도 있습니다.
스프링 4.3부터는 단일 파라미터를 받는 생성자의 경우에는 필요한 파라미터를 자동으로 주입할 수 있습니다. @AllArgsContructor는 모든 파라미터를 이용하는 생성자를 만들기 때문에 실제 코드는 아래와 같이 BoardMapper를 주입받는 생성자가 만들어지게 됩니다.
스프링의 서비스 객체 설정(root-context.xml)
비즈니스 계층의 인터페이스와 구현 클래스가 작성되었다면, 이를 스프링의 빈으로 인식하기 위해 root-context.xml에 @Service 어노테이션이 있는 com.project.service 패키지를 스캔하도록 추가합니다.
root-context.xml의 네임스페이스 탭에서 context 항목을 추가합니다.
네임스페이스를 추가하면 해당 이름으로 시작하는 태그를 활용할 수 있고, root-context.xml의 내부에 service 패키지를 스캔하는 내용을 추가합니다.
Java 설정의 경우
root-context.xml을 대신하는 RootConfig 클래스를 이용해서 @ComponentScan을 추가합니다.
비즈니스 계층의 구현과 테스트
com.project.service 패키지 생성, BoardServiceTests 클래스를 생성합니다.
BoardServiceTests 클래스
BoardServiceTests의 첫 테스트는 BoardService 객체가 제대로 주입이 가능한지 확인하는 작업으로 시작합니다.
정상적으로 주입되었다면 아래와 같이 BoardService 객체와 데이터베이스 관련 로그가 같이 출력됩니다.
다음 수행할 테스트
1. 등록 작업의 구현과 테스트
2. 목록(리스트) 작업의 구현과 테스트
3. 조회 작업의 구현과 테스트
4. 삭제/수정 구현과 테스트
1. 등록 작업의 구현과 테스트
왼쪽은 BoardServiceImpl 클래스의 메서드
오른쪽은 BoardServiceTests 클래스의 메서드
실행 전 DB_Table
테스트 클래스 실행 로그
실행 후 DB_Table
2. 목록(리스트) 작업의 구현과 테스트
왼쪽은 BoardServiceImpl 클래스의 메서드
오른쪽은 BoardServiceTests 클래스의 메서드
테스트 클래스 실행 로그
3. 조회 작업의 구현과 테스트
왼쪽은 BoardServiceImpl 클래스의 메서드
오른쪽은 BoardServiceTests 클래스의 메서드
테스트 클래스 실행 로그
4. 삭제/수정 구현과 테스트
왼쪽은 BoardServiceImpl 클래스의 메서드
오른쪽은 BoardServiceTests 클래스의 메서드
실행 전 DB_Table
정상적으로 수정과 삭제가 이루어지면,
1번 글의 title은 '제목 6월 24일' 로, updatedate는 현재 날짜로 수정되고,
2번 글은 삭제됩니다.
실행 후 DB_Table
이번 시간에는 비즈니스 계층에서의 CRUD 구현과 테스트를 해보았습니다.
'java, spring' 카테고리의 다른 글
[Spring] MariaDB와 log4jdbc 연결 오류 해결방법 (1) | 2021.06.30 |
---|---|
[Spring framework] 프레젠테이션(웹) 계층의 CRUD 구현 (Controller) (1) | 2021.06.26 |
[Spring] 영속 영역의 CRUD 구현 (MyBatis - CRUD) (0) | 2021.06.21 |
[Spring] 영속 계층의 CRUD 구현을 위한 환경설정 (0) | 2021.06.19 |
[Spring framework] 스프링 MVC 프로젝트 Java로 구성하기 (0) | 2021.06.18 |