SpringBoot
[Spring] #2. 게시판 만들기 _ DAO, Service 생성
도하루박
2022. 11. 18. 21:24
반응형
DAO 생성
DB에 insert 확인이 되면 이제 DAO를 만들 건데 Spring 에서는 repository 패키지 안에 생성한다.
main > java > repository > BoardDAO
package com.example.app.repository;
import com.example.app.domain.vo.BoardVO;
import com.example.app.mapper.BoardMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class BoardDAO {
private final BoardMapper boardMapper;
// 추가
public void save(BoardVO boardVO) {
boardMapper.insert(boardVO);
}
// 수정
public void setBoardVO(BoardVO boardVO) {
boardMapper.update(boardVO);
}
// 삭제
public void remove(Long boardNumber) {
boardMapper.delete(boardNumber);
}
// 조회
public BoardVO findById(Long boardNumber) {
return boardMapper.select(boardNumber);
}
// 전체 조회
public List<BoardVO> findAll() {
return boardMapper.selectAll();
}
}
@Repository
@RequiredArgsConstructor
위에서 Repository와 ReauiredArgsConstructor 등록해줌으로써 스프링 빈에 등록해준다는 의미이고 스프링이 관리하게 될 수 있게 해준다. 여기서 다오는 데이터베이스 쪽에서 전달받는 결과값들을 처리 할 수 있는 객체지향이라는 영역에서 가장 앞에 마중나와있는 영역이라고 할 수 있다.
DAO Service
서비스의 필요성
DAO를 만들면 컨트롤러에서 바로 사용해도 상관은 없지만 DAO는 한 쿼리당 하나의 다오 매서드가 1대1 매핑이 되어야 한다. 쿼리당 다오 매서드가 하나씩 구현이 되기 때문에 쿼리의 양이 많아지면서 복잡한 코드가 될 것이다.
여기서 서비스는 여러 쿼리의 다오를 묶는 역할을 서비스가 해준다. 그렇기 때문에 컨드롤러에서는 이 서비스를 호출만 하게 되면 간결한 쿼리가 나오게 될 것이고 클린코드가 나오게 되는 것이다.
만약 다오를 거치지 않고 매퍼의 쿼리를 서비스에서 묶는 다면?
매퍼를 서비스에서 묶을 수 없는 이유는 객체지향이라는 것이 있기 때문에 매퍼에서는 파라미터타입과 리턴타입이 묶여있고 쿼리에 맞게끔이미 결합을 시켜놓은 상태라서 서비스에서 구현이 어려울 수 있다.
Service 생성
service는 상황에 따라 class로도 생성이 되고 interface로도 생성이 된다.
여기서 사용하는 매서는 화면에서 보이는 쪽으로 생각하며 설정한다.
package com.example.app.service;
import com.example.app.domain.vo.BoardVO;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public interface BoardService {
// 추가
public void register(BoardVO boardVO);
// 수정
public void modify(BoardVO boardVO);
// 삭제
public void remove(Long boardNumber);
// 조회
public BoardVO show(Long boardNumber);
// 전체 조회
public List<BoardVO> showAll();
}
구현체 Service 생성
서비스를 만든 다음 이제 구현체가 필요하다
게시판에 해당하는 이름을 설정해주고 위에서 설정한 BoardService를 상속받게 해준다.
package com.example.app.mapper;
import com.example.app.domain.vo.BoardVO;
import com.example.app.repository.BoardDAO;
import com.example.app.service.BoardService;
import lombok.RequiredArgsConstructor;
import java.util.List;
@Service
@RequiredArgsConstructor @Qualifier("community") @Primary
public class CommunityBoardService implements BoardService {
private final BoardDAO boardDAO;
@Override
public void register(BoardVO boardVO) {
boardDAO.save(boardVO);
}
@Override
public void modify(BoardVO boardVO) {
boardDAO.setBoardVO(boardVO);
}
@Override
public void remove(Long boardNumber) {
boardDAO.remove(boardNumber);
}
@Override
public BoardVO show(Long boardNumber) {
return boardDAO.findById(boardNumber);
}
@Override
public List<BoardVO> showAll() {
return boardDAO.findAll();
}
}
CommunityBoardServiceTest
package com.example.app.service;
import com.example.app.domain.vo.BoardVO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Slf4j
public class CommunityBoardServiceTest {
@Autowired
private BoardService boardService;
@Test
public void registerTest(){
BoardVO boardVO = new BoardVO();
boardVO.create("새로 작성한 게시글 제목", "홍길동", "새로 작성한 게시글 내용");
boardService.register(boardVO);
}
@Test
public void modifyTest(){
BoardVO boardVO = boardService.show(1L);
boardVO.setBoardTitle("수정된 게시글 제목");
boardService.modify(boardVO);
}
@Test
public void showTest(){
log.info("board: " + boardService.show(1L));
}
@Test
public void showAllTest(){
boardService.showAll().stream().map(BoardVO::getBoardTitle).forEach(log::info);
}
}
반응형