항해99/개발일지

20220127 개발일지 #원페이지 게시판 controller/service 분리

paran21 2022. 1. 27. 23:29

오늘은 3주차 마지막날이다.

개인과제는 이미 제출했고, 팀과제는 수정/추가했다.

알고리즘 문제를 몇 문제 풀고, 어제부터 보기 시작한 Spring 심화편 강의를 이어들었다.

 

심화편 강의에서 이번에 Spring 시작하면서 느꼈던 의문들이 거의 해소되었다.

내용도 많고 복잡하지만, 왜 Spring을 사용해야 하는지에 대해 Spring을 안쓰는 것부터 시작하는게 좋았다.

controller나 service, repo의 경우에도 먼저 안써보고 쓸 경우 어떻게 바꿀 수 있는지, 스프링의 중요 개념인 DI를 쓰면 어떻게 코드가 변하고 장점은 무엇인지 비교해주어서 좋았다.

 

1주차 강의를 오늘까지 듣고 마무리하고, 배운 내용을 바탕으로 추가로 만든 원페이지 게시판 코드를 일부 수정했다.

처음에 멀티페이지로 만들면서 좋았던 점은 모든 로직들을 service에서 구현하기 때문에 controller/service/repository의 구분이 확실하고, 코드를 이해하기에도 더 편했다.

 

반면에 원페이지 게시판은 기초3주차 강의를 바탕으로 구현했고, 간단한 기능들은 service없이 controller에서 모두 구현했다.

만약 추가로 프로젝트를 확장시킨다면 분리를 하는게 좋을 것 같았고, 배운 내용을 적용해보고 싶어 추가로 분리했다.

 

#Controller

서비스에서 모든 기능이 실현되도록 하였다.

일부러 Autowired를 생략하지 않았고, @RequiredArgsConstructor도 사용하지 않았다.

(강의 내용에서 언급한 것처럼 생략가능한 것들은 익숙해지고 사용하는게 좋을 것 같아서 우선 다 써줬다.)

@RestController
public class BoardController {

    private final BoardService boardService;

    @Autowired
    public BoardController(BoardService boardService) {
        this.boardService = boardService;
    }

    //게시글 등록하기
    @PostMapping("/boards")
    public Board createBoard(@RequestBody BoardRequestDto requestDto) {
        Board board = boardService.createdBoard(requestDto);
        return board;
    }

    //게시글 목록 조회하기
    @GetMapping("/boards")
    public List<Board> getBoard() {
        List<Board> board = boardService.getBoard();
        return board;
    }

    //게시글 조회하기
    @GetMapping("/boards/{id}")
    public Board getBoardOne(@PathVariable Long id){
        Board board = boardService.getBoardOne(id);
        return board;
    }
}

#Service

@Service
public class BoardService {

    private final BoardRepository boardRepository;

    @Autowired
    public BoardService(BoardRepository boardRepository) {
        this.boardRepository = boardRepository;
    }

    //게시글 등록하기
    public Board createdBoard(BoardRequestDto requestDto) {
        Board board = new Board(requestDto);
        boardRepository.save(board);
        return board;
    }

    //게시글 목록 조회하기
    public List<Board> getBoard() {
        return boardRepository.findAllByOrderByCreatedAtDesc();
    }

    //게시글 조회하기
    public Board getBoardOne(Long id) {
        Board board = boardRepository.findById(id).
                orElseThrow(() -> new NullPointerException("아이디가 존재하지 않습니다."));
        return board;
    }
}

마지막으로 깃 사용도 습관을 들여야 할 것 같아서 수정사항을 commit하고 push했다!