본문 바로가기
study

[JSCODE] 익명 게시판 서비스 개발 시작

by 당코 2023. 5. 11.

8주 차 동안 스터디를 통해 백엔드의 전반적인 프로젝트 진행방식에 대해 배우고자 한다.

오늘은 1회 차에 학습한 내용에 대해 정리해 보겠다.

1회 차에는 개발 환경 세팅 및 기본적인 CRUD 기능에 대해 구현하는 것을 목표로 했다.

 

배운 내용, 고민한 점

ERD가 복잡한 것이 아닌 지금은 Board 하나로만 기능을 구현하는 것이기 때문에 기본적인 설계는 어렵지 않았다.

내가 가장 고민한 부분은 엔티티와 dto 간의 변환 위치와 방법이었다.

 

엔티티와 dto 변환

먼저 컨트롤러에서 변환하는 것에 대해 생각해 보았다.

컨트롤러에서는 외부의 요청을 처리하고 다시 내보내는 작업을 수행하는데 여기서 dto를 엔티티로 변환하여 의존성을 추가하는 것이 아쉽다고 생각했다.

차라리 비즈니스 로직을 처리하는 서비스 계층에서 변환작업을 수행하는 것이 좀 더 좋다고 생각하여 서비스 계층에서 변환작업을 수행하였다.

 

다음으로는 엔티티와 dto 간의 변환하는 코드를 어디에 위치시킬 것인가를 고민하였다.

처음에는 엔티티에는 dto를 변환하는 코드를, dto에는 엔티티로 변환하는 코드를 각각 나누어서 entity.toDto 와 dto.toEntity 같은 형식으로 사용할 수 있게 만들었다.

하지만 엔티티 내부에 dto에 관한 코드가 있는 것이 의존성 관리 측면에서 좋지 않다고 느꼈다.

그래서 dto 내부에 2가지 변환 코드 모두를 위치시키고 정적 팩토리 메서드로 만들어 외부에서 사용할 수 있게 만들었다.

public class BoardResponse {

    ...

    public static Board toEntity(BoardRequest boardRequest) {
        return Board.builder()
                .title(boardRequest.getTitle())
                .content(boardRequest.getContent()).build();
    }

    public static BoardResponse from(Board board) {
        return BoardResponse.builder()
                .id(board.getId())
                .title(board.getTitle())
                .content(board.getContent())
                .createdDate(board.getCreatedDate())
                .build();
    }
}

 

예외처리

예외 처리에 대해서도 고민해 보았다.

예전에 @ExceptionHandler와 @ControllerAdvice에 공부했던 적이 있는데 이번에 활용해 보기 위해서 어떻게 구현해야 할지에 대해 학습해 보았다.

ExceptionHandlerController를 만들어 그 안에서 모든 예외를 받아 처리하게 만들었다.

@RestControllerAdvice
public class ExceptionHandlerController {

    @ExceptionHandler(BusinessException.class)
    private ResponseEntity<ExceptionResponse> handleBusinessException(BusinessException exception){
        ExceptionResponse response = ExceptionResponse.from(exception);
        return new ResponseEntity<>(response, exception.getHttpStatus());
    }
}

에러코드는 따로 enum 클래스로 만들어서 관리해 주었고 직접 만든 커스텀예외의 부모인 BusinessException을 만들어 공통처리 할 수 있게 구현하였다.

 

어려웠던 점, 개선할 점

코드를 짤 때 손이 가는 대로 짜는 것이 아닌 내가 그렇게 프로그래밍한 이유가 있어야 한다고 생각한다.

구현하는 것 자체보다 그 과정을 생각하고 이유를 찾아보는 과정이 어려웠고 시간이 많이 들었다.

혼자 찾아가면서 배우는 것도 많은 발전을 할 수 있었지만 다른 사람들의 생각과 이유에 대해 들으면서 의견을 나누어보고 싶다.