강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

Chanuk님의 프로필 이미지
Chanuk

작성한 질문수

오브젝트 - 기초편

5-3-예제. 유연하고 일관적인 협력

책임주도 설계 적용에 대한 간단한 질문 남겨드립니다.

해결된 질문

작성

·

22

1

안녕하세요! 영호님. 강의 잘 듣고 있습니다.

 

  1. 현실적으로 DB 스키마가 이미 정해져 있거나, 기존 데이터를 마이그레이션해야 해서 새롭게 설계하기 어려운 경우, 또는 DBA가 별도로 관리하는 환경에서는 책임주도 설계를 적용하기가 쉽지 않을 것 같습니다. 이런 상황에서도 객체지향적인 설계를 현실적으로 적용할 수 있는 방법이 있을까요?
    (DAO를 중간 계층으로 두면 어느 정도 해결될까요? 아니면 도메인 레이어와 퍼시스턴스 레이어는 분리된 영역이니 크게 상관없을까요? 반대로, 두 레이어가 지나치게 달라지면 오히려 유지보수가 더 어려워지지는 않을까 하는 걱정도 듭니다.)

  2. 그리고, 책임주도 설계가 이론적으로는 유지보수에 강하다고 하지만, 실제로는 아직 구조가 다소 복잡하게 느껴져서 오히려 유지보수성을 해칠 수도 있지 않을까 합니다. 이런 복잡함은 설계 패턴에 익숙해지면 자연스럽게 해소될까요?

감사합니다!

답변 2

0

조영호님의 프로필 이미지
조영호
지식공유자

Chanuk님 안녕하세요. 😊

좋은 질문 남겨 주셔서 감사합니다.

제가 아침부터 계속 강의를 하느라 이제서야 답글을 남기네요.

답변이 늦어져서 죄송합니다.

 

  1. 현실적으로 DB 스키마가 이미 정해져 있거나, 기존 데이터를 마이그레이션해야 해서 새롭게 설계하기 어려운 경우, 또는 DBA가 별도로 관리하는 환경에서는 책임주도 설계를 적용하기가 쉽지 않을 것 같습니다. 이런 상황에서도 객체지향적인 설계를 현실적으로 적용할 수 있는 방법이 있을까요? (DAO를 중간 계층으로 두면 어느 정도 해결될까요? 아니면 도메인 레이어와 퍼시스턴스 레이어는 분리된 영역이니 크게 상관없을까요? 반대로, 두 레이어가 지나치게 달라지면 오히려 유지보수가 더 어려워지지는 않을까 하는 걱정도 듭니다.)


    근본적으로 DB 설계와 객체지향 설계는 접근방식과 목적이 다르기 때문에 신규 프로젝트라고 하더라도 두 구조 사이에 차이가 발생할 수 밖에 없습니다.

    이런 차이를 임피던스 불일치(impedance mismatch) 문제라고 부르는데 DB는 데이터 관점에서 중복을 최소화하는 방향으로 설계해야 하고 객체지향 설계는 강의에서 설명드렸던 것처럼 행동 관점에서 안정적인 구조를 만드는 것을 목적으로 하기 때문입니다. 임피던스 불일치 문제를 해결할 목적으로 만들어진 도구를 ORM(Object Relational Mapping)이라고 부릅니다. Java 진영의 JPA 표준과 Hibernate 구현체가 ORM의 대표적인 예라고 할 수 있습니다.
    ORM을 사용하면 직접 쿼리를 작성할 필요 없이 어느 정도 DB와 클래스 사이의 차이점을 상쇄시킬 수 있습니다. 물론 ORM은 만능이 아니기 때문에 모든 이슈를 다 해결해 주지는 못합니다. 따라서 실용적인 관점에서 완전한 객체지향 설계를 하려고 하시기 보다는 질문에서 언급하신 것처럼 매핑이 좀 더 수월한 방식으로 객체 구조를 선택하실 필요가 있습니다.
    ORM을 사용하는 경우에도 해결하기가 수월하지 않은 경우가 있는데 말씀하신 것처럼 레거시 테이블이 정규화가 안된 상태로 장기간 유지된 경우가 여기에 해당합니다. 이렇게 극단적으로 매핑이 어렵지만 객체지향 설계 방식을 선태하시는게 장점이 크다고 판단되시면 테이블과 1:1로 매핑되는 데이터 용 클래스를 만들어서 데이터베이스에서는 이 데이터용 클래스를 이용해서 데이터를 조회하신 후 객체 구조로 다시 매핑하는 방법도 있습니다. 이 방식은 테이블 스키마에 얽매이지 않고 객체지향 설계를 자유롭게 할 수 있다는 장점이 있지만 데이터용 클래스와 객체를 위한 클래스를 함께 유지해야 한다는 단점도 존재합니다.
    문제의 복잡도와 유지보수 관점에서의 장단점을 기반으로 적합한 방법을 선택하시면 될 것 같아요.

     

  2. 그리고, 책임주도 설계가 이론적으로는 유지보수에 강하다고 하지만, 실제로는 아직 구조가 다소 복잡하게 느껴져서 오히려 유지보수성을 해칠 수도 있지 않을까 합니다. 이런 복잡함은 설계 패턴에 익숙해지면 자연스럽게 해소될까요?

    말씀하신 것처럼 객체지향 설계에 대해 아직 익숙하지 않다보니 복잡하고 어렵게 느끼시는게 아닐까 싶어요. 절차적인 설계에서 객체지향 설계로 이동하는 상황을 패러다임 전환(paradigm shift)라고 부를 정도로 절차적인 사고방식을 객체지향적인 사고방식으로 바꾸는 일은 매우 어렵고 힘든 일이기는 합니다(저도 겪었던 문제구요).
    절차적인 방식은 새로운 코드를 작성하거나 코드를 읽을 때는 객체지향보다 쉽게 느껴집니다. 반면에 객체지향은 기존 코드에서 수정할 부분을 찾거나 코드를 수정할 때 절차적인 방식보다 더 쉽게 느껴집니다. 다시 말해서 절차적인 방식은 새로운 코드를 작성할 때는 유리하지만 유지보수의 측면에서는 좋지 않고, 객체지향은 새로운 코드를 작성할 때는 불리하지만 유지보수 측면에서는 유리하다고 볼 수 있습니다.
    제가 생각에 객체지향이 복잡하다고 느끼시는 이유는 처음 코드를 작성할 때 들어가는 노력이 절차적인 방식보다 더 크기 때문이 아닐까 싶어요. 유지보수 단계에서의 장점을 이해하기 위해서는 실제로 변경이 일어날 때 코드를 수정해본 경험이 필요하기 때문에 객체지향에 익숙해지시고 요구사항 변경이 빈번하게 발생하는 상황에서 코드를 수정하는 경험이 쌓이면 유지보수 측면에서 객체지향이 유리한 이유를 이해하시게 될거라고 생각합니다.


답변이 되었는지 모르겠네요. 🙂

행복한 주말 보내세요!

0

안녕하세요, 인프런 AI 인턴입니다. Chanuk님, 좋은 질문 남겨주셔서 감사합니다. 객체지향 설계에 관한 고민을 나눠주셨네요. 질문하신 내용에 대해 하나씩 살펴보겠습니다.

  1. 기존 DB 스키마와 책임주도 설계:

    • 현실적으로 이미 정해진 DB 스키마가 있는 경우, 객체지향적인 설계를 직접적으로 적용하기 어려울 수 있습니다. 하지만 DAO(Data Access Object) 패턴을 사용해 퍼시스턴스 레이어를 추상화함으로써 도메인 모델과 DB 스키마 간의 간극을 어느 정도 해결할 수 있습니다. 이 방법은 DB 변경이 어려운 환경에서 도메인 모델의 유연성을 제공할 수 있습니다.
    • 도메인 레이어와 퍼시스턴스 레이어를 명확히 분리하면, 각 레이어의 변경이 다른 레이어에 큰 영향을 미치지 않도록 할 수 있습니다. 이로 인해 유지보수가 더 수월해질 수 있습니다. 하지만 두 레이어 간의 차이가 지나치게 크면 오히려 복잡성이 증가할 수 있으므로 적절한 타협이 필요합니다.
  2. 책임주도 설계의 복잡성:

    • 책임주도 설계는 처음에는 어렵게 느껴질 수 있지만, 여러 설계 패턴에 익숙해지고 이를 실제 프로젝트에 적용하다 보면 자연스럽게 복잡함을 이해하게 됩니다. 프로젝트 경험이 쌓이면서 설계 패턴과 객체지향 원칙이 맞물려 시스템의 유지보수성을 높이는 데 도움을 줍니다.

관련해서 비슷한 고민을 다룬 DAO 관련 질문드립니다 질문과 답변을 참고해 보시면 더 많은 인사이트를 얻으실 수 있을 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Chanuk님의 프로필 이미지
Chanuk

작성한 질문수

질문하기