본문 바로가기
백엔드(Back-End)/Spring Boot

[sts4-Spring Boot] 05. Layout (Business Layer - 서비스 영역 처리)

by 기딩 2023. 11. 29.
728x90

2023.11.28 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 04. CRUD Test 작성

 

[sts4-Spring Boot] 04. CRUD Test 작성

이전 글에서 연결시킨 CRUD가 2023.11.28 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 04. CRUD Test 작성 잘 동작하는지 테스트할 차례이다. 그래서 src/메인/자바 or src/메인/리소스 디렉토리보다 src/테스

silvow94.tistory.com

CRUD까지 했으니, 그 CRUD를 어떻게 사용할지 (어떨 때 각 메서드를 활용할지)를 만들어야 한다.

즉, Serive인 비즈니스 로직을 정의하고 구현해보자~!

 

메인/자바의 com.board > 서비스 패키지에 인터페이스를 생성한다.

package com.board.service;

import java.util.List;
import com.board.domain.BoardDTO;

public interface BoardService {
	public boolean registerBoard(BoardDTO params);
	public BoardDTO getBoardDetail(Long idx);
	public boolean deleteBoard(Long idx);
	public List<BoardDTO> getBoardList();
}

작성한 내용을 받아서 게시글에 등록하는 registerBoard와

게시글의 인덱스만 받아서 해당 글을 반환하는 getBoardDetail

게시글의 인덱스만 받아서 해당 글을 삭제하는 deleteBoard

모든 게시글 반환하는 getBoardList

메서드를 정의한다.

 


인터페이스를 만들었으면? 그렇다! 

구현체를 만들어줘야 한다.

 

비즈니스 로직을 실제로 구현하기 위해, 서비스 패키지에 BoardServiceImpl 구현체(클래스)를 생성한다.

interface에 대한 구현체가 딱 하나만 있으면 보통 Impl을 붙임

구현체가 영어로 Implementation여서 접미사 Impl로 주로 표현

 

비즈니스 로직을 담당하는 서비스 클래스이므로 @Service

boradMapper 인터페이스 Bean을 주입한다. 

해당 인터페이스에는  Mapper.xml 쿼리  CRUD 함수들이 정의되어 있음 => MyBatis의 매퍼파일에 정의된 SQL 쿼리와 매핑

package com.board.service;

import java.util.Collections;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.board.domain.BoardDTO;
import com.board.mapper.BoardMapper;

@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper boardMapper;

 

이제 각 메서드를 정의하면 된다.

 

1. 게시글 생성 및 수정 기능

- 게시글 인덱스가 목록에 없음 -> 게시글 생성 (insertBoard에 작성한 내용 전달)

- 게시글 인덱스가 목록에 있음 -> 게시글 수정 (updateBoard에 작성한 내용 전달)

(내용 : 작성/수정 시간, 제목, 내용, 작성자, 공지글여부, 비밀글여부 // 인덱스는 자동++생성)

쿼리 실행 결과 ~> true / false

@Override
	public boolean registerBoard(BoardDTO params) {
		int queryResult = 0;
		
		if (params.getIdx() == null) {
			queryResult = boardMapper.insertBoard(params);
		} else {
			queryResult = boardMapper.updateBoard(params);
		}
		
		return (queryResult == 1) ? true : false;
	}

 

2. 게시글 하나 조회

- 인덱스에 해당하는 게시글 조회

~> 삭제 되지 않은 (selectBoardDetail에서 조건 반영됨) 게시글

@Override
	public BoardDTO getBoardDetail(Long idx) {
		return boardMapper.selectBoardDetail(idx);
	}

 

3. 게시글 삭제

- selectBoardDetail에 삭제되지 않은 (deleteYn이 'N'인) 게시글만 조회
  ('Y'거나 없는 게시글이면 삭제 실행되지 않음)

- 해당 글의 deleteYn을 'Y'로 변경 & deleteTime에 현재 시간 저장 (deleteBoard에 인덱스 전달)

쿼리 실행 결과 ~> true / false

@Override
	public boolean deleteBoard(Long idx) {
		int queryResult = 0;
		
		BoardDTO board = boardMapper.selectBoardDetail(idx);
		
		if(board != null && "N".equals(board.getDeleteYn())) {
			queryResult = boardMapper.deleteBoard(idx);
		}
		
		return (queryResult == 1) ? true : false; 
	}

 

4. 전체 게시글 조회

- 게시글 리스트를 넣기 위해 비어있는 리스트를 만든다.

- 게시글 수를 세고 (전체 글을 조회하는 것엔 크게 전달할 게 없으므로 selectBoardTotalCount();)

- 글의 수가 1개 이상 있으면 selectBoardList(삭제 안 된 글, 공지는 맨 위, 인덱스 내림차순)를 빈 리스트에 대입
~> 게시글 리스트 반환

@Override
	public List<BoardDTO> getBoardList() {
		List<BoardDTO> boardList = Collections.emptyList();
		
		int boardTotalCount = boardMapper.selectBoardTotalCount();
		
		if (boardTotalCount > 0) {
			boardList = boardMapper.selectBoardList();
		}
		
		return boardList;
	}

 

다음 글은 컨트롤러 처리!

728x90