TIL | 3 layerd architecture

bubblegum·2024년 2월 21일
0

Today I learn(TIL)

목록 보기
25/84
post-thumbnail

클래스 기반 리팩토링의 장점

클래스 기반 리팩토링은 소프트웨어 개발에서 객체 지향 프로그래밍(OOP)의 핵심 개념을 활용하여 코드의 구조를 개선하는 과정입니다. 이러한 접근 방식을 취할 때의 주요 장점은 다음과 같습니다:

1. 가독성 향상

  • 명확한 구조: 클래스를 사용하면 관련 데이터와 함수(메서드)를 논리적인 단위로 그룹화할 수 있어, 코드의 구조가 더 명확해집니다.
  • 재사용 용이: 재사용 가능한 코드 블록을 만들어, 다른 부분에서 쉽게 사용할 수 있게 함으로써 가독성과 유지보수성을 향상시킵니다.

2. 유지보수성 향상

  • 코드 수정 용이: 클래스를 사용하면, 변경이 필요한 경우 해당 클래스 내부에서만 수정하면 되므로, 전체 코드 베이스에 걸쳐 일관성을 유지하면서 유지보수성이 향상됩니다.
  • 디버깅 용이: 문제가 발생했을 때, 클래스 단위로 코드를 분석하고 디버깅할 수 있어, 문제의 원인을 더 빠르게 찾아낼 수 있습니다.

3. 캡슐화와 정보 은닉

  • 데이터 보호: 클래스를 통해 데이터(속성)와 그 데이터를 조작하는 메서드를 하나의 단위로 묶어, 외부에서의 직접적인 접근을 제한함으로써 데이터를 보호할 수 있습니다.
  • 인터페이스 제공: 사용자에게 필요한 기능만을 노출시키고, 내부 구현은 숨김으로써 인터페이스를 통한 상호작용을 간소화할 수 있습니다.

4. 상속을 통한 확장성

  • 코드 재사용: 기존 클래스를 상속받아 새로운 클래스를 생성함으로써, 기존 코드를 재사용하고 확장할 수 있으며, 이를 통해 중복 코드를 줄이고 효율성을 높일 수 있습니다.
  • 다형성 적용: 상속과 인터페이스를 활용하여 다형성을 구현함으로써, 다양한 타입의 객체를 동일한 인터페이스로 다룰 수 있게 되어 코드의 유연성이 증가합니다.

5. 테스트 용이성

  • 단위 테스트: 클래스 단위로 코드를 구성하면, 각 클래스의 기능을 독립적으로 테스트하기 용이해집니다. 이는 소프트웨어 개발 과정에서 버그를 빠르게 발견하고 수정할 수 있게 해 줍니다.

6. 팀 작업의 효율성

  • 분업화: 클래스를 통해 코드를 논리적으로 분할함으로써, 팀 내에서 작업을 더 쉽게 분배하고 협업할 수 있습니다.
  • 클래스 기반 리팩토링은 이러한 장점들을 통해 소프트웨어의 설계를 개선하고, 장기적으로 프로젝트의 품질과 개발 속도를 높이는 데 기여할 수 있습니다.

3계층 아키택처의 장단점

3-Layered Architecture, 즉 3계층 아키텍처는 소프트웨어 설계에서 널리 채택되는 패턴 중 하나로, 애플리케이션을 세 개의 주요 계층으로 분리합니다: 프레젠테이션 계층(사용자 인터페이스), 비즈니스 로직 계층(애플리케이션 코어), 그리고 데이터 액세스 계층(데이터베이스와의 인터페이스). 이러한 구조는 소프트웨어 개발 과정을 체계화하고, 유지보수를 용이하게 하는 여러 장점을 제공합니다. 그러나 일부 상황에서는 단점으로 작용할 수도 있습니다.

장점

1. 유지보수성

  • 계층별로 명확하게 구분되어 있어, 한 계층의 변경이 다른 계층에 미치는 영향을 최소화합니다. 이로 인해 시스템의 유지보수가 용이해집니다.

2. 재사용성

  • 비즈니스 로직 계층이나 데이터 액세스 계층과 같은 구성요소들을 다른 시스템에서 재사용하기 쉽습니다.

3. 확장성 및 유연성

  • 시스템의 요구 사항이 변경될 때, 특정 계층만 확장하거나 수정하여 요구 사항을 충족시킬 수 있습니다. 예를 들어, 데이터베이스 시스템을 변경하거나 업그레이드해야 할 경우, 데이터 액세스 계층만 수정하면 됩니다.

4. 분업화

  • 각 계층은 독립적인 역할과 책임을 가지므로, 개발 팀 내에서 역할을 분담하기가 더 쉽습니다. 이는 팀 작업의 효율성을 높일 수 있습니다.

5. 테스트 용이성

  • 계층화된 구조는 단위 테스트와 통합 테스트를 용이하게 합니다. 각 계층을 독립적으로 테스트할 수 있으며, 모의 객체(mock objects)를 사용하여 상호작용을 쉽게 시뮬레이션할 수 있습니다.

단점

1. 성능 저하

  • 계층 간의 데이터 전송과 변환 과정에서 성능 저하가 발생할 수 있습니다. 특히, 복잡한 연산이 필요한 애플리케이션에서는 이러한 성능 저하가 더욱 두드러질 수 있습니다.

2. 개발 복잡성

  • 초기 개발 단계에서 3계층 구조를 설계하고 구현하는 것은 단순한 애플리케이션에 비해 시간이 더 소요되며 복잡할 수 있습니다.

3. 과도한 분리

  • 때로는 비즈니스 로직과 데이터 액세스 로직 사이의 경계가 모호할 수 있으며, 이로 인해 과도한 분리가 발생하여 개발 및 유지보수 과정이 불필요하게 복잡해질 수 있습니다.

4. 유연성 저하

  • 엄격한 계층 구조는 특정 상황에서 유연성을 저하시킬 수 있습니다. 모든 상황에 적합한 완벽한 계층 분리가 어려울 수 있으며, 이는 때로는 시스템의 전체적인 설계를 재고하게 만들 수 있습니다.

테스트 코드 작성의 장단점

테스트 코드를 작성하는 것은 소프트웨어 개발 과정에서 중요한 부분입니다. 테스트 코드는 애플리케이션의 기능이 의도대로 작동하는지 검증하는 자동화된 방법을 제공합니다. 이 과정은 애플리케이션의 품질을 높이고, 개발자가 더 자신감을 가지고 코드를 작성하게 도와줍니다. 그러나 테스트 코드 작성은 시간과 리소스를 요구하는 작업이기도 합니다. 다음은 테스트 코드 작성의 장단점에 대한 요약입니다.

장점

1. 버그 조기 발견

  • 테스트 코드는 개발 과정에서 버그를 조기에 발견하고 수정할 수 있게 도와줍니다. 이는 장기적으로 보았을 때 시간과 비용을 절약할 수 있게 합니다.

2. 코드 품질 향상

  • 테스트를 작성하게 되면 개발자는 더 깔끔하고 유지보수가 용이한 코드를 작성하게 됩니다. 테스트 가능한 코드는 일반적으로 더 좋은 설계 원칙을 따르게 됩니다.

3. 리팩토링 안정성

  • 테스트 코드가 있으면 리팩토링이나 기존 코드의 수정 시 실수로 인한 오류를 줄일 수 있습니다. 테스트가 실패하면 개발자는 즉시 문제를 인지하고 수정할 수 있습니다.

4. 개발 속도 향상

  • 초기에 테스트 코드 작성에 시간이 소요되지만, 장기적으로는 버그 수정에 드는 시간을 줄이고, 기능 추가나 변경 시에도 더 신속하게 작업을 진행할 수 있습니다.

5. 문서화 역할

  • 테스트 코드는 어떻게 코드가 사용되어야 하는지에 대한 실질적인 예시를 제공합니다. 이는 새로운 개발자가 코드베이스에 익숙해지는 데 도움이 될 수 있습니다.

단점

1. 초기 비용 증가

  • 테스트 코드를 작성하고 유지 관리하는 데는 시간과 리소스가 필요합니다. 초기 프로젝트 단계에서는 이러한 비용이 부담으로 작용할 수 있습니다.

2. 유지 관리의 어려움

  • 애플리케이션이 발전함에 따라 테스트 코드 또한 업데이트되어야 합니다. 잘못 관리되면 오래된 테스트 코드가 부정확한 결과를 초래하거나 유지 관리 부담을 증가시킬 수 있습니다.

3. 과도한 의존성

  • 특정 테스트 케이스에 너무 의존하게 되면 실제 사용 사례를 제대로 반영하지 못하는 경우가 발생할 수 있습니다. 테스트는 가능한 한 실제 사용 사례를 모방해야 합니다.

4. 테스트 커버리지에 대한 잘못된 안정감

  • 높은 테스트 커버리지가 반드시 코드 품질이 높다는 것을 의미하지는 않습니다. 때로는 중요하지 않은 부분에 대한 테스트가 과도하게 많을 수 있으며, 실제 중요한 로직의 테스트가 누락될 수 있습니다.

5. 복잡성 증가

  • 복잡한 시스템에서는 테스트 코드 자체가 매우 복잡해질 수 있으며, 이는 새로운 개발자가 시스템을 이해하는 데 장애가 될 수 있습니다.

테스트의 세 가지 유형

테스트의 종류는 다양하지만, 가장 기본적으로 참조되는 세 가지 유형은 단위 테스트(Unit Tests), 통합 테스트(Integration Tests), 그리고 시스템 테스트(System Tests)입니다. 각각의 테스트 유형은 소프트웨어 개발 과정에서 중요한 역할을 하며, 다른 목적과 범위를 가집니다.

1. 단위 테스트 (Unit Tests)

  • 정의: 단위 테스트는 소프트웨어의 가장 작은 실행 가능한 단위를 개별적으로 검증하는 과정입니다. 이러한 단위는 함수, 메서드 또는 클래스일 수 있습니다.
  • 목적: 코드의 개별 부분이 예상대로 정확하게 작동하는지 확인하는 것입니다. 이러한 테스트를 통해 개발자는 코드 변경 시 부작용을 쉽게 식별할 수 있으며, 리팩토링이나 새로운 기능 추가 시 기존 기능이 여전히 올바르게 작동함을 보장할 수 있습니다.
  • 장점: 개발 초기 단계에서 문제를 발견하고 수정할 수 있어 비용과 시간을 절약할 수 있습니다.

2. 통합 테스트 (Integration Tests)

  • 정의: 통합 테스트는 개별적으로 테스트된 소프트웨어의 단위들이 함께 잘 작동하는지 검증하는 과정입니다. 이는 여러 모듈이나 시스템의 다른 부분들이 통합될 때 발생할 수 있는 인터페이스와 흐름의 문제를 찾아내기 위한 것입니다.
  • 목적: 다른 시스템 구성 요소 간의 데이터 교환과 같은 통합 부분에서의 결함을 식별합니다. 이를 통해 모듈 간의 상호 작용이 의도한 대로 작동하는지 확인할 수 있습니다.
  • 장점: 시스템의 다양한 부분들이 서로 올바르게 소통하고 데이터를 정확하게 전달하는지 확인할 수 있어, 전체 시스템의 신뢰성을 높일 수 있습니다.

3. 시스템 테스트 (System Tests)

  • 정의: 시스템 테스트는 완성된 소프트웨어 시스템의 동작을 전체적으로 검증하는 과정입니다. 이는 소프트웨어와 하드웨어의 전체 통합을 포함하여, 실제 운영 환경에서 소프트웨어의 기능, 성능, 보안 등 다양한 측면을 평가합니다.
  • 목적: 시스템이 요구사항 문서에 명시된 사항들을 만족시키는지 확인하는 것입니다. 이는 사용자의 관점에서 소프트웨어의 적합성을 검증합니다.
  • 장점: 최종 사용자의 경험에 가장 가깝게 소프트웨어를 평가할 수 있으며, 전체적인 품질과 운영 환경에서의 신뢰성을 확보할 수 있습니다.

이러한 테스트 유형들은 소프트웨어 개발 과정에서 중요한 단계를 구성하며, 각각은 소프트웨어의 다른 측면을 평가하고 보장합니다. 함께 사용될 때, 이들은 고품질의 소프트웨어 제품을 개발하는 데 필수적입니다.

여러 대의 서버를 운영할 경우의 장점과 무중단 서비스의 원리

여러 대의 서버를 운영하는 경우에는 여러 가지 장점이 있습니다.

장점

1. 고가용성 및 신뢰성

  • 여러 대의 서버를 운영하면 하나의 서버에 장애가 발생해도 다른 서버가 해당 역할을 대신할 수 있습니다. 이렇게 함으로써 시스템의 고가용성과 신뢰성을 향상시킬 수 있습니다.

2. 확장성

  • 서버를 여러 대 운영하면 필요에 따라 서버의 수를 유연하게 확장할 수 있습니다. 이는 트래픽 증가나 서비스의 확장 등과 같은 상황에서 시스템의 성능을 유지하거나 향상시킬 수 있는 장점을 제공합니다.

3. 부하 분산

  • 여러 대의 서버를 사용하면 트래픽을 여러 서버에 분산시켜 부하를 분산시킬 수 있습니다. 이렇게 함으로써 각 서버에 걸리는 부하를 줄이고 서비스의 응답 시간을 최적화할 수 있습니다.

4. 지리적 분산

  • 서버를 여러 지역에 분산 배치함으로써 지리적으로 떨어진 사용자들에게도 빠른 응답 시간을 제공할 수 있습니다. 이는 전 세계적으로 서비스를 제공하는 대규모 웹 애플리케이션에서 특히 중요합니다.

무중단 서비스의 원리

무중단 서비스(Continuous Availability)는 시스템이 연속적으로 사용 가능하고, 서비스 중단 없이 지속적으로 운영되는 것을 의미합니다. 무중단 서비스를 제공하기 위해서는 주로 다음과 같은 원리를 따릅니다.

1. 로드 밸런싱

  • 로드 밸런서를 사용하여 트래픽을 여러 서버에 균등하게 분산시킵니다. 이를 통해 단일 서버에 부하가 집중되는 것을 방지하고 서비스의 가용성을 향상시킵니다.

2. 복제와 데이터 동기화

  • 여러 대의 서버에 동일한 서비스 인스턴스를 복제하여 운영합니다. 데이터는 주로 데이터베이스를 통해 동기화되며, 변경 사항은 모든 서버에 즉시 반영됩니다.

3. 자동화된 오류 처리

  • 시스템에서 발생하는 오류에 대해 자동으로 감지하고, 복구 및 조치를 자동으로 수행합니다. 예를 들어, 서버 장애가 발생하면 자동으로 해당 서버를 감지하고 다른 서버로 트래픽을 전환하여 서비스 중단을 방지합니다.

4. 롤링 업데이트

  • 새로운 소프트웨어 버전을 배포할 때 서비스 중단 없이 점진적으로 업데이트를 적용합니다. 이를 위해 서버를 순차적으로 업데이트하고, 각 단계에서는 충분한 시간을 확보하여 문제가 발생할 경우 롤백할 수 있는 시간을 가집니다.

5. 모니터링과 경고 시스템

  • 시스템의 상태를 지속적으로 모니터링하고, 잠재적인 문제를 식별하여 경고를 발생시킵니다. 이를 통해 문제를 조기에 감지하고 조치를 취할 수 있습니다.

이러한 원리들을 적용하여 시스템이 무중단으로 운영되도록 보장합니다. 이는 사용자들에게 안정적인 서비스 제공과 함께 시스템의 가용성과 신뢰성을 유지하는 데 중요한 역할을 합니다.

profile
황세민

0개의 댓글

관련 채용 정보