Spring/실습 정리
Spring 6강 - BoardService 계층 구성과 실행 테스트
코딩하는냥이
2025. 6. 18. 14:48
반응형
이번 글에서는 BoardService 인터페이스를 정의하고, 이를 구현한 BoradServiceImpl 클래스를 통해 비즈니스 로직 계층(Service Layer)을 구성합니다. 그리고 BoardServiceClient를 통해 동작을 테스트합니다.
📦 BoardService.java (인터페이스)
package com.springbook.biz.board;
import java.util.List;
public interface BoardService {
void insertBoard(BoardVO vo);
void updateBoard(BoardVO vo);
void deleteBoard(BoardVO vo);
BoardVO getBoard(BoardVO vo);
List<BoardVO> getBoardList();
}
📦 BoradServiceImpl.java (서비스 구현 클래스)
package com.springbook.biz.board;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("boardService")
public class BoradServiceImpl implements BoardService {
@Autowired
private BoardDAO boardDAO;
@Override
public void insertBoard(BoardVO vo) {
boardDAO.insertBoard(vo);
}
@Override
public void updateBoard(BoardVO vo) {
boardDAO.updateBoard(vo);
}
@Override
public void deleteBoard(BoardVO vo) {
boardDAO.deleteBoard(vo);
}
@Override
public BoardVO getBoard(BoardVO vo) {
return boardDAO.getBoard(vo);
}
@Override
public List<BoardVO> getBoardList() {
return boardDAO.getBoardList();
}
}
📦 BoardDAO.java (@Repository 등록)
@Repository("boradDAO")
public class BoardDAO {
// DB 연동 로직은 이전 강의와 동일하며 생략
}
📦 JDBCUtil.java (리팩토링된 자원 정리)
public static void closeMethod(AutoCloseable resource) {
if (resource != null)
try {
resource.close();
} catch (Exception e) {
e.printStackTrace();
}
}
- 자원을 보다 간결하게 닫는 방식으로 개선되었습니다.
- AutoCloseable을 이용하여 재사용성 ↑
📦 BoardServiceClient.java (클라이언트 테스트 코드)
package com.springbook.biz.board;
import java.util.List;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class BoardServiceClient {
public static void main(String[] args) {
AbstractApplicationContext factory =
new GenericXmlApplicationContext("applicationContext.xml");
BoardService boardService = (BoardService) factory.getBean("boardService");
BoardVO vo = new BoardVO();
vo.setTitle("ㅌㅌ");
vo.setWriter("aa");
vo.setContent("ㅌㅌ");
boardService.insertBoard(vo);
List<BoardVO> boardList = boardService.getBoardList();
for (BoardVO board : boardList)
System.out.println(board.toString());
}
}
📌 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.springbook.biz"/>
</beans>
- <context:component-scan>을 통해 @Service, @Repository 등이 자동 등록됩니다.
💬 코드 설명
- BoardService: 서비스 계층의 인터페이스이며, 외부에서 사용할 메서드 목록을 정의.
- BoradServiceImpl: 실제 로직을 DAO에 위임하여 처리하며, @Service를 통해 Bean으로 등록됨.
- BoardDAO: DB 처리 로직을 담당하며, @Repository로 등록되어 스프링이 자동으로 관리함.
- BoardServiceClient: 스프링 컨테이너를 이용해 Service Bean을 가져와 기능을 테스트함.
- JDBCUtil: 코드 반복을 줄이기 위해 AutoCloseable 기반의 간단한 자원 해제 방식으로 개선됨.
💡 포인트 정리
- @Service, @Repository, @Autowired를 활용한 계층 분리 구조 구현.
- XML 설정 대신 컴포넌트 스캔으로 Bean 자동 등록.
- 테스트용 클라이언트에서 전체 흐름 검증 가능.
- JDBCUtil 개선으로 코드 재사용성과 가독성 향상.
📌정리하자면, 이번 강의에서는 Service 계층을 구성하고 DAO와 연결하여 전체 CRUD 흐름을 완성해보았습니다. 이 구조를 통해 스프링의 DI(의존성 주입)과 계층 분리를 자연스럽게 적용할 수 있었으며, 향후 컨트롤러/웹 UI와의 연동 기반이 되는 중요한 단계입니다.