본문 바로가기
개발자 준비/개발 공부

실전을 위한 MVC 재 정리(feat. 입력을 원하는 타입으로 가공하는 책임은 어디일까?)

by osul_world 2022. 11. 22.
728x90

판단 실수

이전 미션을 수행하며, InputView에서 사용자 입력을 원하는 타입으로 변환하는 책임을 지어줬습니다

 

(심지어 타입 변환시 발생하는 예외처리도 이곳에서 담당합니다..)

public class InputViewImple implements InputView {

    @Override
    public List<Integer> inputWinningNumbers() {
        try {

            System.out.println("당첨 번호를 입력해 주세요.");
            return InputUtil.convertStringSplitToList(Console.readLine()); //타입 변환 책임

        }catch (Exception e){
            throw new IllegalArgumentException(WINNIG_NUMBERS_INPUT_FORMAT_ERROR_MESSAGE);
        }

    }
}

다시 돌이켜보니 뷰의 책임을 넘어도 한참 넘었습니다…때문에 입력 타입 변환의 책임은 어디에 배치시키는게 정확한지 알아보고자 합니다

 

💡 그전에 먼저 MVC의 개념과 각 구성 요소에 대한 범주를 정확하게 인지하고, 스프링을 예로들어 어디에 배치시킬지 알아보도록 하겠습니다

 

잠깐! MVC 각 부분의 책임은 어디서부터 어디 까지 일까?

모델

모델은 앱이 포함해야할 데이터가 무엇인지를 정의합니다. 객체의 데이터를 보유하고 생성을 담당하는 클래스가 여기에 속합니다

 

데이터 가공시 자주 사용되는 간단한 로직이 추가되기도 합니다 ex) 상품 수량을 더하고 빼는 기능

 

뷰는 앱의 데이터를 보여주는 방식을 정의합니다 즉, 사용자에게 보여지는 모든 UI를 담당하는 클래스 입니다

 

입력을 받기전에 보여지는 화면은 뷰지만 입력을 받는 곳은 컨트롤러입니다, 오직 보여지는 것 외에는 책임이 추가되면 안됩니다

 

컨트롤러

컨트롤러는 앱의 사용자로부터의 입력에 대한 응답을 만들어 내고 모델 및 뷰를 업데이트하는 클래스를 의미합니다

  • 사용자의 입력을 받는다
  • 입력에 대한 응답을 생성하기 위해, 모델이나 뷰를 직접 의존하기도 하며, 필요에 따라 서비스와 레포지토리에게 데이터 가공을 위임하기도 한다
  • 가공한 응답을 반환한다

 

서비스와 레포지토리 레이어

컨트롤러와 모델 사이에 존재하며, 모델에 의존하여 비즈니스 로직을 수행하는 객체들을 의미합니다

 

컨트롤러는 사용자 요청을 처리하기 위해 서비스나 레포지토리를 호출하여 이들이 가공한 데이터를 가지고 응답을 반환합니다

 

왜 서비스와 레포지토를 만들까요?

컨트롤러 하나에 모든 로직이 들어가면 컨트롤러가 크고 복잡해 지는 문제를 서비스 혹은 레포지토리에게 데이터 가공을 위임하여 해결할 수 있습니다

 

본론! 입력을 원하는 타입으로 가공하는 것은 어디서 해야할까?

결론부터 이야기하자면 컨트롤러 입니다, 실제로 스프링 요청 처리 과정을 보면 컨트롤러에 요청을 파라미터로 넘겨줄때

 

Argument Resolver가 동작하여 Json 등의 메세지를 원하는 타입으로 변환하는 작업을 수행합니다

 

Argument Resolver가 메시지 컨버터를 실행하는데 이 메시지 컨버터가 바로 입력을 원하는 타입으로 가공하는 업무를 담당합니다

 

컨트롤러에 유틸 클래스를 만들어 자동으로 타입 변환이 일어나도록 설계하면 될것 같습니다

 

번외: MVC를 지키며 코딩하는 5가지 방법

 

Reference

https://www.youtube.com/watch?v=ogaXW6KPc8I

https://onlyforus-blog.tistory.com/209

https://onlyforus-blog.tistory.com/158

https://starkying.tistory.com/entry/Model-객체에서만큼은-Validation을-필수로-하자

 

728x90