관심사의 분리(Separation of Concerns, SoC)

컴퓨터 과학(Computer Science)에서 관심사의 분리란 각 부문이 각자의 관심사를 갖도록 컴퓨터 프로그램을 여러 부문으로 나누는 설계 원칙입니다. [1] 예를 들어 다음과 같이 할 일 목록을 출력하는 task.php 가 있다고 생각해봅시다. 편의상 이를 스파게티 예제라고 하겠습니다.

<?php
$conn = new mysqli(HOST, ID, PW, DB);
if ($conn->connect_error) {
die($conn->connect_error);
}
echo “<!DOCTYPE html>
<html>
<head>
<meta charset=’utf-8'>
</head>
<body>“;
$result = $conn->query(“SELECT * FROM tasks”);
if($result) {
echo “<ul>”;
while($row = $result->fetch(MYSQLI_ASSOC)) {
echo “<li>” . $row[‘name’] . “</li>”;
}
echo “</ul>”;
} else {
echo “<p>할 일이 없습니다.</p>”;
}
echo “</body>
</html>”;

이 짧은 코드 안에도 굉장히 많은 관심사가 포함되어 있습니다.

  • 데이터베이스는 무얼 쓰지?: MySQL? MariaDB? PostgreSQL? Oracle?
  • 데이터베이스 연결은 어떻게 하지?: mysql? mysqli? PDO?
  • 데이터베이스에 연결이 안 되면 어떻게 하지?: 에러메시지 출력? 다른 페이지로 이동?
  • 할 일 데이터는 어떻게 가져오지?: 절차지향? prepare 구문을 쓸까 말까?
  • 할 일 목록을 어떻게 표현하지?: ul? 테이블? 글씨 크기는 어떻게? 할 일이 없을 경우 문구는?

‘concern’을 관심사가 아닌 걱정으로 해석[2]하면 조금 다른 관점의 사고를 할 수 있습니다.

  • 데이터베이스가 바뀌면 어떻게 하지?
  • 데이터베이스 연결 방식이 바뀌면 어떻게 하지?
  • 할 일 데이터가 너무 많아지면 어떻게 하지?
  • 화면 구성이 바뀌면 어떻게 하지?

뭔가 생각할 게 갑자기 굉장히 많아진 느낌이지요? 유지보수 하기 좋은 코드라는 것은 결국 미래에 어떤 변화가 발생했을 때 이에 쉽게 대응할 수 있는 코드라고 할 수 있습니다. 그러려면 미리 미래에 발생할 가능성이 있는 일들에 대해 고민을 하고, 처음부터 향후 상황 변화에 쉽게 대응할 수 있도록 프로그램을 작성하는 것이 필요합니다. 그런데 한꺼번에 저렇게 많은 걱정을 해야 한다면 상당히 골치 아프겠죠.

관심사의 분리는 프로그램을 관심사 별로 쪼개서 가능하면 한 번에 한 가지 걱정만 함으로써 프로그램 개발과 유지보수 시의 복잡성을 줄이자는 것입니다. 관심사의 분리가 잘 이뤄지면, 개별 부문을 이해하기 쉽고, 각 부문을 재사용할 수 있게 되며, 한 부문을 개선하거나 수정할 때 다른 부문에 대해 자세히 알 필요가 없어지고, 다른 부문이 변하는 것에도 신경 쓸 필요가 없어지는 장점이 있습니다.

다음 글에서는 관심사 분리 기법의 하나인 MVC 패턴을 알아보고 스파게티 예제에 이를 적용해보도록 하겠습니다.

[참고자료]

  1. Separation of concerns https://en.wikipedia.org/wiki/Separation_of_concerns
  2. 관심사의 분리(Separation of Concerns) https://gamecodingschool.org/2015/05/29/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%ACseparation-of-concerns/
이 글이 포함된, 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서가 출간되었습니다. 어떤 내용이 담겨있는지 목차를 확인하러 가보세요. 흥미로울 것입니다.