hyeonga_code

PreProject_06_Controller 본문

Project_HYEONGARL

PreProject_06_Controller

hyeonga 2024. 5. 13. 07:59
반응형

 

 

목표.

Controller만 먼저 작성하여 흐름을 파악하고자 했다.

 

 

문제점.

SpringBoot와 Gradle 을 활용한 프로젝트를 처음 접하는 과정으로 하나부터 열까지 모두 찾아보며 작업해야 해서 시간도 오래걸리고 제대로 하고있는지도 확신이 서지 않아 갈팡질팡 하고 있는 과정이다..

 

 

ResponseEntity<>를 사용하는 로직.

최근 코드들은 try-catch문이나 if-else 문을 사용하지 않는 코드로 클린 코드를 지향하는 추세라고 한다.

중첩되는 try-catch문이나 if-else 문은 코드를 복잡하게 만들어 가독성이 떨어지고, 유지보수가 어려워지는 문제점이 발생한다. 하나의 메소드에서 많은 작업을 처리하게 되면 코드의 유지보수성과 재사용성도 떨어지게 된다.

 

참고했던 코드들에서 ResponseEntity<>를 많이 사용하여 적용했었는데, 멘토님께서 말씀하시길 실무에서 ResponseEntity<>를 사용하는 일이 거의 없었다고 하셨다. 

또한 ResponseEntity<>를 사용하게 되면 응답 상태 코드와 메세지를 직접 설정해야 하므로 try-catch문이나 if-else문이 많이 필요하게 될 수도 있다.

 

ResponseEntity<>를 사용하여 예외를 처리하는 코드는 메인 비즈지스 로직과는 관계가 없는 코드일 수 있다.

하여 이를 분리해 깨끗하고 유지보수가 쉬운 코드를 작성하는 것이 바람직하다고 한다. (챗GPT)

 

 

다른 방법.

하여 스프링 부트에서는 @ContrllerAdvice와 @ExceptionHandler를 사용하여 전역적으로 예외를 처리하는 방법을 사용한다. 컨트롤러나 서비스에서 비즈니스 로직과 예외 처리를 분리하여 더 깔끔한 코드를 작성할 수 있다.

>> 추후 적용할 예정으로 현재는 Controller의 ResponseEntity만 제거


Exception 

1. Checked Exception

해당 코드의 사용자에게 try-catch를 강제하게 되며 사용하지 않을 경우 컴파일 오류가 발생합니다.
Checked Exception은 해당 혜외가 반드시 처리되어야 하는 경우에만 사용하는 것이 좋습니다.(IOException)

2. Unchecked Exception

try-catch를 강제하지 않는 예외입니다. (RuntimeException)

 

Checked Exception을 남발하면 try-catch 도 자연스럽게 남발되고 의미 없는 catch 구문을 사용하게 됩니다.

 

ResponseEntity<> 대신 ControllerAdvice와 ExceptionHandler 사용하기

@ControllerAdvice

Controller 밖으로 throw 되는 예외를 처리하는 전역 Handler입니다.

 

@ExceptionHandler

@Controller, @RestController가 적용된 Bean 내에서 발생한 예외를 받아 처리할 수 있는 기능을 합니다.
@Service, @Repository 에러는 제외합니다.

 

 

 

- 처음 작성했던 Controller Sample 

// Controller.java
@RestController
@RequestMapping("/url")
public class UrlController {

    // Sample Data
    private Url url = Url.builder()
            .urlId(10L)
            .url("www.example.com")
            .urlTitle("Test Title")
            .urlDescription("Test Description")
            .categoryId(1L)
            .build();
            
    /**
     * 등록
     * @param request
     * @return 생성된 정보
     */
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ResponseEntity<ResponseDTO> create(@Valid @RequestBody RequestDTO request) {
        ResponseDTO response = convertToResponseDTO(request.toEntity());

        return ResponseEntity.status(HttpStatus.CREATED).body(response);
    }
    
    ..중략..
}

 

 

 

 

- 수정한 Controller Sample 

// Controller.java
@RestController
@RequestMapping("/url")
public class Controller {

    @Autowired
    private Service service;

    /**
     * 등록
     * @param Request 입력한 정보
     * @return 생성된 정보
     */
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ResponseDto save(@Valid @RequestBody RequestDto request) {
        return convertToResponseDto( service.save(request, IdFromToken()));
    }
}

 

 

 

반응형