SW 개발 일반/SW 디자인

Cross-cutting 문제

growdai1y 2025. 2. 18. 12:34

앱을 개발하다 보면 앱 개발에 몰입하여 앱의 범위를 넘어서는 문제를 지각하지 못하는 경우가 있습니다. 시각을 조금만 넓게 가져가면 서로 다른 앱 간에 유사한 문제를 해결하려고 하는 경우가 보입니다. 이러한 문제를 Cross-cutting Concern(횡단 관심사)라고 합니다. 멋있는 단어입니다. 근사하지만 결국 중복에 관한 문제입니다. 횡단으로 중복이 발생했다는 것입니다. 

 

이러한 문제를 효과적으로 관리하지 못하면 유지보수성이 떨어지고 개발 생산성이 저하될 수 있습니다. 특히, 앱 개발에서는 동일한 기능이 여러 곳에서 중복 구현되는 경우가 많아 이런 문제를 해결하는 것이 더욱 중요합니다.

 

결과적으로 플랫폼이 이런 부분을 담당해야 하고 플랫폼이 이 부분을 흡수하는 만큼 앱 개발자는 할 일이 줄어 앱 개발 효율은 올라가게 됩니다. 당연하지만 현실은 다양한 그들만의 사정으로 앱 개발자가 고통 받는 순간이 많은 것 같습니다.

Cross-cutting 문제
Cross-cutting 문제


Crosscutting Concern이란 무엇인가?

Crosscutting Concern은 여러 모듈에서 공통적으로 적용해야 하는 관심사(Concern)입니다. 예를 들면, 로그 관리, 인증/인가, 트랜잭션 관리, 에러 처리, 공통 API 호출 방식, 공통 데이터 처리 로직 등이 있습니다.

 

앱 개발에서도 다양한 기능에서 공통적으로 발생하는 문제를 관리하지 못하면 코드 중복, 비효율적인 유지보수, 성능 저하 등의 문제가 발생할 수 있습니다. 이런 문제를 해결하지 않으면, 다음과 같은 상황이 발생할 수 있습니다.

  • 특정 로직을 수정해야 할 때 모든 관련 코드들을 찾아 수정해야 함 → 수정할 곳이 많아 누락될 가능성이 큼.
  • 여러 개발자가 같은 기능을 중복으로 개발하면서 일관성이 없어짐 → 코드 품질이 저하됨.
  • 기능 개선 시 재사용이 어렵고 유지보수가 어려워짐 → 개발 속도가 느려짐.

 


Crosscutting 문제의 실제 사례: 이미지 URL 관리 문제

사례

모바일 앱을 개발할 때, 각 앱에서 동일한 이미지를 사용해야 하는 경우가 많습니다. 예를 들어, 사용자의 프로필 이미지, 상품 썸네일, 로고 이미지 등이 여러 앱에서 동일하게 활용될 수 있습니다.

하지만, 여러 앱이 동일한 이미지를 가져오는 방식이 일관되지 않다면 다음과 같은 문제가 발생할 수 있습니다.

  • 앱마다 서로 다른 API 호출 방식으로 동일한 이미지 URL을 가져옴.
  • URL을 구성하는 방식이 앱별로 다르고, 특정 조건을 다르게 적용함.
  • 새로운 요구사항이 생길 때 모든 앱에서 각각 수정해야 함.

이로 인해 중복 코드가 발생하고, 유지보수가 어렵고, 코드 일관성이 깨지는 문제가 생깁니다.

앱 A, B, C 개발자의 서로 다른 구현 방식

(1) 앱 A 개발자의 구현

fun getProfileImageUrl(userId: String, year: Int, modelName: String, userAge: Int): String {
    var url = "https://cdn.example.com/profile/$userId.jpg"
    
    if (year >= 2020) {
        url = "https://cdn.example.com/profile/updated/$userId.jpg"
    }

    if (modelName == "ModelA") {
        url = "https://cdn.example.com/profile/modelA/$userId.jpg"
    }

    if (userAge <= 18) {
        url = "https://cdn.example.com/profile/young/$userId.jpg"
    }

    return url
}

(2) 앱 B 개발자의 구현

fun getProfileImageUrl(userId: String, year: Int, modelName: String, userAge: Int): String {
    val baseUrl = "https://cdn.example.com/profile"
    val conditionMap = mutableMapOf<string, string="">()

    if (year >= 2020) {
        conditionMap["year"] = "updated"
    }
    if (modelName == "ModelA") {
        conditionMap["model"] = "modelA"
    }
    if (userAge <= 18) {
        conditionMap["age"] = "young"
    }

    return "$baseUrl/${conditionMap.values.joinToString("/")}/$userId.jpg"
}</string,>

(3) 앱 C 개발자의 구현

class ProfileImageRule(
    val condition: (Int, String, Int) -> Boolean,
    val path: String
)

class ProfileImageUrlGenerator {
    private val rules = listOf(
        ProfileImageRule({ year, _, _ -> year >= 2020 }, "updated"),
        ProfileImageRule({ _, model, _ -> model == "ModelA" }, "modelA"),
        ProfileImageRule({ _, _, age -> age <= 18 }, "young")
    )

    fun getProfileImageUrl(userId: String, year: Int, modelName: String, userAge: Int): String {
        val conditions = rules.filter { it.condition(year, modelName, userAge) }
                              .map { it.path }
                              .joinToString("/")
        return "https://cdn.example.com/profile/$conditions/$userId.jpg"
    }
}

Crosscutting 해결 방법: 중앙 관리 모듈 도입

위와 같은 문제를 해결하려면 중앙 집중적인 관리 방식을 도입해야 합니다. 다음과 같은 방법을 적용할 수 있습니다.

object ProfileImageUrlProvider {
    private const val BASE_URL = "https://cdn.example.com/profile"

    fun getProfileImageUrl(userId: String, year: Int, modelName: String, userAge: Int): String {
        val conditions = mutableListOf()

        if (year >= 2020) conditions.add("updated")
        if (modelName == "ModelA") conditions.add("modelA")
        if (userAge <= 18) conditions.add("young")

        return "$BASE_URL/${conditions.joinToString("/")}/$userId.jpg"
    }
}

이점

  • 모든 앱이 같은 로직을 재사용하여 코드 중복을 없앰.
  • 유지보수가 간편하여 새로운 조건 추가 시 한 곳만 수정하면 됨.
  • 코드 일관성이 보장되므로 디버깅이 쉬워짐.

결론

Crosscutting Concern 문제를 방치하면 코드 중복과 유지보수 문제가 커집니다. 이를 해결하기 위해 공통 모듈을 도입하고 중앙 집중적으로 관리하는 방식을 고려해야 합니다.

 

서로 다른 앱 개발자들에게는 보이지 않는 문제도, 플랫폼 관점에서 바라보면 명확해집니다. 이러한 문제들을 지속적으로 모니터링하고 개선하는 것이 더 나은 플랫폼으로 나아가는 길입니다. 다만, 이러한 문제를 초기부터 완벽하게 인지하고 대응하는 것은 어렵습니다.

 

예제는 간단해 보일 수 있지만, 대부분의 소프트웨어 문제는 코드가 드러난 후에야 본질이 보이기 마련입니다. 특히 중복 코드와 같은 문제는 실제 구현된 코드를 근거로 문제를 정의하고, 이를 해결하는 당위성을 확보해야 합니다. 따라서 이러한 공통된 문제를 플랫폼 차원에서 체계적으로 고려하는 것이 필수적입니다.

 

 

 

 

반응형