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와의 연동 기반이 되는 중요한 단계입니다.