나의보물들/Java

[Java] MVC (Model-View-Controller) 패턴에서의 예외처리

솔솔하네 2024. 7. 27. 16:33

🍀 MVC 패턴이란?


소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴 중 하나로 애플리케이션 개발 시 세 가지(Model-View-Controller) 주요 구성 요소로 분리하여 구조화된 방식으로 개발할 수 있도록 도와줌.

 

[ M ] Model

 역할 : 비즈니스 로직과 데이터 관리를 담당

 책임 : 비즈니스 로직을 처리하고 데이터베이스와 상호작용하여 데이터를 가져오거나 저장하는 역할

 예외 처리 : 비즈니스 로직에서 발생하는 예외를 처리 그러나 모델은 사용자에게 직접적인 응답을 생성하거나 표시할 수 없음

 

[ V ] View

 역할 : 사용자 인터페이스를 담당

 책임 : 모델의 데이터를 사용자에게 보여주고 사용자가 데이터를 입력할 수 있도록 함

 예외 처리 : 일반적으로 예외를 직접 처리하지 않지만 컨트롤러가 전달한 오류 메시지를 사용자에게 표시할 수 있음

 

[ C ] Controller

역할 : 사용자 요청을 처리하고 모델과 뷰 사이의 중재 역할을 담당

책임 : 사용자의 입력을 받고 이를 처리하여 적절한 모델과 상호 작용함

예외 처리 : 예외 처리의 책임을 가지며 모델에서 발생한 예외를 포착하여 사용자에게 적절한 오류 메시지와 상태 코드를 제공할 수 있음

 

 

🍀 MVC 패턴에서의 예외처리해야 되는 이유


MVC 패턴의 책임 분리에 따라 각 컴포넌트가 자신의 역할에 맞게 작업을 수행하도록 하는데 예외처리는 Controller에서 책임을 수행할 수 있도록 해야함.

 

1. 중앙 집중적인 예외 관리

  • 모델에서 발생한 예외를 컨트롤러로 전달하면 모든 예외 처리를 컨트롤러에서 중앙 집중적으로 관리할 수 있음.
  • 이를 통해 예외 처리 로직을 통합하고  중복된 코드를 줄여 유지보수를 용이하게 함.

2. 유연한 예외 처리

  • 다양한 예외 상황에 대해 컨트롤러에서 예외의 종류에 따라 다른 처리 로직을 적용할 수 있음.
  • 이를 통해 사용자에게 적절한 오류 메시지 또는 페이지를 제공 가능.

3. 사용자에게 예외 정보 전달

  • ⭐️모델에서 try-catch로만 예외를 처리하면 에러는 발생하지 않지만 사용자는 무엇이 잘못되었는지 알 수 없음.⭐️
  • 컨트롤러에서 예외를 처리하여 사용자에게 오류 상황을 알리고, 적절한 대처 방법을 안내할 수 있음.

 

🍀 MVC 패턴에서의 예외처리 코드 작성


1. Model에서 예외 던지기

 - throw :  예외 객체를 생성하여 예외를 발생시키고, 호출된 곳으로 예외를 전달

public class UserService {
    public User findUserById(int id) {
        if (id <= 0) {
        	// IllegalArgumentException : 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외	
            throw new IllegalArgumentException("유효하지 않은 사용자 입니다.");
        }
        return user;
    }
}

 

2. Controller에서 예외 처리

 - try~catch : try 블록에서 예외가 발생할 수 있는 코드를 실행하고 catch 블록에서 발생한 예외를 처리 ⇢ 프로그램의 비정상 종료를 방지하고 적절한 오류 처리 함.

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/user/{id}")
    public String getUser(@PathVariable("id") int id, Model model) {
        try {
            User user = userService.findUserById(id);
            model.addAttribute("user", user);
            return "userView";
        } catch (IllegalArgumentException e) {
            model.addAttribute("errorMessage", e.getMessage());
            return "errorView";
        }
    }
}

 

 

💭 마이 띵킹 💭

이전에는 mvc패턴으로 프로젝트를 만들 때 사용자에게 불편을 주지않으려면 예외처리를 잘 해야된다고만해서  try-catch문과 throw를 각 책임에 대해 분리하지않고 여기저기 남발하면서 코드를 작성했는데  책임에 따라 분리를 해서 mvc패턴 맞게 작성해야된다는걸 배우고 사용자 한테 불편을 초래하지  않기 위해 예외처리를 했지만 내가 작성했던 코드는 작성만했지 사용자에게 오류 상황을 알리지 못했던 코드도 있었다는 사실에 무지했던 사실에 부끄럽기도 하고 오늘 이런 내용을 배울 수 있어서 너무 럭키비키였고 앞으로 코드를 작성할 때 잘 해야겠다라는 생각이 들었다.