관심사의 분리 파헤치기

홀로 요리, 홀 서빙, 주문 받기 등 가게에서 필요한 모든 일을 다하는 주방장이 있다고 치자.
여기에서 관심사는 요리, 홀 서빙, 주문 받기가 될 수 있다.
누군가는 이를 보고 비효율적이라고도 할 수 있다.
그렇다면 CS에서의 관심사의 정의가 무엇일까? 아래와 같다.
관심사(concern)
컴퓨터 과학에서 관심사(concern)는 컴퓨터 프로그램의 코드에 영향을 미치는 특정한 정보 집합이다. 관심사는 데이터베이스 상호작용의 세세한 부분처럼 포괄적이거나, 기초적인 계산을 수행하는 등의 구체적인 경우일 수 있으며 이는 개발자, 그리고 논의되는 프로그램 간의 소통 수준에 따라 달라진다.
뭔가 추상적이긴 하다.
관심사의 분리에 알아보기 전에, OOP의 5대 설계 원칙중 하나인 SRP에 대해서 알아보자.
OOP 5대 설계 원칙(SOLID) - SRP
SRP(Single responsibility principle) - 단일 책임의 원칙
- 하나의 클래스는 하나의 책임만 진다.
- 책임 = 관심사
즉, Java를 예로 들면, 하나의 메서드에 입력, 처리, 출력 등을 모두 포함하고 있다면, 관심사는 3개를 가지고 있다는 뜻이다. 물론 프로그램은 동작하지만, OOP 원칙에서 본다면 좋지는 않다.
아래와 같이 입력, 처리, 출력을 분리할 수 있겠다.

관심사를 분리해야 하는 이유
관심사의 분리는 하나의 관심사가 하나의 기능만 수행하도록 코드를 구성하는 것을 말한다.
한 객체 안에서 다양한 관심사를 수행하면 코드가 복잡해져서 코드에 대한 이해도가 떨어지기 마련이다.
이는 유지보수적인 측면에서 좋지않다. 즉 하나의 관심사가 하나의 기능을 수행하도록 코드를 작성하는 것이 좋다.
관심사의 분리 - 코드를 통해 알아보자.

위와 같이 날짜에 따른 요일을 알려주는 메서드가 있다고 가정하자.
현재 메서드에는 입력, 처리, 출력 부분이 한 메서드안에 공존하고 있다.
MVC 패턴을 적용하여 분리한 코드는 아래와 같다.
YoilTellerMVC.java
package kr.ac.jipark09.ch2;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
// 년,월,일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTellerMVC {
@RequestMapping("/getYoilMVC")
public String main(int year, int month, int day, Model model) throws IOException {
//1. 유효성 검사
if(!isVaild(year, month, day)) {
return "yoilError";
}
// 2. 요일 계산
char yoil = getYoil(year, month, day);
getYoil(year, month, day);
// 3. 계산한 결과를 model에 저장
model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
model.addAttribute("yoil", yoil);
return "yoil"; // yoil.jsp를 보여줘라
}
private boolean isVaild(int year, int month, int day) {
return true;
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return " 일월화수목금토".charAt(dayOfWeek);
}
}
.
- 입력은 매개변수를 통해 받고 있다.
- 처리는 getYoil 메서드가 하고 있다.
yoil.jsp
<%@ page contentType="text/html; charset=utf-8" %>>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<P>${year }년 ${month }월 ${day }일 ${yoil }입니다. </P>
</body>
</html>
- 출력은 jsp를 통해서 하고 있다.
참고 - 남궁성의 스프링의 정석
'Spring & Spring Boot' 카테고리의 다른 글
| [Spring] JSP vs Thymeleaf (0) | 2024.11.11 |
|---|---|
| [Spring] DTO와 Entity의 분리. 왜? 어떻게? (2) | 2024.11.07 |
| [Spring] DTO vs Entity vs VO (1) | 2024.11.07 |
| [Spring] Spring 3계층 구조, 3-tier-Architecture (1) | 2024.11.06 |
| [Spring] Spring MVC, MVC 패턴이란? (1) | 2024.11.05 |