[스프링부트 #8] BoardService 실습 코드 핵심 정리
게시판 만드는 프로젝트의 Service 계층에서 실습한 코드의 핵심을 정리하였습니다.
Aug 09, 2025
![[스프링부트 #8] BoardService 실습 코드 핵심 정리](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%258A%25A4%25ED%2594%2584%25EB%25A7%2581%25EB%25B6%2580%25ED%258A%25B8%2B%25238%255D%2BBoardService%2B%25EC%258B%25A4%25EC%258A%25B5%2B%25EC%25BD%2594%25EB%2593%259C%2B%25ED%2595%25B5%25EC%258B%25AC%2B%25EC%25A0%2595%25EB%25A6%25AC%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%252323ec86%26bgEndColor%3D%252323ec86%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
1. BoardService 클래스
역할은 게시판의 비즈니스 로직을 처리한다. BoardRepository에 의존함.
Controller → Service → Repository → Entity에 의존함.
주요 책임은 비즈니스 로직을 처리하고 트랜잭션 관리, 응답 DTO 생성이다.
응답 DTO 생성은 서비스 말고 컨트롤러에 책임을 가져가도 되지만, 여기서는 서비스의 책임이다.
2. 주요 메서드
메서드명 | 설명 | 트랜잭션 | DTO 사용 | 비고 |
게시글목록() | 모든 게시글 조회 후 ListResponseDTO 로 변환 | ❌ | 응답 DTO 직접 생성 | 조회 전용 |
게시글상세(int id) | 게시글 단건 조회 후 DetailResponseDTO 로 변환 | ❌ | 응답 DTO 직접 생성 | 조회 전용 |
게시글쓰기(BoardSaveRequestDTO reqDTO) | 게시글 저장 | ✅ | 요청 DTO에서 필요한 값만 꺼냄 | INSERT |
게시글삭제(int id) | ID로 게시글 삭제 | ✅ | - | DELETE |
게시글수정(int id, BoardUpdateRequestDTO reqDTO) | 게시글 수정, 성공 여부 반환 | ✅ | 요청 DTO에서 값 꺼냄 | UPDATE (결과로 row 수 확인) |
3. 전체 실습 코드
public class BoardService {
private final BoardRepository boardRepository;
public List<BoardListResponseDTO> 게시글목록() {
List<Board> boardList = boardRepository.findAll();
List<BoardListResponseDTO> resDTO = new ArrayList<>();
for (Board board : boardList) {
BoardListResponseDTO boardListResponseDTO = new BoardListResponseDTO();
boardListResponseDTO.setId(board.getId());
boardListResponseDTO.setTitle(board.getTitle());
resDTO.add(boardListResponseDTO);
}
return resDTO;
}
public BoardDetailResponseDTO 게시글상세(int id) {
Board board = boardRepository.findById(id);
BoardDetailResponseDTO resDTO = new BoardDetailResponseDTO();
resDTO.setId(board.getId());
resDTO.setTitle(board.getTitle());
resDTO.setContent(board.getContent());
return resDTO;
}
@Transactional
public void 게시글쓰기(BoardSaveRequestDTO reqDTO) {
boardRepository.save(reqDTO.getTitle(), reqDTO.getContent());
}
@Transactional
public void 게시글삭제(int id) {
boardRepository.deleteById(id);
}
@Transactional
public boolean 게시글수정(int id, BoardUpdateRequestDTO reqDTO) {
int rows = boardRepository.update(id, reqDTO.getTitle(), reqDTO.getContent());
return rows == 1;
}
}
- DTO에 종속되지 않도록 필요한 값만 꺼내서 Repository에 넘긴다.

- 조회 메서드는 DTO로 직접 가공해서 반환 → Controller는 비즈니스에 집중 안 해도 됨

@Transactional
을 쓰는 위치가 정확함 → write 작업에만 적용
- 메서드 네이밍이 명확함 (
게시글쓰기
,게시글삭제
,게시글수정
) → 비즈니스 의도가 잘 드러남
Controller에서 받은 DTO는 꼭 Service에 직접 넘기지 말고, 필요한 값만 꺼내서 넘겨야 한다.
Service는 View나 Request 형식에 절대 종속되면 안 된다. 그래야 진짜로 재사용 가능한 비즈니스 계층이 된다.
Share article