관심사의 분리(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 개발자 안내서가 출간되었습니다. 어떤 내용이 담겨있는지 목차를 확인하러 가보세요. 흥미로울 것입니다.
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.