맨위로가기

안티패턴

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

안티패턴은 소프트웨어 개발, 프로젝트 관리, 조직 운영 등 다양한 분야에서 나타나는, 자주 발생하는 비효율적이고 좋지 않은 해결 방법이나 설계 방식을 의미한다. 소프트웨어 공학에서는 거대한 진흙덩어리, 신 객체, 매직 넘버, 폴터가이스트 등이 있으며, 디자인 및 설계, 프로그래밍, 프로젝트 관리, 조직 운영 등 다양한 측면에서 나타난다. 안티패턴을 인식하고 개선하는 것은 문제 해결 능력을 향상시키고, 보다 효율적인 시스템을 구축하는 데 기여할 수 있다.

더 읽어볼만한 페이지

  • 반사회적 행동 - 깨진 유리창 이론
    깨진 유리창 이론은 사소한 무질서가 방치되면 더 큰 범죄로 이어진다는 이론으로, 1982년 제시되었으며, 뉴욕시 치안 정책에 반영되어 범죄율 감소에 기여했으나, 과잉 단속 등의 비판도 존재한다.
  • 반사회적 행동 - 차별
    차별은 특정 집단이라는 이유로 개인이나 집단에게 불이익을 주거나 부당하게 대우하는 행위로, 인종, 성별, 종교 등 다양한 근거로 발생하며, 국제기구들은 차별 종식을 위해 노력하고 각국은 차별 금지 법률을 시행하고 있다.
  • 안티패턴 - 기술 부채
    기술 부채는 소프트웨어 개발에서 발생하는 개념으로, 현재의 편의적인 설계가 미래에 추가적인 비용을 발생시키는 것을 의미하며, 다양한 원인으로 발생하여 개발 비용 증가, 프로젝트 지연, 경쟁력 약화 등의 부정적인 결과를 초래할 수 있다.
  • 안티패턴 - 난독화
    난독화는 프로그램 코드의 가독성을 낮춰 이해를 어렵게 하는 기술로, 역공학을 방지하여 보안을 강화하며 소스 코드와 바이너리 난독화로 구분되고, 코드 분석을 어렵게 만들지만 불가능하게 하지는 않아 다른 보안 기술과 함께 사용된다.
  • 소프트웨어 구조 - Ajax
    Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다.
  • 소프트웨어 구조 - 멀티테넌시
    멀티테넌시는 단일 애플리케이션 인스턴스로 여러 고객에게 서비스를 제공하여 SaaS 및 클라우드 환경에서 비용과 관리 효율성을 높이고 데이터 활용 가치를 창출하는 소프트웨어 아키텍처 방식이다.
안티패턴
설명
안티패턴소프트웨어 개발, 프로젝트 관리 등 다양한 분야에서 반복적으로 나타나는 비효율적인 패턴 또는 문제 해결 방식
특징처음에는 효과적으로 보이지만, 장기적으로 봤을 때 부정적인 결과를 초래하거나 유지보수를 어렵게 만드는 경향이 있음
일반적인 안티패턴 예시
스파게티 코드구조화되지 않고 복잡하게 얽힌 코드
신-객체과도하게 많은 책임을 가진 객체
자전거 창고 짓기이미 존재하는 기능을 불필요하게 다시 개발하는 것
땜질식 코드문제의 근본적인 원인을 해결하지 않고 임시방편으로 코드를 수정하는 것
안티패턴의 위험성
개발 비용 증가비효율적인 코드로 인해 개발 시간과 비용이 증가할 수 있음
유지보수 어려움복잡한 코드 구조는 유지보수를 어렵게 만들고 오류 발생 가능성을 높임
프로젝트 실패안티패턴이 누적되면 프로젝트의 실패로 이어질 수 있음
안티패턴 극복 방법
디자인 패턴 학습검증된 디자인 패턴을 적용하여 코드의 품질을 향상시킴
코드 리뷰동료 개발자와 함께 코드를 검토하여 잠재적인 문제를 발견하고 개선함
리팩토링코드의 기능을 변경하지 않고 구조를 개선하여 유지보수성을 높임
지속적인 학습새로운 기술과 트렌드를 학습하여 안티패턴에 빠지지 않도록 노력함
같이 보기
관련 개념디자인 패턴
냄새나는 코드
프로그래밍

2. 소프트웨어 공학에서의 안티패턴

소프트웨어 공학에서 안티패턴은 흔히 사용되지만, 결과적으로 부정적인 영향을 주는 패턴을 말한다. 안티패턴은 코드 품질 저하, 유지보수 어려움, 시스템 불안정성 등을 유발할 수 있다.

''디자인 패턴''의 저자들은 안티패턴을 다음과 같은 두 가지 핵심 요소로 정의한다.

# 처음에는 문제에 대한 효과적인 해결책처럼 보이지만, 실제로는 나쁜 결과를 더 많이 초래한다.

# 문제에 대한 다른 해결책이 존재하며, 이 해결책은 문서화되어 있고 반복 가능하며 효과적이다.

안티패턴은 일반적으로 '세 번의 규칙'을 따른다. 즉, 특정 패턴이 적어도 세 번 이상 나타나야 안티패턴으로 간주된다.

소프트웨어 공학에서 안티패턴의 예로는 신 객체, 매직 넘버, 폴터가이스트 등이 있다.[6][7]

안티패턴이라는 용어는 1995년 앤드루 코에니히가 처음 사용했으며,[8] 이후 여러 서적에서 널리 사용되면서 소프트웨어 설계뿐만 아니라 일반적인 사회 상호작용에도 적용되기 시작했다.

''AntiPatterns''의 저자들은 안티패턴과 단순한 악습을 구별하는 두 가지 요소를 다음과 같이 제시했다.


  • 반복되는 패턴이지만 처음에는 유익해 보이지만 결국 나쁜 결과를 초래한다.
  • 리팩토링을 통해 해결할 수 있으며, 문서화되어 있고, 실례로 증명되어 재현 가능하다.


많은 안티패턴은 모순된 단어를 경멸적으로 사용한 새로운 용어로 불리며, 피해야 할 단순한 오류, 미해결 문제, 악습 이상의 의미를 지닌다. "함정"이나 "암흑 패턴"이라고도 불리며, 나쁜 문제 해결책이 반복되는 것을 가리킨다.

2. 1. 디자인 및 설계

소프트웨어 공학에서 안티패턴은 디자인 부재를 나타내는 '''거대한 진흙덩어리'''를 포함한다. 이 외에도 다음과 같은 안티패턴이 존재한다.

  • '''신 객체''': 단일 클래스가 프로그램의 모든 제어를 처리하는 경우를 의미한다. 여러 클래스에 분산되어야 할 제어 기능이 한 클래스에 집중되어 프로그램의 복잡성을 높인다.
  • '''매직 넘버''': 코드 내에서 명확한 설명 없이 사용되는 숫자를 의미한다. 이러한 숫자는 코드의 가독성과 유지보수성을 저해하며, 명명된 상수로 대체하는 것이 바람직하다.
  • '''폴터가이스트''': 다른 클래스의 메서드를 호출하는 역할만 수행하는 임시 컨트롤러 클래스를 의미한다. 이러한 클래스는 불필요하게 프로그램의 복잡성을 증가시킨다.
  • '''스파게티 코드''': 복잡하게 얽혀 있어 구조를 파악하기 어려운 코드를 의미한다. 유지보수가 매우 어렵다.


'''거대한 진흙덩어리'''는 1997년 브라이언 푸트와 조셉 요더의 논문에서 대중화된 용어이다. 이들은 거대한 진흙덩어리를 다음과 같이 정의했다.[1]

이러한 시스템은 인지 가능한 아키텍처가 없으며, 비즈니스 압력, 개발자 이직, 소프트웨어 엔트로피 등으로 인해 발생한다.

2. 2. 프로그래밍


  • 복사-붙여넣기 프로그래밍 (copy and paste programming): 범용적인 코드를 만들지 않고, 기존 코드를 복사하여 (수정하여) 사용하는 것을 말한다.[10]
  • 바쁜 대기 (Busy spin): 어떤 현상이 발생하기를 기다릴 때 메시징을 사용하지 않고 반복적으로 확인하여 CPU를 낭비하는 것을 말한다.
  • 하드 코딩: 시스템의 동작 환경에 대한 가정을 구현에 포함시키는 것을 말한다.
  • 발생하지 않을 현상: 이미 알려진 오류가 실제로는 발생하지 않을 것이라고 생각하는 것을 말한다.
  • 시기상조 최적화(Premature optimization): 초기 단계부터 효율성을 추구하며 코딩하여 좋은 설계와 유지 보수성을 희생한다. 때로는 실제 효율성도 악화시킨다.
  • 수정 프로그래밍 / 우연에 의한 프로그래밍: 코드를 점진적으로 수정하면서 작동 여부를 확인하여 문제를 해결하려고 한다.
  • 테스터 주도 개발: 새로운 요구 사항이 버그 보고서로 기술되는 프로젝트를 말한다.
  • switch와 루프에 의한 순차 처리: switch 문을 사용한 순차적인 처리를 루프 문 안에 포함시킨다.
  • 매직 넘버 (Magic numbers): 설명이 없는 숫자를 알고리즘에 사용한다.
  • 매직 스트링 (Magic string): 이벤트 비교 등을 위해 리터럴 문자열을 사용한다.
  • 소프트 코딩 (Softcoding): 비즈니스 로직을 소스 코드가 아닌 설정 파일에 저장한다.[13]
  • 예외에 의한 코딩: 특수한 케이스가 인식될 때마다 그에 대응하는 코드를 추가한다.
  • 오류 숨기기: 오류 메시지를 사용자에게 알리기 전에 포착하여 숨기거나 안전한 메시지를 보여준다.
  • 예외에 의한 프로그래밍: 프로그래밍 언어의 오류 포착 메커니즘을 정상적인 프로그램의 로직 기술에 사용한다.
  • 화물 숭배 프로그래밍 (Cargo cult programming): 패턴이나 방법론을 이유를 이해하지 않고 사용한다.
  • 실패 캐싱: 복구된 후에도 오류 플래그를 재설정하지 않는다.
  • 보트 앵커: 더 이상 사용하지 않는 부분을 그대로 둔다.
  • 맹신: 버그 수정의 정확성, 또는 서브루틴의 결과를 확인하지 않는다.
  • 원격 동작: 시스템의 크게 분산된 부분끼리 상호 작용한다.
  • 우발적 복잡성: 문제 해결에 불필요한 복잡성을 도입한다.

3. 프로젝트 관리에서의 안티패턴

프로젝트 관리에서의 안티패턴은 프로젝트 지연, 실패, 팀원 간의 갈등 등을 유발할 수 있다. ''안티패턴'' 책에서는 다음과 같은 안티패턴들을 제시하고 있다.


  • 허풍선이 축제: 과도하게 업계 전문가들을 동원하는 것을 말한다.
  • 성공에 대한 두려움: 프로젝트 완료에 가까워질수록 비합리적인 두려움을 느끼는 현상이다.
  • 옥수수 속대: 사람과의 관계에서 어려움을 겪는 것을 의미한다.
  • 지적 폭력: 전문 용어나 난해한 기술을 사용하여 다른 사람을 위협하는 행위이다.
  • 벽 너머로 던지기: 개발자의 동의 없이 유행하는 소프트웨어 엔지니어링 방식을 강요하는 것을 말한다.
  • 화재 훈련: 짧은 위기가 반복되고 그 사이에 오랜 단조로운 기간이 이어지는 상황을 의미한다.
  • '''데스 마칭''': CEO를 제외한 모든 사람이 프로젝트가 실패할 것이라는 사실을 알고 있지만, 프로젝트가 강제로 진행되는 상황을 말한다. 또는 이해할 수 없는 마감일 때문에 직원이 밤늦게나 휴일까지 근무하도록 강요받는 상황을 의미한다.
  • '''집단 사고''': 집단 구성원들이 동의를 얻을 수 있는 생각만을 하려고 하고, 그 외의 생각은 피하는 경향을 말한다.
  • '''소프트웨어 비대화''': 시스템의 후속 버전에 더 많은 인력이 필요하게 되는 현상이다.
  • '''범위 증가''': 프로젝트 시작 후 프로젝트의 범위가 지속적으로 변하거나 적절한 관리 없이 증대되는 현상을 말한다.

3. 1. 일반적인 문제


  • '''분석 마비''': 프로젝트의 분석 단계에 불균형한 노력을 쏟는 것이다.[1]
  • '''뷰그래프 엔지니어링''': 실제 소프트웨어 개발보다 프레젠테이션 제작에 너무 많은 시간을 소비하는 것을 말한다.[1]
  • '''계획에 의한 죽음''': 과도한 계획을 의미한다.[1]
  • '''눈속임''': 구현되지 않은 기능을 구현된 것처럼 보이게 하는 것이다.[1]

3. 2. 팀 관리 및 의사소통


  • '''비합리적인 관리'''는 나쁜 관리 습관을 의미한다.
  • '''불화'''는 관리자 간의 갈등을 의미한다.
  • '''이메일은 위험하다'''는 부적절한 이메일 메시지로 인한 상황을 의미한다.

4. 조직 운영에서의 안티패턴

조직 운영에서의 안티패턴에는 다음과 같은 예시들이 있다.


  • '''조직 경직''': 여러 사람이 설계에 참여하지만, 통일된 의견이 없어 일관성이 떨어지는 결과가 나오는 현상이다.[12]
  • '''수직 분할''': 상하 소통은 원활하지만, 부서 간의 정보 교류나 협업이 어려운 조직 구조를 말한다.

4. 1. 조직 구조 및 문화


  • '''조직 경직''' (Design by committee영어): 여러 사람이 설계에 참여하지만, 통일된 의견이 없어 일관성이 떨어지는 결과가 나오는 것을 말한다.[12]
  • '''수직 분할''' (Stovepipe (organisation)영어): 상하 소통은 원활하지만, 부서 간의 정보 교류나 협업이 어려운 조직 구조를 의미한다.

5. 안티패턴의 활용 및 개선

''디자인 패턴''의 저자에 따르면, 안티패턴은 단순한 나쁜 습관, 나쁜 관행, 나쁜 아이디어와는 다르며, 다음과 같은 두 가지 핵심 요소를 갖는다.[6][7]

# 안티패턴은 처음에는 문제에 대한 적절하고 효과적인 해결책처럼 보이지만, 실제로는 좋은 결과보다 나쁜 결과를 더 많이 초래하는, 일반적으로 사용되는 프로세스, 구조 또는 일련의 행동 패턴이다.

# 안티패턴이 해결하려는 문제에 대해 문서화되어 있고, 반복 가능하며, 효과가 입증된 다른 해결책이 존재한다.

일반적으로 어떤 패턴이 '세 번의 규칙'처럼 실제로 안티패턴으로 인정받으려면 최소 세 번 이상 반복해서 나타나야 한다.

안티패턴을 문서화하는 것은 문제 영역을 분석하고 전문가의 지식을 공유하는 효과적인 방법이 될 수 있다.

일부 안티패턴 설명은 단순히 패턴의 부정적인 결과만 나열하지만, 좋은 안티패턴 문서는 안티패턴을 개선하거나 대체할 수 있는 방법 또한 제공한다.

어떤 문제에 대한 부적절한 해결책을 분류한 것을 안티패턴이라고 한다. 이러한 안티패턴은 반복되는 실수를 기술함으로써, 반복으로 이어지는 역학적인 구조나 잘못된 패턴을 제거하도록 리팩토링하는 방법을 학습하는 데 도움을 줄 수 있다.

참조

[1] 웹사이트 Big Ball of Mud http://www.laputan.o[...] 1999-06-26
[2] 문서 アンチパターン(2002)
[3] 문서 競合状態が発生するソフトウェア開発や保守性の低いソースコードなどが主な例である。
[4] 문서 アンチパターン(2002)
[5] 문서 問題解決のための戦略の立案と実施をすることがアンチパターンの目的であり、ソフトウェア開発における不味いやり方に焦点を当てることが目的ではない。加えて、アンチパターンを破壊的な方向に利用することには社会的な危険が伴うと言われる。形の正しいアンチパターンは、否定的な解から肯定的な解への移行を定義しており、否定的な解のみを記述しているものはアンチパターンもどき(pseudo-AntiPattern)と呼ばれ区別される。
[6] 서적 Software design https://books.google[...] Addison-Wesley 2003
[7] 서적 Process patterns: building large-scale systems using object technology https://books.google[...] Cambridge University Press 1998
[8] 간행물 Patterns and Antipatterns 1995-03
[9] 서적 The patterns handbook: techniques, strategies, and applications https://books.google[...] Cambridge University Press 1998
[10] 웹사이트 Lava Flow http://www.antipatte[...]
[11] 웹사이트 Undocumented 'lava flow' antipatterns complicate process http://www.icmgworld[...]
[12] 웹사이트 Vendor Lock-In http://www.antipatte[...]
[13] 웹사이트 Soft Coding http://worsethanfail[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com