본문 바로가기
🍃Spring ,SpringBoot 공부/스프링의 정석 : 남궁성과 끝까지 간다

[Spring 공부/스프링의 정석] 관심사의 분리와 MVC 패턴

by 코코의 주인 2022. 11. 2.

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)

  1. SRP(Single responsibility principle) - 단일 책임의 원칙
    • 하나의 클래스는 하나의 책임만 진다.
    • 책임 = 관심사
  2. OCP(Open/closed principle) - 개방/폐쇄 원칙
    • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  3. LSP(Liskov substitution principle) - 리스코프 치환 원칙
    • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  4. ISP(Interface segregation principle) - 인터페이스 분리 원칙
    • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  5. DIP(Dependency Inversion principle) - 의존관계 역전 원칙
    • 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.”

이 외에도 "변하는 것과 변하지 않는 것의 분리", "공통(중복)코드의 분리" 등으로 코드를 분리할 수 있다.

 

2. MVC패턴(Model, View, Controller)

 대부분의 컨트롤러는 입력, 처리, 출력으로 구성된다.

 

1) 입력의 분리

이 중 입력 부분은 중복되는 영역이기 때문에 공통 코드로 분리하는 것이 좋다.

 

2) 출력(View)과 처리(Controller)의 분리

 출력(View)은 값을 처리된 결과를 사용자에게 반환하는 기능을 말한다. 출력값은 처리 결과에 따라 다르기 때문에 변하는 영역이라고 할 수 있다.

처리(Controller)는 정해진 로직에 따라 값을 처리하기 때문에 변하지 않는 영역이다. 때문에 변하지 않는 영역이라고 할 수 있다.

때문에 이 두 기능을 분리한다.

 

3) 모델(Model)

 입력, 처리, 출력이 분리되면 서로 다른 메서드로 분리되기 때문에 처리에서 입력받은 데이터를 읽을 수 없고, 출력에서는 처리된 데이터를 전달받을 수 없다.

 때문에 Model이라는 객체를 생성해서 데이터를 주고받는다.

 

3. MVC 패턴의 동작

  1. 요청이 들어옴
  2. DispatcherServlet이 입력을 처리하고 해당 Controller에게 요청을 넘겨줌
    • Model 생성
  3. 요청을 처리한 결과를 Model에 저장
  4. DispatcherServlet이 결과가 담긴 Model을 View로 넘겨줌
  5. View에서 결과를 읽어서 응답을 만들어냄
  6. 사용자에게 반환

패스트캠퍼스 남궁성 강사님의 "스프링의 정석 : 남궁성과 끝까지 간다" 강의를 참고하여 작성한 글입니다.

 

개발 환경

  • 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

댓글