hyeonga_code
PreProject_06_Controller 본문
목표.
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()));
}
}
'Project_HYEONGARL' 카테고리의 다른 글
PreProject_8_SpringBoot 프로젝트 MySQL 연결하기 (0) | 2024.05.26 |
---|---|
PreProject_07_Controller Test (TestRestTemplate) (0) | 2024.05.21 |
PreProject_05_ResponseEntity<> (0) | 2024.05.13 |
PreProject_04_Spring Web Layer (0) | 2024.05.13 |
PreProject_03_ORM(Object-Relational Mapping) 을 위한 Entity Class (0) | 2024.05.12 |