1. 관심사의 분리
1) 관심사란
컴퓨터 과학에서 관심사(concern)는 컴퓨터 프로그램의 코드에 영향을 미치는 특정한 정보 집합이다. 관심사는 데이터베이스 상호작용의 세세한 부분처럼 포괄적이거나, 기초적인 계산을 수행하는 등의 구체적인 경우일 수 있으며 이는 개발자, 그리고 논의되는 프로그램 간의 소통 수준에 따라 달라진다.
관심사(컴퓨터 과학), 위키백과 https://ko.wikipedia.org/wiki/%EA%B4%80%EC%8B%AC%EC%82%AC_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)
2) 관심사를 분리해야 하는 이유
관심사의 분리는 하나의 관심사가 하나의 기능만 수행하도록 코드를 구성하는 것을 말한다. 한 객체(모듈, 클래스) 안에서 다양한 관심사를 수행하면 코드가 복잡해져서 코드에 대한 이해도가 떨어진다. 이는 유지보수적인 측면에서 악영향을 줄 수 있다. 때문에 하나의 관심사가 하나의 기능을 수행하도록 코드를 작성하는 것이 좋다.
3) 관심사를 분리하는 방법
관심사를 분리하기 위해선 SOLID 원칙에 따라 코드를 작성하는 것이 좋다.
OOP 5대 설계 원칙(SOLID)
- SRP(Single responsibility principle) - 단일 책임의 원칙
- 하나의 클래스는 하나의 책임만 진다.
- 책임 = 관심사
- OCP(Open/closed principle) - 개방/폐쇄 원칙
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- LSP(Liskov substitution principle) - 리스코프 치환 원칙
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- ISP(Interface segregation principle) - 인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- DIP(Dependency Inversion principle) - 의존관계 역전 원칙
- 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.”
이 외에도 "변하는 것과 변하지 않는 것의 분리", "공통(중복)코드의 분리" 등으로 코드를 분리할 수 있다.
2. MVC패턴(Model, View, Controller)
대부분의 컨트롤러는 입력, 처리, 출력으로 구성된다.
1) 입력의 분리

이 중 입력 부분은 중복되는 영역이기 때문에 공통 코드로 분리하는 것이 좋다.
2) 출력(View)과 처리(Controller)의 분리

출력(View)은 값을 처리된 결과를 사용자에게 반환하는 기능을 말한다. 출력값은 처리 결과에 따라 다르기 때문에 변하는 영역이라고 할 수 있다.
처리(Controller)는 정해진 로직에 따라 값을 처리하기 때문에 변하지 않는 영역이다. 때문에 변하지 않는 영역이라고 할 수 있다.
때문에 이 두 기능을 분리한다.
3) 모델(Model)
입력, 처리, 출력이 분리되면 서로 다른 메서드로 분리되기 때문에 처리에서 입력받은 데이터를 읽을 수 없고, 출력에서는 처리된 데이터를 전달받을 수 없다.
때문에 Model이라는 객체를 생성해서 데이터를 주고받는다.
3. MVC 패턴의 동작

- 요청이 들어옴
- DispatcherServlet이 입력을 처리하고 해당 Controller에게 요청을 넘겨줌
- Model 생성
- 요청을 처리한 결과를 Model에 저장
- DispatcherServlet이 결과가 담긴 Model을 View로 넘겨줌
- View에서 결과를 읽어서 응답을 만들어냄
- 사용자에게 반환
패스트캠퍼스 남궁성 강사님의 "스프링의 정석 : 남궁성과 끝까지 간다" 강의를 참고하여 작성한 글입니다.
개발 환경
- MacBook Pro(13-inch, M1)
- macOS Monterey 12.4
- InteliJ Ultimate 2022.2.2
- Oracle Open JDK 11.0.15
- Spring Boot 2.7.5
'🍃Spring ,SpringBoot 공부 > 스프링의 정석 : 남궁성과 끝까지 간다' 카테고리의 다른 글
[스프링] @RequestParam과 @ModelAttribute (0) | 2022.11.25 |
---|---|
[Spring공부/스프링의 정석] 서블릿(Servlet)과 JSP - 2 (0) | 2022.11.18 |
[Spring 공부/스프링의 정석] 서블릿(Servlet)과 JSP - 1 (0) | 2022.11.08 |
댓글