이전에 만들었던 날짜를 알려주는 프로그램을 크게 보면
입력
처리
출력
3단계로 나눠져있다
내가 원하는 것을 입력하면
그것을 처리하고
처리된 값을 출력하고
대부분 이런 순서로 진행된다
이러한 과정 하나하나를 관심사라고하며 영어로는 concern이라고 한다
즉 우리가 해야할 작업이다 우리가 관심을 가지고 해야할 작업을 관심사라고 부른다
main이라는 메서드는 현재 3개의 관심사를 가지고 있다
oop 5대 설계원칙이라는 것이 있는데 지금은 자세하게 다루지않고 이런것이 있구나 정도만 알면된다
S O L I D
1 2 3 4 5
이중에 첫번째 S에 해당하는 (SRP 단일 책임의 원칙)에 대해 설명해보면
하나의 메서드는 하나의 책임을 가진다
여기서 책임은 하나의 관심사라는 것이다
이 프로그램에서는 main이라는 메서드의 관심사가 3개이므로 관심사를 분리해줘야한다
하나의 메서드가 3개의 책임을 가지고 있는 상태인데
객체지향을 잘하기위해서는 코드 분리를 잘해줘야한다
분리에는 3가지가 있는데
첫번째로 관심사의 분리
두번째로 변하는 것과 자주 변하지않는 것(common code, uncommoncode)의 분리
마지막으로 공통 코드 즉 중복된 것의 분리이다
앞으로 설계하고 코드를 짤 때 이 3가지 분리가 잘 이뤄졌는지에 따라
내가 짠 코드가 객체지향적으로 잘 설계된 코드인지 그렇지않은지를 알 수 있게 된다
처음부터 객체지향적인 코드를 잘 설계할 수는 없지만
그 기준이 이렇다 라는 것만 알아두자
코드를 일단 작성해놓고 5대 설계원칙과 3개의 분리가 잘 되어있는지 확인검토하면서
개선해나가면 되는 것이다
이제 이 3개의 관심사를 분리해보자
위에 각각의 컨트롤러에서
입력은 Request.getParameter()를 보통 사용하는데 그럼 총 3번의 중복코드를 사용하는 것이다
그렇게되면 우리가 3가지 분리에 해당하는 중복분리가 되지 않은 것이므로 객체지향적 설계를 위해 분리를 꼭 해줘야한다
각각의 컨트롤러에서 입력부분만 떼서 요청을 받았을 때 입력에서 먼저 처리하고 컨트롤러로 보내주면 된다
하나의 관심사의 분리가 이런 것이다
기존의 3개의 입력을 중복했던 것을 하나로 만들어주고
요청이 들어오면 먼저 입력을 받고 각각의 컨트롤러로 보내주면되는 것
쉽게말하면 지금의 분리를 우리는 공통 코드의 분리 - 입력의 분리라고 할 수 있다
매개변수로 request를 받아와서 년원일을 getParameter로 꺼내서 썼는데
이걸 request로 받지 않고 개별매개변수로 직접 받을 수 있게 바꿀 수 있다
이렇게하면 차이점이 통으로 한번에 받는 것이 아니라 각자 개별적으로 꺼내서 하나씩 받을 수 있게 되는 것이다
심지어 스프링에서는 자동변환이 가능해서 "abc" 같은 것은 에러가 날 수 있지만
"2021" 같은 스트링은 int year라고 주게되면 2021이라는 숫자로 자동변환까지 해준다
이로서 일일이 필요한 것들을 따로 적게되면 입력을 할 필요가 없게되고 하나의 관심사를 사라지게 만들 수 있다
여기까지 따라왔으면 머리가 지끈거리고 이게 무슨소리야? 라는 생각이 들 수 있다
포스팅을 하는 나조차도 이걸 100프로 이해하면서 쓰는 것이 아니다
끊임없이 공부하고 복습하면서 내것으로 만드는 과정속의 나의 노력이 중요한 것이지
한번 읽고 강의봤다고 내 것이 안됬다는 것에 초점이 맞춰져서 스트레스 받을 필요는 없다
이제 남은 2개의 관심사를 어떻게 분리할 수 있는지 보자
이렇게 만약 출력을 분리하게 되면 장점도 있지만 단점도 있다
사실 단점이라기보다는 기존의 방식에서는 같은 메서드 안에 있기 때문에
편하게 호출 할 수 있지만 따로 분리하게 되면 같은 메서드가 아니므로 year, month, day 등등을 호출할 수 없게 된다.
영역이 서로 다르기 때문이다
그래서 우리는 객체 Model이 필요하다
이 모델 객체가 값들을 다 저장하고 출력하는 곳에 전달을 해주면 출력이 가능하게 된다
이런식으로 처리하는 것이 MVC 패턴이다
작업처리는 Controller
출력하는 곳은 View
그 분리된 사이를 이어주는게 Model
이게바로 MVC패턴이다
위 이미지를 보면 상단에 방식이 기존의 방식이고 아래에 방식이 MVC패턴이다
MVC 패턴의 흐름을 설명하자면
1. 클라이언트가 어떠한 요청을 하면 DispatcherServlet이라는 녀석이 Model객체를 만들어서 요청을 저장하고 컨트롤러에게 던짐
2. Controller에서는 요청받은 일을 처리 하고 결과물을 Model에 다시 담은 후 Dispatcher에게 다시 던짐
3. 디스패쳐는 요청했던 것의 결과를 가지고 있는 Model을 넘겨 받아서 View에게 전달함
4. View는 전달받은 요청의 결과를 알아볼 수 있게 이쁘게 출력해서 클라이언트에게 보여줌
사실 이것보다 훨씬 복잡하짐나
이건 단순화해서 설명한것이다 처음부터 다 이해하기 힘드니까
단순하게 이해하고 복잡하게 알아가는게 좋다
코드로 한번 보면서 설명하자면
클라이언트가 요청(1)을 보내면 그 요청을 디스해쳐는 알아서 입력 및 변환한 다음 결과를 담을 수 있는 Model이라는
객체를 만들어서 요청을 담은 다음 컨트롤러에게 전달(2)한다
여기보면 유효성 검사를 해줬는데 year, month, day가 잘못들어오게 되면 에러를 발생해서 클라이언트에게 쏴주게 된다
클라이어트가 전달받은 후 model로 해당값들을 전부 저장해준다
저장 한 모델을 이제 View에게 보내야 하는데 어떤 파일을 통해서 보여줄지 정해야하는데
이렇게 yoil이라는 파일을 통해서 보여주고싶다고 지정해주면
컨트롤러는 View에게
야! 이 값들 yoil.jsp에서 출력해! 라고 주문하게 된다
그러면 yoil.jsp는 준비하고있다가
값이 넘어오면 년,월,일,요일 을 전부 받아서
출력하고 그 값을 클라이언트에게 응답해주게된다
일상적인 예시를 하나 들어보자
우리가 만약 은행에서 거래내역을 1년치 조회를 했을 때
그 조회 내역을 PDF 로 받을지 CSV로 받을지 Excel로 받을 지 고객이 선택할 수 있도록
버튼을 각각 만들어 놓았다고 해보면 그 버튼 하나하나가 별도의 View라고 보면 된다
클라이언트가 버튼을 눌렀을 때 그 버튼의 해당하는 View를 보여주는 것이다
여기까지가 이론이고 다음 포스팅에서 실습을 진행하고 실습을 바탕으로 알게된 것들을 정리해보자
'BackEnd' 카테고리의 다른 글
서블릿과 JSP (0) | 2022.12.16 |
---|---|
관심사의 분리, MVC 패턴 - 실습 (0) | 2022.12.15 |
Base64 64진법이란? (0) | 2022.12.15 |
텍스트 파일 vs 바이너리 파일 (0) | 2022.12.15 |
스프링 MVC 공부 (0) | 2022.09.14 |