본문 바로가기
JAVA

웹 MVC

by NetStats 2024. 5. 4.

MVC => 코드에 대한 유지보수를 어떻게 하면 편하게 할수 있을까 고민하다 탄생하게 되었다

 

MVC패턴이 생긴 가장큰 이유는 유지보수 때문이다 

먼저 사용자가 구글에 코딩이라고 검색을하면 

그럼 이 컨트롤러는 코딩에 대한 검색 데이터를 달라고 모델한테 요청을한다.

 

이 모델은 검색결과 데이터를 찾아 컨트롤러에 전달하게 되고 컨트롤러는 다시 뷰한테 전달한다

뷰는 사용자가보는 검색결과의 데이터를 UI를 사용하여 예쁘게 나눠 보여준다 

 

 

모델은 데이터와 관련된 일을한다

컨트롤러는 모델과 뷰와 중개자 역할을한다

뷰는 사용자한테 보여지는 부분을 담당한다

 

MVC를 지키면서 코딩하는방법

첫번째

쉽게 풀어 말하면 모델내부에 컨트롤러와 뷰에 관련된 코드가 있으면 안된다.

 모델은 컨트롤러와 뷰에 의존하지 않아야 한다.

모델 내부에 컨트롤러와 뷰에 관련된 코드가 있으면 안된다.

모델 클래스에서 컨트롤러와 뷰의 클래스를 import해서  사용하면 안된다는거다.

 

모델은 데이터와 관련된 부분이다 모니 언제든 깔끔하고 정제된 데이터를 꺼내 쓸 수 있게

뷰나 컨트롤러에 코드를 섞어넣지않고

데이터에 관련된 코드만 넣는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Student {
    private String name;
    private int age;
    
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
    
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
}
cs

- 이름과 나이를 가진 클래스다. -

컨트롤러나 뷰에 관련된 코드가 아예 없다.

컨트롤러나 뷰에 의존을 하고 있지않다

 

두번째

 

뷰는 모델에만 의존해야하고 컨트롤러에는 의존하면 안된다.

쉽게 말해서 뷰 내부에 모델의 코드만 있을 수 있고

컨트롤러의 코드가 있으면 안된다 .

 

1
2
3
4
5
6
7
8
9
10
11
public class OutputView{
    public printProfile(Student student){
        System.printnl(
                "내 이름은 " + student.getName() + "입니다."
                );
        
        System.printnl(
                 "내 나이는 " + student.getAge() + "입니다."
                );
    }
}
cs

위 코드에 printProtile method의 파라미터로 student를 받는걸 볼수 있다

그러나 student는 모델에 관련된 코드다 뷰 내부에 모델에 관련된 코드는 있어도 상관이 없다.

하지만 컨트롤러와 관련된 코드는 있으면 안된다.

 

세번째

세번째로는 뷰가 모델로 부터 데이터를 받을 때는 사용자마다 다르게 보여줘야하는 데이터에 대해서만 받아야한다.

이 말이 무슨말이냐면

실제 어플 서비스를 바탕으로 설명을 한번 해보면

배달의 민족 어플 주문화기 화면

여기서 화면을 다르게 보여줘야하는건 크게 두가지가있다

사용자마다 다르게 보여줘야 되는 부분들과

사용자한테 일관되게 보여줘야할 부분으로 나눌수있다

빨간색으로 가둔 부분을 잘 보자

이렇게 빨간색으로 칠해진 부분이 사용자마다 다르게 보여줘야할 부분이다

 

 

정리하자면 View는 사용자에게 보여줘야할 UI와

모델로 부터 받은 데이터가 합쳐져 만들어진 화면이다

여기서 중요한건 모든 사용자한테 똑같이 보여줘야할 부분들(ex. 주문하기 글씨, 배달 정보란 글씨,어플 배경은 하얀색)

이런 정보들은 모델로부터 받으면 안된다.

뷰가 자체적으로 가지고 있어야 되는 정보들이다.

 

이 세번째 규칙은 뷰가 모델로부터 데이터를 받을때는 사용자마다 다르게 보여야 하는 데이터에 대해서만 받아야한다

 

네번째

 

 

1
2
3
4
5
6
public class Controller{
    public static void main(String[] args){
        Student student = new Student("이름",20);
        OutputView.printProfile(student);
    }
}
cs

컨트롤러 내부에는 모델과 뷰의 코드가 있을 수 있다.

왜냐하면 컨트롤러는 모델과 뷰의 중개자 역할을 하면서 전체 로직을 구성하기 때문이다.

 

다섯번 째

다섯 번째로는 뷰가 모델로부터 데이터를 받을때

반드시 컨트롤러에서 받아야한다

위의 컨트롤러 코드를 보면 모델인 Student 클래스로부터 학생의 데이터를 만들어서 뷰의printProfile method한테 

파라미터로 전달하는걸 볼수 있다

뷰가 모델로부터 데이터를 받을대는 컨트롤러 코드 코드 안에서만 받야한다.

 

 

 

정리

1.Model 은 Controller와 View에 의존하지 않아야 한다

(Model 내부에 Controller와 View에 관련된 코드가 있으면 안된다.)

 

2.View는 Model에만 의존해야하고, Controller에는 의존하면 안된다.

(view 내부에 Model의 코드만 있을수 있고, Controller의 코드가 있으면 안 된다.)

 

3.View가 Model로 부터 데이터를 받을때는,

사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.

 

4.Controller는 Model과 View에 의존해도 된다.

(Controller 내부에는 Model과 View의 코드가 있을 수 있다.)

 

5.View가 Model로 부터 데이터를 받을 때, 반드시 Controller에서 받아야한다.

 

출처

 

 

반응형

'JAVA' 카테고리의 다른 글

java람다/스트림  (0) 2024.05.06
DTO 와 VO  (0) 2024.05.04
Spring 어노테이션 정리  (0) 2024.05.03
httpServletRequest 주요기능  (0) 2024.05.02
JAVA 파일 스트림  (0) 2024.05.02

댓글