<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>알아두면 쓸데있는 IT 잡학사전</title>
    <link>https://gregorio78.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 14 May 2026 19:00:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>그레고리오78</managingEditor>
    <image>
      <title>알아두면 쓸데있는 IT 잡학사전</title>
      <url>https://tistory1.daumcdn.net/tistory/2569000/attach/a3a7fb8ce9a14760a42b9f436966e7cc</url>
      <link>https://gregorio78.tistory.com</link>
    </image>
    <item>
      <title>객체지향(OOP)의 Interface</title>
      <link>https://gregorio78.tistory.com/451</link>
      <description>&lt;h1&gt;&lt;b&gt;1. Interface의 개요&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1 Interface의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;span&gt;는 객체가 수행해야 할 &lt;/span&gt;&lt;b&gt;행위(Method)의 명세(Contract)&lt;/b&gt;&lt;span&gt; 를 정의하는 추상 타입입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;무엇을 할 것인가만 정의&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;어떻게 할 것인가는 구현 클래스가 결정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;추상 타입&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구현이 아닌 메소드 선언만 포함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;다중 구현 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;여러 클래스가 동일 Interface 구현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;느슨한 결합&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구현체 변경 시 영향 최소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;다형성 지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동일 인터페이스로 다양한 객체 처리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;간단한 개념 예&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1773701289094&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Payment
   pay()

class CardPayment implements Payment
class CashPayment implements Payment

// 실제 실행 시
Payment p = new CardPayment()
Payment p = new CashPayment()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 동일 Interface로 다양한 객체 처리&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2 Interface UML 표현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;UML에서는 &lt;/span&gt;&lt;b&gt;&amp;laquo;interface&amp;raquo;&lt;/b&gt;&lt;span&gt; 또는 &lt;/span&gt;&lt;b&gt;lollipop notation&lt;/b&gt;&lt;span&gt; 으로 표현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PrUwv/dJMcaiihNAz/9AUgyOEr5YCJP3URFzopVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PrUwv/dJMcaiihNAz/9AUgyOEr5YCJP3URFzopVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PrUwv/dJMcaiihNAz/9AUgyOEr5YCJP3URFzopVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPrUwv%2FdJMcaiihNAz%2F9AUgyOEr5YCJP3URFzopVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;273&quot; height=&quot;199&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구현 관계&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T9N1Q/dJMcafskdH4/KRTKiCqpUsVrgQJcclwWG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T9N1Q/dJMcafskdH4/KRTKiCqpUsVrgQJcclwWG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T9N1Q/dJMcafskdH4/KRTKiCqpUsVrgQJcclwWG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT9N1Q%2FdJMcafskdH4%2FKRTKiCqpUsVrgQJcclwWG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;407&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;UML 관계 표기&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;관계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;UML 표기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Interface&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;laquo;interface&amp;raquo;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인터페이스 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Implementation&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Realization&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;클래스 구현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Method&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;+method()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;public method&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;2. 개발 언어별 Interface 비교&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1 언어별 Interface 특징&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Interface &lt;b&gt;지원&lt;/b&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;직접 없음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Function Pointer로 구현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C++&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추상 클래스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;pure virtual function&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Interface 키워드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;다중 구현 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C#&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Interface 키워드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Java와 유사&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;VB.NET&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Interface 키워드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Implements 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ABC / Duck typing&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추상 클래스 기반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;2.2 Interface와 관련 Design Pattern&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interface는 대부분의 &lt;span&gt;&lt;b&gt;GoF Design Pattern&lt;/b&gt;&lt;/span&gt;의 핵심입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Pattern&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Strategy&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;알고리즘 교체&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Factory Method&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객체 생성 분리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Adapter&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인터페이스 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Proxy&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;접근 제어&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Decorator&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능 확장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;2.3 Design Pattern&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;① Strategy Pattern&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘을 Interface로 분리하여 &lt;span&gt;&lt;b&gt;동적으로 교체&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHUZkd/dJMcacvDA1k/UkdAqyjBKfwIarnIL9EPs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHUZkd/dJMcacvDA1k/UkdAqyjBKfwIarnIL9EPs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHUZkd/dJMcacvDA1k/UkdAqyjBKfwIarnIL9EPs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHUZkd%2FdJMcacvDA1k%2FUkdAqyjBKfwIarnIL9EPs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;862&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1773701683006&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ① Strategy 인터페이스
public interface Strategy {
    void execute();
}

// ② ConcreteStrategy A
public class StrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println(&quot;StrategyA 실행: 알고리즘 A 수행&quot;);
    }
}

// ③ ConcreteStrategy B
public class StrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println(&quot;StrategyB 실행: 알고리즘 B 수행&quot;);
    }
}

// ④ Context &amp;mdash; Strategy를 주입받아 위임
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();  // 실제 알고리즘은 Strategy에 위임
    }
}

// ⑤ Client
public class Main {
    public static void main(String[] args) {
        Context context = new Context(new StrategyA());
        context.executeStrategy();  // StrategyA 실행: 알고리즘 A 수행

        // 런타임에 전략 교체
        context.setStrategy(new StrategyB());
        context.executeStrategy();  // StrategyB 실행: 알고리즘 B 수행
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 설명&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context는 Strategy 인터페이스에만 의존하기 때문에 StrategyA와 StrategyB를 전혀 알지 못합니다. 덕분에 새로운 전략(StrategyC)을 추가할 때 Context를 수정할 필요 없이 인터페이스만 구현하면 됩니다 &amp;mdash; &lt;b&gt;OCP(개방-폐쇄 원칙)&lt;/b&gt; 준수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setStrategy()를 통해 런타임에 알고리즘을 동적으로 교체할 수 있는 것이 이 패턴의 핵심 장점입니다. 결제 수단 선택, 정렬 알고리즘 교체, 압축 방식 변경 등 &quot;행동을 바꿔끼워야 하는&quot; 상황에 적합합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘 교체 가능&lt;/li&gt;
&lt;li&gt;OCP(Open Closed Principle)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;② Factory Method Pattern&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체 생성 로직을 &lt;/span&gt;&lt;b&gt;Interface 기반으로 분리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RGqtP/dJMcabKgIdQ/r6zegCTk5QOhZIPTk7oUJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RGqtP/dJMcabKgIdQ/r6zegCTk5QOhZIPTk7oUJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RGqtP/dJMcabKgIdQ/r6zegCTk5QOhZIPTk7oUJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRGqtP%2FdJMcabKgIdQ%2Fr6zegCTk5QOhZIPTk7oUJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1346&quot; height=&quot;926&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773701878427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ① Product 인터페이스
public interface Product {
    void use();
}

// ② ConcreteProduct &amp;mdash; Product 구현체
public class ConcreteProduct implements Product {
    private String name;

    public ConcreteProduct(String name) {
        this.name = name;
    }

    @Override
    public void use() {
        System.out.println(name + &quot; 사용 중&quot;);
    }
}

// ③ Creator &amp;mdash; 팩토리 메서드를 선언하는 추상 클래스
public abstract class Creator {

    // 팩토리 메서드: 서브클래스가 어떤 객체를 만들지 결정
    public abstract Product createProduct();

    // 공통 비즈니스 로직: 생성은 createProduct()에 위임
    public void doSomething() {
        Product product = createProduct();
        System.out.print(&quot;Creator.doSomething &amp;rarr; &quot;);
        product.use();
    }
}

// ④ ConcreteCreator &amp;mdash; 팩토리 메서드를 오버라이드해 구체 객체 반환
public class ConcreteCreator extends Creator {

    @Override
    public Product createProduct() {
        return new ConcreteProduct(&quot;ConcreteProduct&quot;);
    }
}

// ⑤ Client
public class Main {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();

        // 팩토리 메서드 직접 호출
        Product product = creator.createProduct();
        product.use();                 // ConcreteProduct 사용 중

        // 또는 Creator의 템플릿 메서드를 통해 간접 호출
        creator.doSomething();         // Creator.doSomething &amp;rarr; ConcreteProduct 사용 중
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실전 예시-알람&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773701898972&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Notification {
    void send(String message);
}

public class EmailNotification implements Notification {
    @Override public void send(String message) {
        System.out.println(&quot;[EMAIL] &quot; + message);
    }
}

public class SmsNotification implements Notification {
    @Override public void send(String message) {
        System.out.println(&quot;[SMS] &quot; + message);
    }
}

public abstract class NotificationCreator {
    public abstract Notification createNotification();

    public void notify(String message) {
        createNotification().send(message);
    }
}

public class EmailCreator extends NotificationCreator {
    @Override public Notification createNotification() { return new EmailNotification(); }
}

public class SmsCreator extends NotificationCreator {
    @Override public Notification createNotification() { return new SmsNotification(); }
}

// Client
NotificationCreator creator = new EmailCreator();
creator.notify(&quot;주문이 완료되었습니다.&quot;);   // [EMAIL] 주문이 완료되었습니다.

creator = new SmsCreator();
creator.notify(&quot;배송이 시작되었습니다.&quot;);   // [SMS] 배송이 시작되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;③ Adapter Pattern&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호환되지 않는 인터페이스 연결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OVZVD/dJMcabcnDMQ/XlrrYU1FkSEH7f3Aeetus1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OVZVD/dJMcabcnDMQ/XlrrYU1FkSEH7f3Aeetus1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OVZVD/dJMcabcnDMQ/XlrrYU1FkSEH7f3Aeetus1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOVZVD%2FdJMcabcnDMQ%2FXlrrYU1FkSEH7f3Aeetus1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1360&quot; height=&quot;846&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773702113885&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ① Target &amp;mdash; Client가 기대하는 인터페이스
public interface Target {
    void request();
}

// ② Adaptee &amp;mdash; 이미 존재하는 클래스 (인터페이스가 맞지 않음)
public class Adaptee {
    public void specificRequest() {
        System.out.println(&quot;[Adaptee] specificRequest() 실행 (기존 방식)&quot;);
    }
}

// ③ Adapter &amp;mdash; Target을 구현하고, 내부에서 Adaptee에 위임
public class Adapter implements Target {
    private final Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        System.out.println(&quot;[Adapter] request() 호출 &amp;rarr; specificRequest()로 변환&quot;);
        adaptee.specificRequest();  // 인터페이스 변환 후 위임
    }
}

// ④ Client &amp;mdash; Target만 바라보고, Adaptee의 존재를 모름
public class Client {
    private final Target target;

    public Client(Target target) {
        this.target = target;
    }

    public void doWork() {
        target.request();
    }
}

// ⑤ Main
public class Main {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target adapter  = new Adapter(adaptee);
        Client client   = new Client(adapter);

        client.doWork();
        // [Adapter] request() 호출 &amp;rarr; specificRequest()로 변환
        // [Adaptee] specificRequest() 실행 (기존 방식)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실전 예시-레거시 결제 시스템 연동&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773702145009&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기존 레거시 결제 모듈 (변경 불가)
public class LegacyPaymentSystem {
    public void makePayment(String accountNo, double amount) {
        System.out.printf(&quot;[Legacy] 계좌 %s 에 %.0f원 결제%n&quot;, accountNo, amount);
    }
}

// 신규 시스템이 기대하는 인터페이스
public interface PaymentProcessor {
    void pay(String userId, int amount);
}

// 어댑터: 신규 인터페이스 &amp;rarr; 레거시 호출로 변환
public class LegacyPaymentAdapter implements PaymentProcessor {
    private final LegacyPaymentSystem legacy;

    public LegacyPaymentAdapter(LegacyPaymentSystem legacy) {
        this.legacy = legacy;
    }

    @Override
    public void pay(String userId, int amount) {
        String accountNo = &quot;ACC-&quot; + userId;   // userId &amp;rarr; 계좌번호 변환
        legacy.makePayment(accountNo, amount); // 레거시에 위임
    }
}

// Client (신규 시스템)
public class OrderService {
    private final PaymentProcessor processor;

    public OrderService(PaymentProcessor processor) {
        this.processor = processor;
    }

    public void placeOrder(String userId, int price) {
        System.out.println(&quot;주문 처리 중...&quot;);
        processor.pay(userId, price);
    }
}

// Main
PaymentProcessor adapter = new LegacyPaymentAdapter(new LegacyPaymentSystem());
OrderService service = new OrderService(adapter);
service.placeOrder(&quot;user42&quot;, 15000);
// 주문 처리 중...
// [Legacy] 계좌 ACC-user42 에 15000원 결제&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;3. 개발 언어별 Interface 예제&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1 C 언어 (Function Pointer 기반)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;C는 Interface가 없기 때문에 &lt;/span&gt;&lt;b&gt;struct + function pointer&lt;/b&gt;&lt;span&gt; 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773701805068&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct {
    void (*pay)(int);
} Payment;

void cardPay(int amount) {
    printf(&quot;Card Pay: %d\n&quot;, amount);
}

void cashPay(int amount) {
    printf(&quot;Cash Pay: %d\n&quot;, amount);
}

int main() {

    Payment card = { cardPay };
    Payment cash = { cashPay };

    card.pay(100);
    cash.pay(200);

}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2 C++ Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;C++에서는 &lt;/span&gt;&lt;b&gt;pure virtual function&lt;/b&gt;&lt;span&gt; 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773701833578&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Payment {
public:
    virtual void pay(int amount) = 0;
};

class CardPayment : public Payment {
public:
    void pay(int amount) {
        cout &amp;lt;&amp;lt; &quot;Card Pay: &quot; &amp;lt;&amp;lt; amount &amp;lt;&amp;lt; endl;
    }
};

int main() {
    Payment* p = new CardPayment();
    p-&amp;gt;pay(100);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.3 Java Interface&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773701973043&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Payment {
    void pay(int amount);
}

class CardPayment implements Payment {

    public void pay(int amount) {
        System.out.println(&quot;Card Pay : &quot; + amount);
    }
}

public class Main {

    public static void main(String[] args) {

        Payment p = new CardPayment();
        p.pay(100);

    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.4 C# Interface&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773701992335&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

interface IPayment
{
    void Pay(int amount);
}

class CardPayment : IPayment
{
    public void Pay(int amount)
    {
        Console.WriteLine(&quot;Card Pay &quot; + amount);
    }
}

class Program
{
    static void Main()
    {
        IPayment p = new CardPayment();
        p.Pay(100);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.5 VB.NET Interface&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773702017903&quot; class=&quot;vbnet&quot; data-ke-language=&quot;vbnet&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Interface IPayment
    Sub Pay(amount As Integer)
End Interface

Class CardPayment
    Implements IPayment

    Public Sub Pay(amount As Integer) Implements IPayment.Pay
        Console.WriteLine(&quot;Card Pay &quot; &amp;amp; amount)
    End Sub
End Class

Module Program

    Sub Main()

        Dim p As IPayment = New CardPayment()
        p.Pay(100)

    End Sub

End Module&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.6 Python Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python은 &lt;/span&gt;&lt;b&gt;ABC(Abstract Base Class)&lt;/b&gt;&lt;span&gt; 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773702039810&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod

class Payment(ABC):

    @abstractmethod
    def pay(self, amount):
        pass

class CardPayment(Payment):

    def pay(self, amount):
        print(&quot;Card Pay:&quot;, amount)

p = CardPayment()
p.pay(100)&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;4. Method Overload / Method Override&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.1&amp;nbsp;&lt;/b&gt;&lt;b&gt;Method Overload의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;같은 이름의 메소드지만 파라미터가 다른 메소드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773702078222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;add(int a, int b)
add(int a, int b, int c)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.2 &lt;/b&gt;&lt;b&gt;Method Override의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모 클래스 메소드를 자식 클래스에서 재정의&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773702228436&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Parent
   run()

class Child
   run()  &amp;larr; override&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.3 Method Overload와 Method Override 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Overload&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Override&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메소드 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능 재정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;위치&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동일 클래스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상속 관계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;파라미터&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;다름&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동일&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;반환 타입&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동일/다름 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동일&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;다형성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;compile time&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;runtime&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.4 예제 코드 (Java)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Overload&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1773702299214&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Calc {

    int add(int a, int b) {
        return a + b;
    }

    int add(int a, int b, int c) {
        return a + b + c;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Override&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1773702315798&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {

    void sound() {
        System.out.println(&quot;Animal Sound&quot;);
    }

}

class Dog extends Animal {

    @Override
    void sound() {
        System.out.println(&quot;Dog Bark&quot;);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;OOP 핵심 구조&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;1412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjV0Zb/dJMcaiJnjng/CG7sUS4byebxDdx9bKMHq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjV0Zb/dJMcaiJnjng/CG7sUS4byebxDdx9bKMHq0/img.png&quot; data-alt=&quot;SOLID 원칙은 이 4대 원칙 위에서 설계 지침으로 동작한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjV0Zb/dJMcaiJnjng/CG7sUS4byebxDdx9bKMHq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjV0Zb%2FdJMcaiJnjng%2FCG7sUS4byebxDdx9bKMHq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1402&quot; height=&quot;1412&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;1412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SOLID 원칙은 이 4대 원칙 위에서 설계 지침으로 동작한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발/OOP</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/451</guid>
      <comments>https://gregorio78.tistory.com/451#entry451comment</comments>
      <pubDate>Tue, 17 Mar 2026 08:15:56 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript Coding Conventions</title>
      <link>https://gregorio78.tistory.com/450</link>
      <description>&lt;h1 id=&quot;-mKieFuy&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;-mKieFuy&quot; data-block-id=&quot;YrL0aU&quot;&gt;변수&lt;/h1&gt;
&lt;h2 id=&quot;CyWx8Jso&quot; data-toc-id=&quot;CyWx8Jso&quot; data-block-id=&quot;vMztZ8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의미있는 변수 이름을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;jvF6fA&quot; data-ke-size=&quot;size16&quot;&gt;읽는 사람으로 하여금 변수마다 어떤 점이 다른지 알 수 있도록 이름을 구별하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;riLVZx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot; data-block-id=&quot;w4JquK&quot;&gt;&lt;code&gt;function between(a1: T, a2: T, a3: T): boolean {
  return a2 &amp;lt;= a1 &amp;amp;&amp;amp; a1 &amp;lt;= a3;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;0eSGt1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;excel&quot; data-block-id=&quot;5cccSt&quot;&gt;&lt;code&gt;function between(value: T, left: T, right: T): boolean {
  return left &amp;lt;= value &amp;amp;&amp;amp; value &amp;lt;= right;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;L-gDik-z&quot; data-toc-id=&quot;L-gDik-z&quot; data-block-id=&quot;FoBKE8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;발음할 수 있는 변수 이름을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;9Btdy0&quot; data-ke-size=&quot;size16&quot;&gt;발음할 수 없는 이름은 그 변수에 대해서 바보 같이 소리를 내 토론할 수밖에 없습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;R1Eo8B&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;elm&quot; data-block-id=&quot;iyt25O&quot;&gt;&lt;code&gt;type DtaRcrd102 = {
  genymdhms: Date;
  modymdhms: Date;
  pszqint: number;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;gYWVhK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot; data-block-id=&quot;mmN3cy&quot;&gt;&lt;code&gt;type Customer = {
  generationTimestamp: Date;
  modificationTimestamp: Date;
  recordId: number;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;_cJQMO35&quot; data-toc-id=&quot;_cJQMO35&quot; data-block-id=&quot;VNmaMC&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동일한 유형의 변수는 동일한 단어를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;6X074X&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li&gt;
&lt;pre class=&quot;routeros&quot; data-block-id=&quot;1YDTQp&quot;&gt;&lt;code&gt;    function getUserInfo(): User;
    function getUserDetails(): User;
    function getUserData(): User;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;SS_Uxb&quot;&gt;&lt;code&gt;    function getUser(): User;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;L_23GWY0&quot; data-toc-id=&quot;L_23GWY0&quot; data-block-id=&quot;Y8jjjM&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;검색할 수 있는 이름을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Fnqo_y&quot; data-ke-size=&quot;size16&quot;&gt;코드를 쓸 때보다 읽을 때가 더 많기 때문에 우리가 쓰는 코드는 읽을 수 있고 검색이 가능해야 합니다. 프로그램을 이해할 때 의미있는 변수 이름을 짓지 않으면 읽는 사람으로 하여금 어려움을 줄 수 있습니다. 검색 가능한 이름을 지으세요. &lt;a href=&quot;https://palantir.github.io/tslint/rules/no-magic-numbers/&quot;&gt;TSLint&lt;/a&gt;와 같은 도구는 이름이 없는 상수를 식별할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;giM97U&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;6yde_A&quot;&gt;// 86400000이 도대체 뭐지? setTimeout(restart, 86400000);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;F83_5V&quot;&gt;// 대문자로 이루어진 상수로 선언하세요. const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000; setTimeout(restart, MILLISECONDS_IN_A_DAY);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lyS3MSkH&quot; data-toc-id=&quot;lyS3MSkH&quot; data-block-id=&quot;_eWfQM&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의도를 나타내는 변수를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9uTjk1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;WqkOAq&quot;&gt;declare const users: Map&amp;lt;string, User&amp;gt;; for (const keyValue of users) { // users 맵을 순회 }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;gCyJWG&quot;&gt;declare const users: Map&amp;lt;string, User&amp;gt;; for (const [id, user] of users) { // users 맵을 순회 }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;AVgj1Rbp&quot; data-toc-id=&quot;AVgj1Rbp&quot; data-block-id=&quot;r1H6eW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;암시하는 이름은 사용하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;-N3SLn&quot; data-ke-size=&quot;size16&quot;&gt;명시적인 것이 암시적인 것보다 좋습니다.&amp;nbsp;명료함은 최고입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DuWJLH&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;xKfLeB&quot;&gt;const u = getUser(); const s = getSubscription(); const t = charge(u, s);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;lN7ZCn&quot;&gt;const user = getUser(); const subscription = getSubscription(); const transaction = charge(user, subscription);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-1Nun4EL&quot; data-toc-id=&quot;-1Nun4EL&quot; data-block-id=&quot;6Q4wox&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;불필요한 문맥은 추가하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;o5v_w7&quot; data-ke-size=&quot;size16&quot;&gt;클래스/타입/객체의 이름에 의미가 담겨있다면, 변수 이름에서 반복하지 마세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oJh0EA&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;C7ebGs&quot;&gt;type Car = { carMake: string; carModel: string; carColor: string; } function print(car: Car): void { console.log(${car.carMake} ${car.carModel} (${car.carColor})); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;````tsmake: string;color: string;function print(car: Car): void {}&lt;/li&gt;
&lt;li data-block-id=&quot;_0-Nss&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li data-block-id=&quot;7MnwQ5&quot;&gt;console.log(${car.make} ${car.model} (${car.color}));&lt;/li&gt;
&lt;li data-block-id=&quot;WMAg18&quot;&gt;}&lt;/li&gt;
&lt;li data-block-id=&quot;rxZMzu&quot;&gt;model: string;&lt;/li&gt;
&lt;li data-block-id=&quot;Ew6jYY&quot;&gt;type Car = {&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Ue-KTfus&quot; data-toc-id=&quot;Ue-KTfus&quot; data-block-id=&quot;X0nm00&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;short circuiting이나 조건문 대신 기본 매개변수를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;P3_ly5&quot; data-ke-size=&quot;size16&quot;&gt;기본 매개변수는 short circuiting보다 보통 명료합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;nQVDGK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;8mCawz&quot;&gt;function loadPages(count?: number) { const loadCount = count !== undefined ? count : 10; // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;_LvOgJ&quot;&gt;function loadPages(count: number = 10) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;9GjruZgX&quot; data-toc-id=&quot;9GjruZgX&quot; data-block-id=&quot;Oly_qc&quot;&gt;함수&lt;/h1&gt;
&lt;h2 id=&quot;PS-dA-Kp&quot; data-toc-id=&quot;PS-dA-Kp&quot; data-block-id=&quot;BVCh1y&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수의 매개변수는 2개 혹은 그 이하가 이상적입니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;XrsvwM&quot; data-ke-size=&quot;size16&quot;&gt;함수 매개변수의 개수를 제한하는 것은 함수를 테스트하기 쉽게 만들어주기 때문에 놀라울 정도로 중요합니다. 함수 매개변수가 3개 이상인 경우, 각기 다른 인수로 여러 다른 케이스를 테스트해야 하므로 경우의 수가 매우 많아집니다.&lt;br /&gt;한 개 혹은 두 개의 매개변수가 이상적인 경우고, 가능하다면 세 개는 피해야 합니다. 그 이상의 경우에는 합쳐야 합니다. 두 개 이상의 매개변수를 가질 경우, 함수가 많은 것을 할 가능성이 높아집니다. 그렇지 않은 경우, 대부분 상위 객체는 하나의 매개변수로 충분할 것입니다.&lt;br /&gt;많은 매개변수를 사용해야 한다면 객체 리터럴을 사용하는 것을 고려해보세요.&lt;br /&gt;함수가 기대하는 속성을 명확하게 하기 위해, &lt;a href=&quot;https://basarat.gitbook.io/typescript/future-javascript/destructuring&quot;&gt;구조 분해&lt;/a&gt; 구문을 사용할 수 있습니다. 이 구문은 몇 개의 장점을 가지고 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;R311SN&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;어떤 사람이 함수 시그니쳐(매개변수의 타입, 반환값의 타입 등)를 볼 때, 어떤 속성이 사용되는지 즉시 알 수 있습니다.&lt;/li&gt;
&lt;li&gt;명명된 매개변수처럼 보이게 할 때 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;또한 구조 분해는 함수로 전달된 매개변수 객체의 특정한 원시 값을 복제하며 이것은 사이드 이펙트를 방지하는데 도움을 줍니다. 유의사항: 매개변수 객체로부터 구조 분해된 객체와 배열은 &lt;b&gt;복제되지 않습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;타입스크립트는 사용하지 않은 속성에 대해서 경고를 주며, 구조 분해를 사용하면 경고를 받지 않을 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;rOTAmO&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;V2Y4uj&quot;&gt;function createMenu(title: string, body: string, buttonText: string, cancellable: boolean) { // ... } createMenu('Foo', 'Bar', 'Baz', true);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;ZQM8is&quot;&gt;function createMenu(options: { title: string, body: string, buttonText: string, cancellable: boolean }) { // ... } createMenu({ title: 'Foo', body: 'Bar', buttonText: 'Baz', cancellable: true });&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases&quot;&gt;타입 앨리어스&lt;/a&gt;&lt;b&gt;를 사용해서 가독성을 더 높일 수 있습니다&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;DXLvxH&quot;&gt;type MenuOptions = { title: string, body: string, buttonText: string, cancellable: boolean }; function createMenu(options: MenuOptions) { // ... } createMenu({ title: 'Foo', body: 'Bar', buttonText: 'Baz', cancellable: true });&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;16RPvInT&quot; data-toc-id=&quot;16RPvInT&quot; data-block-id=&quot;RuAvpH&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수는 한 가지만 해야합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;qRa9mN&quot; data-ke-size=&quot;size16&quot;&gt;이것은 소프트웨어 공학에서 단연코 가장 중요한 규칙입니다. 함수가 한 가지 이상의 역할을 수행할 때 작성하고 테스트하고 추론하기 어려워집니다. 함수를 하나의 행동으로 정의할 수 있을 때, 쉽게 리팩토링할 수 있으며 코드를 더욱 명료하게 읽을 수 있습니다. 이 가이드에서 이 부분만 자기것으로 만들어도 당신은 많은 개발자보다 앞설 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;TRp7zJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;gjMKUn&quot;&gt;function emailClients(clients: Client[]) { clients.forEach((client) =&amp;gt; { const clientRecord = database.lookup(client); if (clientRecord.isActive()) { email(client); } }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;xC2lxM&quot;&gt;function emailClients(clients: Client[]) { clients.filter(isActiveClient).forEach(email); } function isActiveClient(client: Client) { const clientRecord = database.lookup(client); return clientRecord.isActive(); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;HalG3NlU&quot; data-toc-id=&quot;HalG3NlU&quot; data-block-id=&quot;WVyL2z&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수가 무엇을 하는지 알 수 있도록 함수 이름을 지으세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hY0NYZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;mzrZlD&quot;&gt;function addToDate(date: Date, month: number): Date { // ... } const date = new Date(); // 무엇이 추가되는지 함수 이름만으로 유추하기 어렵습니다 addToDate(date, 1);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;gjmCz9&quot;&gt;function addMonthToDate(date: Date, month: number): Date { // ... } const date = new Date(); addMonthToDate(date, 1);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;8WDEdAwQ&quot; data-toc-id=&quot;8WDEdAwQ&quot; data-block-id=&quot;Fja6G2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수는 단일 행동을 추상화해야 합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;hRwxEz&quot; data-ke-size=&quot;size16&quot;&gt;함수가 한 가지 이상을 추상화한다면 그 함수는 너무 많은 일을 하게 됩니다. 재사용성과 쉬운 테스트를 위해서 함수를 쪼개세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RPEHJf&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;8CCa7w&quot;&gt;function parseCode(code: string) { const REGEXES = [ /* ... */ ]; const statements = code.split(' '); const tokens = []; REGEXES.forEach((regex) =&amp;gt; { statements.forEach((statement) =&amp;gt; { // ... }); }); const ast = []; tokens.forEach((token) =&amp;gt; { // lex... }); ast.forEach((node) =&amp;gt; { // parse... }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;V5pDtS&quot;&gt;const REGEXES = [ /* ... */ ]; function parseCode(code: string) { const tokens = tokenize(code); const syntaxTree = parse(tokens); syntaxTree.forEach((node) =&amp;gt; { // parse... }); } function tokenize(code: string): Token[] { const statements = code.split(' '); const tokens: Token[] = []; REGEXES.forEach((regex) =&amp;gt; { statements.forEach((statement) =&amp;gt; { tokens.push( /* ... */ ); }); }); return tokens; } function parse(tokens: Token[]): SyntaxTree { const syntaxTree: SyntaxTree[] = []; tokens.forEach((token) =&amp;gt; { syntaxTree.push( /* ... */ ); }); return syntaxTree; }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;U3ZPIZKH&quot; data-toc-id=&quot;U3ZPIZKH&quot; data-block-id=&quot;KIaBmQ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;중복된 코드를 제거해주세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;X7o5HF&quot; data-ke-size=&quot;size16&quot;&gt;코드가 중복되지 않도록 최선을 다하세요. 중복된 코드는 어떤 로직을 변경할 때 한 곳 이상을 변경해야 하기 때문에 좋지 않습니다.&lt;br /&gt;당신이 레스토랑을 운영하면서 재고를 추적한다고 상상해보세요: 모든 토마토, 양파, 마늘, 양념 등. 관리하는 목록이 여러개일 때 토마토를 넣은 요리를 제공할 때마다 모든 목록을 수정해야 합니다. 관리하는 목록이 단 하나일 때는 한 곳만 수정하면 됩니다!&lt;br /&gt;당신은 종종 두 개 이상의 사소한 차이점이 존재한다고 생각해서 거의 비슷한 코드를 중복 작성합니다. 하지만 그 몇가지 다른 것으로 인해 같은 역할을 하는 두 개 이상의 함수를 만들게 됩니다. 중복된 코드를 제거하는 것은 조금씩 다른 역할을 하는 것을 묶음으로써 하나의 함수/모듈/클래스로 처리하는 추상화를 만드는 것을 의미합니다.&lt;br /&gt;추상화를 올바르게 하는 것은 중요하며, 이것은 &lt;a href=&quot;https://github.com/738/clean-code-typescript#solid&quot;&gt;SOLID&lt;/a&gt; 원칙을 따르는 이유이기도 합니다. 올바르지 않은 추상화는 중복된 코드보다 나쁘므로 주의하세요! 좋은 추상화를 할 수 있다면 그렇게 하라는 말입니다! 반복하지 마세요. 그렇지 않으면 하나를 변경할 때마다 여러 곳을 변경하게 될 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;XCZKGu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;JSm8Hy&quot;&gt;function showDeveloperList(developers: Developer[]) { developers.forEach((developer) =&amp;gt; { const expectedSalary = developer.calculateExpectedSalary(); const experience = developer.getExperience(); const githubLink = developer.getGithubLink(); const data = { expectedSalary, experience, githubLink }; render(data); }); } function showManagerList(managers: Manager[]) { managers.forEach((manager) =&amp;gt; { const expectedSalary = manager.calculateExpectedSalary(); const experience = manager.getExperience(); const portfolio = manager.getMBAProjects(); const data = { expectedSalary, experience, portfolio }; render(data); }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;BcR0xT&quot;&gt;class Developer { // ... getExtraDetails() { return { githubLink: this.githubLink, } } } class Manager { // ... getExtraDetails() { return { portfolio: this.portfolio, } } } function showEmployeeList(employee: Developer | Manager) { employee.forEach((employee) =&amp;gt; { const expectedSalary = employee.calculateExpectedSalary(); const experience = employee.getExperience(); const extra = employee.getExtraDetails(); const data = { expectedSalary, experience, extra, }; render(data); }); }&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;5z88kD&quot; data-ke-size=&quot;size16&quot;&gt;당신은 중복된 코드에 대해서 비판적으로 생각해야 합니다. 가끔은 중복된 코드와 불필요한 추상화로 인한 복잡성 간의 맞바꿈이 있을 수 있습니다. 서로 다른 두 개의 모듈의 구현이 유사해 보이지만 서로 다른 도메인에 존재하는 경우, 코드 중복은 공통된 코드에서 추출해서 중복을 줄이는 것보다 나은 선택일 수 있습니다. 이 경우에 추출된 공통의 코드는 두 모듈 사이에서 간접적인 의존성이 나타나게 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;KJbmVqQh&quot; data-toc-id=&quot;KJbmVqQh&quot; data-block-id=&quot;ZEgzJj&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Object.assign&lt;/b&gt;&lt;b&gt; 혹은 구조 분해를 사용해서 기본 객체를 만드세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MHaxa-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;WlQnLa&quot;&gt;type MenuConfig = { title?: string, body?: string, buttonText?: string, cancellable?: boolean }; function createMenu(config: MenuConfig) { config.title = config.title || 'Foo'; config.body = config.body || 'Bar'; config.buttonText = config.buttonText || 'Baz'; config.cancellable = config.cancellable !== undefined ? config.cancellable : true; // ... } createMenu({ body: 'Bar' });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;AHMU7R&quot;&gt;type MenuConfig = { title?: string, body?: string, buttonText?: string, cancellable?: boolean }; function createMenu(config: MenuConfig) { const menuConfig = Object.assign({ title: 'Foo', body: 'Bar', buttonText: 'Baz', cancellable: true }, config); // ... } createMenu({ body: 'Bar' });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대안으로, 기본 값을 구조 분해를 사용해서 해결할 수 있습니다&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;qml88F&quot;&gt;type MenuConfig = { title?: string, body?: string, buttonText?: string, cancellable?: boolean }; function createMenu({ title = 'Foo', body = 'Bar', buttonText = 'Baz', cancellable = true }: MenuConfig) { // ... } createMenu({ body: 'Bar' });&lt;/li&gt;
&lt;li&gt;사이드 이펙트와 undefined 혹은 null 값을 명시적으로 넘기는 예상치 못한 행동을 피하기 위해서 타입스크립트 컴파일러에게 그것을 허락하지 않도록 설정할 수 있습니다. 타입스크립트에서 &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#--strictnullchecks&quot;&gt;--strictNullChecks&lt;/a&gt; 옵션을 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3dppaJFA&quot; data-toc-id=&quot;3dppaJFA&quot; data-block-id=&quot;ypdY4C&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사이드 이펙트를 피하세요 (파트 1)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;TWVEzK&quot; data-ke-size=&quot;size16&quot;&gt;함수는 값을 가져와서 다른 값을 반환하는 것 이외에 다른 것을 할 경우 사이드 이펙트를 발생시킬 수 있습니다. 사이드 이펙트는 파일을 쓴다거나, 전역 변수를 조작한다거나, 뜻하지 않게 낯선 사람에게 당신의 전재산을 송금할 수 있습니다.&lt;br /&gt;당신은 가끔 프로그램에서 사이드 이펙트를 가질 필요가 있습니다. 이전의 사례에서와 같이 당신은 파일을 써야할 때가 있습니다. 당신이 하고 싶은 것은 이것을 중앙화하는 것입니다. 특정 파일을 쓰기 위해 몇 개의 함수와 클래스를 만들지 마세요. 그것을 행하는 서비스를 단 하나만 만드세요.&lt;br /&gt;중요한 것은 어떠한 구조도 없이 객체 사이에 상태를 공유하거나 어떤 것에 의해서든지 변경될 수 있는 데이터 타입을 사용하거나 사이드 이펙트가 일어나는 곳을 중앙화 하지 않는 것과 같은 위험 요소를 피하는 것입니다. 만약 그렇게 할 수 있다면, 당신은 대부분의 다른 프로그래머들보다 더욱 행복할 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KXcpQ7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;elFxkv&quot;&gt;// 아래의 함수에서 참조하는 전역 변수입니다. let name = 'Robert C. Martin'; function toBase64() { name = btoa(name); } toBase64(); // 이 이름을 사용하는 다른 함수가 있다면, 그것은 Base64 값을 반환할 것입니다 console.log(name); // 'Robert C. Martin'이 출력되는 것을 예상했지만 'Um9iZXJ0IEMuIE1hcnRpbg=='가 출력됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;zRJlNh&quot;&gt;const name = 'Robert C. Martin'; function toBase64(text: string): string { return btoa(text); } const encodedName = toBase64(name); console.log(name);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tqVhZoJJ&quot; data-toc-id=&quot;tqVhZoJJ&quot; data-block-id=&quot;iz-_i2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사이드 이펙트를 피하세요 (파트 2)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;lRyPFD&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 원시값은 값에 의해 전달되고 객체/배열은 참조에 의해 전달됩니다. 예를 들어, 객체와 배열의 경우 어떤 함수가 쇼핑 장바구니 배열을 변경하는 기능을 가지고 있다면, 구매하려는 아이템이 추가됨으로써 cart 배열을 사용하는 다른 함수는 이 추가의 영향을 받을 수 있습니다. 이것은 장점이 될 수도 있지만 단점이 될 수도 있습니다. 최악의 상황을 상상해보겠습니다:&lt;br /&gt;사용자는 네트워크 요청을 생성하고 서버에 cart 배열을 전송하는 purchase 함수를 호출하는 '구매' 버튼을 클릭합니다. 네트워크 연결 불량 때문에 purchase 함수는 요청을 재시도해야 합니다. 네트워크 요청이 시작되기 전에 사용자가 원하지 않은 아이템을 실수로 '장바구니에 추가하기' 버튼을 누르면 어떻게 될까요? 네트워크 요청이 시작되면, purchase 함수는 addItemToCart 함수가 변경한 쇼핑 장바구니 배열을 참조하고 있기 때문에 purchase 함수는 실수로 추가된 아이템을 보낼 것입니다.&lt;br /&gt;훌륭한 해법은 addItemToCart 함수에서 cart 배열을 복제하고 그것을 수정하고 그 복제한 값을 반환하는 것입니다. 이는 쇼핑 장바구니 배열을 참조하고 있는 값을 들고 있는 어떤 다른 함수도 다른 변경에 의해 영향을 받지 않는 것을 보장합니다.&lt;br /&gt;이 접근법에 대한 두 가지 주의사항:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;HgU_Aw&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실제로는 입력된 객체값을 변경하기를 원하는 경우가 있을 수 있습니다. 하지만 이러한 프로그래밍 관례를 선택할 때 당신은 이러한 경우가 매우 드물다는 것을 알게 될 것입니다. 대부분은 사이드 이펙트가 없도록 리팩토링될 수 있습니다! (&lt;a href=&quot;https://en.wikipedia.org/wiki/Pure_function&quot;&gt;Pure Function&lt;/a&gt;를 확인해주세요)&lt;/li&gt;
&lt;li&gt;큰 객체를 복제하는 것은 성능 관점에서 비용이 높을 수 있습니다. 다행히도 이러한 프로그래밍 접근법을 가능하게 해주는 훌륭한 라이브러리가 있기 때문에 큰 문제는 아닙니다. 이는 수동으로 객체와 배열을 복제해주는 것만큼 메모리 집약적이지 않게 해주고 빠르게 복제해줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;2VNjjJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;HbmwNC&quot;&gt;function addItemToCart(cart: CartItem[], item: Item): void { cart.push({ item, date: Date.now() }); };&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Z4S7jM&quot;&gt;function addItemToCart(cart: CartItem[], item: Item): CartItem[] { return [...cart, { item, date: Date.now() }]; };&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5eFybrJO&quot; data-toc-id=&quot;5eFybrJO&quot; data-block-id=&quot;YKYC0O&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;명령형 프로그래밍보다 함수형 프로그래밍을 지향하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;TiIHIe&quot; data-ke-size=&quot;size16&quot;&gt;가능하다면 이런 방식의 프로그래밍을 지향하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DV1Or0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;DnJw1u&quot;&gt;const contributions = [ { name: 'Uncle Bobby', linesOfCode: 500 }, { name: 'Suzie Q', linesOfCode: 1500 }, { name: 'Jimmy Gosling', linesOfCode: 150 }, { name: 'Gracie Hopper', linesOfCode: 1000 } ]; let totalOutput = 0; for (let i = 0; i &amp;lt; contributions.length; i++) { totalOutput += contributions[i].linesOfCode; }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;QMTuxE&quot;&gt;const contributions = [ { name: 'Uncle Bobby', linesOfCode: 500 }, { name: 'Suzie Q', linesOfCode: 1500 }, { name: 'Jimmy Gosling', linesOfCode: 150 }, { name: 'Gracie Hopper', linesOfCode: 1000 } ]; const totalOutput = contributions .reduce((totalLines, output) =&amp;gt; totalLines + output.linesOfCode, 0);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Pk7C3pbP&quot; data-toc-id=&quot;Pk7C3pbP&quot; data-block-id=&quot;1ldBiG&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;조건문을 캡슐화하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BOoCZu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;ymuSn_&quot;&gt;if (subscription.isTrial || account.balance &amp;gt; 0) { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;wUkBil&quot;&gt;function canActivateService(subscription: Subscription, account: Account) { return subscription.isTrial || account.balance &amp;gt; 0; } if (canActivateService(subscription, account)) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vMpy8T-b&quot; data-toc-id=&quot;vMpy8T-b&quot; data-block-id=&quot;zrUTg6&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;부정 조건문을 피하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BAe42L&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;z-FNqH&quot;&gt;function isEmailNotUsed(email: string): boolean { // ... } if (isEmailNotUsed(email)) { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;zHlI7V&quot;&gt;function isEmailUsed(email): boolean { // ... } if (!isEmailUsed(node)) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Vw8kwD10&quot; data-toc-id=&quot;Vw8kwD10&quot; data-block-id=&quot;hVIK_Y&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 체킹을 피하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;a_CzFl&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트는 자바스크립트의 엄격한 구문적 상위 집합이며 언어에 선택적인 정적 타입 검사 기능을 추가합니다. 타입스크립트의 기능을 최대한 활용하기 위해 항상 변수의 타입, 매개변수, 반환값의 타입을 지정하도록 하세요. 그렇게 하면 리팩토링이 매우 쉬워집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KrHz7m&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;l0U_PD&quot;&gt;function travelToTexas(vehicle: Bicycle | Car) { if (vehicle instanceof Bicycle) { vehicle.pedal(currentLocation, new Location('texas')); } else if (vehicle instanceof Car) { vehicle.drive(currentLocation, new Location('texas')); } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Wz-JBA&quot;&gt;type Vehicle = Bicycle | Car; function travelToTexas(vehicle: Vehicle) { vehicle.move(currentLocation, new Location('texas')); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;OfaRVOOP&quot; data-toc-id=&quot;OfaRVOOP&quot; data-block-id=&quot;jUk5b0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;필요 이상으로 최적화하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;sAQGJz&quot; data-ke-size=&quot;size16&quot;&gt;현대 브라우저는 런타임에서 많은 최적화를 수행합니다. 많은 시간을 최적화하는 데에 사용하고 있다면 시간 낭비입니다. 최적화가 부족한 부분을 확인할 수 있는 좋은 &lt;a href=&quot;https://github.com/petkaantonov/bluebird/wiki/Optimization-killers&quot;&gt;자료&lt;/a&gt;가 있습니다. 이것을 참조하여 최적화가 부족한 부분만 최적화해줄 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;1nx725&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;zJSN6_&quot;&gt;// 예전 브라우저에서는 캐시되지 않은 `list.length`를 사용한 각 순회는 비용이 많이 들 것입니다. // `list.length`의 재계산 때문입니다. 현대 브라우저에서는 이 부분이 최적화됩니다. for (let i = 0, len = list.length; i &amp;lt; len; i++) { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;3fjFqZ&quot;&gt;for (let i = 0; i &amp;lt; list.length; i++) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3z_tbJnp&quot; data-toc-id=&quot;3z_tbJnp&quot; data-block-id=&quot;70h3AU&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;필요하지 않는 코드는 제거하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;jZ7Zdv&quot; data-ke-size=&quot;size16&quot;&gt;사용하지 않은 코드는 중복된 코드만큼 나쁩니다. 당신의 코드에서 이것을 유지할 이유는 없습니다. 호출되지 않은 코드가 있다면 제거하세요! 지운 코드를 다시 확인할 필요가 있다면 버전 기록에서 볼 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;YX4npt&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;smIfwC&quot;&gt;function oldRequestModule(url: string) { // ... } function requestModule(url: string) { // ... } const req = requestModule; inventoryTracker('apples', req, 'www.inventory-awesome.io');&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Z2920q&quot;&gt;function requestModule(url: string) { // ... } const req = requestModule; inventoryTracker('apples', req, 'www.inventory-awesome.io');&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;UZPnpivZ&quot; data-toc-id=&quot;UZPnpivZ&quot; data-block-id=&quot;ZV9XSx&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;iterator&lt;/b&gt;&lt;b&gt;와 &lt;/b&gt;&lt;b&gt;generator&lt;/b&gt;&lt;b&gt;를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;oDkpq3&quot; data-ke-size=&quot;size16&quot;&gt;스트림과 같이 사용되는 데이터 콜렉션을 사용할 때는 generator와 iterable을 사용하세요. 몇 가지의 좋은 이유가 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;z80AHk&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피호출자가 접근할 아이템 수를 결정한다는 의미에서 피호출자를 generator 구현으로부터 분리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;지연 실행, 아이템은 요구에 의해 스트림 처리될 수 있습니다.&lt;/li&gt;
&lt;li&gt;for-of 구문을 사용해 아이템을 순회하는 내장 지원이 있습니다.&lt;/li&gt;
&lt;li&gt;iterable은 최적화된 iterator 패턴을 구현할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;es3R2Z&quot;&gt;function fibonacci(n: number): number[] { if (n === 1) return [0]; if (n === 2) return [0, 1]; const items: number[] = [0, 1]; while (items.length &amp;lt; n) { items.push(items[items.length - 2] + items[items.length - 1]); } return items; } function print(n: number) { fibonacci(n).forEach(fib =&amp;gt; console.log(fib)); } // 피보나치 숫자의 첫 번째 10개 숫자를 출력합니다. print(10);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;jREhWh&quot;&gt;// 피보나치 숫자의 무한 스트림을 생성합니다. // `generator`는 모든 숫자의 배열을 유지하고 있지 않습니다. function* fibonacci(): IterableIterator&amp;lt;number&amp;gt; { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } function print(n: number) { let i = 0; for (const fib of fibonacci()) { if (i++ === n) break; console.log(fib); } } // 피보나치 숫자의 첫 번째 10개 숫자를 출력합니다. print(10);&lt;/li&gt;
&lt;li&gt;map, slice, forEach 등과 같은 메소드를 연결함으로써 네이티브 배열을 비슷한 방법으로 iterable로 작업할 수 있게 하는 라이브러리가 있습니다. iterable의 발전된 조작의 사례를 위해 &lt;a href=&quot;https://www.npmjs.com/package/itiriri&quot;&gt;itiriri&lt;/a&gt;를 확인해주세요. (또는 비동기 iterable의 조작을 위해서 &lt;a href=&quot;https://www.npmjs.com/package/itiriri-async&quot;&gt;itiriri-async&lt;/a&gt;를 확인해주세요.)&lt;/li&gt;
&lt;li data-block-id=&quot;7-hp9r&quot;&gt;import itiriri from 'itiriri'; function* fibonacci(): IterableIterator&amp;lt;number&amp;gt; { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } itiriri(fibonacci()) .take(10) .forEach(fib =&amp;gt; console.log(fib));&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;mITD8iC8&quot; data-toc-id=&quot;mITD8iC8&quot; data-block-id=&quot;oJMIsH&quot;&gt;&lt;br /&gt;객체와 자료구조&lt;/h1&gt;
&lt;h2 id=&quot;6DKWE-LV&quot; data-toc-id=&quot;6DKWE-LV&quot; data-block-id=&quot;P-y9Po&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 vs 인터페이스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;1AN33n&quot; data-ke-size=&quot;size16&quot;&gt;합집합 또는 교집합이 필요할 때 타입을 사용하세요. extends 또는 implements가 필요할 때 인터페이스를 사용하세요. 엄격한 규칙은 없지만 당신에게 맞는 방법을 사용하세요.&lt;br /&gt;타입스크립트에서 type과 interface 사이의 다른 점에 대해서 더 상세한 설명을 원한다면 이 &lt;a href=&quot;https://stackoverflow.com/questions/37233735/typescript-interfaces-vs-types/54101543#54101543&quot;&gt;답변&lt;/a&gt;을 참고하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;7tKUg2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;iRSmlF&quot;&gt;interface EmailConfig { // ... } interface DbConfig { // ... } interface Config { // ... } //... type Shape = { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;JRkyKS&quot;&gt;type EmailConfig = { // ... } type DbConfig = { // ... } type Config = EmailConfig | DbConfig; // ... interface Shape { // ... } class Circle implements Shape { // ... } class Square implements Shape { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;nVXvrYL9&quot; data-toc-id=&quot;nVXvrYL9&quot; data-block-id=&quot;j0UxgM&quot;&gt;&lt;br /&gt;클래스&lt;/h1&gt;
&lt;h2 id=&quot;9nPVNFa1&quot; data-toc-id=&quot;9nPVNFa1&quot; data-block-id=&quot;gBHlpz&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클래스는 작아야 합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;ZwP7cw&quot; data-ke-size=&quot;size16&quot;&gt;클래스의 크기는 책임에 의해 측정됩니다. 단일 책임 원칙에 따르면 클래스는 작아야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EGvxii&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;1D4CFZ&quot;&gt;class Dashboard { getLanguage(): string { /* ... */ } setLanguage(language: string): void { /* ... */ } showProgress(): void { /* ... */ } hideProgress(): void { /* ... */ } isDirty(): boolean { /* ... */ } disable(): void { /* ... */ } enable(): void { /* ... */ } addSubscription(subscription: Subscription): void { /* ... */ } removeSubscription(subscription: Subscription): void { /* ... */ } addUser(user: User): void { /* ... */ } removeUser(user: User): void { /* ... */ } goToHomePage(): void { /* ... */ } updateProfile(details: UserDetails): void { /* ... */ } getVersion(): string { /* ... */ } // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;uM9AHG&quot;&gt;class Dashboard { disable(): void { /* ... */ } enable(): void { /* ... */ } getVersion(): string { /* ... */ } } // 다른 클래스에 남은 메소드를 이동시킴으로써 책임을 분산시키세요 // ...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;XilTej1z&quot; data-toc-id=&quot;XilTej1z&quot; data-block-id=&quot;a_g2x6&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;높은 응집도와 낮은 결합도&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;VhJKgY&quot; data-ke-size=&quot;size16&quot;&gt;응집도는 클래스 멤버가 서로에게 연관되어 있는 정도를 정의합니다. 이상적으로, 클래스 안의 모든 필드는 각 메소드에 의해 사용되어야 합니다. 그 때 우리는 클래스가 최대한으로 응집되어있다라고 말합니다. 이것은 항상 가능하지도 않고 권장하지 않습니다. 그러나 응집도를 높이는 것을 선호해야 합니다.&lt;br /&gt;결합도는 두 클래스가 얼마나 서로에게 관련되어있거나 종속적인 정도를 뜻합니다. 하나의 클래스의 변경이 다른 클래스에게 영향을 주지 않는다면 그 클래스들의 결합도는 낮다고 말합니다.&lt;br /&gt;좋은 소프트웨어 설계는 &lt;b&gt;높은 응집도&lt;/b&gt;와 &lt;b&gt;낮은 결합도&lt;/b&gt;를 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Uoad8p&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;YVyTO6&quot;&gt;class UserManager { // Bad: 각 private 변수는 메소드의 하나 혹은 또 다른 그룹에 의해 사용됩니다. // 클래스가 단일 책임 이상의 책임을 가지고 있다는 명백한 증거입니다. // 사용자의 트랜잭션을 얻기 위해 서비스를 생성하기만 하면 되는 경우, // 여전히 `emailSender` 인스턴스를 전달해야 합니다. constructor( private readonly db: Database, private readonly emailSender: EmailSender) { } async getUser(id: number): Promise&amp;lt;User&amp;gt; { return await db.users.findOne({ id }); } async getTransactions(userId: number): Promise&amp;lt;Transaction[]&amp;gt; { return await db.transactions.find({ userId }); } async sendGreeting(): Promise&amp;lt;void&amp;gt; { await emailSender.send('Welcome!'); } async sendNotification(text: string): Promise&amp;lt;void&amp;gt; { await emailSender.send(text); } async sendNewsletter(): Promise&amp;lt;void&amp;gt; { // ... } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;QzUMUk&quot;&gt;class UserService { constructor(private readonly db: Database) { } async getUser(id: number): Promise&amp;lt;User&amp;gt; { return await this.db.users.findOne({ id }); } async getTransactions(userId: number): Promise&amp;lt;Transaction[]&amp;gt; { return await this.db.transactions.find({ userId }); } } class UserNotifier { constructor(private readonly emailSender: EmailSender) { } async sendGreeting(): Promise&amp;lt;void&amp;gt; { await this.emailSender.send('Welcome!'); } async sendNotification(text: string): Promise&amp;lt;void&amp;gt; { await this.emailSender.send(text); } async sendNewsletter(): Promise&amp;lt;void&amp;gt; { // ... } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;AL4uKuQP&quot; data-toc-id=&quot;AL4uKuQP&quot; data-block-id=&quot;6EV2aW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상속(inheritance)보다 조합(composition)을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Z9pd7M&quot; data-ke-size=&quot;size16&quot;&gt;Gang of Four의 &lt;a href=&quot;https://en.wikipedia.org/wiki/Design_Patterns&quot;&gt;디자인 패턴&lt;/a&gt;에 나와있듯이 할 수 있는 대로 상속보다 조합을 사용해야 합니다. 상속과 조합을 사용해야 하는 좋은 이유들은 각각 많습니다. 이 교훈에서 중요한 점은 당신의 마음이 본능적으로 상속을 추구한다면, 조합이 당신의 문제를 더 좋게 해결할 수 있을지 고민해보라는 것입니다. 어떤 경우에는 더 좋을 수 있습니다.&lt;br /&gt;당신은 '언제 상속을 사용해야 할까요?' 라고 의문점을 가질 것입니다. 그것은 당면한 문제에 달려 있습니다. 조합보다 상속이 더 좋은 경우가 아래에 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;x3BXmT&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;'has-a' 관계가 아닌 'is-a' 관계일 때 (사람-&amp;gt;동물 vs 사용자-&amp;gt;사용자 정보)&lt;/li&gt;
&lt;li&gt;기반이 되는 클래스로부터 코드를 재사용할 수 있을 때 (사람은 모든 동물처럼 움직일 수 있습니다.)&lt;/li&gt;
&lt;li&gt;기반이 되는 클래스를 변경하여 파생된 클래스를 전체적으로 변경하려는 경우 (모든 동물은 움직일 때 칼로리가 소비됩니다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;w8KalW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;elv3HK&quot;&gt;class Employee { constructor( private readonly name: string, private readonly email: string) { } // ... } // `Employee`가 세금 데이터를 가지기 때문에 나쁜 에입니다. `EmployeeTaxData`는 `Employee`의 타입이 아닙니다. class EmployeeTaxData extends Employee { constructor( name: string, email: string, private readonly ssn: string, private readonly salary: number) { super(name, email); } // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;3noAda&quot;&gt;class Employee { private taxData: EmployeeTaxData; constructor( private readonly name: string, private readonly email: string) { } setTaxData(ssn: string, salary: number): Employee { this.taxData = new EmployeeTaxData(ssn, salary); return this; } // ... } class EmployeeTaxData { constructor( public readonly ssn: string, public readonly salary: number) { } // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;qfnr2bCo&quot; data-toc-id=&quot;qfnr2bCo&quot; data-block-id=&quot;_dG7E8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메소드 체이닝을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;DV4r64&quot; data-ke-size=&quot;size16&quot;&gt;이 패턴은 매우 유용하고 많은 라이브러리에서 공통적으로 사용하고 있습니다. 이것은 당신의 코드를 표현력이 있게 해주고 덜 장황하게 해줍니다. 이러한 이유로 메소드 체이닝을 사용해서 당신의 코드가 얼마나 명료해지는지 살펴보시길 바랍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SP4n8D&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;U4ds1L&quot;&gt;class QueryBuilder { private collection: string; private pageNumber: number = 1; private itemsPerPage: number = 100; private orderByFields: string[] = []; from(collection: string): void { this.collection = collection; } page(number: number, itemsPerPage: number = 100): void { this.pageNumber = number; this.itemsPerPage = itemsPerPage; } orderBy(...fields: string[]): void { this.orderByFields = fields; } build(): Query { // ... } } // ... const queryBuilder = new QueryBuilder(); queryBuilder.from('users'); queryBuilder.page(1, 100); queryBuilder.orderBy('firstName', 'lastName'); const query = queryBuilder.build();&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;j-YCfL&quot;&gt;class QueryBuilder { private collection: string; private pageNumber: number = 1; private itemsPerPage: number = 100; private orderByFields: string[] = []; from(collection: string): this { this.collection = collection; return this; } page(number: number, itemsPerPage: number = 100): this { this.pageNumber = number; this.itemsPerPage = itemsPerPage; return this; } orderBy(...fields: string[]): this { this.orderByFields = fields; return this; } build(): Query { // ... } } // ... const query = new QueryBuilder() .from('users') .page(1, 100) .orderBy('firstName', 'lastName') .build();&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;qWfeUxcr&quot; data-toc-id=&quot;qWfeUxcr&quot; data-block-id=&quot;3yE1DP&quot;&gt;인터페이스 &amp;amp; 타입&lt;/h1&gt;
&lt;h2 id=&quot;xP5Lg9vY&quot; data-toc-id=&quot;xP5Lg9vY&quot; data-block-id=&quot;jRI5d0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터페이스 (&lt;/b&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;QrRuqa&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;br /&gt;I를 접두어로 사용하지 않습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oN9LBC&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전에는 인터페이스 변수 앞에&amp;nbsp;I를 붙이는 경우가 많았는데 현재는 비관습적인 이유로 사용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;zh_93J&quot;&gt;&lt;code&gt;// Bad
interface IFoo {
}

// Good
interface Foo {
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;IZLn-14O&quot; data-toc-id=&quot;IZLn-14O&quot; data-block-id=&quot;5olrBY&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 (&lt;/b&gt;&lt;b&gt;Type&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Di831s&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;br /&gt;멤버는&amp;nbsp;camelCase를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;elm&quot; data-block-id=&quot;P3VDKF&quot;&gt;&lt;code&gt;// Bad
type car {
  ModelInfo: string;
}

// Good
type Car {
  modelInfo: string;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dlZWiMj8&quot; data-toc-id=&quot;dlZWiMj8&quot; data-block-id=&quot;OkCgZE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Type&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;2KHE-c&quot; data-ke-size=&quot;size16&quot;&gt;Union&lt;b&gt;이나&amp;nbsp;&lt;/b&gt;&lt;b&gt;Intersection&lt;/b&gt;&lt;b&gt;이 필요할 때 Type을 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot; data-block-id=&quot;SoXTvG&quot;&gt;&lt;code&gt;type Foo = number | { someProperty: number }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;GZ-Gl8&quot; data-ke-size=&quot;size16&quot;&gt;extends&amp;nbsp;&lt;b&gt;또는&amp;nbsp;&lt;/b&gt;&lt;b&gt;implements&lt;/b&gt;&lt;b&gt;를 사용하고 싶을 때는&amp;nbsp;&lt;/b&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;b&gt;를 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;V3iEH4&quot;&gt;&lt;code&gt;interface Foo {
  foo: string;
}

interface FooBar extends Foo {
  bar: string;
}

class X implements FooBar {
  foo: string;
  bar: string;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;Ae9oIRDE&quot; data-toc-id=&quot;Ae9oIRDE&quot; data-block-id=&quot;gH5OcK&quot;&gt;&lt;b&gt;네임스페이스 &amp;amp; ENUM&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;6J6rMCYc&quot; data-toc-id=&quot;6J6rMCYc&quot; data-block-id=&quot;vqySCT&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네임스페이스 (&lt;/b&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;rKzqXI&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hYsxtJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 팀에서 정한 약속입니다.&lt;/li&gt;
&lt;li&gt;네임스페이스들은 정적멤버를 갖는 클래스, 클래스 이름도&amp;nbsp;PascalCase를 사용하기 때문에 동일하게 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;il6naY&quot;&gt;&lt;code&gt;// Bad
namespace foo {
}

// Good
namespace Foo {
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;q0n40LvG&quot; data-toc-id=&quot;q0n40LvG&quot; data-block-id=&quot;vsx9VQ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Plbr_l&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;br /&gt;enum의 멤버에는&amp;nbsp;PascalCase를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VooH1T&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 팀에서 정한 약속입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;protobuf&quot; data-block-id=&quot;daHyxB&quot;&gt;&lt;code&gt;// Bad
enum color {
  red
}

// Good
enum Color {
  Red
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;CwuPyc2i&quot; data-toc-id=&quot;CwuPyc2i&quot; data-block-id=&quot;GuJ98z&quot;&gt;명확하지 않은 변수 타입&lt;/h1&gt;
&lt;h2 id=&quot;nXnV3Tpg&quot; data-toc-id=&quot;nXnV3Tpg&quot; data-block-id=&quot;OyG_qy&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;any&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;unknown&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uarkyx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;unknown&amp;nbsp;타입을 사용합니다.&lt;/li&gt;
&lt;li&gt;any,&amp;nbsp;unknown&amp;nbsp;타입 모두 아무때나 사용할 수 있지만&amp;nbsp;unknown&amp;nbsp;타입은 사용하는 쪽에서 방어처리를 해서 안전하게 사용이 가능합니다.&lt;/li&gt;
&lt;li&gt;any&amp;nbsp;타입은 타입스크립트를 쓰는 의미가 없게 되버릴 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gml&quot; data-block-id=&quot;B3erNp&quot;&gt;&lt;code&gt;const prettyPrint: string = (x: unknown) =&amp;gt; {
  if (Array.isArray(x)) {
    return '[' + x.map(prettyPrint).join(', ') + ']'
  }
  if (typeof x === 'string') {
    return `'${x}'`
  }
  if (typeof x === 'number') {
    return String(x)
  } 
  return 'etc.'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;KjjJW7&quot; data-ke-size=&quot;size16&quot;&gt;x를&amp;nbsp;any로 했을 경우&amp;nbsp;map(),&amp;nbsp;join()을 사용할 수 있는데&amp;nbsp;unknown일 때&amp;nbsp;x가 배열인 경우에만&amp;nbsp;map(),&amp;nbsp;join()을 사용할 수 있도록 강제해줍니다.&lt;/p&gt;
&lt;h2 id=&quot;cW2mQVQC&quot; data-toc-id=&quot;cW2mQVQC&quot; data-block-id=&quot;-9FFmw&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;undefined&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KY7IuD&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명백히 값이 없을 때에도 사용하지 않도록 합니다.&lt;/li&gt;
&lt;li&gt;타입스크립트에서&amp;nbsp;type으로 구조를 암시할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gml&quot; data-block-id=&quot;L3VxoV&quot;&gt;&lt;code&gt;// Bad
let foo = { x: 123, y: undefined }

// Good
let foo = { x: number, y?: number } = { x: 123 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;bUG5CY&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로&amp;nbsp;undefined를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;LABTdk&quot;&gt;&lt;code&gt;return undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;JF6Lhj&quot; data-ke-size=&quot;size16&quot;&gt;null이나&amp;nbsp;undefined&amp;nbsp;값을 갖는 객체는&amp;nbsp;truthy하게 검사합니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot; data-block-id=&quot;p3mPY8&quot;&gt;&lt;code&gt;// Bad
if (error === null)

// Good
if (error)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;ECLNVq&quot; data-ke-size=&quot;size16&quot;&gt;null이나&amp;nbsp;undefined를 체크할 때&amp;nbsp;===&amp;nbsp;혹은&amp;nbsp;!==를 사용하지 않고&amp;nbsp;==&amp;nbsp;혹은&amp;nbsp;!=를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;c38faC&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null이나&amp;nbsp;undefined에는 작동하지만 다른&amp;nbsp;fasly&amp;nbsp;값들 ('', 0,&amp;nbsp;false)에는 작동하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot; data-block-id=&quot;7CVtCe&quot;&gt;&lt;code&gt;// Bad
if (error !== null)

// Good
if (error != null)&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;STT6UR6l&quot; data-toc-id=&quot;STT6UR6l&quot; data-block-id=&quot;PeNb29&quot;&gt;SOLID&lt;/h1&gt;
&lt;h2 id=&quot;dn6-Czco&quot; data-toc-id=&quot;dn6-Czco&quot; data-block-id=&quot;e-8nWm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;단일 책임 원칙 (SRP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;KBu3Te&quot; data-ke-size=&quot;size16&quot;&gt;클린 코드에서 말하듯이, '클래스를 변경할 때는 단 한 가지 이유만 존재해야 합니다'. 여행갈 때 가방 하나에 많은 것을 챙기는 것과 같이, 클래스를 많은 기능으로 꽉 채우고 싶은 유혹이 있습니다. 이러한 문제는 당신의 클래스가 개념적으로 응집력이 있지 않으며 변경될 많은 이유가 존재한다는 것을 말합니다. 클래스를 변경하는 많은 시간을 줄이는 것은 중요합니다. 왜냐하면 너무 많은 기능이 한 클래스에 있고 그 안에서 하나의 기능을 수정한다면, 다른 종속된 모듈에 어떻게 영향을 줄지 이해하는 것이 어렵기 때문입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;u9y9I6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;D3f6tx&quot;&gt;class UserSettings { constructor(private readonly user: User) { } changeSettings(settings: UserSettings) { if (this.verifyCredentials()) { // ... } } verifyCredentials() { // ... } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;H0u_9v&quot;&gt;class UserAuth { constructor(private readonly user: User) { } verifyCredentials() { // ... } } class UserSettings { private readonly auth: UserAuth; constructor(private readonly user: User) { this.auth = new UserAuth(user); } changeSettings(settings: UserSettings) { if (this.auth.verifyCredentials()) { // ... } } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3u-ZPjUf&quot; data-toc-id=&quot;3u-ZPjUf&quot; data-block-id=&quot;-ZKbsO&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개방 폐쇄 원칙 (OCP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;PM1uHb&quot; data-ke-size=&quot;size16&quot;&gt;Bertrand Meyer가 말했듯이, '소프트웨어 엔터티(클래스, 모듈, 함수 등)는 상속에 개방되어 있습니다. 하지만 수정에는 폐쇄되어 있습니다.' 이것이 무엇을 의미할까요? 이 원칙은 기본적으로 기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 하는 것을 명시합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;XuCV6I&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;K90gvG&quot;&gt;class AjaxAdapter extends Adapter { constructor() { super(); } // ... } class NodeAdapter extends Adapter { constructor() { super(); } // ... } class HttpRequester { constructor(private readonly adapter: Adapter) { } async fetch&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { if (this.adapter instanceof AjaxAdapter) { const response = await makeAjaxCall&amp;lt;T&amp;gt;(url); // response 값을 변경하고 반환합니다. } else if (this.adapter instanceof NodeAdapter) { const response = await makeHttpCall&amp;lt;T&amp;gt;(url); // response 값을 변경하고 반환합니다. } } } function makeAjaxCall&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { // 서버에 요청하고 프로미스를 반환합니다. } function makeHttpCall&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { // 서버에 요청하고 프로미스를 반환합니다. }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;9fVSyO&quot;&gt;abstract class Adapter { abstract async request&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt;; // 하위 클래스와 공유하는 코드 ... } class AjaxAdapter extends Adapter { constructor() { super(); } async request&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt;{ // 서버에 요청하고 프로미스를 반환합니다. } // ... } class NodeAdapter extends Adapter { constructor() { super(); } async request&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt;{ // 서버에 요청하고 프로미스를 반환합니다. } // ... } class HttpRequester { constructor(private readonly adapter: Adapter) { } async fetch&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { const response = await this.adapter.request&amp;lt;T&amp;gt;(url); // response 값을 변경하고 반환합니다. } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tBdH_xK2&quot; data-toc-id=&quot;tBdH_xK2&quot; data-block-id=&quot;C-6GA7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;리스코프 치환 원칙 (LSP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;0pePQw&quot; data-ke-size=&quot;size16&quot;&gt;매우 단순한 개념을 뜻하는 어려워보이는 용어입니다. '만약 S가 T의 하위 타입이라면, T 타입의 객체는 S 타입의 객체로 대체될 수 있습니다. (예: S 타입 객체는 T 타입 객체로 치환될 수도 있습니다.) 이는 프로그램이 갖추어야할 속성(정확성, 수행되는 작업 등)을 변경하지 않아도 대체될 수 있습니다.' 더욱 어려워보이는 정의입니다.&lt;br /&gt;이를 위한 최고의 설명은 다음과 같습니다. 만약 부모 클래스와 자식 클래스가 있다면, 부모 클래스와 자식 클래스는 잘못된 결과 없이 서로 교환하여 사용될 수 있습니다. 여전히 혼란스러울 수 있습니다. 고전적인 정사각형-직사각형 예제를 살펴보세요. 수학적으로, 정사각형은 직사각형입니다. 그러나 상속을 통해 'is-a' 관계로 설계한다면, 당신은 곤경에 빠질 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;c60V5C&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;KSbU1F&quot;&gt;class Rectangle { constructor( protected width: number = 0, protected height: number = 0) { } setColor(color: string): this { // ... } render(area: number) { // ... } setWidth(width: number): this { this.width = width; return this; } setHeight(height: number): this { this.height = height; return this; } getArea(): number { return this.width * this.height; } } class Square extends Rectangle { setWidth(width: number): this { this.width = width; this.height = width; return this; } setHeight(height: number): this { this.width = height; this.height = height; return this; } } function renderLargeRectangles(rectangles: Rectangle[]) { rectangles.forEach((rectangle) =&amp;gt; { const area = rectangle .setWidth(4) .setHeight(5) .getArea(); // BAD: `Square` 클래스에서는 25를 반환합니다. 20이 반환되어야 합니다. rectangle.render(area); }); } const rectangles = [new Rectangle(), new Rectangle(), new Square()]; renderLargeRectangles(rectangles);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;VqvO7h&quot;&gt;abstract class Shape { setColor(color: string): this { // ... } render(area: number) { // ... } abstract getArea(): number; } class Rectangle extends Shape { constructor( private readonly width = 0, private readonly height = 0) { super(); } getArea(): number { return this.width * this.height; } } class Square extends Shape { constructor(private readonly length: number) { super(); } getArea(): number { return this.length * this.length; } } function renderLargeShapes(shapes: Shape[]) { shapes.forEach((shape) =&amp;gt; { const area = shape.getArea(); shape.render(area); }); } const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)]; renderLargeShapes(shapes);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;6xd6UTEm&quot; data-toc-id=&quot;6xd6UTEm&quot; data-block-id=&quot;2dmxqJ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터페이스 분리 원칙 (ISP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;dUn-5q&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스 분리 원칙은 '클라이언트는 사용하지 않는 인터페이스에 의존하지 않는다' 라는 것입니다. 이 원칙은 단일 책임 원칙과 많은 관련이 있습니다. 이 말의 뜻은 클라이언트가 노출된 메소드를 사용하는 대신에 전체 파이를 얻지 않는 방식으로 추상화를 설계해야 한다는 것입니다. 그것은 또한 클라이언트에게 클라이언트가 실제로 필요하지 않은 메소드의 구현을 강요하는 것도 포함합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5bnMvv&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;lDj02q&quot;&gt;interface SmartPrinter { print(); fax(); scan(); } class AllInOnePrinter implements SmartPrinter { print() { // ... } fax() { // ... } scan() { // ... } } class EconomicPrinter implements SmartPrinter { print() { // ... } fax() { throw new Error('Fax not supported.'); } scan() { throw new Error('Scan not supported.'); } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;asS-ol&quot;&gt;interface Printer { print(); } interface Fax { fax(); } interface Scanner { scan(); } class AllInOnePrinter implements Printer, Fax, Scanner { print() { // ... } fax() { // ... } scan() { // ... } } class EconomicPrinter implements Printer { print() { // ... } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hSsfqciT&quot; data-toc-id=&quot;hSsfqciT&quot; data-block-id=&quot;EW3fer&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의존성 역전 원칙 (DIP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;ULNYmI&quot; data-ke-size=&quot;size16&quot;&gt;이 원칙은 두 가지 필수적인 사항을 명시합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;a7-Mc0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상위 레벨의 모듈은 하위 레벨의 모듈에 의존하지 않아야 합니다. 두 모듈은 모두 추상화에 의존해야합니다.&lt;/li&gt;
&lt;li&gt;추상화는 세부사항에 의존하지 않아야 합니다. 세부사항은 추상화에 의존해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-block-id=&quot;OuvnBg&quot; data-ke-size=&quot;size16&quot;&gt;처음에 바로 이해하기는 어려울 수 있습니다. Angular를 사용해봤다면, 의존성 주입(DI)의 형태 안에서 이 원칙의 구현을 확인해봤을 것입니다. 동일한 개념은 아니지만, DIP는 상위 레벨의 모듈이 하위 레벨의 모듈의 세부사항에 접근하고 설정하지 못하도록 지킵니다. DI를 통해서도 마찬가지로 성취할 수 있습니다. 이것의 큰 장점은 모듈 사이의 결합도를 줄일 수 있다는 것입니다. 결합도는 코드를 리팩토링하기 어렵게 하기 때문에 매우 나쁜 개발 패턴입니다.&lt;br /&gt;DIP는 주로 IoC 컨테이너를 사용함으로써 달성됩니다. 타입스크립트를 위한 강력한 IoC 컨테이너의 예제는 &lt;a href=&quot;https://www.npmjs.com/package/inversify&quot;&gt;InversifyJs&lt;/a&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ZViXuT&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;b23Fr7&quot;&gt;import { readFile as readFileCb } from 'fs'; import { promisify } from 'util'; const readFile = promisify(readFileCb); type ReportData = { // .. } class XmlFormatter { parse&amp;lt;T&amp;gt;(content: string): T { // XML 문자열을 T 객체로 변환 } } class ReportReader { // BAD: 특정 요청의 구현에 의존하는 것을 만들었습니다. // `parse` 메소드에 의존하는 `ReportReader`를 만들어야 합니다. private readonly formatter = new XmlFormatter(); async read(path: string): Promise&amp;lt;ReportData&amp;gt; { const text = await readFile(path, 'UTF8'); return this.formatter.parse&amp;lt;ReportData&amp;gt;(text); } } // ... const reader = new ReportReader(); await report = await reader.read('report.xml');&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;6WfOj_&quot;&gt;import { readFile as readFileCb } from 'fs'; import { promisify } from 'util'; const readFile = promisify(readFileCb); type ReportData = { // .. } interface Formatter { parse&amp;lt;T&amp;gt;(content: string): T; } class XmlFormatter implements Formatter { parse&amp;lt;T&amp;gt;(content: string): T { // XML 문자열을 T 객체로 변환 } } class JsonFormatter implements Formatter { parse&amp;lt;T&amp;gt;(content: string): T { // JSON 문자열을 T 객체로 변환 } } class ReportReader { constructor(private readonly formatter: Formatter) { } async read(path: string): Promise&amp;lt;ReportData&amp;gt; { const text = await readFile(path, 'UTF8'); return this.formatter.parse&amp;lt;ReportData&amp;gt;(text); } } // ... const reader = new ReportReader(new XmlFormatter()); await report = await reader.read('report.xml'); // 또는 json 보고서가 필요한 경우 const reader = new ReportReader(new JsonFormatter()); await report = await reader.read('report.json');&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;Upe64Grr&quot; data-toc-id=&quot;Upe64Grr&quot; data-block-id=&quot;sbuUJ0&quot;&gt;&lt;br /&gt;TEST&lt;/h1&gt;
&lt;h2 id=&quot;4GgWEMYs&quot; data-toc-id=&quot;4GgWEMYs&quot; data-block-id=&quot;7OBdWp&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Ghqxao&quot; data-ke-size=&quot;size16&quot;&gt;테스트는 배포보다 중요합니다. 테스트가 없거나 부족한 경우, 코드를 배포할 때마다 당신은 어떤 것이 작동하지 않을지 확실하지 않을 것입니다. 적절한 양의 테스트를 구성하는 것은 당신의 팀에게 달려있지만, (모든 문장과 브랜치에서) 100%의 커버리지를 가진다면 매우 높은 자신감과 마음의 평화를 얻을 것입니다. 이는 훌륭한 테스트 프레임워크뿐만 아니라, 좋은 &lt;a href=&quot;https://github.com/gotwarlost/istanbul&quot;&gt;커버리지 도구&lt;/a&gt;를 사용해야 한다는 것을 의미합니다.&lt;br /&gt;테스트를 작성하지 않을 이유는 없습니다. 타입스크립트의 타입을 지원하는 &lt;a href=&quot;http://jstherightway.org/#testing-tools&quot;&gt;많은 양의 좋은 자바스크립트 테스트 프레임워크&lt;/a&gt;가 있으므로 당신의 팀이 선호하는 것을 찾아 사용하세요. 당신의 팀에 적합한 테스트 프레임워크를 찾았다면, 당신이 만드는 모든 새로운 기능/모듈을 위한 테스트를 항상 작성하는 것을 목표로 하세요. 테스트 기반 개발(TDD)이 당신이 선호하는 방법이라면, 매우 좋습니다. 하지만 중요한 건 어떤 기능을 만들거나 기존의 것을 리팩토링하기 전에 목표하는 커버리지를 달성하는 것입니다.&lt;/p&gt;
&lt;h2 id=&quot;Hjo7vsxb&quot; data-toc-id=&quot;Hjo7vsxb&quot; data-block-id=&quot;V7120u&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TDD의 세 가지 법칙&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;py-LUS&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실패하는 단위 테스트를 작성하기 전에는 실제 코드를 작성하지 마세요.&lt;/li&gt;
&lt;li&gt;컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성하세요.&lt;/li&gt;
&lt;li&gt;실패하는 단위 테스트를 통과할 정도로만 실제 코드를 작성하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;Em3xV9S0&quot; data-toc-id=&quot;Em3xV9S0&quot; data-block-id=&quot;muvEm2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;F.I.R.S.T 규칙&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;K79ETV&quot; data-ke-size=&quot;size16&quot;&gt;명료한 테스트는 다음 규칙을 따라야 합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;E8PBZm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Fast&lt;/b&gt; 테스트는 빈번하게 실행되므로 빨라야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Independent&lt;/b&gt; 테스트는 서로 종속적이지 않습니다. 독립적으로 실행하든지 순서 상관없이 모두 실행하든지 동일한 결과가 나와야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Repeatable&lt;/b&gt; 테스트는 어떤 환경에서든 반복될 수 있습니다. 테스트가 실패하는데에 이유가 없어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Self-Validating&lt;/b&gt; 테스트는 통과 혹은 실패로 답해야 합니다. 테스트가 통과되었다면 로그 파일을 보며 비교할 필요는 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Timely&lt;/b&gt; 단위 테스트는 실제 코드를 작성하기 전에 작성해야 합니다. 실제 코드를 작성한 후에 테스트를 작성한다면, 테스트를 작성하는 것이 너무 고단하게 느껴질 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;qwjUDMzP&quot; data-toc-id=&quot;qwjUDMzP&quot; data-block-id=&quot;EmfxiI&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테스트 하나에 하나의 개념을 작성하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;sZadf_&quot; data-ke-size=&quot;size16&quot;&gt;또한, 테스트는 단일 책임 원칙을 따라야 합니다. 단위 테스트 하나당 하나의 assert 구문을 작성하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KA_rh8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;3Y3gLY&quot;&gt;import { assert } from 'chai'; describe('AwesomeDate', () =&amp;gt; { it('handles date boundaries', () =&amp;gt; { let date: AwesomeDate; date = new AwesomeDate('1/1/2015'); assert.equal('1/31/2015', date.addDays(30)); date = new AwesomeDate('2/1/2016'); assert.equal('2/29/2016', date.addDays(28)); date = new AwesomeDate('2/1/2015'); assert.equal('3/1/2015', date.addDays(28)); }); });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;cogI3u&quot;&gt;import { assert } from 'chai'; describe('AwesomeDate', () =&amp;gt; { it('handles 30-day months', () =&amp;gt; { const date = new AwesomeDate('1/1/2015'); assert.equal('1/31/2015', date.addDays(30)); }); it('handles leap year', () =&amp;gt; { const date = new AwesomeDate('2/1/2016'); assert.equal('2/29/2016', date.addDays(28)); }); it('handles non-leap year', () =&amp;gt; { const date = new AwesomeDate('2/1/2015'); assert.equal('3/1/2015', date.addDays(28)); }); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;c8In7FuG&quot; data-toc-id=&quot;c8In7FuG&quot; data-block-id=&quot;edvtef&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테스트의 이름은 테스트의 의도가 드러나야 합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;tir1pd&quot; data-ke-size=&quot;size16&quot;&gt;테스트가 실패할 때, 테스트의 이름은 어떤 것이 잘못되었는지 볼 수 있는 첫 번째 표시입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;C-slFM&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;xqL_g5&quot;&gt;describe('Calendar', () =&amp;gt; { it('2/29/2020', () =&amp;gt; { // ... }); it('throws', () =&amp;gt; { // ... }); });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Tes196&quot;&gt;describe('Calendar', () =&amp;gt; { it('should handle leap year', () =&amp;gt; { // ... }); it('should throw when format is invalid', () =&amp;gt; { // ... }); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;7mwp8oo-&quot; data-toc-id=&quot;7mwp8oo-&quot; data-block-id=&quot;SIHmFK&quot;&gt;&lt;br /&gt;동시성&lt;/h1&gt;
&lt;h2 id=&quot;ovAMhO1j&quot; data-toc-id=&quot;ovAMhO1j&quot; data-block-id=&quot;pYuN1l&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로미스 vs 콜백&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;TYJNKY&quot; data-ke-size=&quot;size16&quot;&gt;콜백은 명료하지 않고, 지나친 양의 중첩된 콜백 지옥을 유발할 수 있습니다.&lt;br /&gt;콜백 방식을 사용하고 있는 기존의 함수를 프로미스를 반환하는 함수로 변환시켜주는 유틸리티 라이브러리가 있습니다. (Node.js를 사용한다면 &lt;a href=&quot;https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original&quot;&gt;util.promisify&lt;/a&gt;를 확인해주세요. 일반적인 목적이라면 &lt;a href=&quot;https://www.npmjs.com/package/pify&quot;&gt;pify&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/es6-promisify&quot;&gt;es6-promisify&lt;/a&gt;를 확인해주세요.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MEyTO8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;SOhx-_&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; function downloadPage(url: string, saveTo: string, callback: (error: Error, content?: string) =&amp;gt; void) { get(url, (error, response) =&amp;gt; { if (error) { callback(error); } else { writeFile(saveTo, response.body, (error) =&amp;gt; { if (error) { callback(error); } else { callback(null, response.body); } }); } }); } downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html', (error, content) =&amp;gt; { if (error) { console.error(error); } else { console.log(content); } });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;JUg_9D&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; import { promisify } from 'util'; const write = promisify(writeFile); function downloadPage(url: string, saveTo: string): Promise { return get(url) .then(response =&amp;gt; write(saveTo, response)); } downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html') .then(content =&amp;gt; console.log(content)) .catch(error =&amp;gt; console.error(error));&lt;/li&gt;
&lt;li&gt;프로미스는 코드를 더욱 간결하게 해주는 몇몇의 헬퍼 메소드를 지원합니다:패턴설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;ZoFcmR&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.resolve(value)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;해결(resolve)된 프로미스로 값을 변환함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.reject(error)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;거부(reject)된 프로미스로 에러를 변환함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.all(promises)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;전달된 모든 프로미스가 이행한 값의 배열을 이행하는 새 프로미스 객체를 반환하거나 거부된 첫 번째 프로미스의 이유로 거부함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.race(promises)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;전달된 프로미스의 배열에서 가장 먼저 완료된 결과/에러로 이행/거부된 새 프로미스 객체를 반환함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
Promise.all는 병렬적으로 작업을 수행할 필요가 있을 때 유용합니다. Promise.race는 프로미스를 위한 타임아웃과 같은 것을 구현하는 것을 쉽게 할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dLwPPsKJ&quot; data-toc-id=&quot;dLwPPsKJ&quot; data-block-id=&quot;0eofgk&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로미스보다 &lt;/b&gt;&lt;b&gt;async&lt;/b&gt;&lt;b&gt;/&lt;/b&gt;&lt;b&gt;await&lt;/b&gt;&lt;b&gt;가 더 명료합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;UbD70s&quot; data-ke-size=&quot;size16&quot;&gt;async/await 구문을 사용하면 연결된 프로미스 구문보다 훨씬 더 명료하고 이해하기 쉬운 코드를 작성할 수 있습니다. async키워드가 앞에 붙여진 함수는 await 키워드에서 코드의 실행을 멈춘다는 것을 자바스크립트 런타임에게 알려줍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;kPg88P&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;lBvNO-&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; import { promisify } from 'util'; const write = util.promisify(writeFile); function downloadPage(url: string, saveTo: string): Promise { return get(url).then(response =&amp;gt; write(saveTo, response)); } downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html') .then(content =&amp;gt; console.log(content)) .catch(error =&amp;gt; console.error(error));&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;9Oup1-&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; import { promisify } from 'util'; const write = promisify(writeFile); async function downloadPage(url: string, saveTo: string): Promise { const response = await get(url); await write(saveTo, response); return response; } // somewhere in an async function try { const content = await downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html'); console.log(content); } catch (error) { console.error(error); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;ELuxpg_x&quot; data-toc-id=&quot;ELuxpg_x&quot; data-block-id=&quot;CHxMtd&quot;&gt;&lt;br /&gt;에러처리&lt;/h1&gt;
&lt;h2 id=&quot;EAwbfOc4&quot; data-toc-id=&quot;EAwbfOc4&quot; data-block-id=&quot;efFz7d&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;WFlCAi&quot; data-ke-size=&quot;size16&quot;&gt;에러를 던지는 것은 좋은 것입니다! 에러를 던진다는 것은 런타임이 당신의 프로그램에서 뭔가 잘못되었을 때 식별하고 현재 스택에서 함수 실행을 멈추고, (노드에서) 프로세스를 종료하며, 스택 트레이스를 콘솔에 보여줌으로써 당신에게 해당 에러를 알려주는 것을 의미합니다.&lt;/p&gt;
&lt;h2 id=&quot;s33MT67I&quot; data-toc-id=&quot;s33MT67I&quot; data-block-id=&quot;d3jySZ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;catch&lt;/b&gt;&lt;b&gt; 절에서 에러 처리 부분을 비워두지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;F9O3eL&quot; data-ke-size=&quot;size16&quot;&gt;catch 절에서 단지 에러를 받는 것만으로는 해당 에러에 대응할 수 없습니다. 또한, 콘솔에 에러를 기록하는 것(console.log)은 콘솔에 출력된 많은 것들 사이에서 발견되지 못할 수 있기 때문에 그다지 좋은 선택은 아닙니다. 당신이 어떤 코드를 try/catch로 감쌌다면, 그 코드에서 에러가 일어날 수 있으며, 즉 에러가 발생했을 때에 대한 계획이나 장치가 있어야 한다는 것을 의미합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;1n40M4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;eFmWh1&quot;&gt;try { functionThatMightThrow(); } catch (error) { console.log(error); } // 아래 예제는 훨씬 나쁩니다. try { functionThatMightThrow(); } catch (error) { // 에러를 무시 }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;ez5JH6&quot;&gt;import { logger } from './logging' try { functionThatMightThrow(); } catch (error) { logger.log(error); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;d2wpb5RO&quot; data-toc-id=&quot;d2wpb5RO&quot; data-block-id=&quot;T6b3Nr&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요청이 거부된 프로미스 객체를 무시하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;jSJxl5&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 try/catch 절에서 받은 에러 처리 부분을 비워두면 안됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;G8EtV3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;tfuqBl&quot;&gt;getUser() .then((user: User) =&amp;gt; { return sendEmail(user.email, 'Welcome!'); }) .catch((error) =&amp;gt; { console.log(error); });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;X72MKm&quot;&gt;import { logger } from './logging' getUser() .then((user: User) =&amp;gt; { return sendEmail(user.email, 'Welcome!'); }) .catch((error) =&amp;gt; { logger.log(error); }); // 또는 async/await 구문을 사용할 수 있습니다: try { const user = await getUser(); await sendEmail(user.email, 'Welcome!'); } catch (error) { logger.log(error); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;uFh7cIWV&quot; data-toc-id=&quot;uFh7cIWV&quot; data-block-id=&quot;Rnt2Zj&quot;&gt;&lt;br /&gt;서식&lt;/h1&gt;
&lt;h2 id=&quot;RAEzVDiG&quot; data-toc-id=&quot;RAEzVDiG&quot; data-block-id=&quot;auRycR&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;m3gQDi&quot; data-ke-size=&quot;size16&quot;&gt;서식은 주관적입니다. 여기에 있는 많은 규칙들과 같이 당신이 따르기 어려운 규칙은 없습니다. 중요한 점은 서식에 대해서 논쟁하지 않는 것입니다. 서식을 자동화하기 위한 도구들이 매우 많습니다. 그 중 하나를 사용하세요! 서식에 대해 논쟁하는 것은 엔지니어에게 시간과 돈 낭비일 뿐입니다. 따라야하는 일반적인 규칙은 일관적인 서식 규칙을 지켜야하는 것입니다.&lt;br /&gt;&lt;a href=&quot;https://palantir.github.io/tslint/&quot;&gt;TSLint&lt;/a&gt;라고 불리는 타입스크립트를 위한 강력한 도구가 있습니다. 이것은 코드의 가독성과 유지보수성을 극적으로 개선시키도록 도와주는 정적 분석 도구입니다. 프로젝트에 참고할 수 있는 TSLint 설정을 사용할 준비가 되었습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;iELpGl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-standard&quot;&gt;TSLint Config Standard&lt;/a&gt; - 표준 스타일 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-airbnb&quot;&gt;TSLint Config Airbnb&lt;/a&gt; - 에어비엔비 스타일 가이드&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-clean-code&quot;&gt;TSLint Clean Code&lt;/a&gt; - &lt;a href=&quot;https://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882&quot;&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt;에 영감 받은 TSLint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-react&quot;&gt;TSLint react&lt;/a&gt; - React &amp;amp; JSX와 관련된 lint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-prettier&quot;&gt;TSLint + Prettier&lt;/a&gt; - &lt;a href=&quot;https://github.com/prettier/prettier&quot;&gt;Prettier&lt;/a&gt; 코드 포맷터를 위한 lint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-eslint-rules&quot;&gt;ESLint rules for TSLint&lt;/a&gt; - 타입스크립트를 위한 ESLint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-immutable&quot;&gt;Immutable&lt;/a&gt; - 타입스크립트에서 변경을 허락하지 않는 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;n2QcPZ&quot; data-ke-size=&quot;size16&quot;&gt;또한, 훌륭한 자료인 &lt;a href=&quot;https://basarat.gitbook.io/typescript/styleguide&quot;&gt;타입스크립트 스타일 가이드와 코딩 컨벤션&lt;/a&gt;을 참고해주세요.&lt;/p&gt;
&lt;blockquote data-block-id=&quot;cfztys&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-block-id=&quot;kS4BLe&quot; data-ke-size=&quot;size16&quot;&gt;TSLint는 deprecated되었습니다. &lt;a href=&quot;https://github.com/palantir/tslint/issues/4534&quot;&gt;Roadmap: TSLint -&amp;gt; ESLint&lt;/a&gt; 이슈를 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;a2EtVjP7&quot; data-toc-id=&quot;a2EtVjP7&quot; data-block-id=&quot;kD-aeJ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;일관적으로 대소문자를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;nCIbao&quot; data-ke-size=&quot;size16&quot;&gt;대소문자를 구분하여 작성하는 것은 당신에게 변수, 함수 등에 대해서 많은 것을 알려줍니다. 이 규칙은 주관적이어서, 당신의 팀이 원하는 것을 선택해야 합니다. 중요한 점은 어떤 걸 선택하였든지 간에 일관적이어야 한다는 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;og-kXm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;lsFhdY&quot;&gt;const DAYS_IN_WEEK = 7; const daysInMonth = 30; const songs = ['Back In Black', 'Stairway to Heaven', 'Hey Jude']; const Artists = ['ACDC', 'Led Zeppelin', 'The Beatles']; function eraseDatabase() {} function restore_database() {} type animal = { /* ... */ } type Container = { /* ... */ }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;zMNwVh&quot;&gt;const DAYS_IN_WEEK = 7; const DAYS_IN_MONTH = 30; const SONGS = ['Back In Black', 'Stairway to Heaven', 'Hey Jude']; const ARTISTS = ['ACDC', 'Led Zeppelin', 'The Beatles']; function eraseDatabase() {} function restoreDatabase() {} type Animal = { /* ... */ } type Container = { /* ... */ }&lt;/li&gt;
&lt;li&gt;클래스, 인터페이스, 타입 그리고 네임스페이스 이름에는 PascalCase를 사용하세요.&lt;/li&gt;
&lt;li&gt;변수, 함수 그리고 클래스 멤버 이름에는 camelCase를 사용하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bxgDFlJA&quot; data-toc-id=&quot;bxgDFlJA&quot; data-block-id=&quot;pOXzn0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;import 구문을 특정 순서대로 정리하세요(ESLint)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;yHUIxV&quot; data-ke-size=&quot;size16&quot;&gt;import 구문을 읽기 쉽고 명료하게 하면 당신은 현재 코드의 의존성을 빠르게 확인할 수 있습니다. 다음과 같은 import 구문 정리를 위한 좋은 방법들을 적용해보세요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;V0IpmO&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import 구문은 알파벳 순서대로 배열하고 그룹화해야 합니다.&lt;/li&gt;
&lt;li&gt;사용하지 않은 import 구문은 제거되어야 합니다.&lt;/li&gt;
&lt;li&gt;이름이 있는 import 구문은 알파벳 순서대로 배열해야 합니다. (예: import {A, B, C} from 'foo';)&lt;/li&gt;
&lt;li&gt;import 하는 소스코드는 그룹 내에서 알파벳 순서대로 배열해야 합니다. (예: import as foo from 'a'; import as bar from 'b';)&lt;/li&gt;
&lt;li&gt;import 구문의 그룹은 빈 줄로 구분되어야 합니다.&lt;/li&gt;
&lt;li&gt;그룹은 다음 순서를 준수해야 합니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5EXuGa&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폴리필 (예: import 'reflect-metadata';)&lt;/li&gt;
&lt;li&gt;Node 내장 모듈 (예: import fs from 'fs';)&lt;/li&gt;
&lt;li&gt;외부 모듈 (예: import { query } from 'itiriri';)&lt;/li&gt;
&lt;li&gt;내부 모듈 (예: import { UserService } from 'src/services/userService';)&lt;/li&gt;
&lt;li&gt;상위 디렉토리에서 불러오는 모듈 (예: import foo from '../foo'; import qux from '../../foo/qux';)&lt;/li&gt;
&lt;li&gt;동일한 계층의 디렉토리에서 불러오는 모듈 (예: import bar from './bar'; import baz from './bar/baz';)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;wbvfu1&quot;&gt;import { TypeDefinition } from '../types/typeDefinition'; import { AttributeTypes } from '../model/attribute'; import { ApiCredentials, Adapters } from './common/api/authorization'; import fs from 'fs'; import { ConfigPlugin } from './plugins/config/configPlugin'; import { BindingScopeEnum, Container } from 'inversify'; import 'reflect-metadata';&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;I-g45C&quot;&gt;import 'reflect-metadata'; import fs from 'fs'; import { BindingScopeEnum, Container } from 'inversify'; import { AttributeTypes } from '../model/attribute'; import { TypeDefinition } from '../types/typeDefinition'; import { ApiCredentials, Adapters } from './common/api/authorization'; import { ConfigPlugin } from './plugins/config/configPlugin';&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;eqeRA48P&quot; data-toc-id=&quot;eqeRA48P&quot; data-block-id=&quot;9RPc4Z&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입스크립트 앨리어스를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;6_zoU9&quot; data-ke-size=&quot;size16&quot;&gt;tsconfig.json의 compilerOptions 섹션 안에서 paths와 baseUrl 속성을 정의해 더 보기 좋은 import 구문을 작성해주세요.&lt;br /&gt;이 방법은 import 구문을 사용할 때 긴 상대경로를 작성하는 것을 피하게 도와줄 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VpMUHg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;5yaT4_&quot;&gt;import { UserService } from '../../../services/UserService';&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;
&lt;pre class=&quot;prolog&quot; data-block-id=&quot;XbbL7l&quot;&gt;&lt;code&gt;// tsconfig.json
...
  'compilerOptions': {
    ...
    'baseUrl': 'src',
    'paths': {
      '@services': ['services/*']
    }
    ...
  }
...&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;W3onGd&quot;&gt;import { UserService } from '@services/UserService';&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;Qg_uZnaA&quot; data-toc-id=&quot;Qg_uZnaA&quot; data-block-id=&quot;ImvIcH&quot;&gt;&lt;br /&gt;주석&lt;/h1&gt;
&lt;h2 id=&quot;9homR6O3&quot; data-toc-id=&quot;9homR6O3&quot; data-block-id=&quot;Aa-kk0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;당신의 코드를 주석 처리하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Z8Gq0q&quot; data-ke-size=&quot;size16&quot;&gt;버전 관리 시스템이 존재하는 이유입니다. 사용하지 않는 코드는 기록에 남기세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5QjA2r&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;qb6NF-&quot;&gt;type User = { name: string; email: string; // age: number; // jobPosition: string; }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;PB6E32&quot;&gt;type User = { name: string; email: string; }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;6ibiMcek&quot; data-toc-id=&quot;6ibiMcek&quot; data-block-id=&quot;O5if0F&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;일기 같은 주석을 달지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;DbkKPF&quot; data-ke-size=&quot;size16&quot;&gt;버전 관리 시스템을 사용하세요! 죽은 코드, 주석 처리된 코드, 특히 일기 같은 주석은 필요 없습니다. 대신에 기록을 보기 위해 git log 명령어를 사용하세요!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;6NbJIW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;V9HdDt&quot;&gt;/** * 2016-12-20: 이해하지 못해서 모나드를 제거함 (RM) * 2016-10-01: 특별한 모나드를 사용해 개선함 (JP) * 2016-02-03: 타입 체킹 추가함 (LI) * 2015-03-14: combine 함수를 구현함 (JR) */ function combine(a: number, b: number): number { return a + b; }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;yWSF5c&quot;&gt;function combine(a: number, b: number): number { return a + b; }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;NfpVUfXN&quot; data-toc-id=&quot;NfpVUfXN&quot; data-block-id=&quot;iOFxWF&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드의 위치를 설명하는 주석을 사용하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;hD-k7z&quot; data-ke-size=&quot;size16&quot;&gt;이건 보통 코드를 어지럽히기만 합니다. 함수와 변수 이름을 적절한 들여쓰기와 서식으로 당신의 코드에 시각적인 구조가 보이도록 하세요.&lt;br /&gt;대부분의 IDE(통합 개발 환경)에서는 코드 블록을 접기/펼치기 할 수 있는 기능을 지원합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dS1glu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;UCQBRY&quot;&gt;//////////////////////////////////////////////////////////////////////////////// // Client 클래스 //////////////////////////////////////////////////////////////////////////////// class Client { id: number; name: string; address: Address; contact: Contact; //////////////////////////////////////////////////////////////////////////////// // public 메소드 //////////////////////////////////////////////////////////////////////////////// public describe(): string { // ... } //////////////////////////////////////////////////////////////////////////////// // private 메소드 //////////////////////////////////////////////////////////////////////////////// private describeAddress(): string { // ... } private describeContact(): string { // ... } };&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;wfySui&quot;&gt;class Client { id: number; name: string; address: Address; contact: Contact; public describe(): string { // ... } private describeAddress(): string { // ... } private describeContact(): string { // ... } };&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;peQGOhZg&quot; data-toc-id=&quot;peQGOhZg&quot; data-block-id=&quot;gZKWR1&quot;&gt;&lt;b&gt;TODO 주석&lt;/b&gt;&lt;/h1&gt;
&lt;p data-block-id=&quot;3nuwFT&quot; data-ke-size=&quot;size16&quot;&gt;추후에 개선을 위해 코드에 메모를 남겨야할 때, // TODO 주석을 사용하세요. 대부분의 IDE는 이런 종류의 주석을 특별하게 지원하기 때문에 해야할 일 목록을 빠르게 검토할 수 있습니다.&lt;br /&gt;하지만 TODO 주석이 나쁜 코드를 작성할 이유는 아니라는 것을 명심하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hgfC3n&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;5y2YdR&quot;&gt;function getActiveSubscriptions(): Promise&amp;lt;Subscription[]&amp;gt; { // ensure `dueDate` is indexed. return db.subscriptions.find({ dueDate: { $lte: new Date() } }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;19uWxL&quot;&gt;function getActiveSubscriptions(): Promise&amp;lt;Subscription[]&amp;gt; { // TODO: ensure `dueDate` is indexed. return db.subscriptions.find({ dueDate: { $lte: new Date() } }); }&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;0Zsp3M&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;iKRYetZg&quot; data-toc-id=&quot;iKRYetZg&quot; data-block-id=&quot;CpZfVZ&quot;&gt;참고&lt;/h1&gt;
&lt;p data-block-id=&quot;EVj3Ax&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/tsguide.html&quot;&gt;https://google.github.io/styleguide/tsguide.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;loivRh&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/tsguide.html#source-file-basics&quot;&gt;https://google.github.io/styleguide/tsguide.html#source-file-basics&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;KFG97r&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://paullabworkspace.notion.site/8a6058561b924c0c95eb3933e480b367&quot;&gt;https://paullabworkspace.notion.site/8a6058561b924c0c95eb3933e480b367&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;e9hLNX&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://radlohead.gitbook.io/typescript-deep-dive/styleguide&quot;&gt;https://radlohead.gitbook.io/typescript-deep-dive/styleguide&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;Pyjc5B&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://techblog.woowahan.com/9804/&quot;&gt;https://techblog.woowahan.com/9804/&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;hJA7To&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://738.github.io/clean-code-typescript/&quot;&gt;https://738.github.io/clean-code-typescript/&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;hqhWot&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/tipjs/javascript-style-guide&quot;&gt;https://github.com/tipjs/javascript-style-guide&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;H10iAB&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@cada/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%BD%94%EB%94%A9-%EB%B0%8F-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%BB%A8%EB%B2%A4%EC%85%98-1%ED%8E%B8&quot;&gt;https://velog.io/@cada/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%BD%94%EB%94%A9-%EB%B0%8F-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%BB%A8%EB%B2%A4%EC%85%98-1%ED%8E%B8&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/450</guid>
      <comments>https://gregorio78.tistory.com/450#entry450comment</comments>
      <pubDate>Mon, 16 Mar 2026 18:36:13 +0900</pubDate>
    </item>
    <item>
      <title>SQL Conventions</title>
      <link>https://gregorio78.tistory.com/449</link>
      <description>&lt;h1 id=&quot;Llk6vtnq&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;Llk6vtnq&quot; data-block-id=&quot;Tcgx8_&quot;&gt;1.개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 가이드는 개발 단계에서 개발표준과 최적화에 고려해야 할 사항에 초점을 맞추어 내용을 기술 하였습니다.기준이 되는 데이터베이스는 MySQL로 제한하였으나 명명규칙등 일반적인 사항은 데이터베이스 시스템에 종속&amp;nbsp;되지 않으므로 본 가이드를 적용할 수 있습니다.본 문서는 아래와 같은 구조로 되어 있습니다.&lt;/p&gt;
&lt;h1 id=&quot;DpItj8S9&quot; data-toc-id=&quot;DpItj8S9&quot; data-block-id=&quot;Sc8c5S&quot;&gt;2. SQL 공통 표준&lt;/h1&gt;
&lt;h2 id=&quot;frcAr4Wr&quot; data-toc-id=&quot;frcAr4Wr&quot; data-block-id=&quot;U_tV_5&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1. SQL 명명규칙(Naming Convention)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;WKmUvMV1&quot; data-toc-id=&quot;WKmUvMV1&quot; data-block-id=&quot;3w-f67&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.1. ID 길이&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;QHipuZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RG-Saa&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID의 길이는 18바이트를 넘지 않도록 작성한다.&lt;/li&gt;
&lt;li&gt;지나치게 짧은 ID는 원래 의미를 상실하기 쉬우며 가독성을 떨어뜨린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;lfl1Y0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 DBMS별로 최대허용길이가 다르지만 공통으로 사용할 수 있는 길이는 18바이트이다.&lt;/li&gt;
&lt;li&gt;길이가 길 경우 DBMS간의 이식성을 떨어뜨리게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;58O8mwPh&quot; data-toc-id=&quot;58O8mwPh&quot; data-block-id=&quot;Qdjlf9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.2. ID 구성문자&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EI3dZe&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;X7YugX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알파벳과 숫자, 밑줄(underscore)외의 특수문자는 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;밑줄(underscore)는 연속으로 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;ID을 명명할 때 모음을 지나치게 생략하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;An2VkN&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특수문자가 들어간 ID는 가독성이 떨어진다.&lt;/li&gt;
&lt;li&gt;밑줄문자(underscore)을 연속으로 사용하면 해당 코드를 읽을 때 밑줄문자가 몇 개 사용되었는지 인식하기 힘들다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;h2GsKV4D&quot; data-toc-id=&quot;h2GsKV4D&quot; data-block-id=&quot;5NPjJd&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.3. 대소문자 사용규칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qGcWRL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DlDaDV&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대소문자 사용원칙을 정했으면 일관성 있게 고수한다. (대문자 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Z0YGgA&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대소문자 구분여부는 DBMS마다 다르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;u7hYOWJU&quot; data-toc-id=&quot;u7hYOWJU&quot; data-block-id=&quot;rLVS18&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.4. 국제 명명규칙 표준 준수&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qxCKNi&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9NRKb3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;국제 명명규칙 표준(ISO-11179)을 준수할 것&lt;/li&gt;
&lt;li&gt;국가명이나 국가코드에 대한 명명은 ISO-3166 표준을 따른다.&lt;/li&gt;
&lt;li&gt;날짜 표기에 대한 형식은 ISO-8601 표준을 따른다.&lt;/li&gt;
&lt;li&gt;단, 아무리 우수한 국제 표준이라도 레거시 시스템에서 관습적으로 사용하는 것을 우선하여 적용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;wR565D&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL과 연관된 ISO-11179
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AIHmZn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL과 연관된 ISO-11179 표준 도메인은 11179-4으로, 데이터 요소 중 스칼라(Scalar) 타입은 아래와 같은 원칙을 준수한다.&lt;/li&gt;
&lt;li&gt;국가명이나 국가코드 표준에 대한 자료는 아래를 참고한다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm&quot;&gt;http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;아무리 우수한 국제표준 명명규칙이라도 관행으로 굳어졌거나 관습적으로 사용하는 것 보다 우선하여 사용하지 못한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;uFzAUuHt&quot; data-toc-id=&quot;uFzAUuHt&quot; data-block-id=&quot;yPqws2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.5. 서술적인 접두어(prefix)의 사용 자제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;k9vz9T&quot; data-ke-size=&quot;size16&quot;&gt;서술적인 접두어(prefix)는 SQL문을 읽거나 분석할 때 도움이 되지 않는 경우가 많으며 오히려 그 반대의 경우가 더 많다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;U5S4jl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Li879u&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;s&gt;테이블 ID는 &amp;ldquo;tbl_&amp;rdquo; 등으로 시작하지 않는다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;컬럼ID는 해당 컬럼의 소속을 나타내기 위해 테이블ID을 접두어를 붙이지 않는다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;뷰(view) ID는 &amp;ldquo;vw_&amp;rdquo; 등으로 시작하지 않는다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;특정컬럼이 primary key 또는 foreign key임을 나타내기 위해 해당 컬럼의 ID을 &amp;ldquo;pk_&amp;rdquo; 또는 &amp;ldquo;pf_&amp;rdquo; 등으로 시작하지 않도록 한다.&lt;/li&gt;
&lt;li&gt;특정 ID가 제약사항(constraint)임을 나타내기 위해 다음과 같은 형식의 명명규칙을 사용하지 않도록 한다.&lt;/li&gt;
&lt;li data-block-id=&quot;HyRVqu&quot;&gt;&amp;lt;table_id&amp;gt;_CK_&amp;lt;column_id&amp;gt;&lt;/li&gt;
&lt;li&gt;트리거(trigger) ID는 &amp;ldquo;trig_&amp;rdquo; 로 시작하지 않도록 한다.&lt;/li&gt;
&lt;li&gt;저장프로시저 ID는 user-defined-procedure임을 나타내기 위해 &amp;ldquo;usp_&amp;rdquo; 로 시작하지 않는다.&lt;/li&gt;
&lt;li&gt;트리거 또는 저장프로시저의 ID는 &amp;lt;동사&amp;gt;&amp;lt;목적어&amp;gt; 형태로 명명한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;7afurh&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 ID을 명명할 때 해당 ID의 소속, 형식을 표현하기 위해 접두어를 붙일 경우 해당 ID의 소속 또는 형식이 바뀌면 ID자체를 변경해야 할 경우가 있는데, 이렇게 되면 일관성을 잃어버리게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bFm71BXH&quot; data-toc-id=&quot;bFm71BXH&quot; data-block-id=&quot;CKf-nq&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.6. 표준 접미어(postfix)를 지정&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;TElpwu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID의 주체가 되는 오브젝트의 형식을 나타내는 접두어(prefix) 대신 해당 오브젝트의 속성을 나타내는 접미어(postfix)을 지정하여 사용하는 것이 낫다.&lt;/li&gt;
&lt;li data-block-id=&quot;sDrMTT&quot;&gt;(데이터베이스 명명규칙 참조)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;VuZ3oEVt&quot; data-toc-id=&quot;VuZ3oEVt&quot; data-block-id=&quot;4x8RJR&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.7. 테이블, 뷰(view)의 이름&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dG7APZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;zbyFBw&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;집합적이면서도 대표적인 이름 또는 복수형을 사용할 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;8NWrWF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단, 1개의 row만을 유지해야 하는 테이블의 경우는 예외로 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;산업표준을 따른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;q6cOB2Zk&quot; data-toc-id=&quot;q6cOB2Zk&quot; data-block-id=&quot;GsiEhv&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.8. 별칭(alias)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;owY3VQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;x71fv7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별칭(alias)을 사용할 때 근본이 되는 원래의 이름과 동떨어진 이름은 사용하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DbnjYo&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별칭(alias, 상관관계에 의해 파생되는 이름)도 하나의 이름이며 그것의 존재 원인이 되는 근원 테이블, 컬럼 또는 수식 등이 있게 마련이다. 별칭을 사용할 때 원래의 이름과 동떨어진 이름은 유지보수가 매우 어렵게 만들게 되므로 배제하는 것이 좋으나 지엽적으로 사용할 경우는 간략한 형태로 축약하여 사용하는 것을 허용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Ejv7ylsc&quot; data-toc-id=&quot;Ejv7ylsc&quot; data-block-id=&quot;-g6i5h&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.9. 관계성이 함축된 이름&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;PsvhGg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;mexf1h&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 또는 뷰간의 관계가 서로 엮일 때, 이로 인해 파생되는 엔터티에 대해 가능하면 관계성을 표현할 수 있는 이름을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DAsdQF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래와 같이 두 개 엔터티가 관계가 함축된 엔터티의 이름은 관계성을 함축하는 이름을 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;WYi54y&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lsquo;남자&amp;rsquo;와 &amp;lsquo;여자&amp;rsquo; 엔터티가 결합된 경우&lt;/li&gt;
&lt;li&gt;나쁜 예 : ManWoman 또는 HusbandsWives&lt;/li&gt;
&lt;li&gt;좋은 예 : Marriage&lt;/li&gt;
&lt;li data-block-id=&quot;rmFdjW&quot;&gt;&amp;lsquo;학생&amp;rsquo;과 &amp;lsquo;과목&amp;rsquo; 엔터티가 결합된 경우&lt;/li&gt;
&lt;li&gt;나쁜 예 : StudentsCourses&lt;/li&gt;
&lt;li&gt;좋은 예 : Enrollments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;qZBiumjj&quot; data-toc-id=&quot;qZBiumjj&quot; data-block-id=&quot;7YZmR-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.10. 메타데이터 성격을 가진 이름&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;1pflRJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9BQn6Q&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스키마 등에서 메타데이터 성격을 가진 오브젝트에 한해서 구조체를 나타내는 접미사를 사용할 수 있다. 예를 들면 인덱스ID의 경우 &amp;ldquo;_ix&amp;rdquo; 의 접미사를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;L_w_GwgL&quot; data-toc-id=&quot;L_w_GwgL&quot; data-block-id=&quot;CUkH9P&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.11. 데이터 요소 명명 시 피해야 할 사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ScOaKQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;W8lt0V&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애매한 이름은 사용하지 말 것&lt;/li&gt;
&lt;li&gt;상반적인 개념의 수식어가 결합된 ID는 사용하지 말 것&lt;/li&gt;
&lt;li&gt;상황에 따라 변동이 될 수 있는 ID는 사용하지 말 것&lt;/li&gt;
&lt;li&gt;물리모델에서 사용하는 용어(대부분 DBMS에 종속적인 용어)는 논리모델에서 사용하지 말 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;wCb5Ol&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;너무 일반적인 이름은 포괄적이어서 아무런 정보를 전달하지 못하는 경우가 많다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;709uTV&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예 : amount, date, id&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;객체지향 프로그래밍이 몸에 밴 개발자의 경우 모든 필드에 &amp;ldquo;_id&amp;rdquo; 라는 접미사를 붙이려는 경향이 있는데, 실제 상황에서 의미가 없는 경우가 많다.&lt;/li&gt;
&lt;li&gt;논리모델에서 다음과 같은 용어는 물리모델로 전환하는 단계에서 예약어로 사용되는 경우가 많으므로 피해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Ed_cbl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예 : IDENTITY, GUID, ROWID 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;B1dWcz_o&quot; data-toc-id=&quot;B1dWcz_o&quot; data-block-id=&quot;t5MMKi&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.12. 대소문자 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NtUV6e&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uahFVK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼ID, 파라미터, 변수는 소문자로 작성한다.&lt;/li&gt;
&lt;li&gt;위의 경우를 제외하고, 스키마(schema)에서 나오는 오브젝트의 첫 글자는 대문자로 작성한다.&lt;/li&gt;
&lt;li&gt;예약어(reserved word)는 모두 대문자로 작성한다.&lt;/li&gt;
&lt;li&gt;Camel-Case는 사용하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;j50AWW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예약어를 대문자로 작성하는 이유는 특별히 유의해서 보게 하려는 의도를 담고 있기 때문이다.&lt;/li&gt;
&lt;li&gt;Camel-Case은 기존의 Hungarian notation에 익숙한 개발자를 위한 것인데(ID를 구성하는 단어의 첫 글자만 대문자로 사용하는 표기법), 실제로는 가독성(readability)를 떨어뜨리는 요인이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Bj7dZjrU&quot; data-toc-id=&quot;Bj7dZjrU&quot; data-block-id=&quot;RBvoFn&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2. SQL 코딩규칙(Coding Convention)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 SQL 코딩 시 가독성 향상을 위해 지켜야 할 문자, 문장의 배치 등 외형을 중심으로 기술하였습니다.&lt;/p&gt;
&lt;h3 id=&quot;Xmi-LdgU&quot; data-toc-id=&quot;Xmi-LdgU&quot; data-block-id=&quot;r1JFB6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.1. 공백(space)사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;tGolbz&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;I4NPo6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL코딩 시 가급적 탭을 사용하지 말고 공백문자(space)을 사용할 것&lt;/li&gt;
&lt;li&gt;SQL코드의 토큰 좌우에 공백을 사용할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ATzuU8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자마다 선호하는 TAB-SIZE가 다르기 때문에, SQL 코드 작성시 탭(TAB)을 사용하면 실제 코드가 가독성이 떨어질 수 있다.&lt;/li&gt;
&lt;li&gt;실제 예는 아래와 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;fRIDAc&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나쁜 예&amp;nbsp;:&amp;nbsp;foobar=21&lt;/li&gt;
&lt;li&gt;좋은 예&amp;nbsp;:&amp;nbsp;foobar = 21&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;IR2P1nVI&quot; data-toc-id=&quot;IR2P1nVI&quot; data-block-id=&quot;JMobIn&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.2. 줄 간격&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;rD3xV-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;I0wXBx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 문장 내에서는 한 줄씩만 띄어쓰기를 할 것&lt;/li&gt;
&lt;li&gt;하나의 프로세스 내에서의 각 문장은 두 줄씩 띄어쓰기를 할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;UmI1sk-F&quot; data-toc-id=&quot;UmI1sk-F&quot; data-block-id=&quot;cp6X2W&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.3. 들여쓰기(indentation)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;scmsFi&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;smKVeo&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 사용할 때 한 그룹 내에서는 &amp;lsquo;4-space rule&amp;rsquo;을 사용할 수 도 있다. (들여쓰기는 공백 3개로 통일한다.)&lt;/li&gt;
&lt;li&gt;서브쿼리(sub-query)에서는 괄호를 시작과 끝의 위치를 일치시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;q3Gxkv&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL에서의 수직 맞춤 배치는 기존의 3GL 프로그래밍과 달리 공백을 이용한 인덴테이션 보다 우선 순위가 높다.&lt;/li&gt;
&lt;li&gt;서브쿼리(sub-query)에서는 괄호를 시작과 끝의 위치를 일치시키면 서브쿼리의 영역을 쉽게 파악할 수 있는 이점이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;SxdfBgVx&quot; data-toc-id=&quot;SxdfBgVx&quot; data-block-id=&quot;EE34VK&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.4. 일반적인 마침법의 준수&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;u-ysKL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;f35Aqe&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콤마 뒤에 공백을 집어 넣을 것&lt;/li&gt;
&lt;li&gt;콤마로 분리된 ID가 여러 줄에 걸쳐 나올 때, 콤마를 라인 끝이 아닌 라인의 처음에 위치시킬 것&lt;/li&gt;
&lt;li&gt;세미콜론으로 끝나는 SQL문의 마지막은 New-Line 이나 최소한 공백을 집어 넣을 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HmqpcK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL 문을 읽을 때 콤마와 마침표를 구분하기 힘들 경우가 많으므로 다음의 예와 같이 콤마 뒤에는 공백을 집어 넣는다.&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;8ixGhN&quot;&gt;&lt;code&gt;SELECT flobs.a,flobs.b,flobs.c,fleq.d
&amp;nbsp;&amp;nbsp;FROM Flobs,Foobar,Fleq;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Fpw75X&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;yZ3Uub&quot;&gt;&lt;code&gt;SELECT flobs.a, flobs.b, flobs.c, fleq.d
&amp;nbsp;&amp;nbsp;FROM Flobs, Foobar, Fleq;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;I90grh&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콤마로 분리된 ID가 여러 줄에 걸쳐 쓰여지면, 다음 예와 같이 콤마를 라인의 처음에 위치시키는 것이 보기에도 좋고 추후 SQL을 수정하기에도 수월하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;CuHmmv&quot;&gt;&lt;code&gt;SELECT flobs.a,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flobs.b,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flobs.c,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fleq.d
&amp;nbsp;&amp;nbsp;FROM Flobs,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fleq&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;VcRIUZn-&quot; data-toc-id=&quot;VcRIUZn-&quot; data-block-id=&quot;TiDYtj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.5. 예약어(Reserved Word) 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;gtnlOr&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Riea4q&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예약어는 단축형이 아닌 Full-Name을 사용할 것&lt;/li&gt;
&lt;li&gt;특정 DBMS에 종속적인 예약어 대신 표준 예약어를 사용할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;cqIyj8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 타입을 제외하고는 되도록이면 예약어는 생략하지 말고 Full-Name을 사용하는 것이 좋다. 예를 들면 &amp;ldquo;FROM&amp;rdquo;절에 &amp;ldquo;Personnel P1&amp;rdquo; 대신 &amp;ldquo;Personnel AS P1&amp;rdquo; 으로 사용하면 좋다.&lt;/li&gt;
&lt;li&gt;특정 DBMS에 종속적인 예약어를 사용하면 이식성이 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;OUaAmeYi&quot; data-toc-id=&quot;OUaAmeYi&quot; data-block-id=&quot;mXugqu&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.6. SQL 수직 배치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL문장이 여러 줄에 걸쳐 기술되어 있을 경우, 좌우로 지그재그형태로 생긴 모양은 최대한 배제하고, 다음을 원칙으로 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qj13NK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Q5c4Kg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT(T), UPDATE(E), FROM(M), WHERE(E), AND(D), OR(R), ORDER BY(R), GROUP BY(P)의 끝 문자를 다음 SQL문의 끝 문자(SELECT(T), UPDATE(E), INSERT(T), DELETE(E))와 맞춘다.&lt;/li&gt;
&lt;li&gt;INSERT 및 VALUES는 동일한 위치에서 시작한다.&lt;/li&gt;
&lt;li&gt;모든 컬럼은 동일한 위치에서 시작한다. (단, 컬럼 앞에 함수가 나오면 함수명의 첫 글자를 기준으로 맞춤)&lt;/li&gt;
&lt;li&gt;SELECT(T), UPDATE(E), INSERT(T), DELETE(E) 뒤로 바로 컬럼명이 나올 경우 다음 줄에서 앞 줄의 첫 단어의 끝(INSERT(T), UPDATGE(E), INSERT(T), DELETE(E))으로 부터 한 칸을 띄고 작성한다.&lt;/li&gt;
&lt;li&gt;SELECT, UPDATE, INSERT, DELETE 문의 컬럼 목록은 첫 컬럼만 제외하고 앞에 콤마(,)로 시작한다.&lt;/li&gt;
&lt;li&gt;INSERT 문의 경우 VALUE 절의 값들도 첫 번째 값을 제외하고 모두 콤마로 시작하되 동일한 위치로 정렬한다.&lt;/li&gt;
&lt;li&gt;FROM 절의 인-라인 뷰를 제외한 일반 테이블들은 콤마(,)로 구분하되 한 줄에 연속하여 기술하고 한 줄을 초과하는 경우, 줄을 바꾸어 윗줄의 첫 테이블 이름에 맞추어 시작한다.&lt;/li&gt;
&lt;li&gt;인-라인 뷰의 내부의 SQL문은 시작괄호 &amp;lsquo;(&amp;lsquo; 바로 다음부터 시작하되, 위의 내용과 동일한 규칙을 적용하며 인-라인 뷰가 끝나면 괄호를 닫은 후 줄을 바꾸도록 한다.&lt;/li&gt;
&lt;li&gt;SQL 문의 마지막에 &amp;ldquo;;&amp;rdquo; 을 기술하여 해당 문의 끝을 표시한다.&lt;/li&gt;
&lt;li&gt;UPDATE 문에서 SET절의 컬럼들은 첫 컬럼만 제외하고 콤마(,)로 시작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Mm83pr&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인 SQL 문 배치 예시&lt;/li&gt;
&lt;li&gt;일반적인 수직배치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;ndmbFM&quot;&gt;&lt;code&gt;SELECT DISTINCT pilot
  FROM PilotSkills AS PS1
 WHERE NOT EXISTS (
        SELECT *
          FROM Hangar
         WHERE NOT EXISTS (
                SELECT *
                  FROM PilotSkills AS PS2
                 WHERE PS1.pilot = PS2.pilot
                   AND P2.plane = Hangar.plane
                )
       )
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;SELECT 문의 작성 예시
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;ESy3U-&quot;&gt;&lt;code&gt;-- 예시 (2) : 주석(comment)을 SELECT 예약어 바로 다음에 배치한 예
SELECT col1,
       col2, /* Comment */
       col3
  FROM TB_SAMPLE
 WHERE col1 = 123
GROUP BY col2
HAVING SUM(col3) &amp;gt; 1000
ORDER BY SUM(col3)
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;ULQUGL&quot;&gt;&lt;code&gt;-- 예시 (3): 중첩된 SQL문장의 수직배치 예
SELECT col1,
       col2, /* Comment */
       col3,
       col4,
       col5 /* Comment */
  FROM (
        SELECT col1,
               col2,
               col3
          FROM TB_SAMPLE1
         WHERE col1 BETWEEN 100 AND 200
       ) a,
       TB_SAMPLE2 b
 WHERE a.col1 = b.col1
   AND b.col2 IN (
        SELECT col1
          FROM TB_SAMPLE3
         WHERE col2 = &amp;lsquo;123&amp;rsquo;)
   AND b.col3 LIKE &amp;lsquo;A%&amp;rsquo;
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;zbaB9F&quot;&gt;&lt;code&gt;-- 예시 (4) CASE문을 동반한 수직배치의 예
SELECT col1,
       col2,
       col3,
       CASE WHEN col4 = 'AAA' THEN col5 * 1.05
            WHEN col4 LIKE '%BB' THEN col5 * 1.1
            WHEN col4 IN ('CCC', 'DDD') THEN col5 * 1.2
            ELSE col5 * 1.3
       END AS 인상급여
  FROM TB_SAMPLE
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;wSsygn&quot;&gt;&lt;code&gt;-- 예시 (5): 왼쪽 괄호가 동반된 수직배치의 예
SELECT deptno
  FROM BIG_DEPT d
 WHERE NOT EXISTS (
        SELECT deptno
          FROM BIG_EMP e
         WHERE e.deptno = d.deptno
       )
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;F4_7k3&quot;&gt;&lt;code&gt;-- 예시 (6): UNION을 동반한 수직배치의 예
SELECT deptno
  FROM BIG_DEPT d
UNION ALL
SELECT deptno
  FROM BIG_EMP e
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;8SuL5g&quot;&gt;-- 예시 (1) : SELECT 예약어의 &amp;lsquo;T&amp;rsquo;을 기준으로 수직배치를 한 예 SELECT col1, col2, /* Comment */ col3, CASE WHEN col4 = 1 THEN col4 ELSE col4,col4 / 100 END as col4, col5 /* Comment */ FROM TB_SAMPLE a WHERE col1 = 123 AND col2 like &amp;lsquo;A%&amp;rsquo; AND col3 in (&amp;lsquo;A&amp;rsquo;, &amp;lsquo;B&amp;rsquo;, &amp;lsquo;C&amp;rsquo;) ;&lt;/li&gt;
&lt;li&gt;UPDATE 문의 작성 예시&lt;/li&gt;
&lt;li data-block-id=&quot;fDq-9I&quot;&gt;-- 예시 (1): UPDATE 예약어의 &amp;lsquo;E&amp;rsquo;을 기준으로 수직배치를 한 예 UPDATE TB_SAMPLE SET col1 = 123, col2 = &amp;lsquo;ABC&amp;rsquo;, col3 = TO_CHAR(9936) WHERE col4 = 123 AND col5 LIKE &amp;lsquo;A%&amp;rsquo; AND col6 IN (&amp;lsquo;A&amp;rsquo;, &amp;lsquo;B&amp;rsquo;, &amp;lsquo;C&amp;rsquo;) ;&lt;/li&gt;
&lt;li&gt;INSERT 문 작성예문
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;67oBME&quot;&gt;&lt;code&gt;-- 예시 (2): INSERT의 VALUE 내용을 SELECT을 사용하여 처리한 예
INSERT INTO TB_SAMPLE1 (
       col1,
       col2
)
SELECT col3, /* col1 */
       col4 /* col2 */
  FROM TB_SAMPLE2
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;3CZ376&quot;&gt;-- 예시 (1): INSERT 예약어의 &amp;lsquo;T&amp;rsquo;을 기준으로 수직배치를 한 예 INSERT INTO TB_SAMPLE ( &amp;nbsp;&amp;nbsp;&amp;nbsp;col1, &amp;nbsp;&amp;nbsp;&amp;nbsp; col2, &amp;nbsp;&amp;nbsp;&amp;nbsp; col3, &amp;nbsp;&amp;nbsp;&amp;nbsp; col4 ) VALUES ( &amp;nbsp;&amp;nbsp;&amp;nbsp; '111', &amp;nbsp;&amp;nbsp;&amp;nbsp; '222', &amp;nbsp;&amp;nbsp;&amp;nbsp; '333', &amp;nbsp;&amp;nbsp;&amp;nbsp; '444' );&lt;/li&gt;
&lt;li&gt;o DELETE 문 작성예문&lt;/li&gt;
&lt;li data-block-id=&quot;baZDQi&quot;&gt;-- 예시 (1) : DELETE 예약어의 끝 문자(&amp;lsquo;E&amp;rsquo;)을 기준으로 수직배치를 한 예 DELETE FROM TB_SAMPLE WHERE col1 = 123 AND col2 LIKE 'A%' AND col3 IN ('A', 'B', 'C') ;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;d9QYBVJx&quot; data-toc-id=&quot;d9QYBVJx&quot; data-block-id=&quot;3V1DrP&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.7. 주석(comment) 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EAmtir&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;pV_iWM&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT, UPDATE, INSERT, DELETE 문에서 컬럼목록 다음에 반드시 주석(/* */)을 사용하여 프로그램ID을 기술한다.&lt;/li&gt;
&lt;li&gt;원칙적으로 힌트(HINT)을 사용하는 것은 금지하지만, 불가피하게 힌트(HINT)을 사용할 경우에는 SQL문의 첫 번째 SELECT, UPDATE, INSERT, DELETE 다음에 반드시 동일한 줄에 프로그램 ID 를 /* / 을 이용하여 기술하며, /+ */ 을 이용하고 프로그램ID을 먼저 기술하고 힌트를 기술한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;nXXBpPMV&quot; data-toc-id=&quot;nXXBpPMV&quot; data-block-id=&quot;2zI0Bw&quot;&gt;3. SQL 작성 표준&lt;/h1&gt;
&lt;h2 id=&quot;8LLiajEt&quot; data-toc-id=&quot;8LLiajEt&quot; data-block-id=&quot;n33CM7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1.&amp;nbsp;SQL&amp;nbsp;작성시&amp;nbsp;기본적인&amp;nbsp;지침&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;l1WjJda2&quot; data-toc-id=&quot;l1WjJda2&quot; data-block-id=&quot;2TQMiC&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.1. 표준기능의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품특성과 연관된 기능보다 표준 기능을 사용 할 것.&lt;/p&gt;
&lt;h3 id=&quot;LKy_oJHr&quot; data-toc-id=&quot;LKy_oJHr&quot; data-block-id=&quot;i23TV0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.1.1. OUTER JOIN 표기법 (권장)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회 시 특정 DBMS에 종속된 SQL을 사용하는 예는 바람직하지 않으며 이식에 문제를 발생시키게 된다. (위 사항은 권장 사항임)&lt;/p&gt;
&lt;h3 id=&quot;nwshxqlI&quot; data-toc-id=&quot;nwshxqlI&quot; data-block-id=&quot;RM9Nqk&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.1.2. ISO표준 기간 표기법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO-8601 표준 표기법인 &amp;ldquo;YYYY-MM-DD hh:mm:ss.sssss&amp;rdquo; 을 사용할 것&lt;/p&gt;
&lt;h3 id=&quot;oUdPSPJy&quot; data-toc-id=&quot;oUdPSPJy&quot; data-block-id=&quot;XuGMIH&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2. 간결한 표기법을 사용&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;86b7VW_f&quot; data-toc-id=&quot;86b7VW_f&quot; data-block-id=&quot;PSD-jV&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.1. 필요 없는 괄호의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 불필요한 괄호는 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot; data-block-id=&quot;Osiazb&quot;&gt;&lt;code&gt;SELECT a, b, c
&amp;nbsp;&amp;nbsp;FROM Foobar
&amp;nbsp;WHERE (a = b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;AND (c &amp;lt; 42)
;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;mY5FBE18&quot; data-toc-id=&quot;mY5FBE18&quot; data-block-id=&quot;4s4esA&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.2.&amp;nbsp;CASE&amp;nbsp;문&amp;nbsp;사용시&amp;nbsp;주의&amp;nbsp;사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SKSf0X&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CASE문은 엄밀하게 말하면 문장(statement)이 아니라 수식(expression)이기 때문에 반드시 하나의 값을 반환한다는 것에 유의할 것(만약 조건 중 만족하는 것이 없으면 묵시적으로 &amp;ldquo;ELSE NULL&amp;rdquo; 이 추가된다.&lt;/li&gt;
&lt;li&gt;명시적으로 NULL을 반환할 때는 &amp;ldquo;CAST (NULL AS &amp;lt;datatype&amp;gt;)&amp;rdquo; 형태를 사용할 것&lt;/li&gt;
&lt;li&gt;CASE문을 쓸 때 &amp;ldquo;&amp;lt;CASE operand&amp;gt;&amp;rdquo; 대신에 Searched CASE 수식을 사용할 것&lt;/li&gt;
&lt;li&gt;o 바람직하지 않은 예&lt;/li&gt;
&lt;li data-block-id=&quot;XctpDa&quot;&gt;CASE iso_sex_code WHEN 0 THEN 'Unknown' WHEN 1 THEN 'Male' WHEN 2 THEN 'Female' WHEN 9 THEN 'N/A' ELSE NULL END&lt;/li&gt;
&lt;li&gt;o 바람직한 예&lt;/li&gt;
&lt;li data-block-id=&quot;PbZPba&quot;&gt;CASE WHEN iso_sex_code = 0 THEN 'Unknown' WHEN iso_sex_code = 1 THEN 'Male' WHEN iso_sex_code = 2 THEN 'Female' WHEN iso_sex_code = 9 THEN 'N/A' ELSE NULL END&lt;/li&gt;
&lt;li&gt;o 예외상황
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;jtYgkN&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NULL 여부와 비교하는 경우는 다음과 같이 SQL을 작성하면 에러가 발생하므로 주의해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot; data-block-id=&quot;6iS5ZX&quot;&gt;&lt;code&gt;CASE WHEN foo = 0 THEN &amp;lsquo;bar&amp;rsquo;
     WHEN foo = NULL THEN &amp;lsquo;no_bar&amp;rsquo; /*&amp;nbsp;error&amp;nbsp;!!!&amp;nbsp;*/
     ELSE NULL
END&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;가능하다면 COALESCE 또는 NULLIF 을 사용하여 SQL을 깔끔하게 작성한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HyR7ye&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(COALESCE, NULLIF 모두 SQL-92 표준이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7WTYZokl&quot; data-toc-id=&quot;7WTYZokl&quot; data-block-id=&quot;3y2YtQ&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.3. 불필요한 비교문&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 불필요한 비교문은 사용하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot; data-block-id=&quot;inlSbn&quot;&gt;&lt;code&gt;SELECT a, b, c
  FROM Foobar
 WHERE a = b
   AND b = c
   AND c = a
;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;M1IDrB6k&quot; data-toc-id=&quot;M1IDrB6k&quot; data-block-id=&quot;InuhAj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.4. 수식을 간소화하여 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ZXKOE6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간소한 수식 예(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HXwVHx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나쁜 예
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;tP1qwH&quot;&gt;&lt;code&gt;SELECT a, b, c
  FROM Foobar
 WHERE a + 2 = b&amp;nbsp;-&amp;nbsp;4
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;RoX65x&quot;&gt;아래와 같이 작성하면 읽기에도 어려울 뿐 아니라, a 컬럼이 인덱스로 구성되어 있어도 인덱스를 활용할 수 없게 되는 경우가 있다.&lt;/li&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;XBBu-Q&quot;&gt;SELECT a, b, c FROM Foobar WHERE a = b &amp;ndash; 6 ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;간소한 수식 예(2)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HQT-_l&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구간에 대한 조건을 AND을 사용하여 표현하는 것보다 BETWEEN을 활용하는 것이 좋다.&lt;/li&gt;
&lt;li data-block-id=&quot;y6ayay&quot;&gt;(단, 인덱스를 활용할 수 있는지 여부를 먼저 고려해서 사용할 것)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;간소한 수식 예(3)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Tuhl8r&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 개의 값과 비교할 때 OR을 사용하여 표현하는 것보다 IN을 활용하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;중첩되어 복잡한 조건절은 CASE 수식을 사용하여 간략하게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Suon3FvA&quot; data-toc-id=&quot;Suon3FvA&quot; data-block-id=&quot;6WJs24&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.3. 주석 사용시 주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;QDm9tn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가능하면 &amp;ldquo;--&amp;ldquo; 보다는 /* */ 을 활용하는 것이 좋다. (경우에 따라 Unary Operator인 -&amp;lsquo;와 혼동이 되는 경우가 있기 때문이다)&lt;/li&gt;
&lt;li&gt;Stored-Procedure&amp;nbsp;및&amp;nbsp;Function 에서의 주석
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Av0Mle&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;항상 Stored-Procedure는 첫 줄에 최소한 다음의 사항을 주석으로 표현한다. 단, 프로시저 이름은 &amp;ldquo;&amp;lt;동사&amp;gt;&amp;lt;목적어&amp;gt;&amp;rdquo; 형태로 기술하는 것이 좋다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;aHNCzk&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SP&amp;nbsp;및&amp;nbsp;Function&amp;nbsp;명&amp;nbsp;및&amp;nbsp;목적/기능&amp;nbsp;설명&lt;/li&gt;
&lt;li&gt;Input&amp;nbsp;Param&amp;nbsp;명&amp;nbsp;및&amp;nbsp;설명&lt;/li&gt;
&lt;li&gt;Output&amp;nbsp;Param&amp;nbsp;명&amp;nbsp;및&amp;nbsp;설명&lt;/li&gt;
&lt;li&gt;변경&amp;nbsp;이력(작성일자,&amp;nbsp;이름&amp;nbsp;-&amp;nbsp;변경&amp;nbsp;내용)&lt;/li&gt;
&lt;li&gt;복잡한 제어문에는 항상 주석을 사용할 것&lt;/li&gt;
&lt;li data-block-id=&quot;HyBSTg&quot;&gt;/* =========================================================================================== Name : fnConvertIntToIPv4 Desc : 정수(INT UNSIGNED)를 IPv4 주소 문자열로 변환 Params - intIPv4 : 정수로 변환된 IPv4 Return - VARCHAR : IPv4 주소 문자열 Used : fnConvertIntToIPv4(3232235777) &amp;rarr; '192.168.1.1' History - 2025.04.09, 이명근 - 최초 구현 =========================================================================================== */&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sTz5NYpW&quot; data-toc-id=&quot;sTz5NYpW&quot; data-block-id=&quot;HPoQlC&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.4. 옵티마이저用 힌트(Hint)의 사용자제&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uJAPrP&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵티마이저用 힌트는 DBMS에 따라 표기법이 달라서 호환이 되지 않는 경우가 많으므로 사용하지 않는 것이 좋다.&lt;/li&gt;
&lt;li&gt;DBMS의 옵티마이저는 대부분의 개발자보다 더 적은 비용의 전략을 잘 찾아낸다.&lt;/li&gt;
&lt;li&gt;힌트를 사용할 일이 없어지거나 인덱스가 변경되면 성능이 더 떨어지는 경우가 많다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;RfmR3AmB&quot; data-toc-id=&quot;RfmR3AmB&quot; data-block-id=&quot;VkQbn7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.5. 복잡한&amp;nbsp;데이터&amp;nbsp;처리&amp;nbsp;시&amp;nbsp;SQL Stored Procedure 사용 권장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무&amp;nbsp;처리&amp;nbsp;로직이&amp;nbsp;복잡한&amp;nbsp;데이터&amp;nbsp;처리(예:&amp;nbsp;데이터&amp;nbsp;조회&amp;nbsp;후&amp;nbsp;임시&amp;nbsp;테이블&amp;nbsp;생성하여&amp;nbsp;입력/수정/삭제&amp;nbsp;후&amp;nbsp;Target&amp;nbsp;Table에&amp;nbsp;데이터&amp;nbsp;입력/수정/삭제&amp;nbsp;로직)인&amp;nbsp;경우&amp;nbsp;Stored&amp;nbsp;Procedure&amp;nbsp;사용한다.Stored Procedure을 사용하면 다음과 같은 장점이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NN13IT&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안성 강화
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Swkmkn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stored Procedure을 사용하면 해당 프로시저 내부에서 허용되는 작업만 진행하게 되므로 동적SQL(Dynamic SQL)을 사용할 때보다 훨씬 안전하다. (동적 SQL을 사용하면 SQL내용을 통제할 수 있는 방법이 없다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유지보수 용이
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;p59Mxz&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stored Procedure는 손쉽게 수정하여 업그레이드할 수 있다. (새로 DBMS에 수정하는 순간 re-compile된다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 트래픽 감소
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SFxxN6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크상에서 파라미터 값만 전송되므로 네트워크 전송 효율이 좋아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일관성
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hN07mX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 모두 Stored-Procedure로만 작성하게 되면 일관성이 생기므로 추후 작업에도 생산성이 높아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모듈성
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;aTVxAk&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 Stored-Procedure에서도 해당 프로시저를 호출하여 사용할 수 있으므로 모듈화에 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;OBto0sXW&quot; data-toc-id=&quot;OBto0sXW&quot; data-block-id=&quot;AfIY0l&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.6. UNION은 사용 자제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 대부분 옵티마이저는 UNION을 최적화하는데 어려움을 겪고 있다. 따라서 가능하다면 UNION ALL 만을 사용하고 나머지는 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;h3 id=&quot;i7zBNOI0&quot; data-toc-id=&quot;i7zBNOI0&quot; data-block-id=&quot;V9fFHs&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.7. 정렬과 관련된 SQL문의 남용 금지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 Sort 가 발생하는 SQL 문은 최대한 자제한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;E9WXQx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ORDER&amp;nbsp;BY&lt;/li&gt;
&lt;li&gt;GROUP&amp;nbsp;BY&lt;/li&gt;
&lt;li&gt;DISTINCT&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;XOOXXY0o&quot; data-toc-id=&quot;XOOXXY0o&quot; data-block-id=&quot;nv136p&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.8. WHERE 절에 긍정적 조건의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qnOL8J&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비교하고자 하는 컬럼이 숫자 타입이 확실한 경우를 제외하고 비교 하고자 하는 상수 값을 숫자 타입으로 하지 않는다.&lt;/li&gt;
&lt;li&gt;&amp;rdquo;OR&amp;rdquo; 사용을 자제하고 가급적 IN, CASE 함수를 활용한다.&lt;/li&gt;
&lt;li&gt;IFNULL 함수는 불필요하게 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;WHERE 절의 인덱스 스캔 컬럼에 인위적인 변형을 가하지 말고 반드시 상수(변수) 쪽에 변형을 가한다.&lt;/li&gt;
&lt;li&gt;데이터를 검색할 때 불필요한 부분은 액세스하지 말고 읽어야 하는 부분만 처리하여 효율을 높인다. ( SELECT 문에서 &amp;lsquo;*&amp;rsquo;을 사용하지 말고 Named Column을 사용한다. )&lt;/li&gt;
&lt;li&gt;불필요한 Network 접근을 줄이기 위해 가능하면 SQL을 최대한 묶어서 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;9KdQxsCO&quot; data-toc-id=&quot;9KdQxsCO&quot; data-block-id=&quot;8ldBTE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2. SQL 작성시 기본적인 절차&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;Fe80E_zk&quot; data-toc-id=&quot;Fe80E_zk&quot; data-block-id=&quot;9TJ97L&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.1. SQL 테스트&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Fqc6IZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가능한 NULL과 관련된 모든 경우의 수를 테스트할 것&lt;/li&gt;
&lt;li&gt;CHECK() 제약사항을 모두 검사하고 테스트할 것&lt;/li&gt;
&lt;li&gt;테이블의 크기가 커질 경우를 테스트할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;JvhJson2&quot; data-toc-id=&quot;JvhJson2&quot; data-block-id=&quot;lX7k2i&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.2. SQL 수행비용 검증&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 작성된 SQL 문에 대한 실행계획을 검증하는 절차를 거친다.&lt;/p&gt;
&lt;h3 id=&quot;NJxVqn4X&quot; data-toc-id=&quot;NJxVqn4X&quot; data-block-id=&quot;E1Su6W&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.3. OLAP 성격의 업무 개발시 주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OLTP 성격의 업무에서 아래와 같은 SQL 문에 대해서는 반드시 해당 SQL문의 개선 작업을 수행한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;YrFrP6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Full Table Scan&lt;/li&gt;
&lt;li&gt;Index Fast Full Scan&lt;/li&gt;
&lt;li&gt;Sort Merge Join&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;_w6XUUui&quot; data-toc-id=&quot;_w6XUUui&quot; data-block-id=&quot;-71yfG&quot;&gt;4. SQL 작성 지침&lt;/h1&gt;
&lt;h2 id=&quot;6vdWzhdL&quot; data-toc-id=&quot;6vdWzhdL&quot; data-block-id=&quot;Puux1J&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.1. DDL(Data Definition Language) 작성 지침&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;PHzzXojW&quot; data-toc-id=&quot;PHzzXojW&quot; data-block-id=&quot;tF78Ec&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.1. Default 값은 데이터 타입과 일치하는 값을 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연한 말이지만, 의외로 많은 개발자가 이 원칙을 지키지 않는다. 예를 들면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ym9ZKX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Decimal 데이터 타입에 정수 0(zero)을 default 값으로 사용하는 경우&lt;/li&gt;
&lt;li&gt;(CHAR(n) 데이터 타입에 길이가 n개 보다 적은 문자 스트링을 default 값으로 사용하는 경우&lt;/li&gt;
&lt;li&gt;TIMESTAMPE 데이터 타입에 DATE 값을 default 로 사용하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우 같은 경우 DBMS에서 원래 데이터 타입에 맞게 묵시적인 변환작업이 일어나는데, DBMS성능에 영향을 미치는 요인이 될 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;GwnJmyvX&quot; data-toc-id=&quot;GwnJmyvX&quot; data-block-id=&quot;CE26O4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.2. Data Type 중 문자 타입은 일관성을 유지&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DHZgI9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;char 대신 varchar 을 사용할 것&lt;/li&gt;
&lt;li&gt;인덱스로 지정될 가능성이 높은 컬럼은 varchar로 지정하여 사용할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;EW0pXyY0&quot; data-toc-id=&quot;EW0pXyY0&quot; data-block-id=&quot;xR7ZlA&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.3. 테이블 생성시 주키(Primary Key)를 가장 위에 배치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가독성을 높이기 위해 키에 해당되는 속성은 가장 위에 위치시키는 것이 좋다. 왜냐하면 키라는 의미 자체가 해당 엔터티의 대표값을 나타내기 때문이다.&lt;/p&gt;
&lt;h3 id=&quot;jaMOdmOI&quot; data-toc-id=&quot;jaMOdmOI&quot; data-block-id=&quot;5nPQst&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.4. 컬럼을 논리적인 순서로 배열 및 논리적인 그룹 지정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 스키마가 완성된 이후에 컬럼을 추가할 때 성능에 영향을 미치는지 고려해야 하는데, 다음 순서대로 컬럼을 배치하면 성능에 도움이 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;a48-V7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업데이트가 적게 일어나는 고정길이 컬럼&lt;/li&gt;
&lt;li&gt;업데이트가 적게 일어나는 가변길이 컬럼&lt;/li&gt;
&lt;li&gt;업데이트가 자주 일어나는 컬럼(들)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;lXk-b8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업데이트가 동시에 일어나는 성격의 컬럼이 연속되게 배치하면 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;kci7YxOI&quot; data-toc-id=&quot;kci7YxOI&quot; data-block-id=&quot;hiBLTj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.5. 제약조건 이름은 명확하게 기술&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제약조건은 &amp;rdquo;CONSTRAINT &amp;lt;name&amp;gt;&amp;rdquo; 형태로 기술하는데, 제약조건 명을 기술하지 않으면 에러 상황이 발생하였을 때 시스템에서 정한 임의의 이름으로 에러메시지가 발생하므로 오류를 찾기 어렵게 되므로 제약조건의 이름은 명확하게 기술한다. 단, PRIMARY KEYS, UNIQUE, FOREIGN KEY 제약 조건에 대한 이름은 생략한다.&lt;/p&gt;
&lt;h3 id=&quot;cf-Q_uNO&quot; data-toc-id=&quot;cf-Q_uNO&quot; data-block-id=&quot;SO81NP&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.6. 수치형 컬럼은 범위 제약사항을 두도록 고려&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스는 기업에서 유일하게 신뢰할 수 있는 &amp;ldquo;저장소&amp;rdquo;이므로, 비즈니스 룰을 강제할 수 있는 방편으로 제약사항을 두게 된다. 대개는 테이블의 필드가 0(zero)보다 크도록 제약사항을 두는 경우가 많다.&lt;/p&gt;
&lt;h3 id=&quot;Z3oHw_VO&quot; data-toc-id=&quot;Z3oHw_VO&quot; data-block-id=&quot;aRiUvM&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.7. 가능하면 모든 테이블이 키를 갖도록 설계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키와 관련하여 주의할 사항은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;luF4Xb&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 채번 컬럼은 관계성 키가 아니다.&lt;/li&gt;
&lt;li&gt;파일은 테이블이 아니다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;좋은 키&amp;rdquo;의 속성을 살펴 볼 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;FewW6y&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유일성(Uniqueness)&lt;/li&gt;
&lt;li&gt;안정성(Stability)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Ci8lnM&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쉽게 변하지 않는 값이어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;친밀성(Familiarity)&lt;/li&gt;
&lt;li&gt;검증성(Validation)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;K9m3UD&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 입장에서 검증하기 용이해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;확인성(Verifiability)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;GBPsQn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자 입장에서 확인하기 용이해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단순성(Simplicity)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;AVJ8Cdwu&quot; data-toc-id=&quot;AVJ8Cdwu&quot; data-block-id=&quot;TIBb3P&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.2. DML(Data Manipulation Language) 작성 지침&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;bmA4-uhQ&quot; data-toc-id=&quot;bmA4-uhQ&quot; data-block-id=&quot;4PudPp&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.1. NULL 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AZWcf4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NULL을&amp;nbsp;꼭&amp;nbsp;사용해야&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;비교&amp;nbsp;연산자가&amp;nbsp;아닌&amp;nbsp;'IS'&amp;nbsp;또는&amp;nbsp;'IS&amp;nbsp;NOT'을&amp;nbsp;사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oDSemI&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;1zc-vE&quot;&gt;IF (@var IS NOT NULL) IF (@var IS NULL)&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;M_l-K9&quot;&gt;IF (@var = NULL) IF (@var &amp;lt;&amp;gt; NULL) IF (@var != NULL) IF (@var &amp;gt; NULL )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인덱스 비교 부분에서 NULL을 사용하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ONkdKI&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;N22o_x&quot;&gt;SELECT&amp;nbsp;ord_no, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ord_date, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item, ord_qty &amp;nbsp;FROM ORDER1T &amp;nbsp;&amp;nbsp;WHERE ord_date &amp;gt; ' ' ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;w6grtf&quot;&gt;SELECT&amp;nbsp;ord_no, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ord_date, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ord_qty &amp;nbsp;&amp;nbsp;FROM ORDER1T &amp;nbsp;WHERE ord_date IS NOT NULL ORDER BY ord_date ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;YqlYNMGg&quot; data-toc-id=&quot;YqlYNMGg&quot; data-block-id=&quot;qfBN6V&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.2. IN 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;r11Bho&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE 조건에서 &amp;lsquo;OR&amp;rsquo;을 최대한 배제하고 IN 을 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;y5Utf_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;Z-L29X&quot;&gt;SELECT emp_name &amp;nbsp;&amp;nbsp;FROM Employees &amp;nbsp;WHERE emp_id IN (1, 2, 5) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;Z_98o_&quot;&gt;SELECT&amp;nbsp;emp_name &amp;nbsp;&amp;nbsp;FROM Employees &amp;nbsp;WHERE ((emp_id = 1) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OR (empidn = 2) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OR (empidn = 5)) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;'BETWEEN'을 사용하면 Range Scan을 수행하고, 'IN'을 사용하면 Point SCAN을 수행하므로 IN을 사용하는 것이 더 효율적이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NjHuyX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;4NIKXd&quot;&gt;SELECT col3, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;col4, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;col5 &amp;nbsp;&amp;nbsp;FROM TAB1 &amp;nbsp;WHERE col1 = 'A' &amp;nbsp;&amp;nbsp;&amp;nbsp;AND col2 IN ('112',&amp;nbsp;'111') ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;cS89zR&quot;&gt;SELECT col3, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;col4, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;col5 &amp;nbsp;&amp;nbsp;FROM TAB1 &amp;nbsp;WHERE col1 = 'A' &amp;nbsp;&amp;nbsp;&amp;nbsp;AND col2 BETWEEN '111'&amp;nbsp;AND '112' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UNION은 가능하면 IN으로 대체한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MNJ1Bm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;UZnfy8&quot;&gt;SELECT DISTINCT useid, usetypid FROM JOIN_USER_USERTYPS WHERE usetypid IN (16, 17) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;NYmMW5&quot;&gt;SELECT DISTINCT useid, usetypid FROM JOIN_USER_USERTYPES WHERE (usetypid = 16) UNION ALL SELECT DISTINCT useid, usetypid FROM JOIN_USER_USERTYPES WHERE (usetypid = 17) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tm0jK6UU&quot; data-toc-id=&quot;tm0jK6UU&quot; data-block-id=&quot;WrFMCb&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.3. MIN, MAX 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qYn0Ff&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대값(또는 최소값)만 필요한 경우 ORDER BY 대신 MAX(또는 MIN) 함수를 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;JLInld&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;F9jh-s&quot;&gt;SELECT&amp;nbsp;MAX(emp_id) &amp;nbsp;&amp;nbsp;FROM Employees ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;SBI6ad&quot;&gt;SELECT&amp;nbsp;emp_id &amp;nbsp;&amp;nbsp;FROM Employees ORDER BY empi_d DESC ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ma93OCuq&quot; data-toc-id=&quot;ma93OCuq&quot; data-block-id=&quot;LCbbJ6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.4. UNION, UNION ALL 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;-NhvVm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래와 같이 UNION ALL 구문을 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NmMXML&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;ZHJJKl&quot;&gt;SELECT fname, lname, empidn FROM Employees WHERE (empidn &amp;lt; 10) UNION ALL SELECT fname, lname, empidn FROM Employees WHERE (empidn &amp;gt;= 100) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;JS4QRU&quot;&gt;SELECT fname, lname, empidn FROM Employees WHERE (empidn &amp;lt; 10) UNION SELECT fname, lname, empidn FROM Employees WHERE (empidn &amp;gt;= 100) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OR 대신 아래와 같이 UNION ALL 을 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9QqXmE&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;f05-jR&quot;&gt;SELECT COUNT(*) FROM Chujgo WHERE :sw = 1 AND chuldate = '20020628' UNION ALL SELECT COUNT(*) FROM Chulgo WHERE :sw = 2 AND RTRIM(chuldate) LIKE '200206%' ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;t246Bz&quot;&gt;SELECT COUNT(*) FROM Chulgo WHERE (:sw = 1 AND chuldate = &amp;lsquo;20020628&amp;rsquo;) OR (:sw = 2 AND RTRIM(chuldate) LIKE &amp;lsquo;200206%&amp;rsquo;) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;C_s5EYv6&quot; data-toc-id=&quot;C_s5EYv6&quot; data-block-id=&quot;Qc2JCN&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.5. OR 사용시 주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;-ARUhs&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건문 안에 OR을 사용하면 TABLE FULL SCAN을 하게 되므로 주의해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oaUa98&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;A-3te0&quot;&gt;SELECT chulno, custno, chuldate, uncost FROM Chulgo WHERE (:sw = 1 AND (status LIKE &amp;lsquo;1%&amp;rsquo;) OR (:sw = 1 AND (status LIKE &amp;lsquo;2%&amp;rsquo;) OR (:sw = 2 AND (status LIKE &amp;lsquo;3%&amp;rsquo;) ORDER BY status ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;fz7poB&quot;&gt;SELECT chulno, custno, chuldate, uncost FROM Chulgo WHERE (:sw = 1 AND (status LIKE &amp;lsquo;1%&amp;rsquo; OR status LIKE &amp;lsquo;2%&amp;rsquo;)) OR (:sw = 2 AND (status LIKE &amp;lsquo;3%&amp;rsquo;)) ORDER BY status ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;yfOJRAGX&quot; data-toc-id=&quot;yfOJRAGX&quot; data-block-id=&quot;eD41Gt&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.6. 부정형 사용 금지 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;OHC5Dw&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE절에 부정형을 사용하면 인덱스 스캔이 불가능하므로 긍정형으로 변형하여 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EgluvL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;PvZELF&quot;&gt;SELECT 'Not found' INTO :col1 FROM DUAL WHERE NOT EXISTS ( SELECT 'x' FROM EMP WHERE empno = &amp;lsquo;1234&amp;rsquo; ) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;_yeaQv&quot;&gt;SELECT 'Not found' INTO :COL1 FROM EMP WHERE empno &amp;lt;&amp;gt; '1234' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jM-CbPa8&quot; data-toc-id=&quot;jM-CbPa8&quot; data-block-id=&quot;UxL4Dy&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.7. NVL 활용 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;g8k8-p&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총계함수 사용 시 NULL은 무시되므로 총계함수 내에서의 IFNULL함수는 필요하지 않음
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;lFB2hU&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;g0h6xl&quot;&gt;IFNULL(SUM(trn_amount),&amp;nbsp;0)&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;n_uejs&quot;&gt;IFNULL(SUM(IFNULL(trn_amount,&amp;nbsp;0)),&amp;nbsp;0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bA0LoCPM&quot; data-toc-id=&quot;bA0LoCPM&quot; data-block-id=&quot;CWHSvi&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.8. OUTER JOIN 활용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AfLv8J&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 테이블 중 한 쪽에만 값이 있는 경우를 추출할 경우 OUTER JOIN을 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;xUn1Ck&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;g8jyfE&quot;&gt;SELECT d.deptno FROM BIG_DEPT d LEFT OUTER JOIN BIG_EMP e ON (d.deptno = e.deptno AND e.deptno IS NULL) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;Ow7Y1V&quot;&gt;SELECT deptno FROM BIG_DEPT d WHERE NOT EXISTS ( SELECT deptno FROM BIG_EMP e WHERE e.deptno = d.deptno &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;y6GkTo&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;xIw_5TO6&quot; data-toc-id=&quot;xIw_5TO6&quot; data-block-id=&quot;gnnHFp&quot;&gt;5. SQL 사용 지침&lt;/h1&gt;
&lt;h2 id=&quot;TIjBQtl7&quot; data-toc-id=&quot;TIjBQtl7&quot; data-block-id=&quot;zzedCR&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.1. 인덱스(Index) 사용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-ye0zhFF&quot; data-toc-id=&quot;-ye0zhFF&quot; data-block-id=&quot;m2vUX_&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.1. 인덱스 사용지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Vnj7BN&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 경우에만 인덱스를 생성하고, 사용되지 않는 인덱스는 모니터링 후 삭제한다.&lt;/li&gt;
&lt;li&gt;실제 조사된 액세스 종류에 따라서 인덱스를 선정 및 검증한다.&lt;/li&gt;
&lt;li&gt;특정 명령문을 튜닝하기 위해 인덱스를 추가로 생성할 경우 다른 SQL의 액세스 경로가 바뀔 수도 있으므로 충분한 사전 분석 작업이 필요하다.&lt;/li&gt;
&lt;li&gt;각종 액세스 분포도가 자주 조합되어 사용되는 경우는 결합 인덱스로 생성한다.&lt;/li&gt;
&lt;li&gt;자주 조합되어 사용되는 경우의 수를 만족할 수 있도록 인덱스간의 역할을 분담한다.(되도록 많은 access path를 수용하도록 한다)&lt;/li&gt;
&lt;li&gt;가능한 수정이 빈번하지 않는 칼럼으로 인덱스를 선정한다.&lt;/li&gt;
&lt;li&gt;결합 인덱스의 칼럼 순서 선정에 주의 한다. 첫 번째 칼럼이 Where 조건에 존재해야 인덱스 scan 가능하다.&lt;/li&gt;
&lt;li&gt;반복수행(loop 내) 되는 조건은 가장 빠른 수행속도를 내게 하여야 하므로 인덱스 구성의 대상으로 최우선 고려한다.&lt;/li&gt;
&lt;li&gt;넓은 범위(5% 이상)를 인덱스로 처리 시 random access로 인한 많은 오버헤드가 발생할 가능성이 있으므로, Table Full Scan을 고려해봐야 한다.&lt;/li&gt;
&lt;li&gt;인덱스의 개수는 테이블의 사용 형태에 따라 적절히 생성한다. 왜냐하면 DML 작업이 많은 경우 성능저하의 원인이 될 수 있기 때문이다.&lt;/li&gt;
&lt;li&gt;조인(join) 시에는 잘못된 인덱스 사용이 큰 부하를 가져올 수 있으므로, 인덱스 사용여부에 주의하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2RNC3hiw&quot; data-toc-id=&quot;2RNC3hiw&quot; data-block-id=&quot;0eZjXx&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2. 인덱스 적용 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;h92I8FOI&quot; data-toc-id=&quot;h92I8FOI&quot; data-block-id=&quot;nSQlSF&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2.1. 인덱스 컬럼은 원형 그대로 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼은 비교되기 전에 변형이 일어나면 인덱스가 사용되지 않기 때문에 되도록이면 WHERE절에서 인덱스 컬럼을 원형 그대로 사용하는 것이 바람직하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;LL4JrI&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;39gmA2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;ZHIQjN&quot;&gt;SELECT dept, ename, sal FROM EMP WHERE SUBSTR(job, 1, 4) = '&amp;lt;st1:city w:st='on'&amp;gt;SALE&amp;lt;/st1:city&amp;gt;' ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;cOVJqx&quot;&gt;SELECT dept, ename, sal FROM EMP WHERE job LIKE '&amp;lt;st1:city w:st='on'&amp;gt;SALE&amp;lt;/st1:city&amp;gt;%' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시(2)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BrHxak&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;nAniZd&quot;&gt;SELECT empno, ename, job FROM EMP WHERE (sal * 12) = 35000000 ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;x_ajQl&quot;&gt;SELECT empno, ename, job FROM EMP WHERE sal = (35000000 / 12) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시(3)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;cfvRer&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;tGc15Z&quot;&gt;SELECT empno, ename, job FROM EMP WHERE CONCAT(job, dept) = 'CLERK10' ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;CqxBwE&quot;&gt;SELECT empno, ename, job FROM EMP WHERE job = 'CLERK' AND dept = '10' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시(4)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VAnnS8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;o 개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;fEsD2I&quot;&gt;SELECT chr, num, var, dat FROM SAMPLET WHERE CAST(car&amp;nbsp;AS&amp;nbsp;INTEGER) = 10;&lt;/li&gt;
&lt;li&gt;o 개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;jdYXs2&quot;&gt;SELECT chr, num, var, dat FROM SAMPLET WHERE chr =&amp;nbsp;'10' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위의 예를 이용하여 다음과 같이 강제로 인덱스를 타지 않게 할 수 도 있다.&lt;/li&gt;
&lt;li data-block-id=&quot;cWAXq2&quot;&gt;SELECT SUM(col1) FROM TAB1 WHERE RTRIM(status) = '90' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;JmdZ-Ycc&quot; data-toc-id=&quot;JmdZ-Ycc&quot; data-block-id=&quot;gLlPVe&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2.2. 인덱스 사용시 부정형을 사용 금지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼을 부정형(NOT, &amp;lt;&amp;gt;)으로 비교할 때도 인덱스가 사용되지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EuLJeW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;o_0JFL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;GpJFQD&quot;&gt;SELECT 'Not found' INTO :col1 FROM EMP WHERE empno &amp;lt;&amp;gt; '1234' ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;TzRFLh&quot;&gt;SELECT 'Not found' INTO :col1 FROM DUAL WHERE NOT EXISTS ( SELECT &amp;lsquo;'X' FROM EMP WHERE empno =&amp;lsquo;'1234' ) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;MaiypvQX&quot; data-toc-id=&quot;MaiypvQX&quot; data-block-id=&quot;mLRxPS&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2.3. 인덱스 컬럼을 NULL과 비교 금지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼을 NULL과 비교하여도 해당 인덱스가 사용되지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ePBIiU&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dHJ7rZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;_HPFR-&quot;&gt;SELECT ord_no, ord_date, item, ord_qty FROM ORDER1T WHERE ord_date IS NOT NULL ORDER BY ord_date ;&lt;/li&gt;
&lt;li&gt;o 개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;Bl8jaH&quot;&gt;SELECT ord_no, ord_date, item, ord_qty FROM ORDER1T WHERE ord_date &amp;gt; ' ' ; -- ord_date가 숫자 타입이면 SELECT ord_no, ord_date, item, ord_qty FROM ORDER1T WHERE ord_date &amp;gt; 0 ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;h0bl34Gr&quot; data-toc-id=&quot;h0bl34Gr&quot; data-block-id=&quot;jzM5gM&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.2. 뷰(View) 사용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;9uHeS8hh&quot; data-toc-id=&quot;9uHeS8hh&quot; data-block-id=&quot;82MH7N&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.1. 뷰(View) 명명법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰의 명명법은 기본적으로 테이블에 대한 명명법과 동일하다. 다만 뷰의 이름을 'vw&amp;rsquo; 또는 'v&amp;rsquo;로 시작하는 것은 피하는 것이 좋다. 이유는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VSLuv5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뷰를 나중에 테이블로 전환하는 경우 'vw&amp;rsquo; 로 시작하는 이름을 모두 'tbl&amp;rsquo;로 바꾸어야 하는 병폐가 생길 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Fn_aa868&quot; data-toc-id=&quot;Fn_aa868&quot; data-block-id=&quot;AmVUJx&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.2. 보안성을 높이려면 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;zcraesyJ&quot; data-toc-id=&quot;zcraesyJ&quot; data-block-id=&quot;SpW51r&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.3. 데이터에 대한 검증을 위해서 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;bE7bE69x&quot; data-toc-id=&quot;bE7bE69x&quot; data-block-id=&quot;GL0LBA&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.4. 사용자의 요구로 인한 복잡성을 줄이기 위해 뷰(View)을 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 또는 SQL 초보프로그래머를 위해 복잡한 SQL조회 결과를 뷰(View)로 미리 만들어 놓으면 추후 작업할 때 일을 대폭 줄여줄 수 있다&lt;/p&gt;
&lt;h3 id=&quot;xQohMyWH&quot; data-toc-id=&quot;xQohMyWH&quot; data-block-id=&quot;vMRVjy&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.5. 2차 데이터를 도출할 때 뷰(View)을 사용하면 도움이 된다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테이블의 데이터를 근간으로 2차 데이터를 도출하여 사용할 때 뷰를 정의하여 사용하면 프로그래머의 부담이 줄어든다.&lt;/p&gt;
&lt;h3 id=&quot;G4qy2dbQ&quot; data-toc-id=&quot;G4qy2dbQ&quot; data-block-id=&quot;Yje2Bb&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.6. 테이블의 컬럼명이 복잡하거나 어려울 때 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 컬럼명이 복잡하고 애매할 경우 간결한 컬럼명을 가지는 뷰를 생성하면 기존 컬럼명을 수정하지 않고도 동일한 효과를 얻을 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;labfXe8S&quot; data-toc-id=&quot;labfXe8S&quot; data-block-id=&quot;NMrP2t&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.7. 복잡한 제약사항을 단순화하기 위해 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS 마다 테이블에 대한 복잡한 제약사항을 지원하는데 한계가 있으며, 이 한계는 DBMS마다 다르다. 이를 극복하기 위하여 뷰(View)을 사용하면 큰 도움이 된다.&lt;/p&gt;
&lt;h3 id=&quot;XJizFQMA&quot; data-toc-id=&quot;XJizFQMA&quot; data-block-id=&quot;_Di7HY&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.8. 뷰를 생성하려면 그에 합당한 이유가 있어야 한다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;pvt3Rb9S&quot; data-toc-id=&quot;pvt3Rb9S&quot; data-block-id=&quot;a52lu1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.9. 뷰를 남용하지 말 것&lt;/b&gt;&lt;/h3&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/449</guid>
      <comments>https://gregorio78.tistory.com/449#entry449comment</comments>
      <pubDate>Mon, 16 Mar 2026 18:35:20 +0900</pubDate>
    </item>
    <item>
      <title>JAVA Coding Conventions</title>
      <link>https://gregorio78.tistory.com/448</link>
      <description>&lt;h1 id=&quot;2NfEiRft&quot; data-pm-slice=&quot;1 3 []&quot; data-toc-id=&quot;2NfEiRft&quot; data-block-id=&quot;a9rbQa&quot;&gt;&lt;b&gt;1. 코드 표준&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;v7Vy8wj0&quot; data-toc-id=&quot;v7Vy8wj0&quot; data-block-id=&quot;lMgOoe&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1&amp;nbsp;코드&amp;nbsp;표준의&amp;nbsp;필요성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;qlDfvx&quot; data-ke-size=&quot;size16&quot;&gt;프로그램의&amp;nbsp;코드&amp;nbsp;표준은&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;이유로&amp;nbsp;프로그래밍에&amp;nbsp;있어서&amp;nbsp;중요성을&amp;nbsp;지닌다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BzEygG&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어의&amp;nbsp;생명주기에&amp;nbsp;있어서&amp;nbsp;비용의&amp;nbsp;80%&amp;nbsp;이상이&amp;nbsp;관리에&amp;nbsp;소요된다.&lt;/li&gt;
&lt;li&gt;코드&amp;nbsp;표준은&amp;nbsp;소프트웨어의&amp;nbsp;가독성(Readablity)을&amp;nbsp;높여&amp;nbsp;주며&amp;nbsp;개발자로&amp;nbsp;하여금&amp;nbsp;새로운&amp;nbsp;코드를&amp;nbsp;보다&amp;nbsp;빠르고&amp;nbsp;완벽하게&amp;nbsp;이해하도록&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;제품으로서&amp;nbsp;소스&amp;nbsp;코드를&amp;nbsp;납품해야&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;다른&amp;nbsp;제품과&amp;nbsp;마찬가지로&amp;nbsp;코드를&amp;nbsp;잘&amp;nbsp;정리하고&amp;nbsp;깔끔하게&amp;nbsp;해야&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;재&amp;nbsp;작업으로&amp;nbsp;발생하는&amp;nbsp;오류를&amp;nbsp;예방&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;li&gt;이를&amp;nbsp;위해&amp;nbsp;표준이&amp;nbsp;잘&amp;nbsp;적용되도록&amp;nbsp;하기&amp;nbsp;위해서는&amp;nbsp;&lt;b&gt;소프트웨어&amp;nbsp;작성자&amp;nbsp;모두가&amp;nbsp;코딩&amp;nbsp;표준을&amp;nbsp;반드시&amp;nbsp;준수&lt;/b&gt;해야&amp;nbsp;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;F0Mn186R&quot; data-toc-id=&quot;F0Mn186R&quot; data-block-id=&quot;PSclHE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2&amp;nbsp;코드&amp;nbsp;표준이&amp;nbsp;적용될&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;경우&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;O9Oha-&quot; data-ke-size=&quot;size16&quot;&gt;표준&amp;nbsp;적용에&amp;nbsp;예외가&amp;nbsp;발생하는&amp;nbsp;경우에는&amp;nbsp;표준을&amp;nbsp;저해하는&amp;nbsp;잠재적인&amp;nbsp;가능성&amp;nbsp;및&amp;nbsp;표준이&amp;nbsp;적용되기&amp;nbsp;이전에&amp;nbsp;발생한&amp;nbsp;어떤&amp;nbsp;조건이나&amp;nbsp;상황&amp;nbsp;및&amp;nbsp;대처방식을&amp;nbsp;문서화&amp;nbsp;해&amp;nbsp;놓으면,&amp;nbsp;다른&amp;nbsp;사람으로&amp;nbsp;하여금&amp;nbsp;표준을&amp;nbsp;지키지&amp;nbsp;않은&amp;nbsp;코드를&amp;nbsp;이해하는데&amp;nbsp;편리성을&amp;nbsp;제공하며&amp;nbsp;코드&amp;nbsp;표준을&amp;nbsp;보다&amp;nbsp;견실히&amp;nbsp;하는데&amp;nbsp;도움이&amp;nbsp;된다.&lt;/p&gt;
&lt;h1 id=&quot;RR9ymUIR&quot; data-toc-id=&quot;RR9ymUIR&quot; data-block-id=&quot;Nmy2H4&quot;&gt;&lt;b&gt;2. 명명 규칙(Naming Rule)&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;YXsx1x5J&quot; data-toc-id=&quot;YXsx1x5J&quot; data-block-id=&quot;bFCFYc&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1&amp;nbsp;일반&amp;nbsp;사항&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;OxR3Wr&quot; data-ke-size=&quot;size16&quot;&gt;언어 간의 혼란을 피하고 통합을 보장하려면 약어 사용과 관련된 다음 규칙을 따라야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;CrLjoJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업무 영역에 적합하게 정의된 용어를 사용한다.&lt;/li&gt;
&lt;li&gt;같은 유형에 명명할 때, 비슷한 명칭이나 대소문자만 다른 명칭 사용을 금지한다.&lt;/li&gt;
&lt;li&gt;자주 사용되는 JDK의 Package와 중복되지 않도록 한다. 또한 JDK 및 각 언어에서 사용하는 키워드와 중복되지 않아야 한다.&lt;/li&gt;
&lt;li&gt;약어 또는 축약어를 식별자 이름의 일부로 사용하지 않습니다. 예를 들어, getWin 대신 getWindow를 사용합니다.&lt;/li&gt;
&lt;li&gt;컴퓨팅 분야에서 일반적으로 받아 들여지지 않는 Prefix는 사용을 금지한다.&lt;/li&gt;
&lt;li&gt;적절한 경우에는 길이가 긴 구 이름 대신 잘 알려진 머리 글자어를 사용한다. 예를 들어, User Interface 대신 UI를 사용하고 On-line Analytical Processing 대신 OLAP를 사용합니다.&lt;/li&gt;
&lt;li&gt;명칭(Class, Method 등)의 길이는 31자 이내로 한다.&lt;/li&gt;
&lt;li&gt;동일한 변수명과 함수명을 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;명칭은 &amp;ldquo;_&amp;rdquo; 이외의 특수 문자를 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;중괄호는 시작 문장의 마지막 열에 삽입, 닫는 중괄호는 새로운 시작열에 삽입한다.(if문, else-if문, else문, for문, while문, do-while문, switch문, try-catch문)&lt;/li&gt;
&lt;li&gt;하나의 문장이 여러 줄로 작성될 경우 아래와 같은 규칙에 의해 행을 나눈다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;sQIW_N&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;80자 초과 시, 쉼표 다음 문자부터 새로운 행을 시작한다.&lt;/li&gt;
&lt;li&gt;이전 행과 동일한 수준의 표현식과 열을 맞춘다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot; data-block-id=&quot;NCiWIY&quot;&gt;&lt;code&gt;int result = getEmployees(recordsFromEmployeeTable, readCount,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recordsToEmployeeTable, writeCount);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;3IQLA6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열을 선언하는 경우 반드시 요소 수를 명시적으로 선언하거나 초기화에 의해 묵시적으로 결정되도록 한다.&lt;/li&gt;
&lt;li&gt;지역 변수는 선언과 동시에 초기화 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;2VL0Se&quot;&gt;&lt;code&gt;int&amp;nbsp;result&amp;nbsp;=&amp;nbsp;0;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;4HEJ3g&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 리터럴을 직접적으로 소스코드 안에 삽입하지 않는다.&lt;/li&gt;
&lt;li&gt;단항 연산자는 피연산자와 붙여 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;EYD1hf&quot;&gt;&lt;code&gt;var++;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;16BKeX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.(dot) 연산자를 제외한 모든 이항 연산자 전후는 공백으로 구분한다.&lt;/li&gt;
&lt;li&gt;조건부 연산자에서 &amp;ldquo;?&amp;rdquo; 연산자 앞에 이항 연산식이 나타날 경우 괄호로 구분한다.&lt;/li&gt;
&lt;li&gt;증감 연산자는 수식에서 다릉 연산자와 결합하여 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;3개 이상의 연산자를 사용하는 경우 괄호로 연산의 우선순위를 표현한다.&lt;/li&gt;
&lt;li&gt;Switch-case 문에서는 반드시 default 문을 작성하고 마지막 항목에 위치한다.&lt;/li&gt;
&lt;li&gt;For 문을 제어하는 수식에 실수 값을 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;반복문 내부에서 반복중단을 위한 break 문은 가능한 한번만 사용하도록 한다.&lt;/li&gt;
&lt;li&gt;if ~ else if 문은 반드시 else 문으로 끝나도록 한다.&lt;/li&gt;
&lt;li&gt;문자열 변수는 null로 초기화 하지 않는다.&lt;/li&gt;
&lt;li&gt;문자열 비교 시 ==를 사용 하지 말고 equals()를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cs&quot; data-block-id=&quot;G59VI1&quot;&gt;&lt;code&gt;if (&amp;ldquo;company&amp;rdquo;.equals(companyName)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;// some code
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dx4XwQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 맴버변수를 public으로 선언하지 않는다.&lt;/li&gt;
&lt;li&gt;패키즈를 import 할 때 &amp;ldquo;*&amp;rdquo;를 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;광범위한 예외 클래스인 Exception을 사용하여 예외처리 하지 않는다.&lt;/li&gt;
&lt;li&gt;예외를 처리할 때, 민감한 정보를 외부에 노출하지 않는다.&lt;/li&gt;
&lt;li&gt;널리 알려진 축약형을 사용할 때 첫 문자만 대문자를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot; data-block-id=&quot;UpY2zq&quot;&gt;&lt;code&gt;loadXmlDocument()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;F5xShK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비슷한 이름은 사용을 배제한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;cjQQlF&quot;&gt;&lt;code&gt;Object&amp;nbsp;persistentObject;
Object&amp;nbsp;persistentObjects;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tEGAZaD4&quot; data-toc-id=&quot;tEGAZaD4&quot; data-block-id=&quot;Uudnfp&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2&amp;nbsp;대문자&amp;nbsp;표시&amp;nbsp;스타일&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;-PvzpY&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;대문자&amp;nbsp;표시&amp;nbsp;스타일&amp;nbsp;규칙은&amp;nbsp;다음&amp;nbsp;세가지를&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;h3 id=&quot;-gghXuzd&quot; data-toc-id=&quot;-gghXuzd&quot; data-block-id=&quot;TxMsFk&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.1&amp;nbsp;Pascal&amp;nbsp;Case&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;0wkQK_&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자와&amp;nbsp;연결된&amp;nbsp;각&amp;nbsp;후속&amp;nbsp;단어의&amp;nbsp;첫번째&amp;nbsp;문자를&amp;nbsp;대문자로&amp;nbsp;표시&amp;nbsp;합니다.&amp;nbsp;세개&amp;nbsp;이상의&amp;nbsp;문자로&amp;nbsp;구성된&amp;nbsp;식별자에&amp;nbsp;파스칼식을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;_r9CeO&quot;&gt;&lt;code&gt;String&amp;nbsp;BackColor;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;lF1bRNah&quot; data-toc-id=&quot;lF1bRNah&quot; data-block-id=&quot;OeEqXw&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.2&amp;nbsp;Camel&amp;nbsp;Case&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;Npn4Wp&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자는&amp;nbsp;소문자로&amp;nbsp;표시하고&amp;nbsp;연결된&amp;nbsp;각&amp;nbsp;후속&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자는&amp;nbsp;대문자로&amp;nbsp;표시합니다.&lt;/p&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;6KSdn8&quot;&gt;&lt;code&gt;String&amp;nbsp;backColor;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;gwaAmK0q&quot; data-toc-id=&quot;gwaAmK0q&quot; data-block-id=&quot;rjdVRo&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.3&amp;nbsp;모두&amp;nbsp;대문자&amp;nbsp;표시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;ziRWvb&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;모든&amp;nbsp;문자를&amp;nbsp;대문자로&amp;nbsp;표시합니다.&amp;nbsp;이&amp;nbsp;규칙은&amp;nbsp;두개&amp;nbsp;이하의&amp;nbsp;문자로&amp;nbsp;구성된&amp;nbsp;식별자에만&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; data-block-id=&quot;9CiIC5&quot;&gt;&lt;code&gt;OLAP
LDAP&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;7y24sT&quot; data-ke-size=&quot;size16&quot;&gt;열거형&amp;nbsp;및&amp;nbsp;상수&amp;nbsp;값에&amp;nbsp;모두&amp;nbsp;대문자로&amp;nbsp;표시된&amp;nbsp;문자가&amp;nbsp;자주&amp;nbsp;사용되는&amp;nbsp;기존의&amp;nbsp;관리되지&amp;nbsp;않는&amp;nbsp;기호&amp;nbsp;스키마와의&amp;nbsp;호환성을&amp;nbsp;유지하기&amp;nbsp;위해&amp;nbsp;식별자를&amp;nbsp;대문자로&amp;nbsp;표시해야&amp;nbsp;하는&amp;nbsp;경우도&amp;nbsp;있습니다.&lt;br /&gt;일반적으로&amp;nbsp;이러한&amp;nbsp;기호는&amp;nbsp;해당&amp;nbsp;기호를&amp;nbsp;사용하는&amp;nbsp;어셈블리&amp;nbsp;외부에서는&amp;nbsp;표시될&amp;nbsp;수&amp;nbsp;없습니다.&lt;br /&gt;다음&amp;nbsp;표에서는&amp;nbsp;대문자&amp;nbsp;표시&amp;nbsp;규칙에&amp;nbsp;대해&amp;nbsp;간단히&amp;nbsp;설명하고&amp;nbsp;여러&amp;nbsp;형식의&amp;nbsp;식별자에&amp;nbsp;대한&amp;nbsp;예를&amp;nbsp;보여&amp;nbsp;줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;식별자&lt;/b&gt;&lt;b&gt;대문자 표시 규칙&lt;/b&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;minHs3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;클래스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;AppDomain&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;열거형 형식&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;ErrorLevel&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;열거형 값&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;FatalError&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;이벤트&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;ValueChange&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;읽기 전용 정적 필드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;RedValue&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;매서스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;toString&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;패키지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://java.io&quot;&gt;java.io&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;매개변수&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;typeName&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;GET/SET&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;getBackColor/setBackColor&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;kMt06LaP&quot; data-toc-id=&quot;kMt06LaP&quot; data-block-id=&quot;53OEy1&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.3&amp;nbsp;Package&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;slshTj&quot; data-ke-size=&quot;size16&quot;&gt;Java에서는&amp;nbsp;클래스를&amp;nbsp;논리적으로&amp;nbsp;그룹화하기&amp;nbsp;위해&amp;nbsp;계층화된&amp;nbsp;Package를&amp;nbsp;통해&amp;nbsp;분류한다.&lt;br /&gt;그러므로,&amp;nbsp;사전에&amp;nbsp;체계적으로&amp;nbsp;패키지를&amp;nbsp;잘&amp;nbsp;정의해&amp;nbsp;두는&amp;nbsp;것이&amp;nbsp;필수적이다.&lt;br /&gt;Package의&amp;nbsp;이름을&amp;nbsp;지정하기&amp;nbsp;위한&amp;nbsp;일반적인&amp;nbsp;규칙은&amp;nbsp;&lt;b&gt;국가.조직분류.회사&lt;/b&gt;&amp;nbsp;이름&amp;nbsp;다음에&amp;nbsp;기술&amp;nbsp;이름과&amp;nbsp;선택적&amp;nbsp;요소로&amp;nbsp;기능&amp;nbsp;및&amp;nbsp;디자인을&amp;nbsp;차례로&amp;nbsp;사용하는&amp;nbsp;것이다.&lt;br /&gt;예를&amp;nbsp;들면&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;&lt;b&gt;국가.조직분류.회사명.기술-제품명.하위제품명-모듈&lt;/b&gt;&amp;nbsp;등을&amp;nbsp;마침표(.)를&amp;nbsp;통해&amp;nbsp;구분한다.&amp;nbsp;이때,&amp;nbsp;각&amp;nbsp;이름은&amp;nbsp;캐멀식을&amp;nbsp;사용해야&amp;nbsp;한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;JB95rb&quot;&gt;&lt;code&gt;kr.co.company.[feature-technology Name].[module]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;yy2gx5&quot; data-ke-size=&quot;size16&quot;&gt;본&amp;nbsp;표준에서는&amp;nbsp;업무용&amp;nbsp;시스템에&amp;nbsp;맞게&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;Package&amp;nbsp;구조를&amp;nbsp;따르기를&amp;nbsp;권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수준&lt;/b&gt;&lt;b&gt;내용&lt;/b&gt;&lt;b&gt;고정값 / 예제&lt;/b&gt;&lt;b&gt;생략&amp;nbsp;가능&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;R9aTYj&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;국가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;kr, en 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;조직분류&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;com, co, go 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;회사&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;회사명&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;어플리케이션/시스템명&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;제품명, 프로젝트명 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모듈&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모듈명 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;zAevg5ro&quot; data-toc-id=&quot;zAevg5ro&quot; data-block-id=&quot;khQ79n&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.4&amp;nbsp;Class&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;LgfPSB&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;클래스&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AdEfdc&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 이름에는 명사 또는 명사구를 사용합니다.&lt;/li&gt;
&lt;li&gt;파스칼식 대문자 표시 스타일을 사용합니다.&lt;/li&gt;
&lt;li&gt;Java의 naming rule에 따라 Class의 이름은 명사를 사용하고, 첫 문자는 대문자로 시작을 하며 Internal word의 첫 번째 문자는 대문자를 사용합니다.&lt;/li&gt;
&lt;li&gt;약어는 꼭 필요한 경우에만 사용합니다.&lt;/li&gt;
&lt;li&gt;클래스 이름에는 클래스를 나타내는 C 등의 형식 접두사를 사용하지 않습니다. 예를 들어 CFileStream 대신 FileStream을 사용합니다.&lt;/li&gt;
&lt;li&gt;밑줄(_)를 사용하지 않습니다.&lt;/li&gt;
&lt;li&gt;시스템 및 서브시스템을 표시할 수 있는 Prefix를 사용하거나 Class의 특징을 나타내는 Suffix를 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Prefix는 시스템의 특징을 나타내는(구별하는) 취지에서 사용합니다.&lt;/li&gt;
&lt;li&gt;Suffix는 파일구조에서 말하는 확장자가 아니고, 클래스이름을 정할 때 이름의 끝에 들어가는 접미사로 파일의 클래스의 특징 및 해당 이름을 가진 코드들의 기능(데이터삭제, 등록, 조회 등)을 구별하는 취지에서 사용합니다.&lt;/li&gt;
&lt;li&gt;서브시스템이 존재하는 프로젝트에서는 Prefix로 서브시스템을 나타내는 문자를 사용할 것을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;8tghLif9&quot; data-toc-id=&quot;8tghLif9&quot; data-block-id=&quot;xHPvt3&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.5&amp;nbsp;Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;gGP2iO&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;인터페이스&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5C5-cQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스 이름을 지정할 때는 명사 또는 명사구나 동작을 설명하는 형용사를 사용합니다.&lt;/li&gt;
&lt;li&gt;예를 들어, Component라는 인터페이스 이름에서는 설명적인 명사를 사용합니다.&lt;/li&gt;
&lt;li&gt;또한 CustomAttributeProvider라는 인터페이스 이름에서는 명사구를 사용하며, Persistable라는 이름에서는 형용사를 사용합니다.&lt;/li&gt;
&lt;li&gt;파스칼식 대문자 표시 스타일을 사용합니다.&lt;/li&gt;
&lt;li&gt;약어는 꼭 필요한 경우에만 사용합니다.&lt;/li&gt;
&lt;li&gt;클래스가 인터페이스의 표준 구현인 경우 해당 클래스/인터페이스 쌍을 정의할 땐느 유사한 이름을 사용합니다. 클래스 이름에 Impl 접미사가 있는 점만 제외하고 두 이름은 동일해야 합니다.&lt;/li&gt;
&lt;li&gt;밑줄(_)을 사용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;3wQ1lu&quot;&gt;&lt;code&gt;public interface CodeService {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Implementation code goes here.
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;a2L9I7&quot;&gt;&lt;code&gt;//&amp;nbsp;인터페이스
public interface CodeService {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Implementation code goes here.
}

//&amp;nbsp;인터페이스&amp;nbsp;구현&amp;nbsp;클래스
public class CodeServiceImpl implements CodeService {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Implementation code goes here.
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;IvsL9hqa&quot; data-toc-id=&quot;IvsL9hqa&quot; data-block-id=&quot;QXmplx&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.6&amp;nbsp;Method&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;aKzjn0&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;클래스의&amp;nbsp;멤버&amp;nbsp;메서드&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;FdcTIF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메소드는 동사를 사용합니다.&lt;/li&gt;
&lt;li&gt;첫 번째 문자는 소문자로 나타냅니다.&lt;/li&gt;
&lt;li&gt;여러 단어가 조합될 경우 조합되는 단어의 첫 번째 문자는 대문자로 시작되어야 합니다.&lt;/li&gt;
&lt;li&gt;get / set 메서드
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;PgOmnb&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 멤버변수 접근(Access)을 위한 get / set 뒤에 멤버변수명을 쓰는 것을 원칙으로 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메서드 명은 동사형으로 시작하며 동사 + 목적어 형태로 기술합니다.&lt;/li&gt;
&lt;li&gt;메서드 명은 구체적인 용어로 표기하지 않고, 일반적인 메시지 형태로 표기합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;72pUxt&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘못된 예) saveToDB() &amp;ndash; DB같은 구체적인 용어를 사용하지 말고 일반적인 메시지 형태로 표기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;_Rmrmc&quot;&gt;&lt;code&gt;//&amp;nbsp;get / set 메서드
private String name = null;
public String getName() {
&amp;nbsp; &amp;nbsp; return name;
}
public void setName(String name) {
&amp;nbsp; &amp;nbsp; this.name = name;
}

//&amp;nbsp;그 밖의 메서드
create(), checkOut(), attachToDesk(), fileTransfer(), run() 등&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;HeJv70D2&quot; data-toc-id=&quot;HeJv70D2&quot; data-block-id=&quot;cgn4Zr&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.7&amp;nbsp;변수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;nGrr0H&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;변수&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Vgixty&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 문자는 소문자로 나타냅니다.&lt;/li&gt;
&lt;li&gt;변수 및 필드 이름에는 헝가리어 표기법 접두사를 사용하지 않습니다. 단, 임시변수는 헝가리안 표기법으로 작성합니다.&lt;/li&gt;
&lt;li&gt;여러 단어가 조합될 경우 조합되는 단어의 첫 번째 문자는 대문자로 시작되어야 합니다.&lt;/li&gt;
&lt;li&gt;변수명의 시작을 밑줄문자(_) 또는 $ 문자로 사용하지 말아야 합니다.&lt;/li&gt;
&lt;li&gt;변수명은 짧으면서도 충분히 의미가 느껴지도록 하고, 뇌리에 선명하게 남도록 하는 것을 정해야 합니다.&lt;/li&gt;
&lt;li&gt;Collection type의 변수 이거나 배열인 경우 복수로 표현한다.&lt;/li&gt;
&lt;li&gt;멤버 변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MgBJ_8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멤버 변수라 함은 메서드 외부에서 정의하는 변수를 의미한다.&lt;/li&gt;
&lt;li&gt;final&amp;nbsp;상수&amp;nbsp;제외&amp;nbsp;: 상수에&amp;nbsp;대한&amp;nbsp;규칙은&amp;nbsp;&lt;b&gt;2.8&amp;nbsp;상수&lt;/b&gt;&amp;nbsp;참고&lt;/li&gt;
&lt;li&gt;접근자(Access&amp;nbsp;Modifier)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;59GQnA&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 멤버변수 영역은 protected를 원칙으로 한다.&lt;/li&gt;
&lt;li&gt;Protected로 선언된 멤버변수가 하위 클래스를 제외한 다른 클래스에서 사용될 때는 get / set 메서드를 사용하도록 한다.&lt;/li&gt;
&lt;li&gt;변수의 특징에 따라 Access Modifier는 변경될 수 있다.(get / set 메서드에 대한 규칙&amp;nbsp;&lt;b&gt;2.6&amp;nbsp;Method&lt;/b&gt;&amp;nbsp;참고)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;processing&quot; data-block-id=&quot;wWV0Rq&quot;&gt;&lt;code&gt;protected&amp;nbsp;int&amp;nbsp;objID;
private&amp;nbsp;Table&amp;nbsp;tableTab;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;yInCb4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬&amp;nbsp;변수라&amp;nbsp;함은&amp;nbsp;Method&amp;nbsp;내에&amp;nbsp;정의하는&amp;nbsp;변수를&amp;nbsp;의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MhAYJm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬&amp;nbsp;변수의&amp;nbsp;첫&amp;nbsp;문자는&amp;nbsp;소문자로&amp;nbsp;사용하고,&amp;nbsp;여러&amp;nbsp;단어가&amp;nbsp;조합될&amp;nbsp;경우&amp;nbsp;조합되는&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자는&amp;nbsp;대문자로&amp;nbsp;시작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;wVE0ND&quot;&gt;&lt;code&gt;float myWidth;
String userID;
int seq;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;0qAQEB&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임시&amp;nbsp;변수라&amp;nbsp;함은&amp;nbsp;loop&amp;nbsp;&amp;nbsp;문이나&amp;nbsp;condition&amp;nbsp;문에서&amp;nbsp;임시로&amp;nbsp;사용하는&amp;nbsp;변수를&amp;nbsp;의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Hisq6F&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임시변수는&amp;nbsp;헝가리안&amp;nbsp;표기법(Hungarian Notation)으로&amp;nbsp;작성합니다.&lt;/li&gt;
&lt;li&gt;한&amp;nbsp;개의&amp;nbsp;문자로&amp;nbsp;변수명을&amp;nbsp;구성하는&amp;nbsp;것은&amp;nbsp;임시&amp;nbsp;변수인&amp;nbsp;경우에만&amp;nbsp;사용하며,&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;정의한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gml&quot; data-block-id=&quot;zO5FyH&quot;&gt;&lt;code&gt;i, j, k, l&amp;nbsp;//&amp;nbsp;정수형
c, d //&amp;nbsp;문자형 임시 변수
x, y, z&amp;nbsp;//&amp;nbsp;좌표
e //&amp;nbsp;예외
g //&amp;nbsp;그래픽
o //&amp;nbsp;객체
s&amp;nbsp;//&amp;nbsp;문자열&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wJV-Xka3&quot; data-toc-id=&quot;wJV-Xka3&quot; data-block-id=&quot;ahIVpm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.8&amp;nbsp;상수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;vV6UEQ&quot; data-ke-size=&quot;size16&quot;&gt;클래스&amp;nbsp;상수&amp;nbsp;또는&amp;nbsp;일반&amp;nbsp;상수로&amp;nbsp;정의된&amp;nbsp;변수명은&amp;nbsp;&lt;b&gt;Snake&amp;nbsp;Case를&amp;nbsp;사용&lt;/b&gt;한다.&amp;nbsp;즉,&amp;nbsp;단어&amp;nbsp;간의&amp;nbsp;밑줄문자(_)로&amp;nbsp;분리되는&amp;nbsp;대문자&amp;nbsp;사용한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;UBWx-D&quot;&gt;&lt;code&gt;static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Lo5vNg9A&quot; data-toc-id=&quot;Lo5vNg9A&quot; data-block-id=&quot;JheKEE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.9&amp;nbsp;파라미터(인자)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;liN768&quot; data-ke-size=&quot;size16&quot;&gt;생성자(Constructor)나&amp;nbsp;set&amp;nbsp;Method에서&amp;nbsp;멤버&amp;nbsp;필드에&amp;nbsp;값을&amp;nbsp;지정할&amp;nbsp;때,&amp;nbsp;파라미터&amp;nbsp;이름은&amp;nbsp;멤버&amp;nbsp;필드&amp;nbsp;이름과&amp;nbsp;동일하게&amp;nbsp;부여&amp;nbsp;한다.(this&amp;nbsp;키워드&amp;nbsp;사용)&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;ZCdRIu&quot;&gt;&lt;code&gt;public class Dude {
&amp;nbsp;&amp;nbsp; &amp;nbsp; private String name;
&amp;nbsp;&amp;nbsp; &amp;nbsp; public Dude(String name) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name;
&amp;nbsp;&amp;nbsp; &amp;nbsp; }
&amp;nbsp;&amp;nbsp; &amp;nbsp; public void setName(String name) {
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name;
&amp;nbsp;&amp;nbsp; &amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;jj98pCMp&quot; data-toc-id=&quot;jj98pCMp&quot; data-block-id=&quot;YetL9Z&quot;&gt;&lt;b&gt;3. 주석 사용 지침&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;jUo-zcOt&quot; data-toc-id=&quot;jUo-zcOt&quot; data-block-id=&quot;zsv5vU&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1&amp;nbsp;일반&amp;nbsp;사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BFIHev&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 코드만 가지고는 정확하게 코드가 의미하는 바가 무엇인지 이해하기 힘들다.&lt;/li&gt;
&lt;li&gt;주석(Comment)은 코드에 추가적인 설명을 달아서 코드를 보다 읽기 쉽게 만들어 준다.&lt;/li&gt;
&lt;li&gt;여기에서는 개발자들이 준수해야 하는 주석 사용 지침을 설명한다.&lt;/li&gt;
&lt;li&gt;코드에 장식을 하지 않는다(배너식의 주석 사용을 자제한다.)&lt;/li&gt;
&lt;li&gt;주석은 가능한 단순하게 한다.&lt;/li&gt;
&lt;li&gt;코드 작성 이전에 주석부터 작성한다.&lt;/li&gt;
&lt;li&gt;&amp;lsquo;무엇이 되었다&amp;rsquo;가 아니라 &amp;lsquo;무엇이 이러한 이유로 이렇게 되었다&amp;rsquo; 식으로 작성한다.&lt;/li&gt;
&lt;li&gt;주석 위치는 클래스의 시작, 각 메서드 선언의 바로 위에 한다.&lt;/li&gt;
&lt;li&gt;메서드 내부에서도 단계별로 구분지어서 설명할 필요가 있을 때도 주석을 작성한다.&lt;/li&gt;
&lt;li&gt;변수 하나의 의미를 쓰는 주석 등은 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;변수 이름을 명확하게 주어서 주석&amp;nbsp;작성의&amp;nbsp;필요를&amp;nbsp;제거한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aTj0YY1H&quot; data-toc-id=&quot;aTj0YY1H&quot; data-block-id=&quot;l0c2RI&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2&amp;nbsp;주석의&amp;nbsp;종류&amp;nbsp;및&amp;nbsp;사용방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주석의 종류&lt;/b&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;BXywf-&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;2&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;문서화 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;4&quot;&gt;&lt;span&gt;코드구현 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;블록주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Single-line 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;/* */&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Trailing 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;소스코드 + /* */&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;End-of-Line 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;//&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;qkWqtl0V&quot; data-toc-id=&quot;qkWqtl0V&quot; data-block-id=&quot;qLcj_D&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.1&amp;nbsp;기본&amp;nbsp;원칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hrjnjl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스(또는 인터페이스), 메서드, 멤버 변수의 주석으로는 JavaDoc 주석 사용을 권장한다.&lt;/li&gt;
&lt;li&gt;메서드 안의 코드 설명 또는 로컬변수의 주석으로는 단일라인 주석만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3QPY0zcg&quot; data-toc-id=&quot;3QPY0zcg&quot; data-block-id=&quot;CL9Mv2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.2&amp;nbsp;문서화&amp;nbsp;주석&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;mjdLJbPk&quot; data-toc-id=&quot;mjdLJbPk&quot; data-block-id=&quot;p6BaSF&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2.2.1&amp;nbsp;Class&amp;nbsp;Comments&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;yt55E_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 소스의 가장 앞 부분에 다음과 같이 클래스 이름, 하는 작업, 작성일 Comments와 버전정보, 작성자를 명기한다.&lt;/li&gt;
&lt;li&gt;여기서 작성일과 작성자의 다음의 괄호 부분엔 수정일과 수정자의 이름이 명기되며 수정일 뒤에는 수정이유를 간단하게 밝힌다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gherkin&quot; data-block-id=&quot;30E-W_&quot;&gt;&lt;code&gt;/**
 * &amp;lt;pre&amp;gt;
 * 각종 문자열, 스트링, 데이트 형식에 따른 유틸리티
 * &amp;lt;/pre&amp;gt;
 *
 * @author Company.co., Ltd
 * @version
 * &amp;lt;ul&amp;gt;
 *     &amp;lt;li&amp;gt;1.0.0 (2025.03.28) 홍길동(test@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt; 
 * &amp;lt;/ul&amp;gt;
 * @code &amp;lt;pre&amp;gt;{@code
 * @Autowired
 * private FormatUtil formatUtil;
 * }&amp;lt;/pre&amp;gt;
 * @since 2025.03.28
 */&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;wP396R-U&quot; data-toc-id=&quot;wP396R-U&quot; data-block-id=&quot;P4tJJa&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2.2.2&amp;nbsp;Method&amp;nbsp;Comment&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;gherkin&quot; data-block-id=&quot;rYOmBa&quot;&gt;&lt;code&gt;/**
 * &amp;lt;pre&amp;gt;
 * 현재 실행 중인 스레드의 ClassLoader 객체를 반환하며, 만약 해당 스레드에 ClassLoader 객체가 설정되지 않은 경우, 대체 객체(defaultObject)의 클래스에 대한 ClassLoader 객체를 반환
 * &amp;lt;/pre&amp;gt;
 *
 * @param defaultObject 대체 객체
 * @return the class loader
 * @code &amp;lt;pre&amp;gt;{@code
 * @Autowired
 * this.getCurrentClassLoader(params)
 * }&amp;lt;/pre&amp;gt;
 * @history
 * &amp;lt;ul&amp;gt;
 *     &amp;lt;li&amp;gt;2025.03.28 홍길동(test@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt;
 * &amp;lt;/ul&amp;gt;
 */&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;XiVx0IvB&quot; data-toc-id=&quot;XiVx0IvB&quot; data-block-id=&quot;KOOCsd&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.3&amp;nbsp;단일&amp;nbsp;라인&amp;nbsp;주석(Single&amp;nbsp;Line&amp;nbsp;Comment)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ccMa3w&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;// 로 시작하며, 해당 라인의 끝까지 적용된다.&lt;/li&gt;
&lt;li&gt;설명하고자 하는 코드의 바로 윗줄이나, 코드와 같은 라인의 오른쪽에 작성한다.&lt;/li&gt;
&lt;li&gt;하나의 라인이나 한 라인의 일부를 주석처리해서 컴파일&amp;nbsp;되지 않도록 임시로 막을때로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;oHSmhU&quot;&gt;&lt;code&gt;public class FileStream {
&amp;nbsp; &amp;nbsp; // 여기에 코드를 입력하세요.
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;qnTzAtCq&quot; data-toc-id=&quot;qnTzAtCq&quot; data-block-id=&quot;_yRAEV&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.4&amp;nbsp;블럭&amp;nbsp;주석(Block&amp;nbsp;Comment)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;UhXIjF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/* 로 시작하여 */ 까지 적용된다.&lt;/li&gt;
&lt;li&gt;메서드안에서는 단일라인 주석을 사용한다.&lt;/li&gt;
&lt;li&gt;짧은 내용의 주석을 다음 라인에 기술될 코드이 들여쓰기에 맞춰서 한 라인에 표현할 수 도 있다.&lt;/li&gt;
&lt;li&gt;만약 한 라인에 다 표현하지 못 할 경우에는 블록주석 방식을 사용한다.&lt;/li&gt;
&lt;li&gt;한줄 또는 여러 줄을 주석처리하거나, 코드의 블록이 컴파일 되지 않게 임시로 막을 때로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;4NUKDR&quot;&gt;&lt;code&gt;public class FileStream {
&amp;nbsp; &amp;nbsp; /*
&amp;nbsp; &amp;nbsp; 여기에 코드를
&amp;nbsp; &amp;nbsp; 입력하세요.
&amp;nbsp; &amp;nbsp; */
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;AYAYN4XB&quot; data-toc-id=&quot;AYAYN4XB&quot; data-block-id=&quot;tRh5lo&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.5&amp;nbsp;Trailing&amp;nbsp;comment&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;D3OJv-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매우 짧은 주석으로 사용할 수 있는 코드로써 같은 라인에 나타낼 수 있지만 코드를 문(statement)으로부터 분리하기 위해서는 충분히 떨어져야&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;만일 하나 이상의 짧은 주석이 큰 덩어리의 코드로 나타날 경우 동일한 위치에서 들여쓰기를 하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-block-id=&quot;CITNAb&quot;&gt;&lt;code&gt;if(a==2) {
&amp;nbsp; &amp;nbsp; return true;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* special case */
} else {
&amp;nbsp; &amp;nbsp; return isPrime(a); &amp;nbsp; &amp;nbsp; /* works only for odd a */
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;Io7O21F-&quot; data-toc-id=&quot;Io7O21F-&quot; data-block-id=&quot;R78XpF&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.6&amp;nbsp;End-of-Line&amp;nbsp;Comment&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;kVBHvg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;//&amp;rdquo; comment delimiter는 라인 전체 또는 일부를 주석으로 처리 할 수 있으며 &amp;ldquo;//&amp;rdquo;는 문장 주석을 위한 연속한 여러 라인에 사용되어서는 안된다.&lt;/li&gt;
&lt;li&gt;단, 코드의 특정섹션을 처리하기 위해서는 연속한 라인에 사용&amp;nbsp;되어도 무방하다.&lt;/li&gt;
&lt;li&gt;변수선언 후 변수에 대한 설명으로 사용하거나 또는 특정라인에 대한 설명으로 사용한다.&lt;/li&gt;
&lt;li&gt;복잡한 제어구조에서 각 제어문의 끝을 나타내기 위해서 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gcode&quot; data-block-id=&quot;iD7_CT&quot;&gt;&lt;code&gt;for(&amp;hellip;) {
&amp;nbsp; &amp;nbsp; while(&amp;hellip;){
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(&amp;hellip;) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(&amp;hellip;) {
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;hellip;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } // end switch
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } // end if
&amp;nbsp; &amp;nbsp; } // end while
} // end for&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;jQhamOBX&quot; data-toc-id=&quot;jQhamOBX&quot; data-block-id=&quot;ErIWw5&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.3 IntelliJ Class/Method Comment Template 설정 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;qxOf6cIs&quot; data-toc-id=&quot;qxOf6cIs&quot; data-block-id=&quot;5Jy-qW&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3.1 Class&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;MpLrPc&quot; data-ke-size=&quot;size16&quot;&gt;아래 그림과 같이 설정&amp;gt; 도구&amp;gt; JavaDoc&amp;gt; Templates 이동 후 Class level Regular expression 설정 변경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;e2jmW8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.+ : 목록 순서를 첫번째로 변경&lt;/li&gt;
&lt;li&gt;개발자_이름 : 본인 이름 입력&lt;/li&gt;
&lt;li&gt;이메일 계정 : 본인 이메일 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-block-id=&quot;dQULq6&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;/**\n
* &amp;lt;pre&amp;gt;\n
* 여기에 설명을 작성하세요.\n
* &amp;lt;/pre&amp;gt;\n
* @apiNote (선택)API 사용자(개발자)가 알아야 할 중요한 사항을 기록\n
* @implSpec (선택)구현 클래스가 반드시 따라야 할 규칙을 명시\n
* @implNote (선택)구현 방식을 변경할 때 고려해야 할 점 등을 설명\n
* @since ${.now?string('yyyy.MM.dd')}\n
* @author Company.co., Ltd\n
* @version\n
* &amp;lt;ul&amp;gt;\n
*     &amp;lt;li&amp;gt;1.0.0 (${.now?string('yyyy.MM.dd')}) 개발자_이름(이메일_계정@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt;\n
* &amp;lt;/ul&amp;gt;\n
* @code &amp;lt;pre&amp;gt;{@code\n
*  }&amp;lt;/pre&amp;gt;\n
&amp;lt;#if element.typeParameters?has_content&amp;gt;        * \n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.typeParameters as typeParameter&amp;gt;
        * @param &amp;lt;${typeParameter.name}&amp;gt; the type parameter\n
&amp;lt;/#list&amp;gt;
*/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;MzloiyNX&quot; data-toc-id=&quot;MzloiyNX&quot; data-block-id=&quot;RcNejU&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3.2 Method&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;vderei&quot; data-ke-size=&quot;size16&quot;&gt;아래 그림과 같이 설정&amp;gt; 도구&amp;gt; JavaDoc&amp;gt; Templates 이동 후 Method level Regular expression 설정 변경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RluJyH&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.+ : 목록 순서를 첫번째로 변경&lt;/li&gt;
&lt;li&gt;개발자_이름 : 본인 이름 입력&lt;/li&gt;
&lt;li&gt;이메일 계정 : 본인 이메일 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dust&quot; data-block-id=&quot;ZW1Wz_&quot;&gt;&lt;code&gt;/**\n
 * &amp;lt;pre&amp;gt;\n
 * 여기에 Method 설명을 작성하세요.\n
 * &amp;lt;/pre&amp;gt;\n
&amp;lt;#if element.typeParameters?has_content&amp;gt;         * \n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.typeParameters as typeParameter&amp;gt;
         * @param &amp;lt;${typeParameter.name}&amp;gt; the type parameter\n
&amp;lt;/#list&amp;gt;
&amp;lt;#if element.parameterList.parameters?has_content&amp;gt;
         *\n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.parameterList.parameters as parameter&amp;gt;
         * @param ${parameter.name} the ${paramNames[parameter.name]}\n
&amp;lt;/#list&amp;gt;
&amp;lt;#if isNotVoid&amp;gt;
         *\n
         * @return the ${return}\n
&amp;lt;/#if&amp;gt;
&amp;lt;#if element.throwsList.referenceElements?has_content&amp;gt;
         *\n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.throwsList.referenceElements as exception&amp;gt;
         * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&amp;lt;/#list&amp;gt;
 * @code &amp;lt;pre&amp;gt;{@code\n
 * 여기에 Method 사용법을 작성하세요.\n
 * }&amp;lt;/pre&amp;gt;\n
 * @history\n
 * &amp;lt;ul&amp;gt;\n
 *     &amp;lt;li&amp;gt;${.now?string('yyyy.MM.dd')} 개발자_이름(이메일_계정@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt;\n
 * &amp;lt;/ul&amp;gt;\n
 */&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;lOyrN6n8&quot; data-toc-id=&quot;lOyrN6n8&quot; data-block-id=&quot;0pL41T&quot;&gt;&lt;b&gt;4. 선언(Declaration)&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;zAzi7kKo&quot; data-toc-id=&quot;zAzi7kKo&quot; data-block-id=&quot;1XZexc&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.1&amp;nbsp;Number&amp;nbsp;per&amp;nbsp;Line&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;LwIF_6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 라인당 하나의 선언이 추천되는데 이는 주석을 달기 좋기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot; data-block-id=&quot;03W3jy&quot;&gt;&lt;code&gt;int level; // indentation level
int size; // size of table
object currentEntry; // currently selected table entry&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;QgMlVD&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래의 코드보다 위의 코드가 가독성이 편리하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;LxE4eF&quot;&gt;&lt;code&gt;int level, size;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;vEps1x&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 예처럼 서로 다른 유형을 동일라인에 표현하는 것은 피해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;CDGih4&quot;&gt;&lt;code&gt;int foo, fooArray[]; // wrong!&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Xb4hrpBy&quot; data-toc-id=&quot;Xb4hrpBy&quot; data-block-id=&quot;Cp-RNe&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.2&amp;nbsp;배치&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BQDb9C&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선언문의 배치는 블록의 제일 앞에 배치한다.&lt;/li&gt;
&lt;li&gt;여기서 블록이란 중괄호&amp;rdquo;{&amp;ldquo;, &amp;ldquo;}&amp;rdquo;로 둘러쌓인 모든 코드를 말한다.&lt;/li&gt;
&lt;li&gt;선언문이 블록의 중간에 나타나는 것은 좋은 방법이 아니다.&lt;/li&gt;
&lt;li&gt;상위 레벨의 선언을 무효화 시키는 지역선언은 배제되어야 하며 예를 들어 내부 블록내에 동일한 변수명을 선언하는 것은 좋지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;axapta&quot; data-block-id=&quot;-YywsX&quot;&gt;&lt;code&gt;int count;
&amp;hellip;
myMethod() {
&amp;nbsp; &amp;nbsp; if(condition) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int count&amp;nbsp;=&amp;nbsp;0; // AVOID!
&amp;nbsp; &amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;VwIRI-GI&quot; data-toc-id=&quot;VwIRI-GI&quot; data-block-id=&quot;hwrEBm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.3&amp;nbsp;클래스와&amp;nbsp;인터페이스&amp;nbsp;및&amp;nbsp;배열&amp;nbsp;선언&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;FbxKsC&quot; data-ke-size=&quot;size16&quot;&gt;클래스나&amp;nbsp;인터페이스를&amp;nbsp;개발&amp;nbsp;할&amp;nbsp;때에는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;구성&amp;nbsp;원칙을&amp;nbsp;따른다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;km_TYn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드는 이름과 파라메터 목록이 시작되는 괄호&amp;rdquo;(&amp;ldquo; 사이에는 공백을 두지 않는다.&lt;/li&gt;
&lt;li&gt;열린 중괄호(opening brace, &amp;ldquo;{&amp;ldquo;)는 선언문과 같은 라인에 위치한다.&lt;/li&gt;
&lt;li&gt;닫힌 중괄호(closing brace, &amp;ldquo;}&amp;rdquo;)는 열린 중괄호와 상응하도록 들여쓰기를 적용하되 열린 중괄호 뒤가 null 문장인 경우에는 닫힌 중괄호가 바로 대치되도록 한다.&lt;/li&gt;
&lt;li&gt;메서드는 공백라인에 의해 분리된다.&lt;/li&gt;
&lt;li&gt;상황에 따라서는 열린 중괄호를 선언문 다름 라인에 위치 할 수도 있다.&lt;/li&gt;
&lt;li&gt;배열선은은 타입 바로 다음에 배열기로&amp;rdquo;[ ]&amp;rdquo;가 오게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;0GNVO_I-&quot; data-toc-id=&quot;0GNVO_I-&quot; data-block-id=&quot;EHThZu&quot;&gt;&lt;b&gt;5. 공백 및 들여쓰기&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;ON0Peoc8&quot; data-toc-id=&quot;ON0Peoc8&quot; data-block-id=&quot;bYeI7C&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.1&amp;nbsp;공백&amp;nbsp;라인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;oovuQi&quot; data-ke-size=&quot;size16&quot;&gt;공백&amp;nbsp;라인은&amp;nbsp;논리적으로&amp;nbsp;관련된&amp;nbsp;코드&amp;nbsp;섹션을&amp;nbsp;분리하여&amp;nbsp;가독성을&amp;nbsp;향상&amp;nbsp;시킨다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ZLjq0H&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두줄의 공백 라인은 다음 상황에서만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;jl-Ref&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;소스파일의 섹션 구분&lt;/li&gt;
&lt;li&gt;클래스나 인터페이스의 정의 구분&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SkSyYu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한줄의 공백 라인은 다음의 상황에서만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;2AieMZ&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메서드의 구분&lt;/li&gt;
&lt;li&gt;메서드 내의 지역변수와 첫 문장 구분&lt;/li&gt;
&lt;li&gt;블록 주석 또는 단일문 주석의 앞&lt;/li&gt;
&lt;li&gt;가독성 향상을 위해 메서드 내의 논리 섹션간의 구분&lt;/li&gt;
&lt;li&gt;package 선언 후&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;QRyLIgp3&quot; data-toc-id=&quot;QRyLIgp3&quot; data-block-id=&quot;zRr8Mv&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.2&amp;nbsp;공백&amp;nbsp;문자&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;19X9aT&quot; data-ke-size=&quot;size16&quot;&gt;공백&amp;nbsp;문자는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;상황에서&amp;nbsp;사용된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oLnM51&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매개변수 목록에서 콤마(,) 다음에 공백문자를 사용한다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;.&amp;rdquo;를 제외한 모든 Binary 연산자는 Operand로부터 공백문자를 통해 분리되며 공백문자는 단항연산자(unary), minus(&amp;ldquo;-&amp;ldquo;), increment(&amp;ldquo;++&amp;rdquo;), decrement(&amp;ldquo;--&amp;ldquo;)등과 같은 단항연산자를 operend로부터 분리해서는 안된다.&lt;/li&gt;
&lt;li&gt;for 문 내의 표현식은 공백문자에 의해 분리되어야 한다.&lt;/li&gt;
&lt;li&gt;형 변환에 공백문자를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;35XJjBkU&quot; data-toc-id=&quot;35XJjBkU&quot; data-block-id=&quot;81zVSW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.3&amp;nbsp;줄&amp;nbsp;간&amp;nbsp;이어&amp;nbsp;쓰기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;RajRxM&quot; data-ke-size=&quot;size16&quot;&gt;들여쓰기의 단위로는 공백문자(Space) 4개를 이용하며, &lt;b&gt;Tabs은 4개의 공백문자로 설정&lt;/b&gt;하며,&amp;nbsp;한 라인에 표현되기 어려운 문장의 경우에는 다음 일반원칙에 따라 라인을 분리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;m9pVLZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Comma(&amp;ldquo;,&amp;rdquo;)뒤에서 분리&lt;/li&gt;
&lt;li&gt;연산자 다음에 분리&lt;/li&gt;
&lt;li&gt;레벨에 있어서는 하위 레벨보다는 상위 레벨에서 분리&lt;/li&gt;
&lt;li&gt;새 라인은 이전 동일 레벨에 있는 표현문장의 시작위치에 맞추어야 한다.&lt;/li&gt;
&lt;li&gt;만약 위 원칙이 코드를 혼란케 하거나 오른쪽 여백을 손상케 하는 경우에는 그냥 2개의 공백문자를 이용하여 들여쓰기를 하여야 한다.&lt;/li&gt;
&lt;li&gt;조건문 작성시 조건문이 길어질 경우 조건당 한줄로 작성한다.&lt;/li&gt;
&lt;li&gt;If 조건절의 줄간 이어쓰기는 일반적으로 2개의 공백문자를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;sgfi5DwG&quot; data-toc-id=&quot;sgfi5DwG&quot; data-block-id=&quot;7iVb7U&quot;&gt;6. 기타&lt;/h1&gt;
&lt;h2 id=&quot;CMKUSoOh&quot; data-toc-id=&quot;CMKUSoOh&quot; data-block-id=&quot;5KsdHb&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.1&amp;nbsp;인스턴스와&amp;nbsp;클래스&amp;nbsp;변수에&amp;nbsp;대한&amp;nbsp;접근&amp;nbsp;허용&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RTEqr5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스&amp;nbsp;변수에&amp;nbsp;대한&amp;nbsp;public&amp;nbsp;&amp;nbsp;접근은&amp;nbsp;사능한&amp;nbsp;허용해서는&amp;nbsp;안된다.&lt;/li&gt;
&lt;li&gt;대체로&amp;nbsp;인스턴스&amp;nbsp;변수는&amp;nbsp;명시적으로&amp;nbsp;값을&amp;nbsp;설정하거나&amp;nbsp;읽혀질 필요성을 지니고 있지 않은데, 명시적으로 값이 설정 또는 읽혀질 경우는 메서드 호출의 부작용으로 발생한다.&lt;/li&gt;
&lt;li&gt;클래스가&amp;nbsp;단순히&amp;nbsp;자료구조의&amp;nbsp;역할을&amp;nbsp;하는&amp;nbsp;경우에는&amp;nbsp;인스턴스&amp;nbsp;변수를&amp;nbsp;public으로&amp;nbsp;접근하도록&amp;nbsp;한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;_sQ4bTum&quot; data-toc-id=&quot;_sQ4bTum&quot; data-block-id=&quot;Cs9ROW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.2&amp;nbsp;클래스&amp;nbsp;변수와&amp;nbsp;메서드의&amp;nbsp;참조&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;TUA8e6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스&amp;nbsp;변수와&amp;nbsp;클래스&amp;nbsp;메서드에&amp;nbsp;접근하기&amp;nbsp;위해&amp;nbsp;오브젝트&amp;nbsp;인터페이스는&amp;nbsp;가능한&amp;nbsp;이용해서는&amp;nbsp;안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;DGNKYrQG&quot; data-toc-id=&quot;DGNKYrQG&quot; data-block-id=&quot;P7JbiS&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.3&amp;nbsp;상수&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VjtI6_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자&amp;nbsp;상수는&amp;nbsp;직접코드화&amp;nbsp;하지&amp;nbsp;말고,&amp;nbsp;반드시&amp;nbsp;정의한&amp;nbsp;후&amp;nbsp;사용한다.&lt;/li&gt;
&lt;li&gt;-1,&amp;nbsp;0,&amp;nbsp;1&amp;nbsp;등과&amp;nbsp;같이&amp;nbsp;for&amp;nbsp;loop&amp;nbsp;에서&amp;nbsp;counter로&amp;nbsp;사용되는&amp;nbsp;상수들은&amp;nbsp;그냥&amp;nbsp;사용해도&amp;nbsp;무방하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wGs_D4TQ&quot; data-toc-id=&quot;wGs_D4TQ&quot; data-block-id=&quot;uqdURE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.4&amp;nbsp;변수&amp;nbsp;할당&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uKn6A0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일문에서&amp;nbsp;여러&amp;nbsp;번수에&amp;nbsp;동일한&amp;nbsp;값을&amp;nbsp;할당&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;가독성이&amp;nbsp;저하된다.&lt;/li&gt;
&lt;li&gt;Equality&amp;nbsp;operator('==')와&amp;nbsp;쉽게&amp;nbsp;혼동&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;위치에서의&amp;nbsp;Assignment('=')&amp;nbsp;사용은&amp;nbsp;가급적&amp;nbsp;지양한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ti6rpMxC&quot; data-toc-id=&quot;ti6rpMxC&quot; data-block-id=&quot;fIWBpa&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.5&amp;nbsp;괄호&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;0evoo9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연산자가&amp;nbsp;복잡하게&amp;nbsp;사용&amp;nbsp;된&amp;nbsp;경우에&amp;nbsp;연산자&amp;nbsp;우선순위&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;괄호를&amp;nbsp;활발하게&amp;nbsp;사용하는&amp;nbsp;것을&amp;nbsp;권장한다.&lt;/li&gt;
&lt;li&gt;이는&amp;nbsp;실상&amp;nbsp;연산자&amp;nbsp;우선순위가&amp;nbsp;개발자&amp;nbsp;본인에게는&amp;nbsp;명백히&amp;nbsp;보인다&amp;nbsp;할지라도&amp;nbsp;다른&amp;nbsp;개발자를&amp;nbsp;위한&amp;nbsp;배려를&amp;nbsp;베풀어야&amp;nbsp;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Z9wJcvDN&quot; data-toc-id=&quot;Z9wJcvDN&quot; data-block-id=&quot;jIwPza&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.6&amp;nbsp;기타&amp;nbsp;고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;fBuEa9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러&amp;nbsp;줄의&amp;nbsp;String을&amp;nbsp;결합할&amp;nbsp;경우&amp;nbsp;String&amp;nbsp;=&amp;nbsp;String&amp;nbsp;+&amp;nbsp;String&amp;nbsp;보다는&amp;nbsp;StringBuffer를&amp;nbsp;사용한다.&lt;/li&gt;
&lt;li&gt;비록&amp;nbsp;크기가&amp;nbsp;작은&amp;nbsp;클라스하도&amp;nbsp;새로&amp;nbsp;인스턴스화&amp;nbsp;하지&amp;nbsp;말고&amp;nbsp;최대한&amp;nbsp;재&amp;nbsp;사용해야&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/JAVA</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/448</guid>
      <comments>https://gregorio78.tistory.com/448#entry448comment</comments>
      <pubDate>Mon, 16 Mar 2026 18:34:20 +0900</pubDate>
    </item>
    <item>
      <title>객체지향(OOP)의 Class/Method/변수 및 일반화와 상속성</title>
      <link>https://gregorio78.tistory.com/447</link>
      <description>&lt;h1&gt;&lt;b&gt;1. Class의 개요&lt;br /&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1 Class의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Class&lt;/b&gt;&lt;/span&gt;는 객체를 생성하기 위한 &lt;span&gt;&lt;b&gt;설계도(Template)&lt;/b&gt;&lt;/span&gt; 이다. &lt;span&gt;객체의 &lt;/span&gt;&lt;b&gt;속성(Attribute)&lt;/b&gt;&lt;span&gt; 과 &lt;/span&gt;&lt;b&gt;행위(Method)&lt;/b&gt;&lt;span&gt; 를 정의한다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구성요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Attribute&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객체의 상태를 표현하는 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;name, age&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Method&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객체의 동작을 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;getName(), move()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Constructor&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객체 생성 시 초기화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Person()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Access Modifier&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;접근 제어&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;public, private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개념 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d09zZJ/dJMcaaq1Aej/KSgjA4DYVlUcUzmNkpisQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d09zZJ/dJMcaaq1Aej/KSgjA4DYVlUcUzmNkpisQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d09zZJ/dJMcaaq1Aej/KSgjA4DYVlUcUzmNkpisQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd09zZJ%2FdJMcaaq1Aej%2FKSgjA4DYVlUcUzmNkpisQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;720&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2 Class UML 표현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UML에서는 &lt;span&gt;&lt;b&gt;3단 구조&lt;/b&gt;&lt;/span&gt;로 표현한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVDEsa/dJMcaio3Mor/gdJjPO4Ga2kZfq04GZshUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVDEsa/dJMcaio3Mor/gdJjPO4Ga2kZfq04GZshUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVDEsa/dJMcaio3Mor/gdJjPO4Ga2kZfq04GZshUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVDEsa%2FdJMcaio3Mor%2FgdJjPO4Ga2kZfq04GZshUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1046&quot; height=&quot;642&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;접근자의 의미&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;기호&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;+&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;public&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;-&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;#&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;~&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;package&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.3 Class의 일반화와 상속성&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;일반화 (Generalization)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러 클래스의 공통 특성을 상위 클래스에 정의하는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/snMwB/dJMcabcmTzR/2ZbSa0hI2qTpO9KrDTlGyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/snMwB/dJMcabcmTzR/2ZbSa0hI2qTpO9KrDTlGyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/snMwB/dJMcabcmTzR/2ZbSa0hI2qTpO9KrDTlGyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsnMwB%2FdJMcabcmTzR%2F2ZbSa0hI2qTpO9KrDTlGyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;992&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통 속성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;age&lt;/li&gt;
&lt;li&gt;eat()&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상속 (Inheritance)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 클래스의 속성과 메소드를 재사용하는 메커니즘&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;코드 재사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공통 기능 재사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;확장성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능 확장 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;유지보수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 영향 최소화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.4 일반화 및 상속 UML 표현&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qgKRb/dJMcajg8YNz/YhWpk3Z3T6Xk5kuaDHEtkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qgKRb/dJMcajg8YNz/YhWpk3Z3T6Xk5kuaDHEtkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qgKRb/dJMcajg8YNz/YhWpk3Z3T6Xk5kuaDHEtkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqgKRb%2FdJMcajg8YNz%2FYhWpk3Z3T6Xk5kuaDHEtkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;1128&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;2. 개발 언어별 Class / Method 비교&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1 Class 비교 및 인수 전달 방식&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Class 지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;인수 전달&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;없음 (struct 사용)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Value&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C++&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Value / Reference&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Value (객체는 reference copy)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C#&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Value / ref / out&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;VB.NET&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ByVal / ByRef&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Object Reference&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2 Method 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Method 형태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;함수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;클래스 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C++&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Member Function&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OOP 지원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Instance Method&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;JVM 기반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C#&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;.NET&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;VB.NET&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Sub / Function&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;.NET&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;def&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.3 호출 방식&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.7674%; text-align: center;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.7674%;&quot;&gt;&lt;span&gt;Call by Value&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;&lt;span&gt;값 복사&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.7674%;&quot;&gt;&lt;span&gt;Call by Reference&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;&lt;span&gt;주소 전달&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.7674%;&quot;&gt;&lt;span&gt;Call by Object Reference&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 65.1163%;&quot;&gt;&lt;span&gt;객체 참조 전달&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.4 데이터 타입&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;타입&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C++&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C#&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;VB.NET&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동적 타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.5 호출측 변경&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.4651%; text-align: center;&quot;&gt;&lt;b&gt;전달 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.4186%; text-align: center;&quot;&gt;&lt;b&gt;호출자 영향&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.4651%;&quot;&gt;&lt;span&gt;Value&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.4186%;&quot;&gt;&lt;span&gt;변경 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.4651%;&quot;&gt;&lt;span&gt;Reference&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.4186%;&quot;&gt;&lt;span&gt;변경 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;3. 개발 언어별 Class / Method 예제&lt;/b&gt;&lt;/h1&gt;
&lt;h1&gt;&lt;b&gt;3.1 C 언어 예제&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C는 OOP가 없으므로 &lt;span&gt;&lt;b&gt;struct + 함수&lt;/b&gt;&lt;/span&gt; 사용&lt;/p&gt;
&lt;pre id=&quot;code_1773616530216&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef struct {
    char name[50];
    int age;
} Person;

void printPerson(Person p) {
    printf(&quot;Name: %s\n&quot;, p.name);
    printf(&quot;Age: %d\n&quot;, p.age);
}

int main() {
    Person p = {&quot;Tom&quot;, 20};
    printPerson(p);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;3.2 C++ 예제&lt;/b&gt;&lt;/h1&gt;
&lt;pre id=&quot;code_1773616546760&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Person {
private:
    string name;
    int age;

public:
    Person(string n, int a) {
        name = n;
        age = a;
    }

    void print() {
        cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; age &amp;lt;&amp;lt; endl;
    }
};

int main() {
    Person p(&quot;Tom&quot;,20);
    p.print();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;3.3 Java 예제&lt;/b&gt;&lt;/h1&gt;
&lt;pre id=&quot;code_1773616564077&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {

    private String name;
    private int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void print(){
        System.out.println(name + &quot; &quot; + age);
    }

    public static void main(String[] args){
        Person p = new Person(&quot;Tom&quot;,20);
        p.print();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;3.4 C# 예제&lt;/b&gt;&lt;/h1&gt;
&lt;pre id=&quot;code_1773616583526&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

class Person
{
    private string name;
    private int age;

    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public void Print()
    {
        Console.WriteLine(name + &quot; &quot; + age);
    }
}

class Program
{
    static void Main()
    {
        Person p = new Person(&quot;Tom&quot;,20);
        p.Print();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;3.5 VB.NET 예제&lt;/b&gt;&lt;/h1&gt;
&lt;pre id=&quot;code_1773616611187&quot; class=&quot;vbnet&quot; data-ke-language=&quot;vbnet&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Public Class Person

    Private name As String
    Private age As Integer

    Public Sub New(n As String, a As Integer)
        name = n
        age = a
    End Sub

    Public Sub Print()
        Console.WriteLine(name &amp;amp; &quot; &quot; &amp;amp; age)
    End Sub

End Class&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;3.6 Python 예제&lt;/b&gt;&lt;/h1&gt;
&lt;pre id=&quot;code_1773616630243&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def print(self):
        print(self.name, self.age)


p = Person(&quot;Tom&quot;,20)
p.print()&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;b&gt;4. Class 사이의 관계 (종속 / 연관)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 설계에서 클래스 관계는 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;&lt;b&gt;관계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 67.093%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;&lt;span&gt;Association&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 67.093%;&quot;&gt;&lt;span&gt;일반 연관&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;&lt;span&gt;Dependency&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 67.093%;&quot;&gt;&lt;span&gt;종속&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;&lt;span&gt;Aggregation&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 67.093%;&quot;&gt;&lt;span&gt;집합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;&lt;span&gt;Composition&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 67.093%;&quot;&gt;&lt;span&gt;합성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.7907%;&quot;&gt;&lt;span&gt;Inheritance&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 67.093%;&quot;&gt;&lt;span&gt;상속&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;UML 관계 도식&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;1182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9lUl/dJMcahRcAhz/9KBRJsc9JiYVHnUEVY2UQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9lUl/dJMcahRcAhz/9KBRJsc9JiYVHnUEVY2UQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9lUl/dJMcahRcAhz/9KBRJsc9JiYVHnUEVY2UQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9lUl%2FdJMcahRcAhz%2F9KBRJsc9JiYVHnUEVY2UQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1342&quot; height=&quot;1182&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;1182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;5. 개발 언어별 변수 선언 및 접근자&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.1 접근자의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Access Modifier&lt;/b&gt;&lt;/span&gt;는 클래스 멤버 접근 범위를 제한한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캡슐화&lt;/li&gt;
&lt;li&gt;보안&lt;/li&gt;
&lt;li&gt;유지보수성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.2 개발 언어별 변수 선언 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;변수 선언&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;int age;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C++&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;int age;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;private int age;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;C#&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;private int age;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;VB.NET&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Private age As Integer&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;self.age&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.3 개발 언어별 접근자 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.8372%; text-align: center;&quot;&gt;&lt;b&gt;접근자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.9302%; text-align: center;&quot;&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5581%; text-align: center;&quot;&gt;&lt;b&gt;C#&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.6977%; text-align: center;&quot;&gt;&lt;b&gt;VB.NET&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 17.3255%; text-align: center;&quot;&gt;&lt;b&gt;C++&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.5349%; text-align: center;&quot;&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;&lt;span&gt;public&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5581%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.6977%;&quot;&gt;&lt;span&gt;Public&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 17.3255%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;기본&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;&lt;span&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5581%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.6977%;&quot;&gt;&lt;span&gt;Private&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 17.3255%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;_&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;&lt;span&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5581%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.6977%;&quot;&gt;&lt;span&gt;Protected&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 17.3255%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;_&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;&lt;span&gt;internal&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;&lt;span&gt;X&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5581%;&quot;&gt;&lt;span&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.6977%;&quot;&gt;&lt;span&gt;Friend&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 17.3255%;&quot;&gt;&lt;span&gt;X&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;&lt;span&gt;X&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;전체 구조 요약&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4YW0/dJMcahDEBnc/JheNqnKQGgYyz4IKTh33sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4YW0/dJMcahDEBnc/JheNqnKQGgYyz4IKTh33sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4YW0/dJMcahDEBnc/JheNqnKQGgYyz4IKTh33sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4YW0%2FdJMcahDEBnc%2FJheNqnKQGgYyz4IKTh33sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;892&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 문헌&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Grady Booch, &lt;i&gt;Object-Oriented Analysis and Design&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Erich Gamma, &lt;i&gt;Design Patterns&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;OMG, &lt;i&gt;UML Specification&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Robert C. Martin, &lt;i&gt;Clean Architecture&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/OOP</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/447</guid>
      <comments>https://gregorio78.tistory.com/447#entry447comment</comments>
      <pubDate>Mon, 16 Mar 2026 08:27:06 +0900</pubDate>
    </item>
    <item>
      <title>DDD(Domain Driven Development)</title>
      <link>https://gregorio78.tistory.com/446</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 프로세스와 무관한 패턴과 원칙의 집합, DDD 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) DDD의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DDD(Domain Driven Development)&lt;/b&gt;는 소프트웨어의 &lt;b&gt;핵심 복잡성(Core Complexity)&lt;/b&gt;을 해결하기 위해 &lt;b&gt;도메인 모델을 중심(Model-Driven Design)&lt;/b&gt;으로 설계&amp;middot;구현하는 소프트웨어 개발 접근법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 개념은 &lt;a&gt;&lt;span&gt;Eric Evans&lt;/span&gt;&lt;/a&gt;가 저서 &lt;a&gt;&lt;span&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/span&gt;&lt;/a&gt;에서 체계화하였다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;정의 요약&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비즈니스 도메인을 중심으로 모델을 설계&lt;/li&gt;
&lt;li&gt;모델과 코드의 정합성을 유지&lt;/li&gt;
&lt;li&gt;개발자와 도메인 전문가 간 공통 언어(UBIQUITOUS LANGUAGE) 사용&lt;/li&gt;
&lt;li&gt;&lt;span&gt;프로세스 자체가 아니라 &lt;/span&gt;&lt;b&gt;패턴&amp;middot;원칙&amp;middot;Best Practice 집합&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) DDD의 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전통적 개발 방식 문제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;DDD 접근&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;복잡성 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비즈니스 규칙이 분산됨&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 모델에 응집&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구사항 변화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 시 영향 범위 불명확&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Aggregate 단위 변경&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개발-현업 간 소통&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;문서 중심, 해석 차이 발생&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UBIQUITOUS LANGUAGE 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;코드 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CRUD 중심 설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 행위 중심 설계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD는 특히 다음과 같은 환경에서 효과적이다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MSA 기반 복잡한 업무 시스템&lt;/li&gt;
&lt;li&gt;비즈니스 규칙이 많은 금융/물류/ERP 시스템&lt;/li&gt;
&lt;li&gt;장기 유지보수 프로젝트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. DDD 구조도와 기본요소 및 특징&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) DDD Layered 구조도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Zo6p/dJMcaiCqsiv/Q93R5QkK2KJLvF7UqEkHAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Zo6p/dJMcaiCqsiv/Q93R5QkK2KJLvF7UqEkHAK/img.png&quot; data-alt=&quot;DDD Layer Stack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Zo6p/dJMcaiCqsiv/Q93R5QkK2KJLvF7UqEkHAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Zo6p%2FdJMcaiCqsiv%2FQ93R5QkK2KJLvF7UqEkHAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;392&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DDD Layer Stack&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buVSs0/dJMcab4n2we/DkBdEAbUdFZl3kmy3NAYU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buVSs0/dJMcab4n2we/DkBdEAbUdFZl3kmy3NAYU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buVSs0/dJMcab4n2we/DkBdEAbUdFZl3kmy3NAYU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuVSs0%2FdJMcab4n2we%2FDkBdEAbUdFZl3kmy3NAYU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;914&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpl7z/dJMcadgPXN9/MnQe90hb8DFeYoxKd2WwH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpl7z/dJMcadgPXN9/MnQe90hb8DFeYoxKd2WwH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpl7z/dJMcadgPXN9/MnQe90hb8DFeYoxKd2WwH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftpl7z%2FdJMcadgPXN9%2FMnQe90hb8DFeYoxKd2WwH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;1194&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;계층 설명&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Layer&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;책임&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Presentation&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UI/API&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;외부 인터페이스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Application&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;유스케이스 orchestration&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;트랜잭션 제어&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Domain&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;핵심 비즈니스 로직&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Entity, Value, Aggregate&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Infrastructure&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;DB, MQ, 외부시스템&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술 구현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;핵심은 &lt;/span&gt;&lt;b&gt;Domain Layer가 독립적이어야 한다는 점&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 도메인 모델(Domain Model)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 모델은 다음을 포함한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Domain 객체&lt;/li&gt;
&lt;li&gt;비즈니스 규칙&lt;/li&gt;
&lt;li&gt;제약조건&lt;/li&gt;
&lt;li&gt;상태 및 행위&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MODEL DRIVEN DESIGN&lt;/b&gt;&lt;span&gt;의 핵심은&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;모델 = 설계 = 코드&lt;/b&gt; 의 일치성을 유지하는 것이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) DDD 기본 요소 및 특징&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UBIQUITOUS LANGUAGE&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 전문가와 개발자가 공유하는 공통 언어&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Bounded Context&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델의 경계를 명확히 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Aggregate&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;트랜잭션 일관성 경계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Repository&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Aggregate 저장소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Domain Service&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Entity로 표현하기 어려운 로직&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Entity&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;식별자 기반 객체&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Value Object&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;불변 객체&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Domain Event&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상태 변화 이벤트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) DDD 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 중심 설계&lt;/li&gt;
&lt;li&gt;객체지향 설계 원칙 강화&lt;/li&gt;
&lt;li&gt;응집도 &amp;uarr; 결합도 &amp;darr;&lt;/li&gt;
&lt;li&gt;복잡성의 구조화&lt;/li&gt;
&lt;li&gt;전략적 설계(Strategic Design) + 전술적 설계(Tactical Design)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) 효과적인 모델링 구성요소&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bounded Context 명확화&lt;/li&gt;
&lt;li&gt;Context Mapping&lt;/li&gt;
&lt;li&gt;Aggregate 단위 설계&lt;/li&gt;
&lt;li&gt;명확한 UBIQUITOUS LANGUAGE 정의&lt;/li&gt;
&lt;li&gt;도메인 전문가 참여&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. DDD의 기본 구성 요소 (Tactical Pattern)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;도메인 모델 기본 구성 요소 통합표&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Entity&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;식별자를 가지는 객체&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상태 변화 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Order&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Value Object&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;값 자체가 의미&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;불변(Immutable)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Money&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Aggregate&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객체 묶음 단위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;일관성 경계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Order + OrderLine&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Repository&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Aggregate 저장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인터페이스 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OrderRepository&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Domain Service&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;특정 Entity에 속하지 않는 로직&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Stateless&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PaymentService&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Factory&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;복잡한 생성 책임&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;생성 로직 캡슐화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OrderFactory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Domain Event&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 변화 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비동기 처리 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OrderCreated&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 요소 상세&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;&lt;b&gt;Entity&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;&lt;b&gt;Value Object&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;&lt;b&gt;Aggregate&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;&lt;b&gt;Repository&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고유 ID 존재&lt;/li&gt;
&lt;li&gt;동일성(Identity) 기반 비교&lt;/li&gt;
&lt;li&gt;생명주기 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불변 객체&lt;/li&gt;
&lt;li&gt;값 비교&lt;/li&gt;
&lt;li&gt;부작용 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Root(Entity) 중심 구성&lt;/li&gt;
&lt;li&gt;외부는 Root만 참조 가능&lt;/li&gt;
&lt;li&gt;트랜잭션 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Domain &amp;harr; Persistence 분리&lt;/li&gt;
&lt;li&gt;인터페이스는 Domain에 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 Entity에 귀속 불가한 로직&lt;/li&gt;
&lt;li&gt;도메인 규칙 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. DDD 적용 전제사항과 Process&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) DDD 전제사항&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;복잡한 도메인 존재&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단순 CRUD 시스템은 불필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;도메인 전문가 협업 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UBIQUITOUS LANGUAGE 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;장기 운영 시스템&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단기 프로젝트에는 부적합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;객체지향 이해도 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;설계 역량 요구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) DDD Process&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;도메인 탐색 (Domain Exploration)&lt;/li&gt;
&lt;li&gt;UBIQUITOUS LANGUAGE 정의&lt;/li&gt;
&lt;li&gt;Bounded Context 식별&lt;/li&gt;
&lt;li&gt;Aggregate 설계&lt;/li&gt;
&lt;li&gt;Repository 설계&lt;/li&gt;
&lt;li&gt;Domain Service 정의&lt;/li&gt;
&lt;li&gt;Infrastructure 연결&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. DDD 모델 구조와 계층 구조&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 모델 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpoks1/dJMcabceLlY/zYGKmDWBTfkG94ZMDK9AG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpoks1/dJMcabceLlY/zYGKmDWBTfkG94ZMDK9AG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpoks1/dJMcabceLlY/zYGKmDWBTfkG94ZMDK9AG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdpoks1%2FdJMcabceLlY%2FzYGKmDWBTfkG94ZMDK9AG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1704&quot; height=&quot;991&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2r9i/dJMcafyYFh1/tmXmdkGbbjbR6SxY9A3l30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2r9i/dJMcafyYFh1/tmXmdkGbbjbR6SxY9A3l30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2r9i/dJMcafyYFh1/tmXmdkGbbjbR6SxY9A3l30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2r9i%2FdJMcafyYFh1%2FtmXmdkGbbjbR6SxY9A3l30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1696&quot; height=&quot;814&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 계층 구조 통합 설명&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전략적 설계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전술적 설계&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 경계 설정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 구현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;구성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Bounded Context, Context Map&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Entity, Value, Aggregate&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;관심사&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 전체 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객체 내부 구조&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. DDD 적용 시 고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 도메인 로직 복잡성과 코드 재사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡성 낮은 시스템 &amp;rarr; 과도한 설계 위험&lt;/li&gt;
&lt;li&gt;Generic Framework 과용 지양&lt;/li&gt;
&lt;li&gt;도메인 중심 응집 설계 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;MSA 환경에서는 서비스 단위 = Bounded Context로 설계하는 것이 적합&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 도메인 로직과 유지보수 관계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;DDD 미적용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;DDD 적용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 영향&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;광범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Aggregate 단위&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;테스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;통합 테스트 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 단위 테스트 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;확장성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비즈니스 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD는 단순한 설계 기법이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;복잡성 관리 전략&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도메인 중심 개발 철학&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 기반 설계(MODEL DRIVEN DESIGN)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UBIQUITOUS LANGUAGE 기반 협업 체계&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 MSA, Spring 기반 대규모 업무 시스템 환경에서는 Bounded Context를 서비스 단위로 정립하고 Aggregate 중심 설계를 적용하는 것이 매우 효과적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 문헌&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/a&gt;&lt;/span&gt;&lt;span&gt; &amp;ndash; Eric Evans&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Implementing Domain-Driven Design&lt;/a&gt;&lt;/span&gt;&lt;span&gt; &amp;ndash; Vaughn Vernon&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Domain-Driven Design Distilled&lt;/a&gt;&lt;/span&gt;&lt;span&gt; &amp;ndash; Vaughn Vernon&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/446</guid>
      <comments>https://gregorio78.tistory.com/446#entry446comment</comments>
      <pubDate>Wed, 4 Mar 2026 07:32:52 +0900</pubDate>
    </item>
    <item>
      <title>ITSM(Information Technology Service Management)</title>
      <link>https://gregorio78.tistory.com/444</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. IT서비스 관리를 위한 프레임워크, ITSM의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) ITSM의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ITSM(Information Technology Service Management)&lt;/b&gt;은 IT 서비스를 &amp;ldquo;기술 중심(Technology-centric)&amp;rdquo;이 아닌 **서비스 중심(Service-centric)**으로 관리하기 위한 체계적 관리 프레임워크이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT를 단순한 시스템 운영이 아닌 &lt;span&gt;&lt;b&gt;비즈니스 가치를 창출하는 서비스&lt;/b&gt;&lt;/span&gt;로 정의&lt;/li&gt;
&lt;li&gt;프로세스 기반(Process-Oriented) 접근&lt;/li&gt;
&lt;li&gt;품질, 비용, 위험을 통합 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;핵심 개념: &lt;i&gt;IT = 자산이 아니라 서비스&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) ITSM의 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전통적 IT 운영&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ITSM 기반 운영&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;관리 관점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;조직 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능별 사일로&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 중심 통합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성과 측정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 가동률&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA, 고객 만족도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목표&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;장애 최소화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비즈니스 가치 극대화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;통제 방식&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개별 부서 통제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;End-to-End 통합 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도입 필요성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디지털 전환 가속화&lt;/li&gt;
&lt;li&gt;SLA 기반 서비스 계약 증가&lt;/li&gt;
&lt;li&gt;복잡한 IT 인프라 (Cloud, MSA, DevOps)&lt;/li&gt;
&lt;li&gt;IT Governance 강화 요구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) ITSM을 실현하기 위한 모델&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;ITIL&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ITSM Best Practice&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 중심, 사실상 글로벌 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;ISO/IEC 20000&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ITSM 국제 표준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인증 기반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;MOF&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MS 기반 운영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Microsoft 중심 가이드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;CMM&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 성숙도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단계별 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;CMMI&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;통합 성숙도 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 역량 향상&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;ISO/IEC 15504&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 평가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPICE 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;eSCM&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 아웃소싱 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공급자/고객 역량 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;2. ITSM 구성도 및 구성요소&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) ITSM 구성도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cynvck/dJMcajnKt7F/kbQKKkj4KUizqsZdzbKAL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cynvck/dJMcajnKt7F/kbQKKkj4KUizqsZdzbKAL1/img.png&quot; data-alt=&quot;IT Governance &amp;amp;nbsp;구성도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cynvck/dJMcajnKt7F/kbQKKkj4KUizqsZdzbKAL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcynvck%2FdJMcajnKt7F%2FkbQKKkj4KUizqsZdzbKAL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;420&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IT Governance &amp;nbsp;구성도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) ITSM 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 31.8605%;&quot;&gt;&lt;b&gt;영역&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 68.0233%;&quot;&gt;주요&lt;b&gt; 프로세스&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.8605%;&quot;&gt;&lt;span&gt;Service Strategy&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0233%;&quot;&gt;&lt;span&gt;서비스 포트폴리오, 재무관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.8605%;&quot;&gt;&lt;span&gt;Service Design&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0233%;&quot;&gt;&lt;span&gt;SLA, 용량, 가용성, 보안&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.8605%;&quot;&gt;&lt;span&gt;Service Transition&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0233%;&quot;&gt;&lt;span&gt;변경관리, 형상관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.8605%;&quot;&gt;&lt;span&gt;Service Operation&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0233%;&quot;&gt;&lt;span&gt;Incident, Problem, Event&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.8605%;&quot;&gt;&lt;span&gt;Continual Service Improvement&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0233%;&quot;&gt;&lt;span&gt;KPI, 성과측정, 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3) ITIL과 ITSM의 관계&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITSM = 개념(Concept)&lt;/li&gt;
&lt;li&gt;ITIL = 실행 가이드라인(How-to Best Practice)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;&lt;b&gt;ITIL &amp;sub; ITSM 구현 방법론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4) 전통 IT 운영 vs ITSM 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전통 IT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ITSM&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;초점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;KPI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 가동률&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 달성률&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변화관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;사후 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;사전 통제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;고객 관점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;내부 조직 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고객 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;3. ITSM Framework 및 구성요소&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) ITSM Framework 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buQfQ2/dJMcaaqSZ0s/Ykx1YH1PBR8a0v0LWNZQmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buQfQ2/dJMcaaqSZ0s/Ykx1YH1PBR8a0v0LWNZQmk/img.png&quot; data-alt=&quot;IT Governance &amp;amp;nbsp;구조도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buQfQ2/dJMcaaqSZ0s/Ykx1YH1PBR8a0v0LWNZQmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuQfQ2%2FdJMcaaqSZ0s%2FYkx1YH1PBR8a0v0LWNZQmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;331&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IT Governance &amp;nbsp;구조도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) ITSM Framework 구성요소&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;영역&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 산출물&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Governance&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 통제 및 전략 정렬&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 정책&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Service Strategy&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 방향 설정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Service Portfolio&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Service Design&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA, OLA&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Service Transition&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;안정적 전환&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Change Record&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Service Operation&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;안정적 운영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Incident Report&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;CSI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI Report&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;4. ITIL 기반 ITSM 도입 전략&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) ITSM Best Practice, ITIL 특징&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a&gt;ITIL&lt;/a&gt;&lt;/span&gt; 특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 기반 관리&lt;/li&gt;
&lt;li&gt;고객 중심 SLA 구조&lt;/li&gt;
&lt;li&gt;PDCA 기반 지속 개선&lt;/li&gt;
&lt;li&gt;벤더 중립적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) ITSM 도입을 위한 ITIL의 역할&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영 프로세스 통합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;품질 향상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 기반 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;위험 감소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 통제 강화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용 절감&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;재작업 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3) ITSM 구축 방안 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Big Bang&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;단계적 도입&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리스크&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;높음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;낮음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;초기 높음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;분산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;추천 대상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대기업&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대부분 조직&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4) ITSM 도입전략 Flow&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RFuRC/dJMb99ZPPM4/TgM2PymjY7FULktRYuXr4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RFuRC/dJMb99ZPPM4/TgM2PymjY7FULktRYuXr4K/img.png&quot; data-alt=&quot;프로세스 개선 Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RFuRC/dJMb99ZPPM4/TgM2PymjY7FULktRYuXr4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRFuRC%2FdJMb99ZPPM4%2FTgM2PymjY7FULktRYuXr4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;694&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로세스 개선 Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5) ITSM 단계별 도입 절차&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 활동&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;1단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 거버넌스 정립&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;2단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;핵심 프로세스 선정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;3단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;4단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Tool 도입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;5단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI 기반 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;5. ITSM 추진 장애요소 및 극복방안&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;장애요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;극복방안&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;조직 저항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;경영진 후원 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;프로세스 미정립&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;표준화 작업 선행&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;KPI 부재&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;측정지표 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;도구 중심 접근&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 우선 접근&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인력 역량 부족&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;교육 및 인증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;6. ITSM 구축 효과 및 고려사항&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) ITSM 구축 효과&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(1) 고객/사용자 측면&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SLA 기반 품질 보장&lt;/li&gt;
&lt;li&gt;장애 대응 시간 단축&lt;/li&gt;
&lt;li&gt;서비스 가시성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2) IT 조직 측면&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영 표준화&lt;/li&gt;
&lt;li&gt;변경 통제 강화&lt;/li&gt;
&lt;li&gt;비용 예측 가능성 증가&lt;/li&gt;
&lt;li&gt;성숙도 향상 (CMMI 기반 개선 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) ITSM 구축시 고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT Governance 체계 연계&lt;/li&gt;
&lt;li&gt;경영진 Sponsorship 확보&lt;/li&gt;
&lt;li&gt;KPI 기반 운영&lt;/li&gt;
&lt;li&gt;Tool 의존도 최소화&lt;/li&gt;
&lt;li&gt;조직 문화 변화 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3) ITSM 발전 전망&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DevOps + ITSM 통합&lt;/li&gt;
&lt;li&gt;AI 기반 Incident 자동화&lt;/li&gt;
&lt;li&gt;Cloud Native 환경 통합 운영&lt;/li&gt;
&lt;li&gt;ESG 기반 IT 서비스 관리 확장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsNGhs/dJMcahcsxhz/fmkgfrar9MUGKj0KMEQjBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsNGhs/dJMcahcsxhz/fmkgfrar9MUGKj0KMEQjBk/img.png&quot; data-alt=&quot;IT Governance &amp;amp;nbsp;통합개념 구조도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsNGhs/dJMcahcsxhz/fmkgfrar9MUGKj0KMEQjBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsNGhs%2FdJMcahcsxhz%2Ffmkgfrar9MUGKj0KMEQjBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;482&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IT Governance &amp;nbsp;통합개념 구조도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITSM은 단순한 운영 개선 활동이 아니라, &lt;b&gt;IT Governance 하에서 IT를 전략적 서비스 자산으로 전환하는 관리 체계&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 ITIL 기반 도입 + 성숙도 모델(CMMI) + 국제표준(ISO/IEC 20000)을 병행하면&amp;nbsp;지속 가능한 IT 서비스 품질 체계를 구축할 수 있다.&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 문헌 / 출처&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;AXELOS&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;ITIL Official Publications&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ISO&lt;/a&gt;&lt;/span&gt;, ISO/IEC 20000, ISO/IEC 15504&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Carnegie Mellon University&lt;/a&gt;&lt;/span&gt;&lt;span&gt;, CMM/CMMI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Microsoft&lt;/a&gt;&lt;/span&gt;, MOF Documentation&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;IT Governance Institute&lt;/a&gt;&lt;/span&gt;&lt;span&gt; 자료&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/444</guid>
      <comments>https://gregorio78.tistory.com/444#entry444comment</comments>
      <pubDate>Tue, 3 Mar 2026 19:01:48 +0900</pubDate>
    </item>
    <item>
      <title>코드 스멜(Code Smell)과 리팩토링(Refactoring)</title>
      <link>https://gregorio78.tistory.com/443</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 코드 속 악취 제거를 통한 코드 품질 향상, 리팩토링의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 리팩토링(Refactoring)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a&gt;Refactoring&lt;/a&gt;&lt;/span&gt;에서 정의한 바에 따르면,&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;&lt;b&gt;리팩토링(Refactoring)&lt;/b&gt;&lt;/span&gt; 이란 *&amp;ldquo;소프트웨어의 외부 동작은 변경하지 않으면서 내부 구조를 개선하는 일련의 행위&amp;rdquo;*이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, &lt;/span&gt;&lt;b&gt;기능(Functional Behavior)은 유지&lt;/b&gt;&lt;span&gt;하면서&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가독성(Readability)&lt;/li&gt;
&lt;li&gt;유지보수성(Maintainability)&lt;/li&gt;
&lt;li&gt;확장성(Extensibility)&lt;/li&gt;
&lt;li&gt;테스트 용이성(Testability)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 향상시키는 구조적 개선 활동이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 리팩토링의 목적&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;가독성 향상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드 이해 시간 단축&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;유지보수성 향상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 영향 범위 최소화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;확장성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;신규 기능 추가 비용 절감&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기술부채 감소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;누적된 구조적 문제 해소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;테스트 용이성 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단위 테스트 작성 및 자동화 수월&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 코드 스멜(Code Smell)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a&gt;Martin Fowler&lt;/a&gt;&lt;/span&gt;는 코드 스멜을 다음과 같이 정의하였다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;&lt;b&gt;코드 스멜(Code Smell)&lt;/b&gt;&lt;/span&gt; 이란 &amp;ldquo;코드에 잠재된 구조적 문제를 암시하는 징후&amp;rdquo;이다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류(Bug)는 아님&lt;/li&gt;
&lt;li&gt;설계상의 취약점 또는 유지보수 위험 신호&lt;/li&gt;
&lt;li&gt;방치할 경우 기술부채 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, &lt;/span&gt;&lt;b&gt;코드 스멜은 리팩토링의 트리거(trigger)&lt;/b&gt;&lt;span&gt; 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 리팩토링 개념과 주요 기법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 리팩토링 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리팩토링은 단순한 코드 정리가 아니라,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체지향 설계 원칙(SOLID)&lt;/li&gt;
&lt;li&gt;응집도(Cohesion) 향상&lt;/li&gt;
&lt;li&gt;결합도(Coupling) 감소&lt;/li&gt;
&lt;li&gt;책임 분리(SRP)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;등 &lt;/span&gt;&lt;b&gt;소프트웨어 공학 원칙 기반 구조 개선 활동&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 기능 추가 관점에서의 리팩토링 효과&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 45.9302%;&quot;&gt;&lt;b&gt;리팩토링 전&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 53.9535%;&quot;&gt;&lt;b&gt;리팩토링 후&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45.9302%;&quot;&gt;&lt;span&gt;기능 추가 시 기존 코드 수정 다수 발생&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.9535%;&quot;&gt;&lt;span&gt;확장 포인트 명확&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45.9302%;&quot;&gt;&lt;span&gt;버그 발생 가능성 증가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.9535%;&quot;&gt;&lt;span&gt;변경 영향 범위 축소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45.9302%;&quot;&gt;&lt;span&gt;테스트 어려움&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.9535%;&quot;&gt;&lt;span&gt;모듈 단위 테스트 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45.9302%;&quot;&gt;&lt;span&gt;복잡도 증가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.9535%;&quot;&gt;&lt;span&gt;구조 단순화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론: &lt;/b&gt;리팩토링은 &amp;ldquo;기능 추가 속도를 높이기 위한 선행 투자&amp;rdquo;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 리팩토링 주요 기법&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 31.3953%;&quot;&gt;&lt;b&gt;기법&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 34.0698%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 34.4186%;&quot;&gt;&lt;b&gt;적용 대상&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Extract Method&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;긴 메소드를 분리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;긴 메소드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Extract Class&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;큰 클래스를 역할별 분리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;큰 클래스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Rename Method&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;의미 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;가독성 저하&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Move Method&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;적절한 클래스로 이동&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;Feature Envy&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Introduce Parameter Object&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;매개변수 객체화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;너무 많은 인수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Replace Primitive with Object&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;기본형을 객체화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;Primitive Obsession&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Inline Method&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;불필요한 위임 제거&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;과도한 추상화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.3953%;&quot;&gt;&lt;span&gt;Remove Duplicate Code&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%;&quot;&gt;&lt;span&gt;중복 제거&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.4186%;&quot;&gt;&lt;span&gt;중복된 코드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 코드 스멜의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;코드 스멜&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;대표 리팩토링&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;구조적 문제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;중복된 코드 (Duplicated Code)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동일 로직 반복&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Extract Method&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;복잡도 문제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;긴 메소드 (Long Method)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지나치게 긴 함수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Extract Method&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;응집도 저하&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;큰 클래스 (Large Class)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;역할 과다&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Extract Class&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인터페이스 문제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;너무 많은 인수 (Long Parameter List)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가독성 저하&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Introduce Parameter Object&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 취약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Divergent Class&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 이유가 여러 개&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Extract Class&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 파급&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Shotgun Surgery&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;작은 변경에 다수 수정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Move Method&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;객체 책임 위반&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Feature Envy&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;다른 객체 데이터에 집착&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Move Method&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;데이터 구조 문제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Data Clumps&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;항상 함께 전달되는 데이터 묶음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Introduce Parameter Object&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;설계 미성숙&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Primitive Obsession&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기본형 과도 사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Replace Primitive with Object&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 스멜 관계 개념도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtIp74/dJMcafZ0deA/bh0zIkXGbk6uK7EWVVcogk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtIp74/dJMcafZ0deA/bh0zIkXGbk6uK7EWVVcogk/img.png&quot; data-alt=&quot;Code Smell &amp;amp;nbsp;관계도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtIp74/dJMcafZ0deA/bh0zIkXGbk6uK7EWVVcogk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtIp74%2FdJMcafZ0deA%2Fbh0zIkXGbk6uK7EWVVcogk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;542&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Code Smell &amp;nbsp;관계도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Refactoring vs Re-Engineering 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Refactoring&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Re-Engineering&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;내부 구조 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 전면 재구성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기능 변경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;없음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모듈/클래스 단위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 단위&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;낮음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;높음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상대적 저비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고비용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;적용 시점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 노후화 시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 차이: &lt;/b&gt;Refactoring은 &lt;i&gt;점진적 개선&lt;/i&gt;,&amp;nbsp;Re-Engineering은 &lt;i&gt;근본적 재구축&lt;/i&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Refactoring 고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 테스트 코드 선행 확보&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동화 테스트 없이는 위험&lt;/li&gt;
&lt;li&gt;리팩토링 = 테스트 기반 활동&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 작은 단위로 수행&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Atomic Refactoring&lt;/li&gt;
&lt;li&gt;Commit 단위 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) CI/CD 환경 활용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 분석(SonarQube 등)&lt;/li&gt;
&lt;li&gt;코드 커버리지 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) 과도한 리팩토링 주의&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;YAGNI 원칙 고려&lt;/li&gt;
&lt;li&gt;기능 요구사항 우선&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) 팀 차원의 합의 필요&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코딩 컨벤션 통일&lt;/li&gt;
&lt;li&gt;설계 원칙 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드 스멜은 &lt;/span&gt;&lt;b&gt;설계 붕괴의 초기 신호&lt;/b&gt;&lt;span&gt;이며, &lt;/span&gt;&lt;span&gt;리팩토링은 &lt;/span&gt;&lt;b&gt;지속 가능한 소프트웨어 개발을 위한 구조적 치료 행위&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애자일 개발&lt;/li&gt;
&lt;li&gt;지속적 통합(CI)&lt;/li&gt;
&lt;li&gt;테스트 주도 개발(TDD)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경에서 리팩토링은 선택이 아닌 필수 전략이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;  출처&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Martin Fowler&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;Refactoring: Improving the Design of Existing Code&lt;/i&gt;, Addison-Wesley, 1999&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Clean Code&lt;/a&gt;&lt;/span&gt; &amp;ndash; Robert C. Martin&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;/span&gt;&lt;span&gt; &amp;ndash; Michael Feathers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;IEEE Software Engineering Body of Knowledge (SWEBOK)&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>Data Clumps</category>
      <category>Divergent Class</category>
      <category>Feature Envy</category>
      <category>Primitive Obsession</category>
      <category>Shotgun Surgery</category>
      <category>긴 메소드</category>
      <category>너무 많은 인수</category>
      <category>소프트웨어 개발방법론</category>
      <category>중복된 코드</category>
      <category>큰 클래스</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/443</guid>
      <comments>https://gregorio78.tistory.com/443#entry443comment</comments>
      <pubDate>Tue, 3 Mar 2026 18:49:36 +0900</pubDate>
    </item>
    <item>
      <title>CMMI (Capability Maturity Model Integration)</title>
      <link>https://gregorio78.tistory.com/442</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 프로세스 개선 및 내재화의 핵심, CMMI의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) CMMI의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMMI는 조직의 &lt;span&gt;&lt;b&gt;프로세스 성숙도(Maturity)&lt;/b&gt;&lt;/span&gt; 및 &lt;b&gt;능력 수준(Capability)&lt;/b&gt;을 체계적으로 평가&amp;middot;개선하기 위한 통합 프로세스 개선 프레임워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;초기에는 &lt;a&gt;&lt;span&gt;Software Engineering Institute&lt;/span&gt;&lt;/a&gt;(SEI, &lt;a&gt;&lt;span&gt;Carnegie Mellon University&lt;/span&gt;&lt;/a&gt;)에서 개발되었으며, 현재는 &lt;a&gt;&lt;span&gt;ISACA&lt;/span&gt;&lt;/a&gt; 산하 &lt;a&gt;&lt;span&gt;CMMI Institute&lt;/span&gt;&lt;/a&gt;가 관리한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 등장 배경&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;1980~1990년대&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;미 국방부 소프트웨어 품질 문제 발생&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;해결 시도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SW-CMM 개발&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;한계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SW, 시스템, 인력 등 모델이 분리 운영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;통합 필요성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;중복&amp;middot;비일관성 제거 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;결과&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CMMI로 통합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) CMMI의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 중심(Process-centric)&lt;/li&gt;
&lt;li&gt;정량적 관리 강조&lt;/li&gt;
&lt;li&gt;단계적/연속적 표현 제공&lt;/li&gt;
&lt;li&gt;조직 전체 개선 지향&lt;/li&gt;
&lt;li&gt;SCAMPI 기반 공식 평가 체계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) CMMI 참조 모델과 진화&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;모델&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SW 분야&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;Software Capability Maturity Model&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (SW-CMM)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;시스템 공학&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;Systems Engineering Capability Maturity Model&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (SE-CMM)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인력 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;People Capability Maturity Model&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (P-CMM)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;획득 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;Software Acquisition Capability Maturity Model&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (SA-CMM)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;통합 제품 개발&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;Integrated Product Development Capability Maturity Model&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (IPD-CMM)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;통합 결과&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CMMI-DEV / CMMI-SVC / CMMI-ACQ&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;최신&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CMMI V2.0 (2018~)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. CMMI 구성도 및 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 구성도 (개념)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FyiDp/dJMcadHRpPQ/T6YrhAKNWauqkDfDKLQUH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FyiDp/dJMcadHRpPQ/T6YrhAKNWauqkDfDKLQUH1/img.png&quot; data-alt=&quot;목표 구성도 &amp;amp;middot; Goal Structure&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FyiDp/dJMcadHRpPQ/T6YrhAKNWauqkDfDKLQUH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyiDp%2FdJMcadHRpPQ%2FT6YrhAKNWauqkDfDKLQUH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;543&quot; height=&quot;235&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;목표 구성도 &amp;middot; Goal Structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 구성요소&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;PA (Process Area)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개선 대상 영역&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SG&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PA 달성을 위한 목표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SP&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SG를 위한 실행 활동&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;GG&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직화 수준 목표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;GP&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제도화 활동&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Maturity Level&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 성숙도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Capability Level&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PA별 능력 수준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. CMMI 표현방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 단계적 표현 (Staged Representation)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조직 전체 성숙도 중심&lt;/li&gt;
&lt;li&gt;5단계 성숙도 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성숙도 레벨&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Level&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;명칭&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Initial&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비정형&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Managed&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로젝트 단위 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Defined&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 표준화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Quantitatively Managed&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정량적 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Optimizing&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 연속적 표현 (Continuous Representation)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PA별 Capability Level 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Capability Level&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Incomplete&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Performed&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Managed&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Defined&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Quantitatively Managed&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Optimizing&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 단계적 vs 연속적 표현 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Staged&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Continuous&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 성숙도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PA 능력 수준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;결과&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Maturity Level&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Capability Level&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;적용 방식&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;순차적 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;선택적 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;활용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대외 인증&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;내부 전략 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. CMMI의 PA (Process Areas)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 레벨별 PA 구성&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;ML&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;주요 PA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;REQM, PP, PMC, SAM, MA, CM, PPQA&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RD, TS, PI, VER, VAL, OPF, OPD, OT, IPM, RSKM, DAR&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OPP, QPM&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OID, CAR&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. CMMI vs SW-CMM vs SPICE&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) SW-CMM 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SW-CMM&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;CMMI&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SW 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;통합 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단계적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단계+연속&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;확장성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제한적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;우수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SPICE 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;a style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ISO/IEC 15504&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;&amp;nbsp;(SPICE)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;CMMI&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;국제 표준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 프레임워크&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;평가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process Capability&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Maturity/Capability&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;활용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;글로벌 인증&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;미국 중심 확산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. PSP, TSP와 CMMI&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) PSP&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 단위 프로세스 개선 방법론&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결함 예방&lt;/li&gt;
&lt;li&gt;정량적 자기관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) TSP&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 단위 프로세스 체계화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할 기반 운영&lt;/li&gt;
&lt;li&gt;데이터 기반 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 관계도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TwqC3/dJMb99Mfp8V/kWbiFSBl0WAkLWAKUaE4dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TwqC3/dJMb99Mfp8V/kWbiFSBl0WAkLWAKUaE4dK/img.png&quot; data-alt=&quot;PSP &amp;amp;middot; TSP &amp;amp;middot; CMMI &amp;amp;nbsp;관계도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TwqC3/dJMb99Mfp8V/kWbiFSBl0WAkLWAKUaE4dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTwqC3%2FdJMb99Mfp8V%2FkWbiFSBl0WAkLWAKUaE4dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;361&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PSP &amp;middot; TSP &amp;middot; CMMI &amp;nbsp;관계도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. CMMI 전환 전략 및 고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 전환 전략&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전략&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;현재 프로세스 진단&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;목표 레벨 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;GAP 분석&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개선 로드맵 수립&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시범 적용 후 확산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;6&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SCAMPI 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 고려사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경영진 의지&lt;/li&gt;
&lt;li&gt;문화 저항 최소화&lt;/li&gt;
&lt;li&gt;문서화 과잉 방지&lt;/li&gt;
&lt;li&gt;실무 연계 강화&lt;/li&gt;
&lt;li&gt;자동화 도구 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. 적용 효과 및 향후 전망&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 적용 효과&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;효과&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;품질&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;결함 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;생산성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;일정 예측성 향상&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;재작업 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;조직&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;표준화 정착&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 향후 전망 및 대응&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Agile&amp;middot;DevOps와 통합 필요&lt;/li&gt;
&lt;li&gt;정량 데이터 기반 프로세스 자동화&lt;/li&gt;
&lt;li&gt;AI 기반 품질 예측&lt;/li&gt;
&lt;li&gt;CMMI V2.0 중심 경량화 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 문헌&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;CMMI Institute&lt;/a&gt;&lt;/span&gt;&lt;span&gt; 공식 문서&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ISACA&lt;/a&gt;&lt;/span&gt; CMMI V2.0 Guide&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ISO/IEC 15504&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Humphrey, W.S., &lt;i&gt;Managing the Software Process&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;SEI Technical Reports&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>capability</category>
      <category>Carnegie Mellon University</category>
      <category>CMMI Institute</category>
      <category>Continuous</category>
      <category>ISACA</category>
      <category>PA(Process Area)</category>
      <category>Software Engineering Institute</category>
      <category>staged</category>
      <category>성숙도(Maturity)</category>
      <category>소프트웨어 공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/442</guid>
      <comments>https://gregorio78.tistory.com/442#entry442comment</comments>
      <pubDate>Tue, 3 Mar 2026 18:23:43 +0900</pubDate>
    </item>
    <item>
      <title>ISO/IEC 12207 (Software Life Cycle Processes)</title>
      <link>https://gregorio78.tistory.com/441</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 소프트웨어 프로세스 품질 표준,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;ISO/IEC 12207 &lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;b&gt;의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;ISO/IEC 12207&lt;/b&gt;&lt;/span&gt;은 소프트웨어 생명주기(Software Life Cycle) 전반에 걸쳐 수행해야 할 **프로세스, 활동(Activity), 태스크(Task)**를 체계화한 국제 표준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;무엇을 수행해야 하는가(What to do)&amp;rdquo;를 정의하는 &lt;span&gt;&lt;b&gt;프로세스 중심 표준&lt;/b&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 등장 배경 및 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1980~90년대 대규모 SI/국방 프로젝트 증가&lt;/li&gt;
&lt;li&gt;국가&amp;middot;기업 간 개발 표준 상이 &amp;rarr; 품질 불균형&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ISO 9000&lt;/a&gt;&lt;/span&gt; 기반 품질경영 체계의 SW 영역 구체화 필요&lt;/li&gt;
&lt;li&gt;&lt;span&gt;계약 기반 프로젝트에서 &lt;/span&gt;&lt;b&gt;획득자&amp;ndash;공급자 간 공통 기준 필요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생명주기 전 단계 포괄&lt;/li&gt;
&lt;li&gt;계약 중심(획득/공급 프로세스 포함)&lt;/li&gt;
&lt;li&gt;Tailoring(조정) 가능&lt;/li&gt;
&lt;li&gt;프로세스 기반 품질관리 체계&lt;/li&gt;
&lt;li&gt;ISO 9000 품질경영 시스템과 연계 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) ISO 12207 프로세스 구조 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnzwN5/dJMcadgM6ON/ZTdjtT3f7Gwn47kpkORLsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnzwN5/dJMcadgM6ON/ZTdjtT3f7Gwn47kpkORLsk/img.png&quot; data-alt=&quot;조직&amp;amp;middot;기본&amp;amp;middot;지원 프로세스의 계층적 관계와 상호 작용 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnzwN5/dJMcadgM6ON/ZTdjtT3f7Gwn47kpkORLsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnzwN5%2FdJMcadgM6ON%2FZTdjtT3f7Gwn47kpkORLsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;901&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조직&amp;middot;기본&amp;middot;지원 프로세스의 계층적 관계와 상호 작용 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. ISO 12207의 구성 및 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 12207은 크게 &lt;span&gt;&lt;b&gt;기본, 지원, 조직 생명주기 프로세스&lt;/b&gt;&lt;/span&gt;로 구성된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;■ 통합 프로세스 표 (SDLC&amp;middot;품질&amp;middot;조직 관점 통합)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 360px;&quot; border=&quot;1&quot; width=&quot;540&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; width=&quot;43&quot; height=&quot;20&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; width=&quot;156&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; width=&quot;135&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; width=&quot;101&quot;&gt;&lt;b&gt;SDLC 관점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; width=&quot;105&quot;&gt;&lt;b&gt;품질 관점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;기본&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;획득(Acquisition)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;외부 SW 획득 관리&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;계획/요구&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;계약 품질 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;공급(Supply)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;고객 요구 충족&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;개발 수행&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;납품 품질&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;개발(Development)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;SW 설계&amp;middot;구현&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;분석~구현&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;제품 품질&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;운영(Operation)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;시스템 운영&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;운영&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;서비스 품질&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;유지보수(Maintenance)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;변경&amp;middot;개선&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;유지&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;지속 품질&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;지원&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;문서화&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;산출물 기록&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;전 단계&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;추적성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;형상관리&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;변경 통제&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;전 단계&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;무결성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;품질보증(QA)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;프로세스 적합성&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;전 단계&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;프로세스 품질&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;검증(Verification)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;산출물 검증&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;단계별&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;적합성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;확인(Validation)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;사용자 요구 충족 확인&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;시험&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;사용성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;합동검토(Joint Review)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;이해관계자 검토&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;단계별&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;리스크 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;감사(Audit)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;독립적 평가&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;전 단계&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;준수성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;문제해결(Problem Resolution)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;결함 처리&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;전 단계&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;품질 개선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;조직&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;관리(Management)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;프로젝트 관리&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;계획/통제&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;성과 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;기반구조(Infrastructure)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;개발환경 제공&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;전 단계&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;효율성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;개선(Process Improvement)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;프로세스 개선&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;조직 차원&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;성숙도 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; height=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;훈련(Training)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;인력 역량 강화&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;조직 차원&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;품질 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;■ 구성도 (개념도)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH83f9/dJMb99SZtzx/Y3OXoEAsP9FBi0t3yAO7Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH83f9/dJMb99SZtzx/Y3OXoEAsP9FBi0t3yAO7Mk/img.png&quot; data-alt=&quot;조직 &amp;amp;middot; 기본 &amp;amp;middot; 지원 프로세스의 계층 구조와 상호 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH83f9/dJMb99SZtzx/Y3OXoEAsP9FBi0t3yAO7Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH83f9%2FdJMb99SZtzx%2FY3OXoEAsP9FBi0t3yAO7Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;974&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조직 &amp;middot; 기본 &amp;middot; 지원 프로세스의 계층 구조와 상호 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. ISO 12207과 연관 품질모델 비교&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) QM (Quality Management) 관계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.1628%; text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.186%; text-align: center;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%; text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;&lt;span&gt;ISO 9000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.186%;&quot;&gt;&lt;span&gt;조직 품질경영체계&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%;&quot;&gt;&lt;span&gt;경영 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;&lt;span&gt;ISO 12207&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.186%;&quot;&gt;&lt;span&gt;SW 생명주기 프로세스 정의&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%;&quot;&gt;&lt;span&gt;수행 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;a&gt;ISO/IEC 15504&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (SPICE)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.186%;&quot;&gt;&lt;span&gt;프로세스 능력 평가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%;&quot;&gt;&lt;span&gt;성숙도 측정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 품질평가 모델 관계도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yit60/dJMcabQNLke/MPSdjNujhvKiX9hePUXyQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yit60/dJMcabQNLke/MPSdjNujhvKiX9hePUXyQK/img.png&quot; data-alt=&quot;품질경영 &amp;amp;rarr; SW 생명주기 &amp;amp;rarr; 프로세스 성숙도로 이어지는 ISO 표준 체계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yit60/dJMcabQNLke/MPSdjNujhvKiX9hePUXyQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyit60%2FdJMcabQNLke%2FMPSdjNujhvKiX9hePUXyQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;880&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;품질경영 &amp;rarr; SW 생명주기 &amp;rarr; 프로세스 성숙도로 이어지는 ISO 표준 체계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) ISO 12207 vs SPICE(15504) 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ISO 12207&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ISO 15504 (SPICE)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;수행 기준 제시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;능력 수준 측정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;결과&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;표준 프로세스 수립&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Level 0~5 등급&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;활용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개발 표준 수립&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. ISO 12207의 품질 특성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 12207 자체는 품질 특성을 직접 정의하지는 않으나, 다음 품질 확보 체계를 지원한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 준수성&lt;/li&gt;
&lt;li&gt;추적성(Traceability)&lt;/li&gt;
&lt;li&gt;형상 무결성&lt;/li&gt;
&lt;li&gt;검증&amp;middot;확인 체계&lt;/li&gt;
&lt;li&gt;지속적 개선 체계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고: 제품 품질 특성은 ISO/IEC 25010 계열에서 정의)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. ISO 12207 활용 방안 및 한계점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 활용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SI 프로젝트 표준 프로세스 수립&lt;/li&gt;
&lt;li&gt;공공사업 RFP 대응 체계 구축&lt;/li&gt;
&lt;li&gt;DevOps 프로세스 정립 시 기준 프레임워크 활용&lt;/li&gt;
&lt;li&gt;ISO 15504 기반 프로세스 성숙도 평가 연계&lt;/li&gt;
&lt;li&gt;품질보증 조직 설계 기준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;rarr; 특히 대규모 MSA 기반 프로젝트에서 &lt;/span&gt;&lt;b&gt;프로세스 표준화 + DevOps 자동화 체계 수립 시 적용 가치 높음&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 한계점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;문서 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Agile/DevOps 환경과 일부 충돌&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Tailoring 필요&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 특성 반영 필수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용 증가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;중소 프로젝트에는 과도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;추상적 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구체적 방법론은 별도 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;■ 종합 정리&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;핵심&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SW 생명주기 국제 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기본 + 지원 + 조직 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ISO9000, ISO15504&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 표준화 및 품질 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;활용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공공&amp;middot;대규모 SI 프로젝트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;한계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Agile 환경과 조정 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;■ 참고 출처&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISO/IEC 12207:2017 Software life cycle processes&lt;/li&gt;
&lt;li&gt;ISO/IEC 15504 (SPICE)&lt;/li&gt;
&lt;li&gt;ISO 9000 Quality Management Systems&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>ISO15504</category>
      <category>ISO9000</category>
      <category>기본(획득&amp;middot;공급&amp;middot;개발&amp;middot;운영&amp;middot;유지보수)</category>
      <category>소프트웨어 품질표준</category>
      <category>조직(관리&amp;middot;기반구조&amp;middot;개선&amp;middot;훈련)</category>
      <category>지원(문서화&amp;middot;형상관리&amp;middot;품질보증&amp;middot;V&amp;amp;V&amp;middot;합동검토&amp;middot;감사&amp;middot;문제해결)</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/441</guid>
      <comments>https://gregorio78.tistory.com/441#entry441comment</comments>
      <pubDate>Thu, 26 Feb 2026 08:05:17 +0900</pubDate>
    </item>
    <item>
      <title>SLM(Service Level Management)</title>
      <link>https://gregorio78.tistory.com/440</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. SLA 기반 및 개선을 통한 서비스 수준 관리 체계, SLM의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 SLM(Service Level Management)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SLM(Service Level Management)&lt;/b&gt;은 고객과 합의한 **SLA(Service Level Agreement)**를 기반으로 IT 서비스의 품질을 정의&amp;middot;측정&amp;middot;모니터링&amp;middot;개선하는 &lt;span&gt;&lt;b&gt;지속적 서비스 품질 관리 체계&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적: 비즈니스 요구사항에 부합하는 서비스 품질 보장&lt;/li&gt;
&lt;li&gt;기준: SLA에 명시된 서비스 수준 목표(SLO)&lt;/li&gt;
&lt;li&gt;활동: 협의 &amp;rarr; 정의 &amp;rarr; 측정 &amp;rarr; 보고 &amp;rarr; 개선(CSI)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT 서비스 관리 프레임워크인 &lt;a&gt;&lt;span&gt;ITIL&lt;/span&gt;&lt;/a&gt; 에서 SLM은 핵심 프로세스로 정의되며, 서비스 제공자와 고객 간의 신뢰 기반 운영체계를 구축하는 역할을 수행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 SOW, SLA, SLM의 관계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SOW (Statement of Work)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SLA (Service Level Agreement)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SLM (Service Level Management)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개념&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;수행 업무 범위 정의 문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 품질 수준에 대한 계약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA를 운영&amp;middot;관리&amp;middot;개선하는 관리 체계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;무엇을 할 것인가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;어느 수준으로 제공할 것인가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;약속된 수준을 어떻게 유지&amp;middot;개선할 것인가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;관점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로젝트/업무 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;품질 목표(정량 지표)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영 관리 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;예시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;ldquo;24시간 모니터링 제공&amp;rdquo;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;ldquo;가용성 99.9% 이상 유지&amp;rdquo;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월간 SLA 리포트, 위반 원인 분석 및 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;책임 주체&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약 당사자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 제공자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 운영 조직&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SOW &lt;span style=&quot;background-color: #ffffff; color: #14181f; text-align: start;&quot;&gt;&amp;rarr; &lt;/span&gt;SLA &lt;span style=&quot;background-color: #ffffff; color: #14181f; text-align: start;&quot;&gt;&amp;rarr; &lt;/span&gt;SLM 구성도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3FCET/dJMcacCbNq1/ndpDmq5EiCB4mYb6T2mHK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3FCET/dJMcacCbNq1/ndpDmq5EiCB4mYb6T2mHK0/img.png&quot; data-alt=&quot;업무 범위 정의에서 서비스 수준 계약, 운영&amp;amp;middot;관리&amp;amp;middot;개선 체계로 이어지는 서비스 관리 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3FCET/dJMcacCbNq1/ndpDmq5EiCB4mYb6T2mHK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3FCET%2FdJMcacCbNq1%2FndpDmq5EiCB4mYb6T2mHK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;686&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;업무 범위 정의에서 서비스 수준 계약, 운영&amp;middot;관리&amp;middot;개선 체계로 이어지는 서비스 관리 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. SLM 개념도 및 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 SLM 개념도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eSQti0/dJMb99Mcx7F/cDkGQlsbDJUTwq42WkM151/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eSQti0/dJMb99Mcx7F/cDkGQlsbDJUTwq42WkM151/img.png&quot; data-alt=&quot;비즈니스 요구사항에서 지속적 개선(CSI)까지 이어지는 서비스 수준 관리 사이클&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eSQti0/dJMb99Mcx7F/cDkGQlsbDJUTwq42WkM151/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeSQti0%2FdJMb99Mcx7F%2FcDkGQlsbDJUTwq42WkM151%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;1249&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1249&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비즈니스 요구사항에서 지속적 개선(CSI)까지 이어지는 서비스 수준 관리 사이클&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 SLM 구성요소&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구성요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 산출물&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;서비스 카탈로그&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제공 서비스 목록 및 범위 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Service Catalog&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SLA / SLO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 수준 계약 및 목표&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 문서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;KPI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;성과 측정 지표&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI 정의서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모니터링 시스템&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실시간 서비스 상태 측정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대시보드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리포팅 체계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 이행 현황 보고&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월간 SLA Report&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개선 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;위반 원인 분석 및 재발 방지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개선 계획서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;지원 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Incident/Problem/Change 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ITSM 연계 기록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. ITIL에 의한 SLM의 프로세스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a&gt;ITIL&lt;/a&gt;&lt;/span&gt; 기준 SLM은 다음 흐름으로 운영된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 활동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;연계 프로세스&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;① 요구 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비즈니스 요구사항 수집&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;BRM&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;② SLA 설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI/SLO 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Service Design&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;③ 합의 및 계약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고객과 SLA 협상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Supplier Management&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;④ 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가용성, 성능 측정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Availability / Capacity&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;⑤ 보고&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정기 SLA 리포트 작성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Reporting&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;⑥ 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;위반 분석 및 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CSI (Continual Service Improvement)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ITIL v3에서는 Service Design 영역에 포함되며, ITIL 4에서는 &lt;span&gt;&lt;b&gt;Service Value System(SVS)&lt;/b&gt;&lt;/span&gt; 관점에서 지속적 가치 창출 체계로 확장된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. SLM 구축 시스템 기능&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SLM 시스템은 일반적으로 다음 기능을 포함한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;기능 영역&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;상세 기능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SLA 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 등록/수정/이력관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;KPI 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가용성, 응답속도, MTTR 등 지표 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;실시간 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서버, 네트워크, 애플리케이션 상태 수집&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자동 경보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;임계치 초과 시 알림&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리포트 자동화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월간/분기 SLA 통계 보고&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;위반 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Root Cause Analysis&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;대시보드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;경영진용 KPI 시각화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ITSM 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Incident/Problem/Change 자동 연동&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA&amp;middot;클라우드 환경에서는 다음 도구들과 연계된다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;APM(Application Performance Monitoring)&lt;/li&gt;
&lt;li&gt;로그 분석 시스템&lt;/li&gt;
&lt;li&gt;Cloud Monitoring&lt;/li&gt;
&lt;li&gt;DevOps 파이프라인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 효과적인 SLM 구축 방안&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1 전략적 접근&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;실행 방안&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비즈니스 정렬&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA를 기술 중심이 아닌 비즈니스 영향 기준으로 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;현실적 목표 설정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;측정 가능하고 달성 가능한 SLO 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자동화 기반 구축&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;수동 보고 지양, 모니터링 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;정기 리뷰 체계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월간 SLA Review 회의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;KPI 최소화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;핵심 지표 중심 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;지속적 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CSI 프로세스 내재화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 MSA&amp;middot;클라우드 환경에서의 SLM&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 IT 환경에서는 다음 요소가 중요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API Gateway 기반 응답속도 측정&lt;/li&gt;
&lt;li&gt;Auto Scaling 환경에서의 동적 가용성 관리&lt;/li&gt;
&lt;li&gt;SLI/SLO 기반 Site Reliability Engineering(SRE) 적용&lt;/li&gt;
&lt;li&gt;Observability(Logging, Metrics, Tracing) 체계 확립&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SLM은 단순한 SLA 모니터링 활동이 아니라,&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;비즈니스 요구사항 &amp;rarr; SLA 정의 &amp;rarr; 측정 &amp;rarr; 보고 &amp;rarr; 개선&lt;br /&gt;&lt;/b&gt;&lt;span&gt;로 이어지는 &lt;/span&gt;&lt;b&gt;지속적 가치 관리 체계&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 클라우드&amp;middot;MSA 환경에서는 정량적 지표 기반의 자동화된 SLM 체계가 필수적이며,&amp;nbsp;ITIL 기반 프로세스와 DevOps 도구의 통합이 성공 요인이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ITIL&lt;/a&gt;&lt;/span&gt; Foundation Handbook&lt;/li&gt;
&lt;li&gt;AXELOS, &lt;i&gt;ITIL 4 Managing Professional&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;ISO/IEC 20000 (IT Service Management Standard)&lt;/li&gt;
&lt;li&gt;Gartner IT Service Management Framework 자료&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/440</guid>
      <comments>https://gregorio78.tistory.com/440#entry440comment</comments>
      <pubDate>Wed, 25 Feb 2026 18:38:12 +0900</pubDate>
    </item>
    <item>
      <title>SOW (Statement of Work, 작업명세서)</title>
      <link>https://gregorio78.tistory.com/439</link>
      <description>&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;※ 일반적으로 SOW는 &lt;i&gt;State of Work&lt;/i&gt;가 아니라 &lt;span&gt;&lt;b&gt;Statement of Work&lt;/b&gt;&lt;/span&gt;의 약어로 사용된다.&lt;br /&gt;계약 기반 IT 서비스, SI 프로젝트, 아웃소싱, 클라우드 운영계약 등에서 핵심 문서로 활용된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;1. 서비스 수준 관리를 위한 작업명세서, SOW의 개요&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1 SOW(Statement of Work)의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;SOW(Statement of Work)&lt;/b&gt;는 계약에 근거하여 수행될 &lt;/span&gt;&lt;b&gt;업무 범위, 산출물, 일정, 품질 기준, 책임, 검수 기준 등을 명확히 기술한 공식 문서&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&amp;ldquo;무엇을, 어디까지, 어떤 기준으로, 누가 책임지고 수행하는가&amp;rdquo;를 명문화한 실행 중심 계약 문서&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 IT 서비스 관리 및 아웃소싱 환경에서는 SOW가 SLA의 기반 문서가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2 SOW의 필요성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SOW는 다음과 같은 목적을 가진다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;필요성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;범위 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Scope Creep 방지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구사항 확장 및 무분별한 변경 통제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;책임 구분&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;책임소재 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;발주사/수행사 간 분쟁 예방&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;품질 기준 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 기준 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 수립의 기준 문서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용 통제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약금액 합리화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추가 과업 발생 시 근거자료&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;일정 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로젝트 통제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;일정, 마일스톤 명확화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리스크 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;사전 예방&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;예외사항 및 가정 명시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 SI&amp;middot;공공 프로젝트에서는 &lt;span&gt;&lt;b&gt;분쟁 예방 문서&lt;/b&gt;&lt;/span&gt;로서의 기능이 매우 중요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.3 SOW / SLA / SLM의 관계&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SOW&lt;/b&gt;&lt;/span&gt; : 무엇을 수행할 것인가 (Work 범위 정의)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SLA&lt;/b&gt;&lt;/span&gt; : 어느 수준으로 제공할 것인가 (Service Level 정의)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SLM&lt;/b&gt;&lt;/span&gt; : SLA를 관리&amp;middot;측정&amp;middot;개선하는 활동 (관리 프로세스)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;관계 구조도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qGss5/dJMcahwJVur/V3c6H7HSItbhWXhu8Kzjb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qGss5/dJMcahwJVur/V3c6H7HSItbhWXhu8Kzjb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qGss5/dJMcahwJVur/V3c6H7HSItbhWXhu8Kzjb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqGss5%2FdJMcahwJVur%2FV3c6H7HSItbhWXhu8Kzjb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;650&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SOW&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SLA&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SLM&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;작업 범위 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 수준 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 수준 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약 기반 실행 문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;품질 기준 문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;관리 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;주요 내용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;범위, 산출물, 일정, 책임&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가용성, 응답시간, 장애복구&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모니터링, 리포트, 개선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;시점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약 체결 시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영 개시 전&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영 기간 동안&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;관점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;수행 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;품질 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;관리&amp;middot;통제 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;2. SOW의 구성 및 구성항목&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1 SOW의 구성도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSJEg1/dJMcaca7mS1/8P1wDpMKBYrBIP5YLvalNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSJEg1/dJMcaca7mS1/8P1wDpMKBYrBIP5YLvalNk/img.png&quot; data-alt=&quot;서비스 수행 범위 &amp;amp;middot; 일정 &amp;amp;middot; 산출물 &amp;amp;middot; 기준을 정의하는 10가지 핵심 구성 요소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSJEg1/dJMcaca7mS1/8P1wDpMKBYrBIP5YLvalNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSJEg1%2FdJMcaca7mS1%2F8P1wDpMKBYrBIP5YLvalNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;947&quot; height=&quot;882&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서비스 수행 범위 &amp;middot; 일정 &amp;middot; 산출물 &amp;middot; 기준을 정의하는 10가지 핵심 구성 요소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2 SOW 구성요소 및 사례&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;대분류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구성요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 내용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;예시(IT 운영/클라우드 환경)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;계약 기본정보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;목적 및 배경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약 목적, 사업 배경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;AWS 기반 MSA 운영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;업무 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Scope 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;포함/제외 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Gateway, Auth, Batch 운영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;산출물&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Deliverables&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;보고서, 코드, 운영문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월간 운영보고서, 장애보고서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;일정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Milestone&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단계별 일정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구축 3개월, 운영 1년&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;역할 책임&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;R&amp;amp;R&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;발주사/수행사 구분&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;장애 1차 대응 수행사&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;서비스 기준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 기준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가용성, 응답시간&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;99.9% 가용성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Change Control&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 요청 절차&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CR 승인 후 반영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;보안&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Security&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;접근통제, 데이터보호&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;VPN, IAM 정책&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Price&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정액/시간당&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월 3,000만원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;검수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Acceptance&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;검수 기준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 달성률 95% 이상&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리스크&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Risk&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가정, 예외사항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;클라우드 장애 제외&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.3 관점별 SOW의 역할&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;① 서비스 사용자(발주사) 측면&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기대 수준 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구사항 문서화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;분쟁 방지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약 근거 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용 통제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추가 과업 통제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성과 평가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 평가 기준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;② 서비스 제공자(수행사) 측면&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;과업 범위 보호&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;과도한 요구 방지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리스크 통제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;책임 범위 명확화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;수익 보호&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추가 작업 비용 청구 근거&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;운영 기준 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 기준 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;3. SOW 작성 시 고려사항&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1 핵심 고려 요소&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;고려사항&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;범위 명확성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모호한 표현 금지 (&amp;ldquo;적절히&amp;rdquo;, &amp;ldquo;가능한 한&amp;rdquo;)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;측정 가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI는 정량적 수치로 명시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;책임 구분&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RACI 모델 적용 권장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Change Request 절차 명확화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SLA 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA와 충돌하지 않도록 정합성 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;법적 검토&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약법 및 손해배상 조항 검토&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;가정 명시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;전제조건 및 제외사항 명확히 작성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2 실무적 체크리스트&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업무 범위와 요구사항 명세서(RS) 일치 여부&lt;/li&gt;
&lt;li&gt;산출물 형식까지 명시했는가?&lt;/li&gt;
&lt;li&gt;SLA와 KPI가 정량화되어 있는가?&lt;/li&gt;
&lt;li&gt;장애 범위 정의가 명확한가?&lt;/li&gt;
&lt;li&gt;클라우드 사업자 책임 구분이 명확한가?&lt;/li&gt;
&lt;li&gt;보안/개인정보 보호 조항이 포함되어 있는가?&lt;/li&gt;
&lt;li&gt;분쟁 발생 시 기준 문장으로 사용 가능한가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;4. SOW의 전략적 중요성 (MSA&amp;middot;클라우드 환경 관점)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 다음과 같은 환경에서 SOW는 더욱 중요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MSA 기반 분산 서비스 구조&lt;/li&gt;
&lt;li&gt;AWS/Azure/Naver Cloud 혼합 환경&lt;/li&gt;
&lt;li&gt;DevOps 기반 지속 배포 환경&lt;/li&gt;
&lt;li&gt;24&amp;times;7 글로벌 서비스 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 SOW에는 다음이 반드시 포함되어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스별 책임 경계 (Gateway / Auth / Batch 등)&lt;/li&gt;
&lt;li&gt;클라우드 장애 시 책임 범위&lt;/li&gt;
&lt;li&gt;데이터 백업 및 복구 기준 (RPO / RTO)&lt;/li&gt;
&lt;li&gt;보안 사고 대응 체계&lt;/li&gt;
&lt;li&gt;로그 보관 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;5. 결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SOW는 단순한 계약 부속 문서가 아니라,&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;프로젝트 통제의 기준 문서이며, 서비스 품질 관리의 출발점이다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 SI&amp;middot;공공&amp;middot;클라우드&amp;middot;MSA 환경에서는 SOW &amp;rarr; SLA &amp;rarr; SLM의 구조를 체계적으로 설계해야 안정적인 운영이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;6. 참고 문헌&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;Project Management Institute&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;, &lt;i&gt;PMBOK Guide&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;AXELOS&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;ITIL Service Design&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;International Organization for Standardization&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;, ISO/IEC 20000 (IT Service Management)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;대한민국 기획재정부, 공공사업 계약지침&lt;/li&gt;
&lt;li&gt;한국정보화진흥원(NIA), 정보시스템 구축&amp;middot;운영 표준 가이드&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>SLA</category>
      <category>SLM</category>
      <category>SOW</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/439</guid>
      <comments>https://gregorio78.tistory.com/439#entry439comment</comments>
      <pubDate>Wed, 25 Feb 2026 18:29:11 +0900</pubDate>
    </item>
    <item>
      <title>SLA(Service Level Agreement)</title>
      <link>https://gregorio78.tistory.com/437</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. IT 서비스 수준 고객 협약서, SLA의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) SLA(Service Level Agreement)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SLA(Service Level Agreement)&lt;/b&gt;는 서비스 제공자(Service Provider)와 고객(Customer) 간에 &lt;span&gt;&lt;b&gt;IT 서비스의 품질 수준, 측정 기준, 책임 범위, 보상체계&lt;/b&gt;&lt;/span&gt; 등을 명시한 공식 계약 문서이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT 서비스의 &lt;span&gt;&lt;b&gt;정량적 목표(SLO)&lt;/b&gt;&lt;/span&gt; 를 명시&lt;/li&gt;
&lt;li&gt;&lt;span&gt;측정 방법, 보고 방식, 위반 시 &lt;/span&gt;&lt;b&gt;보상체계(Penalty/Service Credit)&lt;/b&gt;&lt;span&gt; 포함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ITSM 체계 내에서 &lt;/span&gt;&lt;b&gt;SLM(Service Level Management)&lt;/b&gt;&lt;span&gt; 활동의 핵심 산출물&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;SLA는 &amp;ldquo;서비스 결과에 대한 품질 계약&amp;rdquo;이며,&lt;br /&gt;SOW(Statement of Work)는 &amp;ldquo;업무 범위에 대한 수행 계약&amp;rdquo;이라는 점에서 구분된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SLA의 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;서비스 품질 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가용성, 응답시간, 복구시간 등을 수치화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;분쟁 예방&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;책임과 기준을 사전 명문화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성과 기반 운영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정량 지표 기반 서비스 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;고객 신뢰 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;객관적 품질 보증 체계 구축&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;지속적 개선 기반&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI 기반의 품질 개선 구조 확립&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. SLA의 개념도 및 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) SLA 개념도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0f0qw/dJMcaaK7MoM/LBZXo28OKECXsxmGikEC01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0f0qw/dJMcaaK7MoM/LBZXo28OKECXsxmGikEC01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0f0qw/dJMcaaK7MoM/LBZXo28OKECXsxmGikEC01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0f0qw%2FdJMcaaK7MoM%2FLBZXo28OKECXsxmGikEC01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;976&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SLA 구성요소&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구성요소&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;관련 개념&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;계약 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;계약 목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 범위 및 목표 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SOW&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;제공 서비스 상세 내역&lt;/td&gt;
&lt;td&gt;ITSM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;서비스 수준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLO (Service Level Objective)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;가용성 99.9% 등 정량 목표&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: start;&quot;&gt;SLA 지표&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;가용성, MTTR, 응답시간 등&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;운영지표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;관리 체계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 관리 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ITIL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: start;&quot;&gt;측정/보고 체계&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;월간 보고, 대시보드 등&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;Monitoring&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;책임 및 역할&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;R&amp;amp;R 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;발주자/수주자 책임 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Governance&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;보상체계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Penalty&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;위반 시 금전적 감액&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Service Credit&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: start;&quot;&gt;Incentive&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;목표 초과 시 보상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;성과보상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. SLA 절차 및 SLA 관리 주요지표&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) SLA 절차&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;단계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;주요 산출물&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;① 요구사항 수집&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고객 요구 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLR&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;② SLO 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정량 목표 수립&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI 정의서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;③ SLA 계약 체결&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;목표&amp;middot;보상체계 명문화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 문서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;④ 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실시간 지표 측정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모니터링 리포트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;⑤ 평가 및 보고&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;월/분기 단위 평가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 보고서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;⑥ 개선 활동&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;문제 개선 및 재협상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개선계획&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SLA 관리 주요 지표&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;지표&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;산식 예&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;가용성(Availability)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 정상 운영 비율&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;(총시간-장애시간)/총시간 &amp;times;100&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MTTR&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;평균 복구 시간&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;총 복구시간/장애건수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MTBF&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;평균 고장 간격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;총 운영시간/장애건수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;응답시간&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요청 후 응답까지 시간&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;평균 응답시간&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;처리율(Throughput)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단위시간당 처리 건수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;TPS&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;장애 처리 준수율&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 목표 내 처리 비율&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;목표내 처리건수/총건수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. SLA 적용에 따른 기대 효과 및 고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) SLA 적용시 기대 효과&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;기대 효과&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;품질 향상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정량 기준 기반 서비스 운영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;성과 기반 비용 지불 구조&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;책임 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;R&amp;amp;R 명확화로 분쟁 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;지속 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI 기반 품질 개선 선순환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SLA 계약 시 발주자 고려사항&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;고려사항&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;지표의 현실성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;과도한 가용성 요구(예: 99.999%)는 비용 급증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;측정 방법 명확화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;측정 도구, 기준 시점 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;예외 조항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;천재지변, 고객 귀책 등 명확화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;보상체계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;과도한 페널티는 장기 협력 저해&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) SLA 계약 시 수주자 고려사항&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;고려사항&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리스크 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;장애 발생 확률 및 영향도 분석&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인프라 이중화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;HA, DR 구성 필요성 검토&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모니터링 체계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실시간 지표 수집 시스템 구축&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;패널티 대비&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Service Credit 한도 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) SLA의 문제점 및 해결방안&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;해결 방안&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;형식적 SLA&lt;/td&gt;
&lt;td&gt;실질적 관리 미흡&lt;/td&gt;
&lt;td&gt;SLM 체계 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;과도한 지표&lt;/td&gt;
&lt;td&gt;관리 복잡성 증가&lt;/td&gt;
&lt;td&gt;핵심 KPI 중심 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;책임 전가&lt;/td&gt;
&lt;td&gt;장애 원인 분쟁&lt;/td&gt;
&lt;td&gt;RACI 명확화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비용 증가&lt;/td&gt;
&lt;td&gt;고가용성 요구&lt;/td&gt;
&lt;td&gt;비용-품질 균형&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;SLA &amp;middot; SOW &amp;middot; SLM &amp;middot; SLO 관계 정리&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;의미&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SLA&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 품질 계약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;품질 보증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SOW&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;수행 범위 계약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;업무 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SLM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SLA 관리 활동&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속적 품질 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;SLO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 목표 지표&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정량 목표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SLA는 단순한 계약 문서가 아니라, &lt;/span&gt;&lt;b&gt;ITSM 체계 내에서 서비스 품질을 정량적으로 관리하는 핵심 관리 도구&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SLA는 SOW와 달리 &lt;span&gt;&lt;b&gt;성과 중심 계약&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;SLM 활동을 통해 지속적 개선 수행&lt;/li&gt;
&lt;li&gt;SLO 기반 KPI 관리가 핵심&lt;/li&gt;
&lt;li&gt;보상체계는 리스크 관리와 직결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA&amp;middot;클라우드 환경에서는 가용성, 응답속도, 장애복구시간이 핵심 지표가 되며, Auto Scaling, 모니터링, DevOps 체계와 연계되어야 실효성 있는 SLA가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 및 출처&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;AXELOS&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;ITIL Service Design &amp;amp; Service Operation&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;ISO&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, ISO/IEC 20000 (IT Service Management)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;IEEE&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, IEEE 610.12 Software Engineering Terminology&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;&lt;b&gt;PMI&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, PMBOK Guide (SOW 관련 정의)&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>ITSM</category>
      <category>SLA</category>
      <category>SLM</category>
      <category>SLO</category>
      <category>SOW</category>
      <category>보상체계</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/437</guid>
      <comments>https://gregorio78.tistory.com/437#entry437comment</comments>
      <pubDate>Wed, 25 Feb 2026 07:58:18 +0900</pubDate>
    </item>
    <item>
      <title>요구공학 (Requirement Engineering)</title>
      <link>https://gregorio78.tistory.com/436</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 소프트웨어 요구사항의 품질만족을 위한 통합 프레임워크, 요구공학의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 요구공학(Requirement Engineering)의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;요구공학은 &lt;/span&gt;&lt;b&gt;이해관계자(Stakeholder)의 요구를 체계적으로 식별&amp;middot;분석&amp;middot;명세&amp;middot;검증하고, 개발 전 생명주기 동안 이를 관리하는 공학적 활동&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 단순한 요구 수집이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 요구 &amp;rarr; 시스템 요구로 구조화&lt;/li&gt;
&lt;li&gt;기능적/비기능적 요구로 분류&lt;/li&gt;
&lt;li&gt;명세(SRS)로 문서화&lt;/li&gt;
&lt;li&gt;추적성과 변경통제를 포함한 전주기 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;를 포함하는 &lt;/span&gt;&lt;b&gt;통합 관리 프레임워크&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표 표준:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;IEEE&lt;/a&gt;&lt;/span&gt; 29148 (Software Requirements Specification)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ISO&lt;/a&gt;&lt;/span&gt;/&lt;a&gt;&lt;span&gt;IEC&lt;/span&gt;&lt;/a&gt; 12207 (Software Life Cycle Process)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 요구공학 프로세스의 프레임워크 및 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 요구공학 프로세스 프레임워크&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wp2U9/dJMcadueTIf/KZckVZxEHvqc4z7eAEMfZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wp2U9/dJMcadueTIf/KZckVZxEHvqc4z7eAEMfZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wp2U9/dJMcadueTIf/KZckVZxEHvqc4z7eAEMfZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwp2U9%2FdJMcadueTIf%2FKZckVZxEHvqc4z7eAEMfZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;341&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 통합 구성요소 정리&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 활동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;산출물&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;핵심 키워드&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;타당성 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;사업성/기술성 검토&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;타당성 보고서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ROI, Risk&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구 추출&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인터뷰, 워크숍&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구 목록&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;사용자 요구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델링, 충돌 해결&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;분석 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능/비기능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구 명세&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SRS 작성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;소프트웨어 명세서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기준선(Baseline)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구 검증&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;리뷰, 프로토타입&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;검증 보고서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;검증가능성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경통제, 추적관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추적 매트릭스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Traceability&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 요구공학 프로세스 단계별 상세&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1 요구사항 타당성 분석 단계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기술적 타당성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술 구현 가능 여부&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;경제적 타당성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비용 대비 효과&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;운영적 타당성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 적용 가능성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;법&amp;middot;규제 타당성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;규정 준수 여부&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 요구사항 추출 프로세스&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;기법&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인터뷰&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;이해관계자 직접 질의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;설문&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정량적 의견 수집&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;워크숍&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공동 요구 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;프로토타이핑&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시각화 기반 요구 구체화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;문서 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기존 시스템 분석&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3 요구사항 관점별 분석&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 111px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;사용자 요구&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;비전&amp;middot;목표 중심&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&amp;ldquo;구매 승인 기능 필요&amp;rdquo;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;시스템 요구&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;구현 가능 수준&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;&amp;ldquo;3단계 승인 워크플로우 구현&amp;rdquo;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;기능적 요구&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;시스템 동작&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;로그인, 결제 처리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;비기능적 요구&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;품질 속성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;성능, 보안, 확장성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.4 요구사항 명세서(SRS)의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;동의 기준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;이해관계자 합의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기준선(Baseline)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 통제 기준 문서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;명확성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;중의성 제거&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;추적성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구&amp;rarr;설계&amp;rarr;코드&amp;rarr;테스트 연결&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.5 요구사항 명세서 작성 원리&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;원리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;명확성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;애매모호 표현 금지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;완전성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;누락 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;검증가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;테스트 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;일관성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상호 충돌 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;수정 용이성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구조화 문서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;추적 가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ID 기반 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개발 후 이용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;유지보수 활용 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.6 요구사항 명세서 항목&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기능적 요구사항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 동작 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비기능적 요구사항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;성능, 보안, 가용성, 확장성, 사용성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인터페이스 요구&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;외부 시스템 연계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;제약 조건&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술/정책/법적 제약&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.7 요구사항 검증&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;정의:&lt;/b&gt;&lt;/span&gt; 요구사항이 올바르게 정의되었는지 확인하는 활동&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;검증 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;방법&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;정확성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;전문가 리뷰&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;완전성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;체크리스트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;일관성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 검증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;테스트 가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;테스트 케이스 도출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;현실성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로토타입&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.8 요구사항 변경 관리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항은 프로젝트 진행 중 지속적으로 변경된다. 따라서 변경은 통제(Control)되어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;변경 관리 프로세스&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwD0JQ/dJMcabQLQfo/KdDKBwidQOCnIsO05rEhvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwD0JQ/dJMcabQLQfo/KdDKBwidQOCnIsO05rEhvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwD0JQ/dJMcabQLQfo/KdDKBwidQOCnIsO05rEhvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwD0JQ%2FdJMcabQLQfo%2FKdDKBwidQOCnIsO05rEhvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;167&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;단계&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 요청&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Change Request 등록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;영향 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;일정/비용/품질 영향 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;승인&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CCB(Change Control Board)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;반영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;문서 및 시스템 수정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;추적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경 이력 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 요구공학 수행 시 고려사항 및 향후 전망&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 고려 사항&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;고려 요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;이해관계자 다양성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;글로벌/다부서 환경&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;애자일 환경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속적 요구 변화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MSA 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 단위 요구 분리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;규제 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개인정보/보안 법규&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자동화 도구&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구 추적 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 향후 전망&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;AI 기반 요구 자동 분석&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;자연어 요구 &amp;rarr; 모델 자동 변환&lt;/li&gt;
&lt;li&gt;DevOps 기반 요구-테스트 자동 연결&lt;/li&gt;
&lt;li&gt;모델 기반 요구공학(MBRE) 확산&lt;/li&gt;
&lt;li&gt;요구-코드 추적 자동화 도구 발전&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 모델 기반 접근:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Object Management Group&lt;/a&gt;&lt;/span&gt;&lt;span&gt; 의 모델 기반 표준&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;International Requirements Engineering Board&lt;/a&gt;&lt;/span&gt;&lt;span&gt; (IREB) CPRE 자격체계&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;b&gt;요구공학 통합 정리 (핵심 요약 표)&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;영역&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;핵심 활동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 산출물&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;품질 요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;관리 요소&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구개발&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추출&amp;middot;분석&amp;middot;명세&amp;middot;확인&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SRS&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;명확성&amp;middot;완전성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기준선&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추적&amp;middot;변경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RTM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추적성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;변경통제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구유형&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능&amp;middot;비기능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구 ID&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;검증가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;영향도 분석&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;요구공학은 단순 문서 작업이 아니라 &lt;/span&gt;&lt;b&gt;소프트웨어 품질과 프로젝트 성공을 결정하는 핵심 공학 활동&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 MSA&amp;middot;DevOps&amp;middot;클라우드 환경에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구의 지속적 변경 관리&lt;/li&gt;
&lt;li&gt;비기능 요구(성능&amp;middot;보안&amp;middot;확장성)의 정량화&lt;/li&gt;
&lt;li&gt;요구-테스트 자동 연계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 핵심 경쟁력이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;참고 문헌&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;IEEE&lt;/a&gt;&lt;/span&gt; Std 29148-2018, &lt;i&gt;Systems and Software Engineering &amp;mdash; Life Cycle Processes &amp;mdash; Requirements Engineering&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;ISO&lt;/a&gt;&lt;/span&gt;/&lt;a&gt;&lt;span&gt;IEC&lt;/span&gt;&lt;/a&gt; 12207&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Karl Wiegers&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;Software Requirements&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Ian Sommerville&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;Software Engineering&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;International Requirements Engineering Board&lt;/a&gt;&lt;/span&gt;&lt;span&gt; CPRE Syllabus&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>기능/비기능 요구</category>
      <category>사용자 요구</category>
      <category>소프트웨어 명세</category>
      <category>시스템 요구</category>
      <category>요구개발(추출&amp;middot;분석&amp;middot;명세&amp;middot;확인)</category>
      <category>요구관리(추적&amp;middot;변경)</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/436</guid>
      <comments>https://gregorio78.tistory.com/436#entry436comment</comments>
      <pubDate>Tue, 24 Feb 2026 08:03:58 +0900</pubDate>
    </item>
    <item>
      <title>Prototype Pattern 및 ODM(Ontology Definition Metamodel) 기반 메타 모델링</title>
      <link>https://gregorio78.tistory.com/435</link>
      <description>&lt;h1&gt;&lt;b&gt;1. ODM(Ontology Definition Metamodel)의 개요&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1 ODM의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ODM(Ontology Definition Metamodel)&lt;/b&gt;은&amp;nbsp;&lt;span&gt;&lt;a&gt;Object Management Group&lt;/a&gt;&lt;/span&gt;(OMG)가 정의한 &lt;span&gt;&lt;b&gt;온톨로지 모델을 UML 기반으로 표현하기 위한 메타모델 표준&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ODM은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;온톨로지를 UML 프로파일 형태로 정의&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;MOF&lt;/a&gt;&lt;/span&gt; 기반 메타모델 구조 사용&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;XMI&lt;/a&gt;&lt;/span&gt;를 통한 모델 교환 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, &lt;/span&gt;&lt;b&gt;Semantic Web 기술과 모델 기반 개발(MDD)을 연결하는 표준&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2 Ontology의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ontology란:&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;특정 도메인의 개념, 관계, 제약조건을 형식적으로 정의한 명세&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 요소:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Class (개념)&lt;/li&gt;
&lt;li&gt;Property (속성/관계)&lt;/li&gt;
&lt;li&gt;Individual (인스턴스)&lt;/li&gt;
&lt;li&gt;Constraint (제약조건)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 기술:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;RDF&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;OWL&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.3 ODM의 특징 &amp;middot; 목적 &amp;middot; 필요성&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 167px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;관련 표준 및 기술&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;정의&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;UML 기반 온톨로지 모델링 메타모델&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;UML, MOF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;Ontology &amp;harr; UML 간 상호운용성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;XMI, XML&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;프로파일 기반 확장&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;UML Profile&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;필요성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;모델 기반 아키텍처(MDA) 환경에서 시맨틱 통합&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;RDF, OWL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;확장성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;Prototype Pattern 기반 메타모델 복제&amp;middot;확장 가능&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;MOF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;제약정의&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;형식적 제약 조건 명세&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;OCL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;논리표현&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;개념 논리 및 규칙 표현&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;CL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;2. ODM 개념도 및 구성요소&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1 ODM 개념도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY5sa5/dJMcabiXQSj/MOdlcG6u2eA08U1ogyq3Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY5sa5/dJMcabiXQSj/MOdlcG6u2eA08U1ogyq3Sk/img.png&quot; data-alt=&quot;OMG ODM Specification (ontologyDefinitionMetamodel) &amp;amp;middot; MOF 2.0 기반 각 계층은 상위 계층의 언어로 기술(describe)되며, 아래로 갈수록 구체화됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY5sa5/dJMcabiXQSj/MOdlcG6u2eA08U1ogyq3Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY5sa5%2FdJMcabiXQSj%2FMOdlcG6u2eA08U1ogyq3Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;916&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OMG ODM Specification (ontologyDefinitionMetamodel) &amp;middot; MOF 2.0 기반 각 계층은 상위 계층의 언어로 기술(describe)되며, 아래로 갈수록 구체화됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2 ODM 계층구조 설명&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;메타 레벨&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;기술&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;M3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타메타모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MOF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;M2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ODM 메타모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Profile&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;M1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 온톨로지 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;M0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실제 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RDF, XML&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.3 Prototype Pattern의 구성요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;&lt;/span&gt;&lt;span&gt; 에 정의된 Prototype Pattern은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;객체 복제를 통한 인스턴스 생성 패턴&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구성요소&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;ODM과의 연관성&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Prototype&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;복제 대상 인터페이스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타클래스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ConcretePrototype&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실제 구현 클래스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Ontology Class&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Client&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;복제 요청자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 생성기&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;clone()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;복제 메커니즘&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타모델 인스턴스화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ODM과 Prototype의 연결&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;ODM은 &lt;/span&gt;&lt;b&gt;메타모델 기반 복제 구조&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Ontology 모델은 UML Class를 기반으로 복제/확장&lt;/li&gt;
&lt;li&gt;MOF 기반 계층은 Prototype 구조와 유사한 &lt;span&gt;&lt;b&gt;계층적 인스턴스화&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;b&gt;3. ODM의 역할과 기능&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1 ODM 기능 메커니즘 구성도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;1121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ygBGB/dJMcaivy2j9/cF14snKxBz06eQ4ss2RELK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ygBGB/dJMcaivy2j9/cF14snKxBz06eQ4ss2RELK/img.png&quot; data-alt=&quot;OMG ODM Specification &amp;amp;middot; XMI 2.x &amp;amp;middot; W3C OWL 2 / RDF 1.1 UML 표기법 &amp;amp;rarr; XMI 직렬화 &amp;amp;rarr; OWL 온톨로지 &amp;amp;rarr; 시맨틱 웹 서비스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ygBGB/dJMcaivy2j9/cF14snKxBz06eQ4ss2RELK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FygBGB%2FdJMcaivy2j9%2FcF14snKxBz06eQ4ss2RELK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;1121&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;1121&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OMG ODM Specification &amp;middot; XMI 2.x &amp;middot; W3C OWL 2 / RDF 1.1 UML 표기법 &amp;rarr; XMI 직렬화 &amp;rarr; OWL 온톨로지 &amp;rarr; 시맨틱 웹 서비스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2 ODM의 역할 및 효과&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;기능 영역&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;효과&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;관련 기술&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모델 통합&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML &amp;harr; OWL 매핑&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 간 상호운용성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;XMI&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;시맨틱 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Ontology 기반 의미 모델링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;데이터 일관성 향상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RDF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;제약 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;형식 제약 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 검증 자동화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OCL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;논리 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개념 논리 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지식 추론 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MDA 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CIM&amp;rarr;PIM&amp;rarr;PSM 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;자동화 개발 지원&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MOF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모델 재사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Prototype 기반 모델 복제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;생산성 향상&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;4. ODM 관련 ISO 메타데이터 표준 및 구성도&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ODM은 ISO/IEC 표준과 밀접한 관련이 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;표준&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;ODM과의 관계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ISO/IEC 19505&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML 표준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ODM은 UML Profile 기반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ISO/IEC 19502&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MOF 표준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ODM의 메타모델 기반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ISO/IEC 11179&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타데이터 레지스트리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;의미 데이터 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ISO/IEC 19763&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타모델 프레임워크&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;온톨로지 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ISO/IEC 20944&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ODM 표준&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Ontology 모델링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ISO 메타데이터 계층 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;1051&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IwdZi/dJMcadVjH8N/fmRh9IWwjgYVJirdZ6EsE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IwdZi/dJMcadVjH8N/fmRh9IWwjgYVJirdZ6EsE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IwdZi/dJMcadVjH8N/fmRh9IWwjgYVJirdZ6EsE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIwdZi%2FdJMcadVjH8N%2FfmRh9IWwjgYVJirdZ6EsE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;1051&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;1051&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;5. 데이터 참조 모델링 (Reference Model)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reference Model은 시스템 간 의미적 정합성을 확보하기 위한 상위 모델이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ODM 기반 Reference Model 구조&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;계층&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;모델 유형&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;관련 기술&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개념 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Conceptual&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 개념 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ER&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;논리 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Logical&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;관계 구조 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;시맨틱 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Ontology&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;의미&amp;middot;추론 가능 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OWL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;물리 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Physical&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;저장 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;XML&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;ER &amp;harr; Ontology 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;ER 모델&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;Ontology 모델&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;데이터 구조 설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;의미 표현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;관계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단순 관계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;추론 가능 관계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;제약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구조 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;논리 제약(OCL/CL)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;테이블 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RDF Triple&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;전체 통합 개념 구조도&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;1122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OH50U/dJMcafZVtik/id3hg8X4BFYKJvTsjwhIuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OH50U/dJMcafZVtik/id3hg8X4BFYKJvTsjwhIuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OH50U/dJMcafZVtik/id3hg8X4BFYKJvTsjwhIuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOH50U%2FdJMcafZVtik%2Fid3hg8X4BFYKJvTsjwhIuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;1122&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;1122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ODM은 단순한 온톨로지 정의 표준이 아니라,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MOF 기반 메타모델 확장&lt;/li&gt;
&lt;li&gt;UML과 Semantic Web 기술 통합&lt;/li&gt;
&lt;li&gt;Prototype Pattern과 유사한 메타계층 복제 구조&lt;/li&gt;
&lt;li&gt;ISO 메타데이터 표준과 연계된 모델 기반 아키텍처 구성 요소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 이해해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 MDA, MDD, 지식관리, SW 현대화 관점에서 ODM은 &lt;b&gt;구조적 모델링과 시맨틱 모델링을 연결하는 핵심 매개체&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;출처&lt;/b&gt;&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Object Management Group&lt;/a&gt;&lt;/span&gt;, &lt;i&gt;Ontology Definition Metamodel (ODM) Specification&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;a&gt;W3C&lt;/a&gt;&lt;/span&gt;, RDF/OWL Specifications&lt;/li&gt;
&lt;li&gt;ISO/IEC 19502 (MOF), ISO/IEC 19505 (UML), ISO/IEC 20944 (ODM)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <category>CL</category>
      <category>ER</category>
      <category>MOF</category>
      <category>OCL</category>
      <category>odm</category>
      <category>owl</category>
      <category>RDF</category>
      <category>UML</category>
      <category>XMI</category>
      <category>XML</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/435</guid>
      <comments>https://gregorio78.tistory.com/435#entry435comment</comments>
      <pubDate>Mon, 23 Feb 2026 18:48:31 +0900</pubDate>
    </item>
    <item>
      <title>Agile SCRUM과 XP(eXtreme Programming)</title>
      <link>https://gregorio78.tistory.com/434</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Agile SCRUM의 개요 및 특징&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. &lt;b&gt;SCRUM의&amp;nbsp;&lt;/b&gt;개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;SCRUM&lt;/b&gt;&lt;/span&gt;은 반복적&amp;middot;점진적 개발을 위한 &lt;b&gt;프레임워크(Framework)&lt;/b&gt;로,&amp;nbsp;고정된 역할(Role), 이벤트(Event), 산출물(Artifact)을 통해 &lt;span&gt;&lt;b&gt;복잡한 문제를 관리&lt;/b&gt;&lt;/span&gt;하는 데 초점을 둔다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Sprint&lt;/b&gt;&lt;/span&gt;라는 짧은 개발 주기(보통 2~4주)&lt;/li&gt;
&lt;li&gt;고객 가치 중심의 &lt;span&gt;&lt;b&gt;점진적 기능 제공&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;팀 자율성과 투명성 강조&lt;/li&gt;
&lt;li&gt;관리&amp;middot;협업&amp;middot;의사결정 구조에 강점&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;✔ SCRUM은 &amp;ldquo;어떻게 코딩할 것인가&amp;rdquo;보다&lt;br /&gt;&amp;ldquo;어떻게 협업하고 관리할 것인가&amp;rdquo;에 초점을 둔 방법론&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. &lt;b&gt;SCRUM의&amp;nbsp;&lt;/b&gt;주요 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;명확한 &lt;/span&gt;&lt;b&gt;3대 역할&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Product Owner&lt;/li&gt;
&lt;li&gt;Scrum Master&lt;/li&gt;
&lt;li&gt;Development Team&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정형화된 &lt;span&gt;&lt;b&gt;이벤트&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sprint Planning&lt;/li&gt;
&lt;li&gt;Daily Scrum&lt;/li&gt;
&lt;li&gt;Sprint Review&lt;/li&gt;
&lt;li&gt;Sprint Retrospective&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;투명한 &lt;/span&gt;&lt;b&gt;백로그 기반 관리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;경험적 프로세스 제어(Empiricism)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;투명성(Transparency)&lt;/li&gt;
&lt;li&gt;검사(Inspection)&lt;/li&gt;
&lt;li&gt;적응(Adaptation)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. XP(eXtreme Programming)의 개요 및 특징&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 개요 (XP)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;XP(eXtreme Programming)&lt;/b&gt;는 Agile 선언을 가장 &lt;b&gt;기술적으로 극단화(eXtreme)&lt;/b&gt;한 방법론으로, &lt;b&gt;코드 품질&amp;middot;개발자 협업&amp;middot;즉각적인 피드백&lt;/b&gt;&lt;span&gt;에 초점을 둔다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 변경을 자연스러운 것으로 수용&lt;/li&gt;
&lt;li&gt;기술 실천(Practice)을 핵심으로 함&lt;/li&gt;
&lt;li&gt;&amp;ldquo;좋은 설계는 지속적인 리팩토링에서 나온다&amp;rdquo;는 철학&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;✔ XP는 &amp;ldquo;어떻게 설계하고, 어떻게 코딩할 것인가&amp;rdquo;에 가장 집중한 Agile 방법론&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2. 주요 특징 (XP)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;강력한 &lt;/span&gt;&lt;b&gt;기술적 실천법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Test-Driven Development (TDD)&lt;/li&gt;
&lt;li&gt;Pair Programming&lt;/li&gt;
&lt;li&gt;Continuous Integration (CI)&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;고객과 개발자의 &lt;span&gt;&lt;b&gt;상시 협업&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;짧은 릴리즈 주기&lt;/li&gt;
&lt;li&gt;단순한 설계(Simple Design) 지향&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Agile SCRUM과 XP의 비교 (통합 표)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 공통점 및 차이점 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SCRUM&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;XP&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기본 성격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로젝트 관리 프레임워크&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개발 기술 중심 방법론&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Agile 가치&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고객 가치, 변화 수용, 협업&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고객 가치, 변화 수용, 협업&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;반복 주기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Sprint (2~4주)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Iteration (1~2주)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;핵심 초점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;관리&amp;middot;협업&amp;middot;프로세스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;코드 품질&amp;middot;기술 실천&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;역할 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;명확 (PO, SM, Team)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비교적 단순&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기술 규칙&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;강제하지 않음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;강제 수준으로 권장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;문서화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;최소 필요 문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;최소 문서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변화 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Sprint 단위 반영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;즉각적 반영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;적합 팀 규모&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;중&amp;middot;대규모 팀&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;소규모 팀&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;대표 키워드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Backlog, Sprint, Review&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;TDD, Pair, Refactoring&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Agile SCRUM과 XP의 장단점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1. Agile SCRUM의 장단점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;장점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;- 역할과 책임이 명확- 프로젝트 가시성 우수- 이해관계자 관리에 강함- 조직 확장성 우수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;단점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;- 기술 품질은 팀 역량에 의존- 형식적 운영 시 &amp;ldquo;회의 방법론&amp;rdquo; 전락 위험- 초기 학습 비용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2. XP의 장단점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;장점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;- 높은 코드 품질- 버그 감소 및 안정성 향상- 빠른 피드백과 릴리즈- 기술 부채 최소화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;단점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;- 개발자 숙련도 요구 높음- Pair Programming에 대한 거부감- 대규모 조직 적용 어려움&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. SCRUM + XP 결합 구성도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1990&quot; data-origin-height=&quot;1876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/05FO7/dJMcacWe0vj/8zK4c2n3xvzsuGLdPn3F1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/05FO7/dJMcacWe0vj/8zK4c2n3xvzsuGLdPn3F1K/img.png&quot; data-alt=&quot;※ SCRUM은 프로젝트 관리 프레임워크를, XP는 구체적인 기술 실천 방법을 제공하여 상호 보완적으로 작동합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/05FO7/dJMcacWe0vj/8zK4c2n3xvzsuGLdPn3F1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F05FO7%2FdJMcacWe0vj%2F8zK4c2n3xvzsuGLdPn3F1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1990&quot; height=&quot;1876&quot; data-origin-width=&quot;1990&quot; data-origin-height=&quot;1876&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;※ SCRUM은 프로젝트 관리 프레임워크를, XP는 구체적인 기술 실천 방법을 제공하여 상호 보완적으로 작동합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;✔ &lt;/span&gt;&lt;b&gt;SCRUM = 관리 프레임워크&lt;br /&gt;&lt;/b&gt;&lt;span&gt;✔ &lt;/span&gt;&lt;b&gt;XP = 기술 실행 엔진 &lt;/b&gt;&lt;span&gt;&amp;rarr; 실무에서는 &lt;/span&gt;&lt;b&gt;SCRUM + XP 혼합 적용&lt;/b&gt;&lt;span&gt;이 가장 안정적&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1. 요약&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SCRUM&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;협업과 관리에 강한 Agile 프레임워크&lt;/li&gt;
&lt;li&gt;SI&amp;middot;공공&amp;middot;대규모 조직에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;XP&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 품질과 기술 실천에 특화&lt;/li&gt;
&lt;li&gt;스타트업&amp;middot;소규모&amp;middot;기술 중심 조직에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현대 Agile 실무&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SCRUM으로 프로젝트를 관리하고&lt;/li&gt;
&lt;li&gt;XP로 개발 품질을 보장하는 혼합 전략이 표준&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2. 제언 (SI&amp;middot;MSA&amp;middot;DevOps 관점)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SI/공공 프로젝트&lt;br /&gt;&lt;span&gt;&amp;rarr; &lt;/span&gt;&lt;b&gt;SCRUM 기반 + XP 일부 도입&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;MSA&amp;middot;DevOps 환경&lt;br /&gt;&lt;span&gt;&amp;rarr; &lt;/span&gt;&lt;b&gt;SCRUM + XP + CI/CD 자동화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;숙련 개발자 조직&lt;br /&gt;&amp;rarr; XP 비중 확대&lt;/li&gt;
&lt;li&gt;대규모 조직&lt;br /&gt;&amp;rarr; SCRUM 기반 거버넌스 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 출처 및 참고문헌&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Agile Manifesto
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://agilemanifesto.org&quot;&gt;https://agilemanifesto.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scrum Guide (Ken Schwaber, Jeff Sutherland)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://scrumguides.org&quot;&gt;https://scrumguides.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Extreme Programming Explained&lt;/i&gt; &amp;ndash; Kent Beck&lt;/li&gt;
&lt;li&gt;IEEE Software, Agile Development Practices&lt;/li&gt;
&lt;li&gt;Martin Fowler &amp;ndash; Agile &amp;amp; XP Practices
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com&quot;&gt;https://martinfowler.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PMI &amp;ndash; Agile Practice Guide&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/434</guid>
      <comments>https://gregorio78.tistory.com/434#entry434comment</comments>
      <pubDate>Sat, 31 Jan 2026 12:03:09 +0900</pubDate>
    </item>
    <item>
      <title>지식검색메타모델(KDM, Knowledge Discovery Metamodel)</title>
      <link>https://gregorio78.tistory.com/433</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;개요&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KDM(Knowledge Discovery Metamodel)은 OMG(Object Management Group)가 표준화한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;소프트웨어 지식 표현을 위한 메타모델&lt;/span&gt;&lt;/b&gt;&lt;span&gt;로, 레거시 시스템 분석, 유지보수, 진단, 평가 및 &lt;b&gt;소프트웨어 현대화(SW Modernization)&lt;/b&gt;를 체계적으로 지원하기 위해 설계되었다. KDM은 소스 코드, 데이터 구조, 아키텍처, 비즈니스 규칙 등을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;기술 독립적이고 상호운용 가능한 모델&lt;/span&gt;&lt;/b&gt;&lt;span&gt;로 표현함으로써 모델 기반 개발(MDD)과 자동화된 현대화를 가능하게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 유지보수, 진단, 평가 및 현대화를 위한 상호운용성 보장&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 KDM의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KDM은 레거시 소프트웨어 자산을 구조적&amp;middot;의미적으로 분석하여 &lt;b&gt;표준 메타모델(MOF 기반)&lt;/b&gt;로 표현하는 지식 표현 모델이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준화 기관&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OMG (Object Management Group)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기반 기술&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MOF, UML, MDA&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;레거시 시스템 이해, 분석, 현대화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;적용 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드, 데이터, 아키텍처, 비즈니스 로직&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 KDM의 필요성&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;기존 문제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;KDM 필요성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;문서 부재&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드 기반 자동 지식 추출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;기술 종속성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술 중립적 모델 제공&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;복잡한 레거시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구조적/계층적 모델링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;현대화 리스크&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;사전 영향도 분석 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.3 KDM의 목표&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;상호운용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;다양한 도구 간 모델 공유&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;재사용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지식 자산의 장기 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자동화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;분석&amp;middot;변환&amp;middot;이행 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;가시성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;아키텍처 및 의존성 시각화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.4 KDM의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;메타모델 기반&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MOF 기반 구조&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;다계층 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드~비즈니스 계층 포괄&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Profile과 호환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MDA 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CIM/PIM/PSM 변환 지원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. KDM의 아키텍처와 구성 요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 KDM 아키텍처 구성도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;1562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lLIRs/dJMcadU7hCG/UWwgnbcsEeYtp8UV5txGEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lLIRs/dJMcadU7hCG/UWwgnbcsEeYtp8UV5txGEK/img.png&quot; data-alt=&quot;KDM은 기존 시스템의 지식을 발견하고 표현하기 위한 OMG 표준 메타모델입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lLIRs/dJMcadU7hCG/UWwgnbcsEeYtp8UV5txGEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlLIRs%2FdJMcadU7hCG%2FUWwgnbcsEeYtp8UV5txGEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2196&quot; height=&quot;1562&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;1562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;KDM은 기존 시스템의 지식을 발견하고 표현하기 위한 OMG 표준 메타모델입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 KDM의 주요 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Code&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;소스 코드 구조 표현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Data&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;데이터베이스 및 파일 구조&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Action&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제어 흐름, 호출 관계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Structure&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;아키텍처 구조&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Conceptual&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비즈니스 개념&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Platform&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실행 환경 정보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3 KDM의 메타모델 계층 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYpmjV/dJMcag5rhe5/JKl7m0E3kBSkVL3Aqv0keK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYpmjV/dJMcag5rhe5/JKl7m0E3kBSkVL3Aqv0keK/img.png&quot; data-alt=&quot;※ KDM은 기존 소프트웨어 시스템의 지식을 추출하고 표현하기 위한 포괄적인 메타모델입니다.
※ 각 서브 메타모델은 시스템의 특정 관점(뷰)을 표현하며, 상호 연관되어 완전한 시스템 표현을 제공합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYpmjV/dJMcag5rhe5/JKl7m0E3kBSkVL3Aqv0keK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYpmjV%2FdJMcag5rhe5%2FJKl7m0E3kBSkVL3Aqv0keK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2150&quot; height=&quot;1440&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;※ KDM은 기존 소프트웨어 시스템의 지식을 추출하고 표현하기 위한 포괄적인 메타모델입니다.
※ 각 서브 메타모델은 시스템의 특정 관점(뷰)을 표현하며, 상호 연관되어 완전한 시스템 표현을 제공합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. KDM의 활용 사례 및 적용 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1 KDM을 활용한 소프트웨어 현대화 사례&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;As-Is&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;To-Be&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Mainframe COBOL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Java/Spring MSA&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Monolithic&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Microservices&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;On-Premise&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Cloud Native&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 KDM 적용 방법론&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.3488%; text-align: center;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.5349%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.3488%;&quot;&gt;&lt;span&gt;Reverse Engineering&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.5349%;&quot;&gt;&lt;span&gt;코드 &amp;rarr; KDM 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.3488%;&quot;&gt;&lt;span&gt;Knowledge Discovery&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.5349%;&quot;&gt;&lt;span&gt;의존성&amp;middot;구조 분석&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.3488%;&quot;&gt;&lt;span&gt;Target Modeling&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.5349%;&quot;&gt;&lt;span&gt;목표 아키텍처 설계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.3488%;&quot;&gt;&lt;span&gt;Model Transformation&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.5349%;&quot;&gt;&lt;span&gt;KDM &amp;rarr; UML/DSL&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.3488%;&quot;&gt;&lt;span&gt;Re-engineering&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.5349%;&quot;&gt;&lt;span&gt;신규 시스템 구현&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3 KDM 도구 및 기술&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;도구&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Eclipse MoDisco&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드 &amp;rarr; KDM 추출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ADM Toolchain&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;현대화 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML Tools&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 시각화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;DSL Engines&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 특화 언어 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. KDM의 장점과 한계&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 KDM의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OMG 국제 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자동화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;분석&amp;middot;변환 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;확장성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;다양한 언어&amp;middot;플랫폼 지원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;재사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지식 자산 축적&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 KDM의 한계 및 도전 과제&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;한계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;학습 난이도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타모델 복잡&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;도구 의존&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상용/전문 도구 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;실시간성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;동적 분석 한계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;최신 기술 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Cloud/Serverless 표현 한계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 결론 및 향후 전망&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1 KDM의 중요성 재확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KDM은 단순한 코드 분석 모델이 아니라, &lt;span&gt;&lt;b&gt;소프트웨어 공학&amp;middot;아키텍처&amp;middot;지식관리&lt;/b&gt;&lt;/span&gt;를 통합하는 핵심 메타모델이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 KDM의 향후 발전 방향&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;방향&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Cloud 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Cloud Native 메타모델 연계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;AI 결합&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;자동 지식 추론&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;DSL 강화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 중심 현대화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;DevOps 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CI/CD 기반 모델 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.3 출처 및 참고 문헌&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OMG, &lt;i&gt;Knowledge Discovery Metamodel (KDM) Specification&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;OMG, &lt;i&gt;Architecture-Driven Modernization (ADM)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;ISO/IEC 19506: KDM Standard&lt;/li&gt;
&lt;li&gt;Eclipse MoDisco Documentation&lt;/li&gt;
&lt;li&gt;Model Driven Architecture (MDA) Guide&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/433</guid>
      <comments>https://gregorio78.tistory.com/433#entry433comment</comments>
      <pubDate>Sat, 31 Jan 2026 11:50:24 +0900</pubDate>
    </item>
    <item>
      <title>SPEM(Software Process Engineering Metamodel)</title>
      <link>https://gregorio78.tistory.com/432</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 키워드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OGM(= OMG), 프로세스, 메타모델, Process Structure, Process Behavior, Managed Content, Method Content, Process with Methods, Method Plugin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. UML을 이용한 프로세스 모델링 표준, SPEM의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 SPEM 정의&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;정식 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Software Process Engineering Metamodel&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준 기관&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OMG(Object Management Group)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;소프트웨어 개발 **프로세스와 방법론(Method)**을 UML 기반으로 구조화&amp;middot;정형화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준 버전&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 2.0&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표현 수단&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Profile + MetaModel&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;SPEM은 &amp;ldquo;소프트웨어 개발 프로세스를 모델링하기 위한 메타모델&amp;rdquo;&lt;/b&gt;이다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 SPEM의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML 기반&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Activity, Class, Package 개념을 확장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;메타모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 자체를 정의하는 상위 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;분리 설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Process&lt;/b&gt;&lt;span&gt;와 &lt;/span&gt;&lt;b&gt;Method Content&lt;/b&gt;&lt;span&gt; 분리&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;재사용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Plugin을 통한 조립식 구성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직/도구 간 프로세스 상호운용성 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. SPEM 메타모델의 아키텍처 및 주요 구성 요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 SPEM 메타모델 아키텍처 구성도&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqhkj9/dJMcafMeniV/MkoX8QkKqwWob618beuARk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqhkj9/dJMcafMeniV/MkoX8QkKqwWob618beuARk/img.png&quot; data-alt=&quot;※ SPEM: Software &amp;amp;amp; Systems Process Engineering Metamodel&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqhkj9/dJMcafMeniV/MkoX8QkKqwWob618beuARk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqhkj9%2FdJMcafMeniV%2FMkoX8QkKqwWob618beuARk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1910&quot; height=&quot;1330&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;※ SPEM: Software &amp;amp; Systems Process Engineering Metamodel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 주요 구성 요소 설명&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구성 요소&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;주요 하위 요소&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;역할 및 설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;핵심 키워드&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;공통기반&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Core Model&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;RoleTaskWorkProductGuidance&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM의 최하위 공통 메타모델로, 모든 프로세스 및 방법 요소의 기본 단위를 정의함&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Role, Task, WorkProduct&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;프로세스 구조&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Process Structure&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PhaseIterationActivityTask Use&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스를 단계&amp;middot;반복&amp;middot;작업 단위로 구조화하며 &amp;ldquo;무엇을 언제 수행하는가&amp;rdquo;를 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process Structure&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;프로세스 행위&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Process Behavior&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Control FlowDependencyParallel FlowCondition&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Activity 기반으로 작업 간 흐름, 병렬 처리, 조건 분기를 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process Behavior&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;관리계층&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Managed Content&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process PackageMethod Package&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스와 Method Content를 연결&amp;middot;관리하며 재사용 및 일관성을 보장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Managed Content&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;방법론 자산&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Method Content&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Task DefinitionRole DefinitionWork Product DefinitionGuidance&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;특정 프로세스에 종속되지 않는 재사용 가능한 방법론 자산을 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Content&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;프로세스 적용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Process with Methods&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Task UseRole UseWork Product Use&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Content를 실제 프로세스에 매핑하여 실행 가능한 프로세스로 구성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process with Methods&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;확장&amp;middot;조립 단위&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Method Plugin&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method ContentProcess ModelGuidance&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;방법론과 프로세스를 패키지화하여 프로젝트&amp;middot;조직 단위로 조합 및 확장 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Plugin&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. SPEM을 활용한 프로세스 모델링 방법론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1 프로세스 모델링 단계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;단계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;1단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Content 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;2단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process Structure 설계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;3단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process Behavior 설계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;4단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Plugin 조립&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;5단계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;검증 및 표준화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 UML 다이어그램 작성법&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;UML 다이어그램&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;SPEM 활용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Class Diagram&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Role, Task, WorkProduct&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Activity Diagram&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Process Behavior&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Package Diagram&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Plugin 구성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3 사례 연구 (공공 SI 프로젝트 개발 프로세스 예)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Task&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;산출물&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구사항 분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구사항 정의서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;아키텍처 설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;설계서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개발&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기능 구현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;소스코드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;테스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;통합 테스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;테스트 결과서&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.4 실제 프로세스 모델링 예시&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2092&quot; data-origin-height=&quot;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKOND/dJMcabQzyTR/AjKyCJBmszPWKVk4JoRg90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKOND/dJMcabQzyTR/AjKyCJBmszPWKVk4JoRg90/img.png&quot; data-alt=&quot;※ 각 활동(Activity)은 역할(Role)에 의해 수행되며, 산출물(Work Product)을 생성합니다. ※ 개발 후 단위 테스트는 병렬로, 통합 테스트는 순차적으로 진행됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKOND/dJMcabQzyTR/AjKyCJBmszPWKVk4JoRg90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKOND%2FdJMcabQzyTR%2FAjKyCJBmszPWKVk4JoRg90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2092&quot; height=&quot;1226&quot; data-origin-width=&quot;2092&quot; data-origin-height=&quot;1226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;※ 각 활동(Activity)은 역할(Role)에 의해 수행되며, 산출물(Work Product)을 생성합니다. ※ 개발 후 단위 테스트는 병렬로, 통합 테스트는 순차적으로 진행됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. SPEM의 확장 및 응용&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;SPEM의 확장성은 Method Plugin을 중심으로, 표준 프로세스를 유지하면서도 Agile&amp;middot;MSA&amp;middot;DevOps 같은 현대 개발 패러다임을 수용할 수 있게 한다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;개념/구성요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;확장&amp;middot;적용 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;적용 효과&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;대표 사례&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;확장 단위&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Method Plugin&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Content + Process Model + Guidance를 하나의 패키지로 구성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로젝트&amp;middot;조직 단위로 Plugin을 조합하여 사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;재사용성 향상표준 프로세스 유지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Scrum PluginDevOps Plugin&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;확장 메커니즘&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;SPEM 확장 방법&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Profile 확장Custom Task / Role 정의Process Template&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직&amp;middot;도메인 특화 요소를 메타모델에 추가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인 적합성 향상표준과 커스터마이징의 공존&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공공 SI 전용 Task보안 점검 Role&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;조립 방식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Process with Methods&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Content를 실제 Process에 매핑&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Task Use / Role Use를 통해 실행 프로세스 구성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실행 가능 프로세스 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;분석&amp;ndash;설계&amp;ndash;개발&amp;ndash;테스트 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Agile 도메인&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Agile / Scrum 적용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Sprint, Backlog, Review를 Task로 모델링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Scrum Plugin으로 반복 개발 프로세스 구성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;경량 프로세스반복&amp;middot;적응 강화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Scrum, XP&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;MSA 도메인&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Microservices Architecture&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 단위 Task 및 독립 배포 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스별 Plugin 구성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;독립성&amp;middot;확장성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스별 개발&amp;middot;배포&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;DevOps 도메인&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;DevOps / CI&amp;middot;CD&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Build, Test, Deploy Task&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;자동화 파이프라인을 Process Behavior로 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;배포 자동화품질 안정화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Jenkins, GitOps&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;공공&amp;middot;SI 도메인&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;표준 개발 방법론&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단계별 산출물 중심 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;발주기관 표준 프로세스 Plugin화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;감사 대응 용이문서 표준화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공공 정보화 사업&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;조직 확장&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;엔터프라이즈 적용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;전사 공통 Plugin + 프로젝트별 Plugin&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공통/개별 프로세스 분리 운영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 일관성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대기업 SI 조직&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  핵심 요약 관점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Method Plugin&lt;br /&gt;&lt;/b&gt;&amp;rarr; &lt;i&gt;SPEM 확장의 핵심 단위&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SPEM 확장 방법&lt;br /&gt;&lt;/b&gt;&amp;rarr; &lt;i&gt;UML Profile + Custom 요소&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응용 도메인&lt;br /&gt;&lt;/b&gt;&amp;rarr; &lt;i&gt;Agile &amp;middot; MSA &amp;middot; DevOps &amp;middot; 공공 SI까지 범용 적용&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. SPEM 도구 및 지원 환경&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;SPEM 도구 선택의 기준은 &amp;ldquo;표준 준수 vs 확장성 vs 비용&amp;rdquo;이며, 공공&amp;middot;SI 환경에서는 EPF, 엔터프라이즈 환경에서는 RMC가 가장 많이 활용된다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;도구명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;유형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;활용 방법&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;한계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;적용 환경&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;오픈소스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Eclipse Process Framework (EPF)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 전용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method Content 정의Process 모델링Plugin 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Method 작성 &amp;rarr; Process 구성 &amp;rarr; Plugin 조립 &amp;rarr; 웹 퍼블리싱&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;무료OMG SPEM 표준 준수공공 SI 적합&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UI 노후화학습 곡선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;공공 SI표준 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;상용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;IBM Rational Method Composer (RMC)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 전용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대규모 방법론 관리조직 표준화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;조직 공통 방법론 설계 및 배포&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;확장성 우수엔터프라이즈 적합&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고비용벤더 종속&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;대기업엔터프라이즈&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;상용 UML&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Enterprise Architect&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Tool&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM Profile 지원UML 기반 모델링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Class/Activity Diagram으로 프로세스 표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML 친숙통합 모델링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 전용 기능 제한&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;아키텍처 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;오픈 방법론&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;OpenUP&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 기반 방법론&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;경량 개발 프로세스 제공&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;템플릿 기반 적용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Agile 친화적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;커스터마이징 제한&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;중소 규모&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;일반 UML 도구&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;MagicDraw / Visual Paradigm&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Tool&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Profile 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM Profile 직접 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;자유도 높음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 관리 기능 부족&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;연구&amp;middot;교육&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;문서화 도구&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;Wiki / Web Publisher&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;보조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 문서 배포&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SPEM 산출물 웹 게시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;접근성 높음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델링 불가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;전사 공유&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  도구 선택 가이드 요약&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;추천 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;공공&amp;middot;SI 표준 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Eclipse EPF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;대기업&amp;middot;엔터프라이즈&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IBM RMC&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML 중심 아키텍처&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Enterprise Architect&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Agile 경량 적용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OpenUP&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;교육&amp;middot;연구&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML Tool + SPEM Profile&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 결론 및 향후 연구 방향&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.1 SPEM의 장점 및 한계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;한계&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;프로세스 표준화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;초기 학습 비용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;재사용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델링 복잡&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;도구 독립성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;경량 프로젝트엔 과도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.2 향후 연구 및 발전 방향&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Agile/DevOps 친화적 단순화&lt;/li&gt;
&lt;li&gt;MSA&amp;middot;클라우드 전용 SPEM Profile&lt;/li&gt;
&lt;li&gt;자동화 도구(Git, CI/CD) 연계&lt;/li&gt;
&lt;li&gt;AI 기반 프로세스 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.3 참고 문헌 및 자료 (출처)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;OMG, &lt;/span&gt;&lt;b&gt;SPEM 2.0 Specification&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;OMG 공식 문서&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.omg.org/spec/SPEM/&quot;&gt;https://www.omg.org/spec/SPEM/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eclipse Process Framework (EPF)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.eclipse.org/epf/&quot;&gt;https://www.eclipse.org/epf/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Philippe Kruchten, &lt;i&gt;The Rational Unified Process&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;ISO/IEC 12207 Software Life Cycle Processes&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/432</guid>
      <comments>https://gregorio78.tistory.com/432#entry432comment</comments>
      <pubDate>Sat, 31 Jan 2026 11:16:11 +0900</pubDate>
    </item>
    <item>
      <title>Docker 설치 방법</title>
      <link>https://gregorio78.tistory.com/431</link>
      <description>&lt;h1 id=&quot;B1UKCW3C&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;B1UKCW3C&quot; data-block-id=&quot;BkRmaD&quot;&gt;1. 설치 및 등록&lt;/h1&gt;
&lt;h2 id=&quot;wFMoYMRv&quot; data-toc-id=&quot;wFMoYMRv&quot; data-block-id=&quot;KRbXWZ&quot; data-ke-size=&quot;size26&quot;&gt;1.1 Docker &amp;amp; Docker Compose 설치&lt;/h2&gt;
&lt;pre class=&quot;vim&quot; data-block-id=&quot;tMXH5s&quot;&gt;&lt;code&gt;# root 계정으로 설치
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wFMoYMRv&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;KRbXWZ&quot; data-toc-id=&quot;wFMoYMRv&quot; data-ke-size=&quot;size26&quot;&gt;1.2 시스템 서비스 등록&lt;/h2&gt;
&lt;pre class=&quot;properties&quot; data-block-id=&quot;rdV4Q3&quot;&gt;&lt;code&gt;# root 계정으로 실행
sudo systemctl enable docker --now
sudo systemctl status docker&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wFMoYMRv&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;wFMoYMRv&quot; data-block-id=&quot;KRbXWZ&quot; data-ke-size=&quot;size26&quot;&gt;1.3 서비스 계정(dockeruser)을 Docker 그룹에 추가&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;80lP0I&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;# root 계정으로 실행
sudo usermod -aG docker dockeruser&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wFMoYMRv&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;wFMoYMRv&quot; data-block-id=&quot;KRbXWZ&quot; data-ke-size=&quot;size26&quot;&gt;1.4 dockeruser&amp;nbsp;계정에서 운영&lt;/h2&gt;
&lt;pre class=&quot;properties&quot; data-block-id=&quot;lXTN_h&quot;&gt;&lt;code&gt;docker ps
docker compose up -d
docker compose logs -f&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;yr-s0XPP&quot; data-toc-id=&quot;yr-s0XPP&quot; data-block-id=&quot;0_X7sl&quot;&gt;2. Docker 기반 개발 서버 구성&lt;/h1&gt;
&lt;h2 id=&quot;zlICD5pm&quot; data-toc-id=&quot;zlICD5pm&quot; data-block-id=&quot;kL64tG&quot; data-ke-size=&quot;size26&quot;&gt;2.1 Frontend 서버 디렉토리 구조&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;PmmjYP&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;/srv/frontend
├── user-web/
│   ├── logs/
│   └── config/
├── admin-web/
│   ├── logs/
│   └── config/
└── etc-web/
    ├── logs/
    └── config/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;_-DjXvSa&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;0GrUqW&quot; data-toc-id=&quot;_-DjXvSa&quot; data-ke-size=&quot;size23&quot;&gt;2.1.1 Frontend 서비스 디렉토리 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1769656086470&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# root 계정으로 실행
sudo mkdir -p /srv/frontend/{user-web, admin-web, etc-web}
sudo mkdir -p /srv/frontend/{user-web, admin-web, etc-web}/logs
sudo mkdir -p /srv/frontend/{user-web, admin-web, etc-web}/config&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zlICD5pm&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;kL64tG&quot; data-toc-id=&quot;zlICD5pm&quot; data-ke-size=&quot;size26&quot;&gt;2.2 Backend 서버 디렉토리 구조&lt;/h2&gt;
&lt;pre style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;sql&quot; data-block-id=&quot;PmmjYP&quot;&gt;&lt;code&gt;/srv/backend
├── eureka/
│   ├── logs/
│   └── config/
├── gateway/
│   ├── logs/
│   └── config/
├── service1/
│   ├── logs/
│   └── config/
├── service2/
│   ├── logs/
│   └── config/
└── etc-service/
    ├── logs/
    └── config/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;_-DjXvSa&quot; data-toc-id=&quot;_-DjXvSa&quot; data-block-id=&quot;0GrUqW&quot; data-ke-size=&quot;size23&quot;&gt;2.2.1 Backend 서비스 디렉토리 생성&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-block-id=&quot;uwCjNU&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# root 계정으로 실행
sudo mkdir -p /srv/backend/{eureka, gateway, service1, service2, etc-service}
sudo mkdir -p /srv/backend/{eureka, gateway, service1, service2, etc-service}/logs
sudo mkdir -p /srv/backend/{eureka, gateway, service1, service2, etc-service}/config&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zlICD5pm&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;kL64tG&quot; data-toc-id=&quot;zlICD5pm&quot; data-ke-size=&quot;size26&quot;&gt;2.3 소유권(dockeruser) 위임&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-block-id=&quot;Oef8Ia&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo chown -R dockeruser:dockeruser /srv/backend&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;J0OJZKxR&quot; data-toc-id=&quot;J0OJZKxR&quot; data-block-id=&quot;jAChHW&quot; data-ke-size=&quot;size23&quot;&gt;2.3.1 dockeruser 계정을 docker 그룹에 추가&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-block-id=&quot;N9aREb&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo usermod -aG docker dockeruser&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;0nVwiDeo&quot; data-toc-id=&quot;0nVwiDeo&quot; data-block-id=&quot;0POr7b&quot; data-ke-size=&quot;size23&quot;&gt;2.3.2 dockeruser 계정으로 전환&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-block-id=&quot;J9Frpz&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;su - dockeruser
cd /srv/msa&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Docker</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/431</guid>
      <comments>https://gregorio78.tistory.com/431#entry431comment</comments>
      <pubDate>Thu, 29 Jan 2026 12:12:44 +0900</pubDate>
    </item>
    <item>
      <title>MDA(Model Driven Architecture)</title>
      <link>https://gregorio78.tistory.com/430</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;메타모델 기반의 구현 공정 자동화와 MDA의 등장 배경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MDA(Model Driven Architecture)는 **OMG(Object Management Group)**가 제안한 표준 기반의 아키텍처 접근 방식으로, 소프트웨어 개발에서 **모델(Model)**을 중심 자산(Primary Artifact)으로 삼아 분석&amp;middot;설계&amp;middot;구현&amp;middot;운영 전 과정을 자동화&amp;middot;표준화하는 것을 목표로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 코드 중심 개발 방식은 플랫폼 종속성, 낮은 재사용성, 기술 변화에 따른 유지보수 비용 증가라는 한계를 가졌고, 이를 해결하기 위해 &lt;span&gt;&lt;b&gt;MOF 기반 메타모델&lt;/b&gt;&lt;/span&gt;, &lt;span&gt;&lt;b&gt;UML&lt;/b&gt;&lt;/span&gt;, &lt;span&gt;&lt;b&gt;모델 변환&lt;/b&gt;&lt;/span&gt;, &lt;span&gt;&lt;b&gt;자동 코드 생성&lt;/b&gt;&lt;/span&gt;을 핵심으로 하는 MDA가 등장하였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MDA 개념 구성도&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4543&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3lGkS/dJMcabJPmBH/TAD7vkug3XuQYlE6vVFB31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3lGkS/dJMcabJPmBH/TAD7vkug3XuQYlE6vVFB31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3lGkS/dJMcabJPmBH/TAD7vkug3XuQYlE6vVFB31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3lGkS%2FdJMcabJPmBH%2FTAD7vkug3XuQYlE6vVFB31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4543&quot; height=&quot;410&quot; data-origin-width=&quot;4543&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 메타모델 기반의 구현 공정 자동화, MDA의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 MDA의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;정의&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;모델 중심 개발을 통해 플랫폼 독립성과 자동화를 확보하는 OMG 표준 아키텍처&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;핵심&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;CIM &amp;rarr; PIM &amp;rarr; PSM &amp;rarr; Code 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;목표&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;상호운용성, 재사용성, 구현 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 MDA의 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구성 요소&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MOF&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타모델 정의를 위한 메타-메타 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 모델링 표준 언어&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;XMI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 교환을 위한 XML 기반 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;CWM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;데이터웨어하우스/BI 메타모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;CIM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비즈니스 관점 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;PIM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;플랫폼 독립 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;PSM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;플랫폼 종속 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.3 MDA의 주요 개념&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;핵심 키워드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;상호운용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;표준 기반 모델 교환 및 연계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;재사용성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PIM 중심의 모델 재사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;구현 자동화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 &amp;rarr; 코드 자동 생성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML Profile&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인/플랫폼 확장 메커니즘&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.4 MDA의 이점과 한계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;이점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;생산성 향상, 품질 개선, 기술 변화 대응&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;한계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;초기 학습 비용, 도구 의존성, 복잡한 모델 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.5 MDA의 적용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;적용 분야&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;사례&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;공공 SI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;전자정부 프레임워크 모델 기반 개발&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;금융&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Core Banking 모델 표준화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;제조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;PLM/ERP 연계 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.6 MDA와 관련된 표준 및 프레임워크&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;표준&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;OMG MDA&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MDA 전체 프레임워크&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML 2.x&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델링 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MOF 2.x&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메타모델 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;XMI&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 교환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.7 MDA 도구 및 기술&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;도구&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;기술&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Eclipse EMF&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MOF 기반 모델 프레임워크&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Papyrus&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;UML/MDA 모델링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;MagicDraw&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상용 UML/MDA 도구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;AndroMDA&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Java 기반 코드 생성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.8 MDA 개발 프로세스&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3330&quot; data-origin-height=&quot;2265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U6mHb/dJMb996h52q/gdCzZW40JG5gkmWcJGb1Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U6mHb/dJMb996h52q/gdCzZW40JG5gkmWcJGb1Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U6mHb/dJMb996h52q/gdCzZW40JG5gkmWcJGb1Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU6mHb%2FdJMb996h52q%2FgdCzZW40JG5gkmWcJGb1Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3330&quot; height=&quot;2265&quot; data-origin-width=&quot;3330&quot; data-origin-height=&quot;2265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.9 MDA 모델링 기법&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;모델링 기법&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML 다이어그램&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;클래스, 시퀀스, 컴포넌트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;UML Profile&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;플랫폼/도메인 확장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;DSL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;특정 도메인 언어&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.10 MDA와 기존 개발방식 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;기존 방식&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;MDA&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;중심 자산&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;어려움&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;용이&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자동화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제한적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;높음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. MDA 기반의 MDD 개발 방법론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 MDD의 정의 및 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MDD(Model Driven Development)는 &lt;span&gt;&lt;b&gt;모델을 중심으로 개발을 수행하는 방법론의 총칭&lt;/b&gt;&lt;/span&gt;으로, MDA는 그중 OMG 표준 아키텍처이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 MDD와 MDA의 관계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;MDD&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;MDA&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;방법론&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;표준 아키텍처&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;포괄적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OMG 기반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3 MDD 개발 프로세스&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;단계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모델링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;도메인/시스템 모델 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변환&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 간 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;생성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;코드/설정 자동 생성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.4 MDD 모델링 기법&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UML&lt;/li&gt;
&lt;li&gt;DSL&lt;/li&gt;
&lt;li&gt;메타모델 기반 모델링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.5 MDD 도구 및 기술&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;도구&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Xtext&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;DSL 개발&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Acceleo&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 &amp;rarr; 코드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;ATL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.6 MDD 적용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring 기반 CRUD 자동 생성&lt;/li&gt;
&lt;li&gt;DB 스키마 &amp;rarr; Entity 자동화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. MDA와 MDD의 통합 및 활용 방안&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1 통합 전략&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MDA 구조 위에 MDD 프로세스 적용&lt;/li&gt;
&lt;li&gt;CI/CD와 코드 생성 연계&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 상호 보완적 역할&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;MDA&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;MDD&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;표준 구조 제공&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;실천 방법 제공&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3 활용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 MSA 표준 모델&lt;/li&gt;
&lt;li&gt;멀티 플랫폼(Spring, .NET) 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.4 미래 전망&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 기반 모델 생성&lt;/li&gt;
&lt;li&gt;Low-Code/No-Code 융합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. PIM과 PSM의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 PIM 정의&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;기술 독립적&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;장기적 재사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 PSM 정의&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;플랫폼 반영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;예&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Spring Boot, JPA&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.3 PIM&amp;ndash;PSM 관계&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qrxci/dJMcaiPDtJc/RgeipZk1Xc8gNkKkhrR5w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qrxci/dJMcaiPDtJc/RgeipZk1Xc8gNkKkhrR5w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qrxci/dJMcaiPDtJc/RgeipZk1Xc8gNkKkhrR5w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqrxci%2FdJMcaiPDtJc%2FRgeipZk1Xc8gNkKkhrR5w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1271&quot; height=&quot;305&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.4 변환 기법&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;규칙 기반 변환&lt;/li&gt;
&lt;li&gt;템플릿 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.5 활용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PIM &amp;rarr; Spring/JPA PSM&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 모델 변환 및 코드 생성 기법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1 모델 변환 개요&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;M2M&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 간 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;M2T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 &amp;rarr; 텍스트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 변환 도구&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 52px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;height: 16px; text-align: center;&quot;&gt;&lt;b&gt;도구&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 16px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;용도&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;ATL&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;M2M&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;QVT&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;OMG 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.3 코드 생성 개요&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복 코드 제거&lt;/li&gt;
&lt;li&gt;표준화된 산출물&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.4 코드 생성 도구&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;도구&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Acceleo&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;M2T&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;AndroMDA&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Java 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.5 적용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Entity/Repository 자동 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. MDA와 MDD의 도전 과제 및 향후 연구 방향&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.1 도전 과제&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;과제&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;복잡성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모델 관리 난이도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;도구 종속&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;벤더 락인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.2 향후 연구 방향&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI + MDA&lt;/li&gt;
&lt;li&gt;클라우드 네이티브 모델링&lt;/li&gt;
&lt;li&gt;DevOps 연계 모델 자동화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MDA는 &lt;span&gt;&lt;b&gt;MOF&amp;ndash;UML&amp;ndash;XMI&amp;ndash;CIM/PIM/PSM&lt;/b&gt;&lt;/span&gt;으로 이어지는 메타모델 체계를 통해 소프트웨어 개발을 구조적으로 혁신한다. MDD와 결합될 때 MDA는 단순한 이론을 넘어 &lt;span&gt;&lt;b&gt;실질적인 생산성 향상과 품질 확보 수단&lt;/b&gt;&lt;/span&gt;이 되며, 특히 대규모 SI&amp;middot;공공&amp;middot;MSA 환경에서 강력한 효과를 발휘한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고 문헌 및 출처&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OMG, &lt;i&gt;Model Driven Architecture (MDA) Guide&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;OMG, &lt;i&gt;UML 2.x Specification&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;OMG, &lt;i&gt;MOF 2.x Specification&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Schmidt, D.C., &lt;i&gt;Model-Driven Engineering&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Eclipse Foundation, &lt;i&gt;EMF Documentation&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/430</guid>
      <comments>https://gregorio78.tistory.com/430#entry430comment</comments>
      <pubDate>Thu, 29 Jan 2026 10:53:51 +0900</pubDate>
    </item>
    <item>
      <title>Redis 설치 절차</title>
      <link>https://gregorio78.tistory.com/429</link>
      <description>&lt;h1 id=&quot;xjpvRs7G&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;xjpvRs7G&quot; data-block-id=&quot;KpkCWQ&quot;&gt;1. 사전 확인&lt;/h1&gt;
&lt;pre class=&quot;vim&quot; data-block-id=&quot;EmH3OC&quot;&gt;&lt;code&gt;cat /etc/rocky-release
# Rocky Linux release 9.6 (Blue Onyx)

sudo dnf install -y gcc make tcl
# Redis는 C로 빌드되므로 gcc, make 필수, tcl은 설치 테스트 시 필요&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;xjpvRs7G&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;KpkCWQ&quot; data-toc-id=&quot;xjpvRs7G&quot; data-pm-slice=&quot;1 1 []&quot;&gt;2. Redis Yum Repository 등록 및 스트림 활성화&lt;/h1&gt;
&lt;h2 id=&quot;H-yalW-G&quot; data-toc-id=&quot;H-yalW-G&quot; data-block-id=&quot;6Du6Nd&quot; data-ke-size=&quot;size26&quot;&gt;2.1 Redis Repository 등록&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;eHIvP6&quot;&gt;&lt;code&gt;sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;H-yalW-G&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;6Du6Nd&quot; data-toc-id=&quot;H-yalW-G&quot; data-ke-size=&quot;size26&quot;&gt;2.2 스트림 활성화&lt;/h2&gt;
&lt;pre class=&quot;crystal&quot; data-block-id=&quot;bO2LN0&quot;&gt;&lt;code&gt;sudo dnf module reset redis -y
sudo dnf module enable redis:remi-7.2 -y&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;xjpvRs7G&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;xjpvRs7G&quot; data-block-id=&quot;KpkCWQ&quot;&gt;3. Redis 설치 및 버전 확인&lt;/h1&gt;
&lt;h2 id=&quot;Y_Yi4UbQ&quot; data-toc-id=&quot;Y_Yi4UbQ&quot; data-block-id=&quot;OpZ72h&quot; data-ke-size=&quot;size26&quot;&gt;3.1 Redis 설치&lt;/h2&gt;
&lt;pre class=&quot;cmake&quot; data-block-id=&quot;whwqum&quot;&gt;&lt;code&gt;sudo dnf install -y redis&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Y_Yi4UbQ&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;OpZ72h&quot; data-toc-id=&quot;Y_Yi4UbQ&quot; data-ke-size=&quot;size26&quot;&gt;3.1 Redis 버전 확인&lt;/h2&gt;
&lt;pre class=&quot;pgsql&quot; data-block-id=&quot;-fooi9&quot;&gt;&lt;code&gt;redis-server --version&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;xjpvRs7G&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;KpkCWQ&quot; data-toc-id=&quot;xjpvRs7G&quot; data-pm-slice=&quot;1 1 []&quot;&gt;4. Redis 설정 변경&lt;/h1&gt;
&lt;pre class=&quot;vim&quot; data-block-id=&quot;CwJ3-p&quot;&gt;&lt;code&gt;sudo vi /etc/redis/redis.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;U32GpE&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;bind 0.0.0.0
protected-mode no
port 6379
requirepass mypassword
daemonize yes
supervised systemd&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;xjpvRs7G&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;xjpvRs7G&quot; data-block-id=&quot;KpkCWQ&quot;&gt;5. Redis 서비스 등록/자동 시작 및 상태 확인&lt;/h1&gt;
&lt;pre class=&quot;pgsql&quot; data-block-id=&quot;FSbquV&quot;&gt;&lt;code&gt;sudo systemctl enable redis --now&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;ebnf&quot; data-block-id=&quot;kxPiyG&quot;&gt;&lt;code&gt;sudo systemctl status redis&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;xjpvRs7G&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;KpkCWQ&quot; data-toc-id=&quot;xjpvRs7G&quot; data-pm-slice=&quot;1 1 []&quot;&gt;6. 방화벽 설정, 부팅 시 자동 실행 확인&lt;/h1&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;IYD3d5&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;rgS2Nq&quot;&gt;&lt;code&gt;sudo systemctl is-enabled redis&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/429</guid>
      <comments>https://gregorio78.tistory.com/429#entry429comment</comments>
      <pubDate>Wed, 28 Jan 2026 12:01:29 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB(7.0.24) 설치 절차</title>
      <link>https://gregorio78.tistory.com/428</link>
      <description>&lt;h1 id=&quot;9CfyG6gq&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;9CfyG6gq&quot; data-block-id=&quot;tMmrZg&quot;&gt;1. 사전 확인&lt;/h1&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;voNPM3&quot;&gt;&lt;code&gt;cat /etc/rocky-release
# Rocky Linux release 9.6 (Blue Onyx)&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;9CfyG6gq&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;tMmrZg&quot; data-toc-id=&quot;9CfyG6gq&quot; data-pm-slice=&quot;1 1 []&quot;&gt;2. MongoDB Yum Repository 추가&lt;/h1&gt;
&lt;h2 id=&quot;ZAXz_2GI&quot; data-toc-id=&quot;ZAXz_2GI&quot; data-block-id=&quot;H8_ouj&quot; data-ke-size=&quot;size26&quot;&gt;2.1 MongoDB Yum Repository 생성&lt;/h2&gt;
&lt;pre class=&quot;makefile&quot; data-block-id=&quot;zdXO61&quot;&gt;&lt;code&gt;# mongodb-org-7.0.repo 생성 
sudo vi /etc/yum.repos.d/mongodb-org-7.0.repo

[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-7.0.asc&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ZAXz_2GI&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;H8_ouj&quot; data-toc-id=&quot;ZAXz_2GI&quot; data-ke-size=&quot;size26&quot;&gt;2.2 MongoDB 설치&lt;/h2&gt;
&lt;pre class=&quot;cmake&quot; data-block-id=&quot;4cyWT0&quot;&gt;&lt;code&gt;sudo dnf install -y mongodb-org&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;9CfyG6gq&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;9CfyG6gq&quot; data-block-id=&quot;tMmrZg&quot;&gt;3. MongoDB 환경 설정&lt;/h1&gt;
&lt;h2 id=&quot;HDCmeUwQ&quot; data-toc-id=&quot;HDCmeUwQ&quot; data-block-id=&quot;49Nz9z&quot; data-ke-size=&quot;size26&quot;&gt;3.1 Port 및 접속 IP 확인&lt;/h2&gt;
&lt;pre class=&quot;vim&quot; data-block-id=&quot;oZc5ds&quot;&gt;&lt;code&gt;sudo vi /etc/mongod.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;nPPEzb&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;net:
  port: 27017
  bindIp: 0.0.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;HDCmeUwQ&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;49Nz9z&quot; data-toc-id=&quot;HDCmeUwQ&quot; data-ke-size=&quot;size26&quot;&gt;3.2 MongoDB 재시작 및 확인&lt;/h2&gt;
&lt;pre class=&quot;properties&quot; data-block-id=&quot;xY8fW6&quot;&gt;&lt;code&gt;# MongoDB 재시작
sudo systemctl restart mongod

# 변경 확인
sudo ss -lntp | grep mongod&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;HDCmeUwQ&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;HDCmeUwQ&quot; data-block-id=&quot;49Nz9z&quot; data-ke-size=&quot;size26&quot;&gt;3.3 방화벽 Port 변경&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;5DnDAf&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;9CfyG6gq&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;tMmrZg&quot; data-toc-id=&quot;9CfyG6gq&quot; data-pm-slice=&quot;1 1 []&quot;&gt;4. 서비스 등록, 실행, 상태 확인&lt;/h1&gt;
&lt;h2 id=&quot;Gszo4cV0&quot; data-toc-id=&quot;Gszo4cV0&quot; data-block-id=&quot;93uEJI&quot; data-ke-size=&quot;size26&quot;&gt;4.1 MongoDB 서비스 등록&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot; data-block-id=&quot;yoEZCH&quot;&gt;&lt;code&gt;sudo systemctl enable mongod&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Gszo4cV0&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;93uEJI&quot; data-toc-id=&quot;Gszo4cV0&quot; data-ke-size=&quot;size26&quot;&gt;4.2 MongoDB 실행, 중지, 재시작, 상태 확인&lt;/h2&gt;
&lt;pre class=&quot;properties&quot; data-block-id=&quot;_zwlzt&quot;&gt;&lt;code&gt;# 실행
sudo systemctl start mongod
# 중지
sudo systemctl stop mongod
# 재시작
sudo systemctl restart mongod
# 상태 확인
sudo systemctl status mongod&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;9CfyG6gq&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;9CfyG6gq&quot; data-block-id=&quot;tMmrZg&quot;&gt;5. 접속 및 보안 설정&lt;/h1&gt;
&lt;h2 id=&quot;ohBJxRop&quot; data-toc-id=&quot;ohBJxRop&quot; data-block-id=&quot;iaLMXo&quot; data-ke-size=&quot;size26&quot;&gt;5.1 접속&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;ckuOYv&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;mongosh --port 27017&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ohBJxRop&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;iaLMXo&quot; data-toc-id=&quot;ohBJxRop&quot; data-ke-size=&quot;size26&quot;&gt;5.2 버전 확인&lt;/h2&gt;
&lt;pre class=&quot;stata&quot; data-block-id=&quot;iF3B2p&quot;&gt;&lt;code&gt;db.version()&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ohBJxRop&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;iaLMXo&quot; data-toc-id=&quot;ohBJxRop&quot; data-ke-size=&quot;size26&quot;&gt;5.3 보안 설정&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;9VvOPa&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;// admin 비밀번호 설정
use admin;

db.createUser({
    user: 'admin',
    pwd: 'admin_password',
    roles: [ { role: 'root', db: 'admin' } ]
  })&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ohBJxRop&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;ohBJxRop&quot; data-block-id=&quot;iaLMXo&quot; data-ke-size=&quot;size26&quot;&gt;5.4 MongoDB 설정 변경&lt;/h2&gt;
&lt;pre class=&quot;vim&quot; data-block-id=&quot;oa3KNF&quot;&gt;&lt;code&gt;sudo vi /etc/mongod.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dts&quot; data-block-id=&quot;_veIaG&quot;&gt;&lt;code&gt;security:
  authorization: enabled&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;nginx&quot; data-block-id=&quot;TNwbMI&quot;&gt;&lt;code&gt;# mongoDB 서비스 재시작
sudo systemctl restart mongod&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;c21Txg&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;# mongo 서비스 접속
mongosh --port 27017 -u admin -p --authenticationDatabase admin&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;9CfyG6gq&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;tMmrZg&quot; data-toc-id=&quot;9CfyG6gq&quot; data-pm-slice=&quot;1 1 []&quot;&gt;6. DB 생성 및 접속 계정 생성&lt;/h1&gt;
&lt;h2 id=&quot;ERJ4hiWl&quot; data-toc-id=&quot;ERJ4hiWl&quot; data-block-id=&quot;WczNA7&quot; data-ke-size=&quot;size26&quot;&gt;6.1 DB 생성&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;pR2K0p&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;// Mongo 서비스 접속
use mydatabase&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ERJ4hiWl&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;WczNA7&quot; data-toc-id=&quot;ERJ4hiWl&quot; data-ke-size=&quot;size26&quot;&gt;6.2 mydatabase 접속 계정 생성&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;LUeaWS&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;db.createUser({
    user: 'user_name',
    pwd: 'user_name_password',
    roles: [ { role: 'readWrite', db: 'mydatabase' } ]
  })&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/428</guid>
      <comments>https://gregorio78.tistory.com/428#entry428comment</comments>
      <pubDate>Wed, 28 Jan 2026 11:56:05 +0900</pubDate>
    </item>
    <item>
      <title>개발서버(RockyLinux)에 MySQL(8.x) 설치</title>
      <link>https://gregorio78.tistory.com/427</link>
      <description>&lt;h1 id=&quot;bIsS1Bie&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;bIsS1Bie&quot; data-block-id=&quot;0CAeLp&quot;&gt;1. &amp;nbsp;Linux 버전 확인&lt;/h1&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;iUgfmH&quot;&gt;&lt;code&gt;cat /etc/rocky-release
# Rocky Linux release 9.5 (Blue Onyx)&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;0CAeLp&quot; data-toc-id=&quot;bIsS1Bie&quot; data-pm-slice=&quot;1 1 []&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt; MySQL Yum Repository 추가&lt;/h1&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; data-toc-id=&quot;NVd7CVyi&quot; data-block-id=&quot;GJYplf&quot; data-ke-size=&quot;size26&quot;&gt;2.1 MySQL Yum Repository 설정&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;Vt_ivd&quot;&gt;&lt;code&gt;# wget 설치
sudo dnf install -y wget

# MySQL RPM download
wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm

# MySQL RPM Install
sudo dnf install -y mysql80-community-release-el9-1.noarch.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;GJYplf&quot; data-toc-id=&quot;NVd7CVyi&quot; data-ke-size=&quot;size26&quot;&gt;2.2&lt;span&gt; &lt;/span&gt;Yum Repository 확인&lt;/h2&gt;
&lt;pre class=&quot;1c&quot; data-block-id=&quot;kLo-VM&quot;&gt;&lt;code&gt;dnf repolist enabled | grep mysql&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;bIsS1Bie&quot; data-block-id=&quot;0CAeLp&quot;&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MySQL 설치&lt;/h1&gt;
&lt;h2 data-toc-id=&quot;3VhkT9ep&quot; data-block-id=&quot;Hho9sh&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;TK_dT5&quot;&gt;&lt;code&gt;sudo dnf install -y mysql-community-server

# gpg public key 오류가 지속적으로 발생하여 gpg check 없이 설치(개발 서버만 해당)
sudo dnf install -y mysql-community-server --nogpgcheck&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;NVd7CVyi&quot; data-block-id=&quot;GJYplf&quot; data-ke-size=&quot;size26&quot;&gt;3.1&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;GPG-Key 오류 대처 방법&lt;/h2&gt;
&lt;pre class=&quot;jboss-cli&quot; data-block-id=&quot;piUbg3&quot;&gt;&lt;code&gt;# GPG-KEY download
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# GPG-KEY download 확인
ls -al /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022

# dnf clean &amp;amp; makecache
sudo dnf clean all
sudo dnf makecache&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;0CAeLp&quot; data-toc-id=&quot;bIsS1Bie&quot; data-pm-slice=&quot;1 1 []&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MySQL 서비스 시작 및 OS 재시동 시 자동 실행 설정&lt;/h1&gt;
&lt;pre class=&quot;vala&quot; data-block-id=&quot;APwlT7&quot;&gt;&lt;code&gt;# mysqld server enable
sudo systemctl enable mysqld
# mysqld service start 
sudo systemctl start mysqld
# mysqld start
/etc/init.d/mysqld start
# mysqld stop
/etc/init.d/mysqld stop
# mysqld restart
/etc/init.d/mysqld restart

# 상태 확인
sudo systemctl status mysqld&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;bIsS1Bie&quot; data-block-id=&quot;0CAeLp&quot;&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt; 초기 root 비밀번호 확인 및 보안 설정&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;GJYplf&quot; data-toc-id=&quot;NVd7CVyi&quot; data-ke-size=&quot;size26&quot;&gt;5.1&lt;span&gt;&lt;span&gt;&amp;nbsp;초기 비밀번호 확인&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;lasso&quot; data-block-id=&quot;KhpLgr&quot;&gt;&lt;code&gt;sudo grep 'temporary password' /var/log/mysqld.log&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;NVd7CVyi&quot; data-block-id=&quot;GJYplf&quot; data-ke-size=&quot;size26&quot;&gt;5.2&lt;span&gt;&lt;span&gt; 보안 설정(비밀번호 변경, 불필요 기능 제거)&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;9YnW4J&quot;&gt;&lt;code&gt;sudo mysql_secure_installation
#설정 항목
# 1. root 비밀번호 변경
# 1.5.1에서 확인한 초기 비밀번호 입력 후 root 비밀번호 변경
# 2025-07-08T01:02:51.432419Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: P-!xhHB2qfkN
# 2. 익명 사용자 삭제
# 3. 원격 root 로그인 비활성화
# 4. test DB 삭제
# 5. 권한 테이블 새로고침&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;0CAeLp&quot; data-toc-id=&quot;bIsS1Bie&quot; data-pm-slice=&quot;1 1 []&quot;&gt;6.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; MySQL 접속 테스트&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;ba30kJ&quot;&gt;&lt;code&gt;mysql -u root -p
Enter password: {{1.5.2에서 변경한 root password 입력}}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;bIsS1Bie&quot; data-block-id=&quot;0CAeLp&quot;&gt;7.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MySQL 기본 설정 파일 변경&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;pre class=&quot;vim&quot; data-block-id=&quot;yjpsFu&quot;&gt;&lt;code&gt;sudo vi /etc/my.cnf&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;NVd7CVyi&quot; data-block-id=&quot;GJYplf&quot; data-ke-size=&quot;size26&quot;&gt;7.1&lt;span&gt;&lt;span&gt; my.cnf 파일 변경 사항&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;2pxXQ3&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;[mysqld]
port = 3306
bind-address = 0.0.0.0
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default_time_zone = '+00:00'
log_bin_trust_function_creators = 1

# 바이너리 로그 보관 기간 설정 (예: 7일간만 보관)
binlog_expire_logs_seconds = 604800
# 개별 로그 파일의 최대 크기 제한 (예: 500MB)
max_binlog_size = 500M

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;GJYplf&quot; data-toc-id=&quot;NVd7CVyi&quot; data-ke-size=&quot;size26&quot;&gt;7.2&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MySQL Service restart&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;maxima&quot; data-block-id=&quot;SxLny_&quot;&gt;&lt;code&gt;# MySQL Service restart
sudo systemctl restart mysqld&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;GJYplf&quot; data-toc-id=&quot;NVd7CVyi&quot; data-ke-size=&quot;size26&quot;&gt;7.3&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;설정 내용 확인&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;tQjKZb&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;-- MySQL Console

-- 포트 확인
SHOW GLOBAL VARIABLES LIKE 'port';

-- 문자셋 확인
SHOW VARIABLES LIKE 'character_set%';

-- 타임존 확인
SHOW VARIABLES LIKE 'time_zone';&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;1c&quot; data-block-id=&quot;gu06uK&quot;&gt;&lt;code&gt;# 바인드 주소 확인 (netstat 또는 ss 명령어)
sudo ss -lntp | grep mysqld&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;NVd7CVyi&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;GJYplf&quot; data-toc-id=&quot;NVd7CVyi&quot; data-ke-size=&quot;size26&quot;&gt;7.4&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Rocky Linux 방화벽 설정&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;dockerfile&quot; data-block-id=&quot;dv01qf&quot;&gt;&lt;code&gt;sudo firewall-cmd --add-port=33065/tcp --permanent
sudo firewall-cmd --reload&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;0CAeLp&quot; data-toc-id=&quot;bIsS1Bie&quot; data-pm-slice=&quot;1 1 []&quot;&gt;8.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MySQL DB 및 계정 생성&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;16gh0P&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;/* Database 생성 */
-- 업무 데이터베이스
CREATE DATABASE work_database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

/* 계정 생성 */
-- 전체 관리 계정
CREATE USER 'super_user_name'@'%' IDENTIFIED BY 'super_user_name_password';
-- work_database_name 관리 계정
CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_name_password';

/* 권한 추가 */
GRANT ALL PRIVILEGES ON work_database_name.* TO 'super_user_app'@'%';
GRANT ALL PRIVILEGES ON work_database_name.* TO 'user_name'@'%';

/* 권한 적용 */
FLUSH PRIVILEGES;

/* 권한 확인 */
show grants for 'super_user_name'@'%';
show grants for 'user_name'@'%';&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;bIsS1Bie&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;bIsS1Bie&quot; data-block-id=&quot;0CAeLp&quot;&gt;9.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MySQL 서버 용량 부족시 대처 방법&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;0-4agy&quot;&gt;&lt;code&gt;-- 현재 디스크 상황이 급하므로, 2일 전 데이터까지만 남기고 모두 삭제
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 2 DAY);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/427</guid>
      <comments>https://gregorio78.tistory.com/427#entry427comment</comments>
      <pubDate>Wed, 28 Jan 2026 11:04:08 +0900</pubDate>
    </item>
    <item>
      <title>SQL Conventions</title>
      <link>https://gregorio78.tistory.com/426</link>
      <description>&lt;h1 id=&quot;Llk6vtnq&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;Llk6vtnq&quot; data-block-id=&quot;Tcgx8_&quot;&gt;1.개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 가이드는 개발 단계에서 개발표준과 최적화에 고려해야 할 사항에 초점을 맞추어 내용을 기술 하였습니다.기준이 되는 데이터베이스는 MySQL로 제한하였으나 명명규칙등 일반적인 사항은 데이터베이스 시스템에 종속&amp;nbsp;되지 않으므로 본 가이드를 적용할 수 있습니다.본 문서는 아래와 같은 구조로 되어 있습니다.&lt;/p&gt;
&lt;h1 id=&quot;DpItj8S9&quot; data-toc-id=&quot;DpItj8S9&quot; data-block-id=&quot;Sc8c5S&quot;&gt;2. SQL 공통 표준&lt;/h1&gt;
&lt;h2 id=&quot;frcAr4Wr&quot; data-toc-id=&quot;frcAr4Wr&quot; data-block-id=&quot;U_tV_5&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1. SQL 명명규칙(Naming Convention)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;WKmUvMV1&quot; data-toc-id=&quot;WKmUvMV1&quot; data-block-id=&quot;3w-f67&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.1. ID 길이&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;QHipuZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RG-Saa&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID의 길이는 18바이트를 넘지 않도록 작성한다.&lt;/li&gt;
&lt;li&gt;지나치게 짧은 ID는 원래 의미를 상실하기 쉬우며 가독성을 떨어뜨린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;lfl1Y0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 DBMS별로 최대허용길이가 다르지만 공통으로 사용할 수 있는 길이는 18바이트이다.&lt;/li&gt;
&lt;li&gt;길이가 길 경우 DBMS간의 이식성을 떨어뜨리게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;58O8mwPh&quot; data-toc-id=&quot;58O8mwPh&quot; data-block-id=&quot;Qdjlf9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.2. ID 구성문자&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EI3dZe&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;X7YugX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알파벳과 숫자, 밑줄(underscore)외의 특수문자는 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;밑줄(underscore)는 연속으로 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;ID을 명명할 때 모음을 지나치게 생략하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;An2VkN&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특수문자가 들어간 ID는 가독성이 떨어진다.&lt;/li&gt;
&lt;li&gt;밑줄문자(underscore)을 연속으로 사용하면 해당 코드를 읽을 때 밑줄문자가 몇 개 사용되었는지 인식하기 힘들다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;h2GsKV4D&quot; data-toc-id=&quot;h2GsKV4D&quot; data-block-id=&quot;5NPjJd&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.3. 대소문자 사용규칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qGcWRL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DlDaDV&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대소문자 사용원칙을 정했으면 일관성 있게 고수한다. (대문자 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Z0YGgA&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대소문자 구분여부는 DBMS마다 다르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;u7hYOWJU&quot; data-toc-id=&quot;u7hYOWJU&quot; data-block-id=&quot;rLVS18&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.4. 국제 명명규칙 표준 준수&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qxCKNi&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9NRKb3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;국제 명명규칙 표준(ISO-11179)을 준수할 것&lt;/li&gt;
&lt;li&gt;국가명이나 국가코드에 대한 명명은 ISO-3166 표준을 따른다.&lt;/li&gt;
&lt;li&gt;날짜 표기에 대한 형식은 ISO-8601 표준을 따른다.&lt;/li&gt;
&lt;li&gt;단, 아무리 우수한 국제 표준이라도 레거시 시스템에서 관습적으로 사용하는 것을 우선하여 적용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;wR565D&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL과 연관된 ISO-11179
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AIHmZn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL과 연관된 ISO-11179 표준 도메인은 11179-4으로, 데이터 요소 중 스칼라(Scalar) 타입은 아래와 같은 원칙을 준수한다.&lt;/li&gt;
&lt;li&gt;국가명이나 국가코드 표준에 대한 자료는 아래를 참고한다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm&quot;&gt;http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;아무리 우수한 국제표준 명명규칙이라도 관행으로 굳어졌거나 관습적으로 사용하는 것 보다 우선하여 사용하지 못한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;uFzAUuHt&quot; data-toc-id=&quot;uFzAUuHt&quot; data-block-id=&quot;yPqws2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.5. 서술적인 접두어(prefix)의 사용 자제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;k9vz9T&quot; data-ke-size=&quot;size16&quot;&gt;서술적인 접두어(prefix)는 SQL문을 읽거나 분석할 때 도움이 되지 않는 경우가 많으며 오히려 그 반대의 경우가 더 많다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;U5S4jl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Li879u&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;s&gt;테이블 ID는 &amp;ldquo;tbl_&amp;rdquo; 등으로 시작하지 않는다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;컬럼ID는 해당 컬럼의 소속을 나타내기 위해 테이블ID을 접두어를 붙이지 않는다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;뷰(view) ID는 &amp;ldquo;vw_&amp;rdquo; 등으로 시작하지 않는다.&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;특정컬럼이 primary key 또는 foreign key임을 나타내기 위해 해당 컬럼의 ID을 &amp;ldquo;pk_&amp;rdquo; 또는 &amp;ldquo;pf_&amp;rdquo; 등으로 시작하지 않도록 한다.&lt;/li&gt;
&lt;li&gt;특정 ID가 제약사항(constraint)임을 나타내기 위해 다음과 같은 형식의 명명규칙을 사용하지 않도록 한다.&lt;/li&gt;
&lt;li data-block-id=&quot;HyRVqu&quot;&gt;&amp;lt;table_id&amp;gt;_CK_&amp;lt;column_id&amp;gt;&lt;/li&gt;
&lt;li&gt;트리거(trigger) ID는 &amp;ldquo;trig_&amp;rdquo; 로 시작하지 않도록 한다.&lt;/li&gt;
&lt;li&gt;저장프로시저 ID는 user-defined-procedure임을 나타내기 위해 &amp;ldquo;usp_&amp;rdquo; 로 시작하지 않는다.&lt;/li&gt;
&lt;li&gt;트리거 또는 저장프로시저의 ID는 &amp;lt;동사&amp;gt;&amp;lt;목적어&amp;gt; 형태로 명명한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;7afurh&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 ID을 명명할 때 해당 ID의 소속, 형식을 표현하기 위해 접두어를 붙일 경우 해당 ID의 소속 또는 형식이 바뀌면 ID자체를 변경해야 할 경우가 있는데, 이렇게 되면 일관성을 잃어버리게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bFm71BXH&quot; data-toc-id=&quot;bFm71BXH&quot; data-block-id=&quot;CKf-nq&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.6. 표준 접미어(postfix)를 지정&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;TElpwu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID의 주체가 되는 오브젝트의 형식을 나타내는 접두어(prefix) 대신 해당 오브젝트의 속성을 나타내는 접미어(postfix)을 지정하여 사용하는 것이 낫다.&lt;/li&gt;
&lt;li data-block-id=&quot;sDrMTT&quot;&gt;(데이터베이스 명명규칙 참조)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;VuZ3oEVt&quot; data-toc-id=&quot;VuZ3oEVt&quot; data-block-id=&quot;4x8RJR&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.7. 테이블, 뷰(view)의 이름&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dG7APZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;zbyFBw&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;집합적이면서도 대표적인 이름 또는 복수형을 사용할 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;8NWrWF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단, 1개의 row만을 유지해야 하는 테이블의 경우는 예외로 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;산업표준을 따른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;q6cOB2Zk&quot; data-toc-id=&quot;q6cOB2Zk&quot; data-block-id=&quot;GsiEhv&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.8. 별칭(alias)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;owY3VQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;x71fv7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별칭(alias)을 사용할 때 근본이 되는 원래의 이름과 동떨어진 이름은 사용하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DbnjYo&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별칭(alias, 상관관계에 의해 파생되는 이름)도 하나의 이름이며 그것의 존재 원인이 되는 근원 테이블, 컬럼 또는 수식 등이 있게 마련이다. 별칭을 사용할 때 원래의 이름과 동떨어진 이름은 유지보수가 매우 어렵게 만들게 되므로 배제하는 것이 좋으나 지엽적으로 사용할 경우는 간략한 형태로 축약하여 사용하는 것을 허용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Ejv7ylsc&quot; data-toc-id=&quot;Ejv7ylsc&quot; data-block-id=&quot;-g6i5h&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.9. 관계성이 함축된 이름&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;PsvhGg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;mexf1h&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 또는 뷰간의 관계가 서로 엮일 때, 이로 인해 파생되는 엔터티에 대해 가능하면 관계성을 표현할 수 있는 이름을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DAsdQF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래와 같이 두 개 엔터티가 관계가 함축된 엔터티의 이름은 관계성을 함축하는 이름을 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;WYi54y&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lsquo;남자&amp;rsquo;와 &amp;lsquo;여자&amp;rsquo; 엔터티가 결합된 경우&lt;/li&gt;
&lt;li&gt;나쁜 예 : ManWoman 또는 HusbandsWives&lt;/li&gt;
&lt;li&gt;좋은 예 : Marriage&lt;/li&gt;
&lt;li data-block-id=&quot;rmFdjW&quot;&gt;&amp;lsquo;학생&amp;rsquo;과 &amp;lsquo;과목&amp;rsquo; 엔터티가 결합된 경우&lt;/li&gt;
&lt;li&gt;나쁜 예 : StudentsCourses&lt;/li&gt;
&lt;li&gt;좋은 예 : Enrollments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;qZBiumjj&quot; data-toc-id=&quot;qZBiumjj&quot; data-block-id=&quot;7YZmR-&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.10. 메타데이터 성격을 가진 이름&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;1pflRJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9BQn6Q&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스키마 등에서 메타데이터 성격을 가진 오브젝트에 한해서 구조체를 나타내는 접미사를 사용할 수 있다. 예를 들면 인덱스ID의 경우 &amp;ldquo;_ix&amp;rdquo; 의 접미사를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;L_w_GwgL&quot; data-toc-id=&quot;L_w_GwgL&quot; data-block-id=&quot;CUkH9P&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.11. 데이터 요소 명명 시 피해야 할 사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ScOaKQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;W8lt0V&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애매한 이름은 사용하지 말 것&lt;/li&gt;
&lt;li&gt;상반적인 개념의 수식어가 결합된 ID는 사용하지 말 것&lt;/li&gt;
&lt;li&gt;상황에 따라 변동이 될 수 있는 ID는 사용하지 말 것&lt;/li&gt;
&lt;li&gt;물리모델에서 사용하는 용어(대부분 DBMS에 종속적인 용어)는 논리모델에서 사용하지 말 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;wCb5Ol&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;너무 일반적인 이름은 포괄적이어서 아무런 정보를 전달하지 못하는 경우가 많다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;709uTV&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예 : amount, date, id&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;객체지향 프로그래밍이 몸에 밴 개발자의 경우 모든 필드에 &amp;ldquo;_id&amp;rdquo; 라는 접미사를 붙이려는 경향이 있는데, 실제 상황에서 의미가 없는 경우가 많다.&lt;/li&gt;
&lt;li&gt;논리모델에서 다음과 같은 용어는 물리모델로 전환하는 단계에서 예약어로 사용되는 경우가 많으므로 피해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Ed_cbl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예 : IDENTITY, GUID, ROWID 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;B1dWcz_o&quot; data-toc-id=&quot;B1dWcz_o&quot; data-block-id=&quot;t5MMKi&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1.12. 대소문자 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NtUV6e&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uahFVK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼ID, 파라미터, 변수는 소문자로 작성한다.&lt;/li&gt;
&lt;li&gt;위의 경우를 제외하고, 스키마(schema)에서 나오는 오브젝트의 첫 글자는 대문자로 작성한다.&lt;/li&gt;
&lt;li&gt;예약어(reserved word)는 모두 대문자로 작성한다.&lt;/li&gt;
&lt;li&gt;Camel-Case는 사용하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;j50AWW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예약어를 대문자로 작성하는 이유는 특별히 유의해서 보게 하려는 의도를 담고 있기 때문이다.&lt;/li&gt;
&lt;li&gt;Camel-Case은 기존의 Hungarian notation에 익숙한 개발자를 위한 것인데(ID를 구성하는 단어의 첫 글자만 대문자로 사용하는 표기법), 실제로는 가독성(readability)를 떨어뜨리는 요인이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Bj7dZjrU&quot; data-toc-id=&quot;Bj7dZjrU&quot; data-block-id=&quot;RBvoFn&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2. SQL 코딩규칙(Coding Convention)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 SQL 코딩 시 가독성 향상을 위해 지켜야 할 문자, 문장의 배치 등 외형을 중심으로 기술하였습니다.&lt;/p&gt;
&lt;h3 id=&quot;Xmi-LdgU&quot; data-toc-id=&quot;Xmi-LdgU&quot; data-block-id=&quot;r1JFB6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.1. 공백(space)사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;tGolbz&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;I4NPo6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL코딩 시 가급적 탭을 사용하지 말고 공백문자(space)을 사용할 것&lt;/li&gt;
&lt;li&gt;SQL코드의 토큰 좌우에 공백을 사용할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ATzuU8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자마다 선호하는 TAB-SIZE가 다르기 때문에, SQL 코드 작성시 탭(TAB)을 사용하면 실제 코드가 가독성이 떨어질 수 있다.&lt;/li&gt;
&lt;li&gt;실제 예는 아래와 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;fRIDAc&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나쁜 예&amp;nbsp;:&amp;nbsp;foobar=21&lt;/li&gt;
&lt;li&gt;좋은 예&amp;nbsp;:&amp;nbsp;foobar = 21&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;IR2P1nVI&quot; data-toc-id=&quot;IR2P1nVI&quot; data-block-id=&quot;JMobIn&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.2. 줄 간격&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;rD3xV-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;I0wXBx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 문장 내에서는 한 줄씩만 띄어쓰기를 할 것&lt;/li&gt;
&lt;li&gt;하나의 프로세스 내에서의 각 문장은 두 줄씩 띄어쓰기를 할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;UmI1sk-F&quot; data-toc-id=&quot;UmI1sk-F&quot; data-block-id=&quot;cp6X2W&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.3. 들여쓰기(indentation)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;scmsFi&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;smKVeo&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 사용할 때 한 그룹 내에서는 &amp;lsquo;4-space rule&amp;rsquo;을 사용할 수 도 있다. (들여쓰기는 공백 3개로 통일한다.)&lt;/li&gt;
&lt;li&gt;서브쿼리(sub-query)에서는 괄호를 시작과 끝의 위치를 일치시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;q3Gxkv&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL에서의 수직 맞춤 배치는 기존의 3GL 프로그래밍과 달리 공백을 이용한 인덴테이션 보다 우선 순위가 높다.&lt;/li&gt;
&lt;li&gt;서브쿼리(sub-query)에서는 괄호를 시작과 끝의 위치를 일치시키면 서브쿼리의 영역을 쉽게 파악할 수 있는 이점이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;SxdfBgVx&quot; data-toc-id=&quot;SxdfBgVx&quot; data-block-id=&quot;EE34VK&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.4. 일반적인 마침법의 준수&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;u-ysKL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;f35Aqe&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콤마 뒤에 공백을 집어 넣을 것&lt;/li&gt;
&lt;li&gt;콤마로 분리된 ID가 여러 줄에 걸쳐 나올 때, 콤마를 라인 끝이 아닌 라인의 처음에 위치시킬 것&lt;/li&gt;
&lt;li&gt;세미콜론으로 끝나는 SQL문의 마지막은 New-Line 이나 최소한 공백을 집어 넣을 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HmqpcK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL 문을 읽을 때 콤마와 마침표를 구분하기 힘들 경우가 많으므로 다음의 예와 같이 콤마 뒤에는 공백을 집어 넣는다.&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;8ixGhN&quot;&gt;&lt;code&gt;SELECT flobs.a,flobs.b,flobs.c,fleq.d
&amp;nbsp;&amp;nbsp;FROM Flobs,Foobar,Fleq;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Fpw75X&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;yZ3Uub&quot;&gt;&lt;code&gt;SELECT flobs.a, flobs.b, flobs.c, fleq.d
&amp;nbsp;&amp;nbsp;FROM Flobs, Foobar, Fleq;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;I90grh&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콤마로 분리된 ID가 여러 줄에 걸쳐 쓰여지면, 다음 예와 같이 콤마를 라인의 처음에 위치시키는 것이 보기에도 좋고 추후 SQL을 수정하기에도 수월하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot; data-block-id=&quot;CuHmmv&quot;&gt;&lt;code&gt;SELECT flobs.a
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;flobs.b
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;flobs.c
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;fleq.d
&amp;nbsp;&amp;nbsp;FROM Flobs
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;Fleq&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;VcRIUZn-&quot; data-toc-id=&quot;VcRIUZn-&quot; data-block-id=&quot;TiDYtj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.5. 예약어(Reserved Word) 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;gtnlOr&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Riea4q&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예약어는 단축형이 아닌 Full-Name을 사용할 것&lt;/li&gt;
&lt;li&gt;특정 DBMS에 종속적인 예약어 대신 표준 예약어를 사용할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;cqIyj8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 타입을 제외하고는 되도록이면 예약어는 생략하지 말고 Full-Name을 사용하는 것이 좋다. 예를 들면 &amp;ldquo;FROM&amp;rdquo;절에 &amp;ldquo;Personnel P1&amp;rdquo; 대신 &amp;ldquo;Personnel AS P1&amp;rdquo; 으로 사용하면 좋다.&lt;/li&gt;
&lt;li&gt;특정 DBMS에 종속적인 예약어를 사용하면 이식성이 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;OUaAmeYi&quot; data-toc-id=&quot;OUaAmeYi&quot; data-block-id=&quot;mXugqu&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.6. SQL 수직 배치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL문장이 여러 줄에 걸쳐 기술되어 있을 경우, 좌우로 지그재그형태로 생긴 모양은 최대한 배제하고, 다음을 원칙으로 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qj13NK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Q5c4Kg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT(T), UPDATE(E), FROM(M), WHERE(E), AND(D), OR(R), ORDER BY(R), GROUP BY(P)의 끝 문자를 다음 SQL문의 끝 문자(SELECT(T), UPDATE(E), INSERT(T), DELETE(E))와 맞춘다.&lt;/li&gt;
&lt;li&gt;INSERT 및 VALUES는 동일한 위치에서 시작한다.&lt;/li&gt;
&lt;li&gt;모든 컬럼은 동일한 위치에서 시작한다. (단, 컬럼 앞에 함수가 나오면 함수명의 첫 글자를 기준으로 맞춤)&lt;/li&gt;
&lt;li&gt;SELECT(T), UPDATE(E), INSERT(T), DELETE(E) 뒤로 바로 컬럼명이 나올 경우 다음 줄에서 앞 줄의 첫 단어의 끝(INSERT(T), UPDATGE(E), INSERT(T), DELETE(E))으로 부터 한 칸을 띄고 작성한다.&lt;/li&gt;
&lt;li&gt;SELECT, UPDATE, INSERT, DELETE 문의 컬럼 목록은 첫 컬럼만 제외하고 앞에 콤마(,)로 시작한다.&lt;/li&gt;
&lt;li&gt;INSERT 문의 경우 VALUE 절의 값들도 첫 번째 값을 제외하고 모두 콤마로 시작하되 동일한 위치로 정렬한다.&lt;/li&gt;
&lt;li&gt;FROM 절의 인-라인 뷰를 제외한 일반 테이블들은 콤마(,)로 구분하되 한 줄에 연속하여 기술하고 한 줄을 초과하는 경우, 줄을 바꾸어 윗줄의 첫 테이블 이름에 맞추어 시작한다.&lt;/li&gt;
&lt;li&gt;인-라인 뷰의 내부의 SQL문은 시작괄호 &amp;lsquo;(&amp;lsquo; 바로 다음부터 시작하되, 위의 내용과 동일한 규칙을 적용하며 인-라인 뷰가 끝나면 괄호를 닫은 후 줄을 바꾸도록 한다.&lt;/li&gt;
&lt;li&gt;SQL 문의 마지막에 &amp;ldquo;;&amp;rdquo; 을 기술하여 해당 문의 끝을 표시한다.&lt;/li&gt;
&lt;li&gt;UPDATE 문에서 SET절의 컬럼들은 첫 컬럼만 제외하고 콤마(,)로 시작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Mm83pr&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인 SQL 문 배치 예시&lt;/li&gt;
&lt;li&gt;일반적인 수직배치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;ndmbFM&quot;&gt;&lt;code&gt;SELECT DISTINCT pilot
  FROM PilotSkills AS PS1
 WHERE NOT EXISTS (
        SELECT *
          FROM Hangar
         WHERE NOT EXISTS (
                SELECT *
                  FROM PilotSkills AS PS2
                 WHERE PS1.pilot = PS2.pilot
                   AND P2.plane = Hangar.plane
                )
       )
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;SELECT 문의 작성 예시
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;ESy3U-&quot;&gt;&lt;code&gt;-- 예시 (2) : 주석(comment)을 SELECT 예약어 바로 다음에 배치한 예
SELECT col1
       , col2 /* Comment */
       , col3
  FROM TB_SAMPLE
 WHERE col1 = 123
GROUP BY col2
HAVING SUM(col3) &amp;gt; 1000
ORDER BY SUM(col3)
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;ULQUGL&quot;&gt;&lt;code&gt;-- 예시 (3): 중첩된 SQL문장의 수직배치 예
SELECT col1
       , col2 /* Comment */
       , col3
       , col4
       , col5 /* Comment */
  FROM (
        SELECT col1
               , col2
               , col3
          FROM TB_SAMPLE1
         WHERE col1 BETWEEN 100 AND 200
       ) a
       , TB_SAMPLE2 b
 WHERE a.col1 = b.col1
   AND b.col2 IN (
        SELECT col1
          FROM TB_SAMPLE3
         WHERE col2 = &amp;lsquo;123&amp;rsquo;)
   AND b.col3 LIKE &amp;lsquo;A%&amp;rsquo;
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-block-id=&quot;zbaB9F&quot;&gt;&lt;code&gt;-- 예시 (4) CASE문을 동반한 수직배치의 예
SELECT col1
       , col2
       , col3
       , CASE WHEN col4 = 'AAA' THEN col5 * 1.05
              WHEN col4 LIKE '%BB' THEN col5 * 1.1
              WHEN col4 IN ('CCC', 'DDD') THEN col5 * 1.2
              ELSE col5 * 1.3
         END AS 인상급여
  FROM TB_SAMPLE
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;wSsygn&quot;&gt;&lt;code&gt;-- 예시 (5): 왼쪽 괄호가 동반된 수직배치의 예
SELECT deptno
  FROM BIG_DEPT d
 WHERE NOT EXISTS (
        SELECT deptno
          FROM BIG_EMP e
         WHERE e.deptno = d.deptno
       )
;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;F4_7k3&quot;&gt;&lt;code&gt;-- 예시 (6): UNION을 동반한 수직배치의 예
SELECT deptno
  FROM BIG_DEPT d
UNION ALL
SELECT deptno
  FROM BIG_EMP e
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;8SuL5g&quot;&gt;-- 예시 (1) : SELECT 예약어의 &amp;lsquo;T&amp;rsquo;을 기준으로 수직배치를 한 예 SELECT col1 , col2 /* Comment */ , col3 , CASE WHEN col4 = 1 THEN col4 ELSE col4,col4 / 100 END as col4 , col5 /* Comment */ FROM TB_SAMPLE a WHERE col1 = 123 AND col2 like &amp;lsquo;A%&amp;rsquo; AND col3 in (&amp;lsquo;A&amp;rsquo;, &amp;lsquo;B&amp;rsquo;, &amp;lsquo;C&amp;rsquo;) ;&lt;/li&gt;
&lt;li&gt;UPDATE 문의 작성 예시&lt;/li&gt;
&lt;li data-block-id=&quot;fDq-9I&quot;&gt;-- 예시 (1): UPDATE 예약어의 &amp;lsquo;E&amp;rsquo;을 기준으로 수직배치를 한 예 UPDATE TB_SAMPLE SET col1 = 123 , col2 = &amp;lsquo;ABC&amp;rsquo; , col3 = TO_CHAR(9936) WHERE col4 = 123 AND col5 LIKE &amp;lsquo;A%&amp;rsquo; AND col6 IN (&amp;lsquo;A&amp;rsquo;, &amp;lsquo;B&amp;rsquo;, &amp;lsquo;C&amp;rsquo;) ;&lt;/li&gt;
&lt;li&gt;INSERT 문 작성예문
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;67oBME&quot;&gt;&lt;code&gt;-- 예시 (2): INSERT의 VALUE 내용을 SELECT을 사용하여 처리한 예
INSERT INTO TB_SAMPLE1 (
       col1
       , col2
)
SELECT col3 /* col1 */
       , col4 /* col2 */
  FROM TB_SAMPLE2
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;3CZ376&quot;&gt;-- 예시 (1): INSERT 예약어의 &amp;lsquo;T&amp;rsquo;을 기준으로 수직배치를 한 예 INSERT INTO TB_SAMPLE ( &amp;nbsp;&amp;nbsp;&amp;nbsp;col1 &amp;nbsp;&amp;nbsp;&amp;nbsp; , col2 &amp;nbsp;&amp;nbsp;&amp;nbsp; , col3 &amp;nbsp;&amp;nbsp;&amp;nbsp; , col4 ) VALUES ( &amp;nbsp;&amp;nbsp;&amp;nbsp; '111' &amp;nbsp;&amp;nbsp;&amp;nbsp; , '222' &amp;nbsp;&amp;nbsp;&amp;nbsp; , '333' &amp;nbsp;&amp;nbsp;&amp;nbsp; , '444' );&lt;/li&gt;
&lt;li&gt;o DELETE 문 작성예문&lt;/li&gt;
&lt;li data-block-id=&quot;baZDQi&quot;&gt;-- 예시 (1) : DELETE 예약어의 끝 문자(&amp;lsquo;E&amp;rsquo;)을 기준으로 수직배치를 한 예 DELETE FROM TB_SAMPLE WHERE col1 = 123 AND col2 LIKE 'A%' AND col3 IN ('A', 'B', 'C') ;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;d9QYBVJx&quot; data-toc-id=&quot;d9QYBVJx&quot; data-block-id=&quot;3V1DrP&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.7. 주석(comment) 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EAmtir&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;pV_iWM&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT, UPDATE, INSERT, DELETE 문에서 컬럼목록 다음에 반드시 주석(/* */)을 사용하여 프로그램ID을 기술한다.&lt;/li&gt;
&lt;li&gt;원칙적으로 힌트(HINT)을 사용하는 것은 금지하지만, 불가피하게 힌트(HINT)을 사용할 경우에는 SQL문의 첫 번째 SELECT, UPDATE, INSERT, DELETE 다음에 반드시 동일한 줄에 프로그램 ID 를 /* / 을 이용하여 기술하며, /+ */ 을 이용하고 프로그램ID을 먼저 기술하고 힌트를 기술한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;nXXBpPMV&quot; data-toc-id=&quot;nXXBpPMV&quot; data-block-id=&quot;2zI0Bw&quot;&gt;3. SQL 작성 표준&lt;/h1&gt;
&lt;h2 id=&quot;8LLiajEt&quot; data-toc-id=&quot;8LLiajEt&quot; data-block-id=&quot;n33CM7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1.&amp;nbsp;SQL&amp;nbsp;작성시&amp;nbsp;기본적인&amp;nbsp;지침&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;l1WjJda2&quot; data-toc-id=&quot;l1WjJda2&quot; data-block-id=&quot;2TQMiC&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.1. 표준기능의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품특성과 연관된 기능보다 표준 기능을 사용 할 것.&lt;/p&gt;
&lt;h3 id=&quot;LKy_oJHr&quot; data-toc-id=&quot;LKy_oJHr&quot; data-block-id=&quot;i23TV0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.1.1. OUTER JOIN 표기법 (권장)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회 시 특정 DBMS에 종속된 SQL을 사용하는 예는 바람직하지 않으며 이식에 문제를 발생시키게 된다. (위 사항은 권장 사항임)&lt;/p&gt;
&lt;h3 id=&quot;nwshxqlI&quot; data-toc-id=&quot;nwshxqlI&quot; data-block-id=&quot;RM9Nqk&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.1.2. ISO표준 기간 표기법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO-8601 표준 표기법인 &amp;ldquo;YYYY-MM-DD hh:mm:ss.sssss&amp;rdquo; 을 사용할 것&lt;/p&gt;
&lt;h3 id=&quot;oUdPSPJy&quot; data-toc-id=&quot;oUdPSPJy&quot; data-block-id=&quot;XuGMIH&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2. 간결한 표기법을 사용&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;86b7VW_f&quot; data-toc-id=&quot;86b7VW_f&quot; data-block-id=&quot;PSD-jV&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.1. 필요 없는 괄호의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 불필요한 괄호는 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot; data-block-id=&quot;Osiazb&quot;&gt;&lt;code&gt;SELECT a, b, c
&amp;nbsp;&amp;nbsp;FROM Foobar
&amp;nbsp;WHERE (a = b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;AND (c &amp;lt; 42)
;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;mY5FBE18&quot; data-toc-id=&quot;mY5FBE18&quot; data-block-id=&quot;4s4esA&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.2.&amp;nbsp;CASE&amp;nbsp;문&amp;nbsp;사용시&amp;nbsp;주의&amp;nbsp;사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SKSf0X&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CASE문은 엄밀하게 말하면 문장(statement)이 아니라 수식(expression)이기 때문에 반드시 하나의 값을 반환한다는 것에 유의할 것(만약 조건 중 만족하는 것이 없으면 묵시적으로 &amp;ldquo;ELSE NULL&amp;rdquo; 이 추가된다.&lt;/li&gt;
&lt;li&gt;명시적으로 NULL을 반환할 때는 &amp;ldquo;CAST (NULL AS &amp;lt;datatype&amp;gt;)&amp;rdquo; 형태를 사용할 것&lt;/li&gt;
&lt;li&gt;CASE문을 쓸 때 &amp;ldquo;&amp;lt;CASE operand&amp;gt;&amp;rdquo; 대신에 Searched CASE 수식을 사용할 것&lt;/li&gt;
&lt;li&gt;o 바람직하지 않은 예&lt;/li&gt;
&lt;li data-block-id=&quot;XctpDa&quot;&gt;CASE iso_sex_code WHEN 0 THEN 'Unknown' WHEN 1 THEN 'Male' WHEN 2 THEN 'Female' WHEN 9 THEN 'N/A' ELSE NULL END&lt;/li&gt;
&lt;li&gt;o 바람직한 예&lt;/li&gt;
&lt;li data-block-id=&quot;PbZPba&quot;&gt;CASE WHEN iso_sex_code = 0 THEN 'Unknown' WHEN iso_sex_code = 1 THEN 'Male' WHEN iso_sex_code = 2 THEN 'Female' WHEN iso_sex_code = 9 THEN 'N/A' ELSE NULL END&lt;/li&gt;
&lt;li&gt;o 예외상황
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;jtYgkN&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NULL 여부와 비교하는 경우는 다음과 같이 SQL을 작성하면 에러가 발생하므로 주의해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot; data-block-id=&quot;6iS5ZX&quot;&gt;&lt;code&gt;CASE WHEN foo = 0 THEN &amp;lsquo;bar&amp;rsquo;
     WHEN foo = NULL THEN &amp;lsquo;no_bar&amp;rsquo; /*&amp;nbsp;error&amp;nbsp;!!!&amp;nbsp;*/
     ELSE NULL
END&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;가능하다면 COALESCE 또는 NULLIF 을 사용하여 SQL을 깔끔하게 작성한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HyR7ye&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(COALESCE, NULLIF 모두 SQL-92 표준이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7WTYZokl&quot; data-toc-id=&quot;7WTYZokl&quot; data-block-id=&quot;3y2YtQ&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.3. 불필요한 비교문&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 불필요한 비교문은 사용하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot; data-block-id=&quot;inlSbn&quot;&gt;&lt;code&gt;SELECT a, b, c
  FROM Foobar
 WHERE a = b
   AND b = c
   AND c = a
;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;M1IDrB6k&quot; data-toc-id=&quot;M1IDrB6k&quot; data-block-id=&quot;InuhAj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.2.4. 수식을 간소화하여 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ZXKOE6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간소한 수식 예(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HXwVHx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나쁜 예
&lt;pre class=&quot;n1ql&quot; data-block-id=&quot;tP1qwH&quot;&gt;&lt;code&gt;SELECT a, b, c
  FROM Foobar
 WHERE a + 2 = b&amp;nbsp;-&amp;nbsp;4
;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;RoX65x&quot;&gt;아래와 같이 작성하면 읽기에도 어려울 뿐 아니라, a 컬럼이 인덱스로 구성되어 있어도 인덱스를 활용할 수 없게 되는 경우가 있다.&lt;/li&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;XBBu-Q&quot;&gt;SELECT a, b, c FROM Foobar WHERE a = b &amp;ndash; 6 ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;간소한 수식 예(2)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;HQT-_l&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구간에 대한 조건을 AND을 사용하여 표현하는 것보다 BETWEEN을 활용하는 것이 좋다.&lt;/li&gt;
&lt;li data-block-id=&quot;y6ayay&quot;&gt;(단, 인덱스를 활용할 수 있는지 여부를 먼저 고려해서 사용할 것)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;간소한 수식 예(3)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Tuhl8r&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 개의 값과 비교할 때 OR을 사용하여 표현하는 것보다 IN을 활용하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;중첩되어 복잡한 조건절은 CASE 수식을 사용하여 간략하게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Suon3FvA&quot; data-toc-id=&quot;Suon3FvA&quot; data-block-id=&quot;6WJs24&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.3. 주석 사용시 주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;QDm9tn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가능하면 &amp;ldquo;--&amp;ldquo; 보다는 /* */ 을 활용하는 것이 좋다. (경우에 따라 Unary Operator인 -&amp;lsquo;와 혼동이 되는 경우가 있기 때문이다)&lt;/li&gt;
&lt;li&gt;Stored-Procedure&amp;nbsp;및&amp;nbsp;Function 에서의 주석
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Av0Mle&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;항상 Stored-Procedure는 첫 줄에 최소한 다음의 사항을 주석으로 표현한다. 단, 프로시저 이름은 &amp;ldquo;&amp;lt;동사&amp;gt;&amp;lt;목적어&amp;gt;&amp;rdquo; 형태로 기술하는 것이 좋다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;aHNCzk&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SP&amp;nbsp;및&amp;nbsp;Function&amp;nbsp;명&amp;nbsp;및&amp;nbsp;목적/기능&amp;nbsp;설명&lt;/li&gt;
&lt;li&gt;Input&amp;nbsp;Param&amp;nbsp;명&amp;nbsp;및&amp;nbsp;설명&lt;/li&gt;
&lt;li&gt;Output&amp;nbsp;Param&amp;nbsp;명&amp;nbsp;및&amp;nbsp;설명&lt;/li&gt;
&lt;li&gt;변경&amp;nbsp;이력(작성일자,&amp;nbsp;이름&amp;nbsp;-&amp;nbsp;변경&amp;nbsp;내용)&lt;/li&gt;
&lt;li&gt;복잡한 제어문에는 항상 주석을 사용할 것&lt;/li&gt;
&lt;li data-block-id=&quot;HyBSTg&quot;&gt;/* =========================================================================================== Name : fnConvertIntToIPv4 Desc : 정수(INT UNSIGNED)를 IPv4 주소 문자열로 변환 Params - intIPv4 : 정수로 변환된 IPv4 Return - VARCHAR : IPv4 주소 문자열 Used : fnConvertIntToIPv4(3232235777) &amp;rarr; '192.168.1.1' History - 2025.04.09, 이명근 - 최초 구현 =========================================================================================== */&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sTz5NYpW&quot; data-toc-id=&quot;sTz5NYpW&quot; data-block-id=&quot;HPoQlC&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.4. 옵티마이저用 힌트(Hint)의 사용자제&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uJAPrP&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵티마이저用 힌트는 DBMS에 따라 표기법이 달라서 호환이 되지 않는 경우가 많으므로 사용하지 않는 것이 좋다.&lt;/li&gt;
&lt;li&gt;DBMS의 옵티마이저는 대부분의 개발자보다 더 적은 비용의 전략을 잘 찾아낸다.&lt;/li&gt;
&lt;li&gt;힌트를 사용할 일이 없어지거나 인덱스가 변경되면 성능이 더 떨어지는 경우가 많다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;RfmR3AmB&quot; data-toc-id=&quot;RfmR3AmB&quot; data-block-id=&quot;VkQbn7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.5. 복잡한&amp;nbsp;데이터&amp;nbsp;처리&amp;nbsp;시&amp;nbsp;SQL Stored Procedure 사용 권장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무&amp;nbsp;처리&amp;nbsp;로직이&amp;nbsp;복잡한&amp;nbsp;데이터&amp;nbsp;처리(예:&amp;nbsp;데이터&amp;nbsp;조회&amp;nbsp;후&amp;nbsp;임시&amp;nbsp;테이블&amp;nbsp;생성하여&amp;nbsp;입력/수정/삭제&amp;nbsp;후&amp;nbsp;Target&amp;nbsp;Table에&amp;nbsp;데이터&amp;nbsp;입력/수정/삭제&amp;nbsp;로직)인&amp;nbsp;경우&amp;nbsp;Stored&amp;nbsp;Procedure&amp;nbsp;사용한다.Stored Procedure을 사용하면 다음과 같은 장점이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NN13IT&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안성 강화
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Swkmkn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stored Procedure을 사용하면 해당 프로시저 내부에서 허용되는 작업만 진행하게 되므로 동적SQL(Dynamic SQL)을 사용할 때보다 훨씬 안전하다. (동적 SQL을 사용하면 SQL내용을 통제할 수 있는 방법이 없다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유지보수 용이
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;p59Mxz&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stored Procedure는 손쉽게 수정하여 업그레이드할 수 있다. (새로 DBMS에 수정하는 순간 re-compile된다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 트래픽 감소
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SFxxN6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크상에서 파라미터 값만 전송되므로 네트워크 전송 효율이 좋아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일관성
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hN07mX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 모두 Stored-Procedure로만 작성하게 되면 일관성이 생기므로 추후 작업에도 생산성이 높아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모듈성
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;aTVxAk&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 Stored-Procedure에서도 해당 프로시저를 호출하여 사용할 수 있으므로 모듈화에 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;OBto0sXW&quot; data-toc-id=&quot;OBto0sXW&quot; data-block-id=&quot;AfIY0l&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.6. UNION은 사용 자제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 대부분 옵티마이저는 UNION을 최적화하는데 어려움을 겪고 있다. 따라서 가능하다면 UNION ALL 만을 사용하고 나머지는 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;h3 id=&quot;i7zBNOI0&quot; data-toc-id=&quot;i7zBNOI0&quot; data-block-id=&quot;V9fFHs&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.7. 정렬과 관련된 SQL문의 남용 금지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 Sort 가 발생하는 SQL 문은 최대한 자제한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;E9WXQx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ORDER&amp;nbsp;BY&lt;/li&gt;
&lt;li&gt;GROUP&amp;nbsp;BY&lt;/li&gt;
&lt;li&gt;DISTINCT&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;XOOXXY0o&quot; data-toc-id=&quot;XOOXXY0o&quot; data-block-id=&quot;nv136p&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1.8. WHERE 절에 긍정적 조건의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qnOL8J&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비교하고자 하는 컬럼이 숫자 타입이 확실한 경우를 제외하고 비교 하고자 하는 상수 값을 숫자 타입으로 하지 않는다.&lt;/li&gt;
&lt;li&gt;&amp;rdquo;OR&amp;rdquo; 사용을 자제하고 가급적 IN, CASE 함수를 활용한다.&lt;/li&gt;
&lt;li&gt;IFNULL 함수는 불필요하게 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;WHERE 절의 인덱스 스캔 컬럼에 인위적인 변형을 가하지 말고 반드시 상수(변수) 쪽에 변형을 가한다.&lt;/li&gt;
&lt;li&gt;데이터를 검색할 때 불필요한 부분은 액세스하지 말고 읽어야 하는 부분만 처리하여 효율을 높인다. ( SELECT 문에서 &amp;lsquo;*&amp;rsquo;을 사용하지 말고 Named Column을 사용한다. )&lt;/li&gt;
&lt;li&gt;불필요한 Network 접근을 줄이기 위해 가능하면 SQL을 최대한 묶어서 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;9KdQxsCO&quot; data-toc-id=&quot;9KdQxsCO&quot; data-block-id=&quot;8ldBTE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2. SQL 작성시 기본적인 절차&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;Fe80E_zk&quot; data-toc-id=&quot;Fe80E_zk&quot; data-block-id=&quot;9TJ97L&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.1. SQL 테스트&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Fqc6IZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가능한 NULL과 관련된 모든 경우의 수를 테스트할 것&lt;/li&gt;
&lt;li&gt;CHECK() 제약사항을 모두 검사하고 테스트할 것&lt;/li&gt;
&lt;li&gt;테이블의 크기가 커질 경우를 테스트할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;JvhJson2&quot; data-toc-id=&quot;JvhJson2&quot; data-block-id=&quot;lX7k2i&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.2. SQL 수행비용 검증&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 작성된 SQL 문에 대한 실행계획을 검증하는 절차를 거친다.&lt;/p&gt;
&lt;h3 id=&quot;NJxVqn4X&quot; data-toc-id=&quot;NJxVqn4X&quot; data-block-id=&quot;E1Su6W&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.3. OLAP 성격의 업무 개발시 주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OLTP 성격의 업무에서 아래와 같은 SQL 문에 대해서는 반드시 해당 SQL문의 개선 작업을 수행한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;YrFrP6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Full Table Scan&lt;/li&gt;
&lt;li&gt;Index Fast Full Scan&lt;/li&gt;
&lt;li&gt;Sort Merge Join&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;_w6XUUui&quot; data-toc-id=&quot;_w6XUUui&quot; data-block-id=&quot;-71yfG&quot;&gt;4. SQL 작성 지침&lt;/h1&gt;
&lt;h2 id=&quot;6vdWzhdL&quot; data-toc-id=&quot;6vdWzhdL&quot; data-block-id=&quot;Puux1J&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.1. DDL(Data Definition Language) 작성 지침&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;PHzzXojW&quot; data-toc-id=&quot;PHzzXojW&quot; data-block-id=&quot;tF78Ec&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.1. Default 값은 데이터 타입과 일치하는 값을 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연한 말이지만, 의외로 많은 개발자가 이 원칙을 지키지 않는다. 예를 들면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ym9ZKX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Decimal 데이터 타입에 정수 0(zero)을 default 값으로 사용하는 경우&lt;/li&gt;
&lt;li&gt;(CHAR(n) 데이터 타입에 길이가 n개 보다 적은 문자 스트링을 default 값으로 사용하는 경우&lt;/li&gt;
&lt;li&gt;TIMESTAMPE 데이터 타입에 DATE 값을 default 로 사용하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우 같은 경우 DBMS에서 원래 데이터 타입에 맞게 묵시적인 변환작업이 일어나는데, DBMS성능에 영향을 미치는 요인이 될 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;GwnJmyvX&quot; data-toc-id=&quot;GwnJmyvX&quot; data-block-id=&quot;CE26O4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.2. Data Type 중 문자 타입은 일관성을 유지&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DHZgI9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;char 대신 varchar 을 사용할 것&lt;/li&gt;
&lt;li&gt;인덱스로 지정될 가능성이 높은 컬럼은 varchar로 지정하여 사용할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;EW0pXyY0&quot; data-toc-id=&quot;EW0pXyY0&quot; data-block-id=&quot;xR7ZlA&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.3. 테이블 생성시 주키(Primary Key)를 가장 위에 배치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가독성을 높이기 위해 키에 해당되는 속성은 가장 위에 위치시키는 것이 좋다. 왜냐하면 키라는 의미 자체가 해당 엔터티의 대표값을 나타내기 때문이다.&lt;/p&gt;
&lt;h3 id=&quot;jaMOdmOI&quot; data-toc-id=&quot;jaMOdmOI&quot; data-block-id=&quot;5nPQst&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.4. 컬럼을 논리적인 순서로 배열 및 논리적인 그룹 지정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 스키마가 완성된 이후에 컬럼을 추가할 때 성능에 영향을 미치는지 고려해야 하는데, 다음 순서대로 컬럼을 배치하면 성능에 도움이 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;a48-V7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업데이트가 적게 일어나는 고정길이 컬럼&lt;/li&gt;
&lt;li&gt;업데이트가 적게 일어나는 가변길이 컬럼&lt;/li&gt;
&lt;li&gt;업데이트가 자주 일어나는 컬럼(들)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;lXk-b8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업데이트가 동시에 일어나는 성격의 컬럼이 연속되게 배치하면 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;kci7YxOI&quot; data-toc-id=&quot;kci7YxOI&quot; data-block-id=&quot;hiBLTj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.5. 제약조건 이름은 명확하게 기술&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제약조건은 &amp;rdquo;CONSTRAINT &amp;lt;name&amp;gt;&amp;rdquo; 형태로 기술하는데, 제약조건 명을 기술하지 않으면 에러 상황이 발생하였을 때 시스템에서 정한 임의의 이름으로 에러메시지가 발생하므로 오류를 찾기 어렵게 되므로 제약조건의 이름은 명확하게 기술한다. 단, PRIMARY KEYS, UNIQUE, FOREIGN KEY 제약 조건에 대한 이름은 생략한다.&lt;/p&gt;
&lt;h3 id=&quot;cf-Q_uNO&quot; data-toc-id=&quot;cf-Q_uNO&quot; data-block-id=&quot;SO81NP&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.6. 수치형 컬럼은 범위 제약사항을 두도록 고려&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스는 기업에서 유일하게 신뢰할 수 있는 &amp;ldquo;저장소&amp;rdquo;이므로, 비즈니스 룰을 강제할 수 있는 방편으로 제약사항을 두게 된다. 대개는 테이블의 필드가 0(zero)보다 크도록 제약사항을 두는 경우가 많다.&lt;/p&gt;
&lt;h3 id=&quot;Z3oHw_VO&quot; data-toc-id=&quot;Z3oHw_VO&quot; data-block-id=&quot;aRiUvM&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1.7. 가능하면 모든 테이블이 키를 갖도록 설계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키와 관련하여 주의할 사항은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;luF4Xb&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 채번 컬럼은 관계성 키가 아니다.&lt;/li&gt;
&lt;li&gt;파일은 테이블이 아니다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;좋은 키&amp;rdquo;의 속성을 살펴 볼 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;FewW6y&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유일성(Uniqueness)&lt;/li&gt;
&lt;li&gt;안정성(Stability)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Ci8lnM&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쉽게 변하지 않는 값이어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;친밀성(Familiarity)&lt;/li&gt;
&lt;li&gt;검증성(Validation)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;K9m3UD&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 입장에서 검증하기 용이해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;확인성(Verifiability)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;GBPsQn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자 입장에서 확인하기 용이해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단순성(Simplicity)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;AVJ8Cdwu&quot; data-toc-id=&quot;AVJ8Cdwu&quot; data-block-id=&quot;TIBb3P&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.2. DML(Data Manipulation Language) 작성 지침&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;bmA4-uhQ&quot; data-toc-id=&quot;bmA4-uhQ&quot; data-block-id=&quot;4PudPp&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.1. NULL 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AZWcf4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NULL을&amp;nbsp;꼭&amp;nbsp;사용해야&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;비교&amp;nbsp;연산자가&amp;nbsp;아닌&amp;nbsp;'IS'&amp;nbsp;또는&amp;nbsp;'IS&amp;nbsp;NOT'을&amp;nbsp;사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oDSemI&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;1zc-vE&quot;&gt;IF (@var IS NOT NULL) IF (@var IS NULL)&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;M_l-K9&quot;&gt;IF (@var = NULL) IF (@var &amp;lt;&amp;gt; NULL) IF (@var != NULL) IF (@var &amp;gt; NULL )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인덱스 비교 부분에서 NULL을 사용하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ONkdKI&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;N22o_x&quot;&gt;SELECT&amp;nbsp;ord_no &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;ord_date &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;item ,&amp;nbsp;ord_qty &amp;nbsp;FROM ORDER1T &amp;nbsp;&amp;nbsp;WHERE ord_date &amp;gt; ' ' ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;w6grtf&quot;&gt;SELECT&amp;nbsp;ord_no &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;ord_date &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;item &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;ord_qty &amp;nbsp;&amp;nbsp;FROM ORDER1T &amp;nbsp;WHERE ord_date IS NOT NULL ORDER BY ord_date ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;YqlYNMGg&quot; data-toc-id=&quot;YqlYNMGg&quot; data-block-id=&quot;qfBN6V&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.2. IN 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;r11Bho&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE 조건에서 &amp;lsquo;OR&amp;rsquo;을 최대한 배제하고 IN 을 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;y5Utf_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;Z-L29X&quot;&gt;SELECT emp_name &amp;nbsp;&amp;nbsp;FROM Employees &amp;nbsp;WHERE emp_id IN (1, 2, 5) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;Z_98o_&quot;&gt;SELECT&amp;nbsp;emp_name &amp;nbsp;&amp;nbsp;FROM Employees &amp;nbsp;WHERE ((emp_id = 1) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OR (empidn = 2) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OR (empidn = 5)) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;'BETWEEN'을 사용하면 Range Scan을 수행하고, 'IN'을 사용하면 Point SCAN을 수행하므로 IN을 사용하는 것이 더 효율적이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NjHuyX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;4NIKXd&quot;&gt;SELECT col3 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;col4 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;col5 &amp;nbsp;&amp;nbsp;FROM TAB1 &amp;nbsp;WHERE col1 = 'A' &amp;nbsp;&amp;nbsp;&amp;nbsp;AND col2 IN ('112',&amp;nbsp;'111') ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;cS89zR&quot;&gt;SELECT col3 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;col4 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;col5 &amp;nbsp;&amp;nbsp;FROM TAB1 &amp;nbsp;WHERE col1 = 'A' &amp;nbsp;&amp;nbsp;&amp;nbsp;AND col2 BETWEEN '111'&amp;nbsp;AND '112' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UNION은 가능하면 IN으로 대체한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MNJ1Bm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;UZnfy8&quot;&gt;SELECT DISTINCT useid , usetypid FROM JOIN_USER_USERTYPS WHERE usetypid IN (16, 17) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;NYmMW5&quot;&gt;SELECT DISTINCT useid , usetypid FROM JOIN_USER_USERTYPES WHERE (usetypid = 16) UNION ALL SELECT DISTINCT useid , usetypid FROM JOIN_USER_USERTYPES WHERE (usetypid = 17) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tm0jK6UU&quot; data-toc-id=&quot;tm0jK6UU&quot; data-block-id=&quot;WrFMCb&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.3. MIN, MAX 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;qYn0Ff&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대값(또는 최소값)만 필요한 경우 ORDER BY 대신 MAX(또는 MIN) 함수를 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;JLInld&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;F9jh-s&quot;&gt;SELECT&amp;nbsp;MAX(emp_id) &amp;nbsp;&amp;nbsp;FROM Employees ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;SBI6ad&quot;&gt;SELECT&amp;nbsp;emp_id &amp;nbsp;&amp;nbsp;FROM Employees ORDER BY empi_d DESC ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ma93OCuq&quot; data-toc-id=&quot;ma93OCuq&quot; data-block-id=&quot;LCbbJ6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.4. UNION, UNION ALL 사용 지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;-NhvVm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래와 같이 UNION ALL 구문을 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;NmMXML&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;ZHJJKl&quot;&gt;SELECT fname , lname , empidn FROM Employees WHERE (empidn &amp;lt; 10) UNION ALL SELECT fname , lname , empidn FROM Employees WHERE (empidn &amp;gt;= 100) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;JS4QRU&quot;&gt;SELECT fname , lname , empidn FROM Employees WHERE (empidn &amp;lt; 10) UNION SELECT fname , lname , empidn FROM Employees WHERE (empidn &amp;gt;= 100) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OR 대신 아래와 같이 UNION ALL 을 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9QqXmE&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;f05-jR&quot;&gt;SELECT COUNT(*) FROM Chujgo WHERE :sw = 1 AND chuldate = '20020628' UNION ALL SELECT COUNT(*) FROM Chulgo WHERE :sw = 2 AND RTRIM(chuldate) LIKE '200206%' ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;t246Bz&quot;&gt;SELECT COUNT(*) FROM Chulgo WHERE (:sw = 1 AND chuldate = &amp;lsquo;20020628&amp;rsquo;) OR (:sw = 2 AND RTRIM(chuldate) LIKE &amp;lsquo;200206%&amp;rsquo;) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;C_s5EYv6&quot; data-toc-id=&quot;C_s5EYv6&quot; data-block-id=&quot;Qc2JCN&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.5. OR 사용시 주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;-ARUhs&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건문 안에 OR을 사용하면 TABLE FULL SCAN을 하게 되므로 주의해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oaUa98&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;A-3te0&quot;&gt;SELECT chulno , custno , chuldate , uncost FROM Chulgo WHERE (:sw = 1 AND (status LIKE &amp;lsquo;1%&amp;rsquo;) OR (:sw = 1 AND (status LIKE &amp;lsquo;2%&amp;rsquo;) OR (:sw = 2 AND (status LIKE &amp;lsquo;3%&amp;rsquo;) ORDER BY status ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;fz7poB&quot;&gt;SELECT chulno , custno , chuldate , uncost FROM Chulgo WHERE (:sw = 1 AND (status LIKE &amp;lsquo;1%&amp;rsquo; OR status LIKE &amp;lsquo;2%&amp;rsquo;)) OR (:sw = 2 AND (status LIKE &amp;lsquo;3%&amp;rsquo;)) ORDER BY status ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;yfOJRAGX&quot; data-toc-id=&quot;yfOJRAGX&quot; data-block-id=&quot;eD41Gt&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.6. 부정형 사용 금지 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;OHC5Dw&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE절에 부정형을 사용하면 인덱스 스캔이 불가능하므로 긍정형으로 변형하여 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EgluvL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;PvZELF&quot;&gt;SELECT 'Not found' INTO :col1 FROM DUAL WHERE NOT EXISTS ( SELECT 'x' FROM EMP WHERE empno = &amp;lsquo;1234&amp;rsquo; ) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;_yeaQv&quot;&gt;SELECT 'Not found' INTO :COL1 FROM EMP WHERE empno &amp;lt;&amp;gt; '1234' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jM-CbPa8&quot; data-toc-id=&quot;jM-CbPa8&quot; data-block-id=&quot;UxL4Dy&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.7. NVL 활용 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;g8k8-p&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총계함수 사용 시 NULL은 무시되므로 총계함수 내에서의 IFNULL함수는 필요하지 않음
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;lFB2hU&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;g0h6xl&quot;&gt;IFNULL(SUM(trn_amount),&amp;nbsp;0)&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;n_uejs&quot;&gt;IFNULL(SUM(IFNULL(trn_amount,&amp;nbsp;0)),&amp;nbsp;0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bA0LoCPM&quot; data-toc-id=&quot;bA0LoCPM&quot; data-block-id=&quot;CWHSvi&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2.8. OUTER JOIN 활용 방안&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AfLv8J&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 테이블 중 한 쪽에만 값이 있는 경우를 추출할 경우 OUTER JOIN을 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;xUn1Ck&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 예&lt;/li&gt;
&lt;li data-block-id=&quot;g8jyfE&quot;&gt;SELECT d.deptno FROM BIG_DEPT d LEFT OUTER JOIN BIG_EMP e ON (d.deptno = e.deptno AND e.deptno IS NULL) ;&lt;/li&gt;
&lt;li&gt;나쁜 예&lt;/li&gt;
&lt;li data-block-id=&quot;Ow7Y1V&quot;&gt;SELECT deptno FROM BIG_DEPT d WHERE NOT EXISTS ( SELECT deptno FROM BIG_EMP e WHERE e.deptno = d.deptno &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;y6GkTo&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;xIw_5TO6&quot; data-toc-id=&quot;xIw_5TO6&quot; data-block-id=&quot;gnnHFp&quot;&gt;5. SQL 사용 지침&lt;/h1&gt;
&lt;h2 id=&quot;TIjBQtl7&quot; data-toc-id=&quot;TIjBQtl7&quot; data-block-id=&quot;zzedCR&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.1. 인덱스(Index) 사용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-ye0zhFF&quot; data-toc-id=&quot;-ye0zhFF&quot; data-block-id=&quot;m2vUX_&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.1. 인덱스 사용지침&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Vnj7BN&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 경우에만 인덱스를 생성하고, 사용되지 않는 인덱스는 모니터링 후 삭제한다.&lt;/li&gt;
&lt;li&gt;실제 조사된 액세스 종류에 따라서 인덱스를 선정 및 검증한다.&lt;/li&gt;
&lt;li&gt;특정 명령문을 튜닝하기 위해 인덱스를 추가로 생성할 경우 다른 SQL의 액세스 경로가 바뀔 수도 있으므로 충분한 사전 분석 작업이 필요하다.&lt;/li&gt;
&lt;li&gt;각종 액세스 분포도가 자주 조합되어 사용되는 경우는 결합 인덱스로 생성한다.&lt;/li&gt;
&lt;li&gt;자주 조합되어 사용되는 경우의 수를 만족할 수 있도록 인덱스간의 역할을 분담한다.(되도록 많은 access path를 수용하도록 한다)&lt;/li&gt;
&lt;li&gt;가능한 수정이 빈번하지 않는 칼럼으로 인덱스를 선정한다.&lt;/li&gt;
&lt;li&gt;결합 인덱스의 칼럼 순서 선정에 주의 한다. 첫 번째 칼럼이 Where 조건에 존재해야 인덱스 scan 가능하다.&lt;/li&gt;
&lt;li&gt;반복수행(loop 내) 되는 조건은 가장 빠른 수행속도를 내게 하여야 하므로 인덱스 구성의 대상으로 최우선 고려한다.&lt;/li&gt;
&lt;li&gt;넓은 범위(5% 이상)를 인덱스로 처리 시 random access로 인한 많은 오버헤드가 발생할 가능성이 있으므로, Table Full Scan을 고려해봐야 한다.&lt;/li&gt;
&lt;li&gt;인덱스의 개수는 테이블의 사용 형태에 따라 적절히 생성한다. 왜냐하면 DML 작업이 많은 경우 성능저하의 원인이 될 수 있기 때문이다.&lt;/li&gt;
&lt;li&gt;조인(join) 시에는 잘못된 인덱스 사용이 큰 부하를 가져올 수 있으므로, 인덱스 사용여부에 주의하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2RNC3hiw&quot; data-toc-id=&quot;2RNC3hiw&quot; data-block-id=&quot;0eZjXx&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2. 인덱스 적용 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;h92I8FOI&quot; data-toc-id=&quot;h92I8FOI&quot; data-block-id=&quot;nSQlSF&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2.1. 인덱스 컬럼은 원형 그대로 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼은 비교되기 전에 변형이 일어나면 인덱스가 사용되지 않기 때문에 되도록이면 WHERE절에서 인덱스 컬럼을 원형 그대로 사용하는 것이 바람직하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;LL4JrI&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;39gmA2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;ZHIQjN&quot;&gt;SELECT dept , ename , sal FROM EMP WHERE SUBSTR(job, 1, 4) = '&amp;lt;st1:city w:st='on'&amp;gt;SALE&amp;lt;/st1:city&amp;gt;' ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;cOVJqx&quot;&gt;SELECT dept , ename , sal FROM EMP WHERE job LIKE '&amp;lt;st1:city w:st='on'&amp;gt;SALE&amp;lt;/st1:city&amp;gt;%' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시(2)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BrHxak&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;nAniZd&quot;&gt;SELECT empno , ename , job FROM EMP WHERE (sal * 12) = 35000000 ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;x_ajQl&quot;&gt;SELECT empno , ename , job FROM EMP WHERE sal = (35000000 / 12) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시(3)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;cfvRer&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;tGc15Z&quot;&gt;SELECT empno , ename ,job FROM EMP WHERE CONCAT(job, dept) = 'CLERK10' ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;CqxBwE&quot;&gt;SELECT empno , ename , job FROM EMP WHERE job = 'CLERK' AND dept = '10' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시(4)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VAnnS8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;o 개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;fEsD2I&quot;&gt;SELECT chr , num , var , dat FROM SAMPLET WHERE CAST(car&amp;nbsp;AS&amp;nbsp;INTEGER) = 10;&lt;/li&gt;
&lt;li&gt;o 개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;jdYXs2&quot;&gt;SELECT chr , num , var , dat FROM SAMPLET WHERE chr =&amp;nbsp;'10' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위의 예를 이용하여 다음과 같이 강제로 인덱스를 타지 않게 할 수 도 있다.&lt;/li&gt;
&lt;li data-block-id=&quot;cWAXq2&quot;&gt;SELECT SUM(col1) FROM TAB1 WHERE RTRIM(status) = '90' ;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;JmdZ-Ycc&quot; data-toc-id=&quot;JmdZ-Ycc&quot; data-block-id=&quot;gLlPVe&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2.2. 인덱스 사용시 부정형을 사용 금지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼을 부정형(NOT, &amp;lt;&amp;gt;)으로 비교할 때도 인덱스가 사용되지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EuLJeW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;o_0JFL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;GpJFQD&quot;&gt;SELECT 'Not found' INTO :col1 FROM EMP WHERE empno &amp;lt;&amp;gt; '1234' ;&lt;/li&gt;
&lt;li&gt;개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;TzRFLh&quot;&gt;SELECT 'Not found' INTO :col1 FROM DUAL WHERE NOT EXISTS ( SELECT &amp;lsquo;'X' FROM EMP WHERE empno =&amp;lsquo;'1234' ) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;MaiypvQX&quot; data-toc-id=&quot;MaiypvQX&quot; data-block-id=&quot;mLRxPS&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1.2.3. 인덱스 컬럼을 NULL과 비교 금지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼을 NULL과 비교하여도 해당 인덱스가 사용되지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ePBIiU&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dHJ7rZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개선 전&lt;/li&gt;
&lt;li data-block-id=&quot;_HPFR-&quot;&gt;SELECT ord_no , ord_date , item , ord_qty FROM ORDER1T WHERE ord_date IS NOT NULL ORDER BY ord_date ;&lt;/li&gt;
&lt;li&gt;o 개선 후&lt;/li&gt;
&lt;li data-block-id=&quot;Bl8jaH&quot;&gt;SELECT ord_no , ord_date , item , ord_qty FROM ORDER1T WHERE ord_date &amp;gt; ' ' ; -- ord_date가 숫자 타입이면 SELECT ord_no , ord_date , item , ord_qty FROM ORDER1T WHERE ord_date &amp;gt; 0 ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;h0bl34Gr&quot; data-toc-id=&quot;h0bl34Gr&quot; data-block-id=&quot;jzM5gM&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.2. 뷰(View) 사용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;9uHeS8hh&quot; data-toc-id=&quot;9uHeS8hh&quot; data-block-id=&quot;82MH7N&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.1. 뷰(View) 명명법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰의 명명법은 기본적으로 테이블에 대한 명명법과 동일하다. 다만 뷰의 이름을 'vw&amp;rsquo; 또는 'v&amp;rsquo;로 시작하는 것은 피하는 것이 좋다. 이유는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VSLuv5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뷰를 나중에 테이블로 전환하는 경우 'vw&amp;rsquo; 로 시작하는 이름을 모두 'tbl&amp;rsquo;로 바꾸어야 하는 병폐가 생길 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Fn_aa868&quot; data-toc-id=&quot;Fn_aa868&quot; data-block-id=&quot;AmVUJx&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.2. 보안성을 높이려면 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;zcraesyJ&quot; data-toc-id=&quot;zcraesyJ&quot; data-block-id=&quot;SpW51r&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.3. 데이터에 대한 검증을 위해서 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;bE7bE69x&quot; data-toc-id=&quot;bE7bE69x&quot; data-block-id=&quot;GL0LBA&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.4. 사용자의 요구로 인한 복잡성을 줄이기 위해 뷰(View)을 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 또는 SQL 초보프로그래머를 위해 복잡한 SQL조회 결과를 뷰(View)로 미리 만들어 놓으면 추후 작업할 때 일을 대폭 줄여줄 수 있다&lt;/p&gt;
&lt;h3 id=&quot;xQohMyWH&quot; data-toc-id=&quot;xQohMyWH&quot; data-block-id=&quot;vMRVjy&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.5. 2차 데이터를 도출할 때 뷰(View)을 사용하면 도움이 된다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테이블의 데이터를 근간으로 2차 데이터를 도출하여 사용할 때 뷰를 정의하여 사용하면 프로그래머의 부담이 줄어든다.&lt;/p&gt;
&lt;h3 id=&quot;G4qy2dbQ&quot; data-toc-id=&quot;G4qy2dbQ&quot; data-block-id=&quot;Yje2Bb&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.6. 테이블의 컬럼명이 복잡하거나 어려울 때 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 컬럼명이 복잡하고 애매할 경우 간결한 컬럼명을 가지는 뷰를 생성하면 기존 컬럼명을 수정하지 않고도 동일한 효과를 얻을 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;labfXe8S&quot; data-toc-id=&quot;labfXe8S&quot; data-block-id=&quot;NMrP2t&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.7. 복잡한 제약사항을 단순화하기 위해 뷰(View)을 사용할 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS 마다 테이블에 대한 복잡한 제약사항을 지원하는데 한계가 있으며, 이 한계는 DBMS마다 다르다. 이를 극복하기 위하여 뷰(View)을 사용하면 큰 도움이 된다.&lt;/p&gt;
&lt;h3 id=&quot;XJizFQMA&quot; data-toc-id=&quot;XJizFQMA&quot; data-block-id=&quot;_Di7HY&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.8. 뷰를 생성하려면 그에 합당한 이유가 있어야 한다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;pvt3Rb9S&quot; data-toc-id=&quot;pvt3Rb9S&quot; data-block-id=&quot;a52lu1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2.9. 뷰를 남용하지 말 것&lt;/b&gt;&lt;/h3&gt;</description>
      <category>개발</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/426</guid>
      <comments>https://gregorio78.tistory.com/426#entry426comment</comments>
      <pubDate>Wed, 28 Jan 2026 10:13:23 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript Coding Conventions</title>
      <link>https://gregorio78.tistory.com/425</link>
      <description>&lt;h1 id=&quot;-mKieFuy&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;-mKieFuy&quot; data-block-id=&quot;YrL0aU&quot;&gt;변수&lt;/h1&gt;
&lt;h2 id=&quot;CyWx8Jso&quot; data-toc-id=&quot;CyWx8Jso&quot; data-block-id=&quot;vMztZ8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의미있는 변수 이름을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;jvF6fA&quot; data-ke-size=&quot;size16&quot;&gt;읽는 사람으로 하여금 변수마다 어떤 점이 다른지 알 수 있도록 이름을 구별하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;riLVZx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot; data-block-id=&quot;w4JquK&quot;&gt;&lt;code&gt;function between(a1: T, a2: T, a3: T): boolean {
  return a2 &amp;lt;= a1 &amp;amp;&amp;amp; a1 &amp;lt;= a3;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;0eSGt1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;excel&quot; data-block-id=&quot;5cccSt&quot;&gt;&lt;code&gt;function between(value: T, left: T, right: T): boolean {
  return left &amp;lt;= value &amp;amp;&amp;amp; value &amp;lt;= right;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;L-gDik-z&quot; data-toc-id=&quot;L-gDik-z&quot; data-block-id=&quot;FoBKE8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;발음할 수 있는 변수 이름을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;9Btdy0&quot; data-ke-size=&quot;size16&quot;&gt;발음할 수 없는 이름은 그 변수에 대해서 바보 같이 소리를 내 토론할 수밖에 없습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;R1Eo8B&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;elm&quot; data-block-id=&quot;iyt25O&quot;&gt;&lt;code&gt;type DtaRcrd102 = {
  genymdhms: Date;
  modymdhms: Date;
  pszqint: number;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;gYWVhK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot; data-block-id=&quot;mmN3cy&quot;&gt;&lt;code&gt;type Customer = {
  generationTimestamp: Date;
  modificationTimestamp: Date;
  recordId: number;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;_cJQMO35&quot; data-toc-id=&quot;_cJQMO35&quot; data-block-id=&quot;VNmaMC&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동일한 유형의 변수는 동일한 단어를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;6X074X&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li&gt;
&lt;pre class=&quot;routeros&quot; data-block-id=&quot;1YDTQp&quot;&gt;&lt;code&gt;    function getUserInfo(): User;
    function getUserDetails(): User;
    function getUserData(): User;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;SS_Uxb&quot;&gt;&lt;code&gt;    function getUser(): User;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;L_23GWY0&quot; data-toc-id=&quot;L_23GWY0&quot; data-block-id=&quot;Y8jjjM&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;검색할 수 있는 이름을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Fnqo_y&quot; data-ke-size=&quot;size16&quot;&gt;코드를 쓸 때보다 읽을 때가 더 많기 때문에 우리가 쓰는 코드는 읽을 수 있고 검색이 가능해야 합니다. 프로그램을 이해할 때 의미있는 변수 이름을 짓지 않으면 읽는 사람으로 하여금 어려움을 줄 수 있습니다. 검색 가능한 이름을 지으세요. &lt;a href=&quot;https://palantir.github.io/tslint/rules/no-magic-numbers/&quot;&gt;TSLint&lt;/a&gt;와 같은 도구는 이름이 없는 상수를 식별할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;giM97U&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;6yde_A&quot;&gt;// 86400000이 도대체 뭐지? setTimeout(restart, 86400000);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;F83_5V&quot;&gt;// 대문자로 이루어진 상수로 선언하세요. const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000; setTimeout(restart, MILLISECONDS_IN_A_DAY);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lyS3MSkH&quot; data-toc-id=&quot;lyS3MSkH&quot; data-block-id=&quot;_eWfQM&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의도를 나타내는 변수를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;9uTjk1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;WqkOAq&quot;&gt;declare const users: Map&amp;lt;string, User&amp;gt;; for (const keyValue of users) { // users 맵을 순회 }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;gCyJWG&quot;&gt;declare const users: Map&amp;lt;string, User&amp;gt;; for (const [id, user] of users) { // users 맵을 순회 }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;AVgj1Rbp&quot; data-toc-id=&quot;AVgj1Rbp&quot; data-block-id=&quot;r1H6eW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;암시하는 이름은 사용하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;-N3SLn&quot; data-ke-size=&quot;size16&quot;&gt;명시적인 것이 암시적인 것보다 좋습니다.&amp;nbsp;명료함은 최고입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DuWJLH&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;xKfLeB&quot;&gt;const u = getUser(); const s = getSubscription(); const t = charge(u, s);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;lN7ZCn&quot;&gt;const user = getUser(); const subscription = getSubscription(); const transaction = charge(user, subscription);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-1Nun4EL&quot; data-toc-id=&quot;-1Nun4EL&quot; data-block-id=&quot;6Q4wox&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;불필요한 문맥은 추가하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;o5v_w7&quot; data-ke-size=&quot;size16&quot;&gt;클래스/타입/객체의 이름에 의미가 담겨있다면, 변수 이름에서 반복하지 마세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oJh0EA&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;C7ebGs&quot;&gt;type Car = { carMake: string; carModel: string; carColor: string; } function print(car: Car): void { console.log(${car.carMake} ${car.carModel} (${car.carColor})); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;````tsmake: string;color: string;function print(car: Car): void {}&lt;/li&gt;
&lt;li data-block-id=&quot;_0-Nss&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li data-block-id=&quot;7MnwQ5&quot;&gt;console.log(${car.make} ${car.model} (${car.color}));&lt;/li&gt;
&lt;li data-block-id=&quot;WMAg18&quot;&gt;}&lt;/li&gt;
&lt;li data-block-id=&quot;rxZMzu&quot;&gt;model: string;&lt;/li&gt;
&lt;li data-block-id=&quot;Ew6jYY&quot;&gt;type Car = {&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Ue-KTfus&quot; data-toc-id=&quot;Ue-KTfus&quot; data-block-id=&quot;X0nm00&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;short circuiting이나 조건문 대신 기본 매개변수를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;P3_ly5&quot; data-ke-size=&quot;size16&quot;&gt;기본 매개변수는 short circuiting보다 보통 명료합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;nQVDGK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad `&lt;/li&gt;
&lt;li data-block-id=&quot;8mCawz&quot;&gt;function loadPages(count?: number) { const loadCount = count !== undefined ? count : 10; // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good &lt;/b&gt;`&lt;/li&gt;
&lt;li data-block-id=&quot;_LvOgJ&quot;&gt;function loadPages(count: number = 10) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;9GjruZgX&quot; data-toc-id=&quot;9GjruZgX&quot; data-block-id=&quot;Oly_qc&quot;&gt;함수&lt;/h1&gt;
&lt;h2 id=&quot;PS-dA-Kp&quot; data-toc-id=&quot;PS-dA-Kp&quot; data-block-id=&quot;BVCh1y&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수의 매개변수는 2개 혹은 그 이하가 이상적입니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;XrsvwM&quot; data-ke-size=&quot;size16&quot;&gt;함수 매개변수의 개수를 제한하는 것은 함수를 테스트하기 쉽게 만들어주기 때문에 놀라울 정도로 중요합니다. 함수 매개변수가 3개 이상인 경우, 각기 다른 인수로 여러 다른 케이스를 테스트해야 하므로 경우의 수가 매우 많아집니다.&lt;br /&gt;한 개 혹은 두 개의 매개변수가 이상적인 경우고, 가능하다면 세 개는 피해야 합니다. 그 이상의 경우에는 합쳐야 합니다. 두 개 이상의 매개변수를 가질 경우, 함수가 많은 것을 할 가능성이 높아집니다. 그렇지 않은 경우, 대부분 상위 객체는 하나의 매개변수로 충분할 것입니다.&lt;br /&gt;많은 매개변수를 사용해야 한다면 객체 리터럴을 사용하는 것을 고려해보세요.&lt;br /&gt;함수가 기대하는 속성을 명확하게 하기 위해, &lt;a href=&quot;https://basarat.gitbook.io/typescript/future-javascript/destructuring&quot;&gt;구조 분해&lt;/a&gt; 구문을 사용할 수 있습니다. 이 구문은 몇 개의 장점을 가지고 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;R311SN&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;어떤 사람이 함수 시그니쳐(매개변수의 타입, 반환값의 타입 등)를 볼 때, 어떤 속성이 사용되는지 즉시 알 수 있습니다.&lt;/li&gt;
&lt;li&gt;명명된 매개변수처럼 보이게 할 때 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;또한 구조 분해는 함수로 전달된 매개변수 객체의 특정한 원시 값을 복제하며 이것은 사이드 이펙트를 방지하는데 도움을 줍니다. 유의사항: 매개변수 객체로부터 구조 분해된 객체와 배열은 &lt;b&gt;복제되지 않습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;타입스크립트는 사용하지 않은 속성에 대해서 경고를 주며, 구조 분해를 사용하면 경고를 받지 않을 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;rOTAmO&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;V2Y4uj&quot;&gt;function createMenu(title: string, body: string, buttonText: string, cancellable: boolean) { // ... } createMenu('Foo', 'Bar', 'Baz', true);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;ZQM8is&quot;&gt;function createMenu(options: { title: string, body: string, buttonText: string, cancellable: boolean }) { // ... } createMenu({ title: 'Foo', body: 'Bar', buttonText: 'Baz', cancellable: true });&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases&quot;&gt;타입 앨리어스&lt;/a&gt;&lt;b&gt;를 사용해서 가독성을 더 높일 수 있습니다&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;DXLvxH&quot;&gt;type MenuOptions = { title: string, body: string, buttonText: string, cancellable: boolean }; function createMenu(options: MenuOptions) { // ... } createMenu({ title: 'Foo', body: 'Bar', buttonText: 'Baz', cancellable: true });&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;16RPvInT&quot; data-toc-id=&quot;16RPvInT&quot; data-block-id=&quot;RuAvpH&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수는 한 가지만 해야합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;qRa9mN&quot; data-ke-size=&quot;size16&quot;&gt;이것은 소프트웨어 공학에서 단연코 가장 중요한 규칙입니다. 함수가 한 가지 이상의 역할을 수행할 때 작성하고 테스트하고 추론하기 어려워집니다. 함수를 하나의 행동으로 정의할 수 있을 때, 쉽게 리팩토링할 수 있으며 코드를 더욱 명료하게 읽을 수 있습니다. 이 가이드에서 이 부분만 자기것으로 만들어도 당신은 많은 개발자보다 앞설 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;TRp7zJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;gjMKUn&quot;&gt;function emailClients(clients: Client[]) { clients.forEach((client) =&amp;gt; { const clientRecord = database.lookup(client); if (clientRecord.isActive()) { email(client); } }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;xC2lxM&quot;&gt;function emailClients(clients: Client[]) { clients.filter(isActiveClient).forEach(email); } function isActiveClient(client: Client) { const clientRecord = database.lookup(client); return clientRecord.isActive(); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;HalG3NlU&quot; data-toc-id=&quot;HalG3NlU&quot; data-block-id=&quot;WVyL2z&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수가 무엇을 하는지 알 수 있도록 함수 이름을 지으세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hY0NYZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;mzrZlD&quot;&gt;function addToDate(date: Date, month: number): Date { // ... } const date = new Date(); // 무엇이 추가되는지 함수 이름만으로 유추하기 어렵습니다 addToDate(date, 1);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;gjmCz9&quot;&gt;function addMonthToDate(date: Date, month: number): Date { // ... } const date = new Date(); addMonthToDate(date, 1);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;8WDEdAwQ&quot; data-toc-id=&quot;8WDEdAwQ&quot; data-block-id=&quot;Fja6G2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수는 단일 행동을 추상화해야 합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;hRwxEz&quot; data-ke-size=&quot;size16&quot;&gt;함수가 한 가지 이상을 추상화한다면 그 함수는 너무 많은 일을 하게 됩니다. 재사용성과 쉬운 테스트를 위해서 함수를 쪼개세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RPEHJf&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;8CCa7w&quot;&gt;function parseCode(code: string) { const REGEXES = [ /* ... */ ]; const statements = code.split(' '); const tokens = []; REGEXES.forEach((regex) =&amp;gt; { statements.forEach((statement) =&amp;gt; { // ... }); }); const ast = []; tokens.forEach((token) =&amp;gt; { // lex... }); ast.forEach((node) =&amp;gt; { // parse... }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;V5pDtS&quot;&gt;const REGEXES = [ /* ... */ ]; function parseCode(code: string) { const tokens = tokenize(code); const syntaxTree = parse(tokens); syntaxTree.forEach((node) =&amp;gt; { // parse... }); } function tokenize(code: string): Token[] { const statements = code.split(' '); const tokens: Token[] = []; REGEXES.forEach((regex) =&amp;gt; { statements.forEach((statement) =&amp;gt; { tokens.push( /* ... */ ); }); }); return tokens; } function parse(tokens: Token[]): SyntaxTree { const syntaxTree: SyntaxTree[] = []; tokens.forEach((token) =&amp;gt; { syntaxTree.push( /* ... */ ); }); return syntaxTree; }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;U3ZPIZKH&quot; data-toc-id=&quot;U3ZPIZKH&quot; data-block-id=&quot;KIaBmQ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;중복된 코드를 제거해주세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;X7o5HF&quot; data-ke-size=&quot;size16&quot;&gt;코드가 중복되지 않도록 최선을 다하세요. 중복된 코드는 어떤 로직을 변경할 때 한 곳 이상을 변경해야 하기 때문에 좋지 않습니다.&lt;br /&gt;당신이 레스토랑을 운영하면서 재고를 추적한다고 상상해보세요: 모든 토마토, 양파, 마늘, 양념 등. 관리하는 목록이 여러개일 때 토마토를 넣은 요리를 제공할 때마다 모든 목록을 수정해야 합니다. 관리하는 목록이 단 하나일 때는 한 곳만 수정하면 됩니다!&lt;br /&gt;당신은 종종 두 개 이상의 사소한 차이점이 존재한다고 생각해서 거의 비슷한 코드를 중복 작성합니다. 하지만 그 몇가지 다른 것으로 인해 같은 역할을 하는 두 개 이상의 함수를 만들게 됩니다. 중복된 코드를 제거하는 것은 조금씩 다른 역할을 하는 것을 묶음으로써 하나의 함수/모듈/클래스로 처리하는 추상화를 만드는 것을 의미합니다.&lt;br /&gt;추상화를 올바르게 하는 것은 중요하며, 이것은 &lt;a href=&quot;https://github.com/738/clean-code-typescript#solid&quot;&gt;SOLID&lt;/a&gt; 원칙을 따르는 이유이기도 합니다. 올바르지 않은 추상화는 중복된 코드보다 나쁘므로 주의하세요! 좋은 추상화를 할 수 있다면 그렇게 하라는 말입니다! 반복하지 마세요. 그렇지 않으면 하나를 변경할 때마다 여러 곳을 변경하게 될 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;XCZKGu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;JSm8Hy&quot;&gt;function showDeveloperList(developers: Developer[]) { developers.forEach((developer) =&amp;gt; { const expectedSalary = developer.calculateExpectedSalary(); const experience = developer.getExperience(); const githubLink = developer.getGithubLink(); const data = { expectedSalary, experience, githubLink }; render(data); }); } function showManagerList(managers: Manager[]) { managers.forEach((manager) =&amp;gt; { const expectedSalary = manager.calculateExpectedSalary(); const experience = manager.getExperience(); const portfolio = manager.getMBAProjects(); const data = { expectedSalary, experience, portfolio }; render(data); }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;BcR0xT&quot;&gt;class Developer { // ... getExtraDetails() { return { githubLink: this.githubLink, } } } class Manager { // ... getExtraDetails() { return { portfolio: this.portfolio, } } } function showEmployeeList(employee: Developer | Manager) { employee.forEach((employee) =&amp;gt; { const expectedSalary = employee.calculateExpectedSalary(); const experience = employee.getExperience(); const extra = employee.getExtraDetails(); const data = { expectedSalary, experience, extra, }; render(data); }); }&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;5z88kD&quot; data-ke-size=&quot;size16&quot;&gt;당신은 중복된 코드에 대해서 비판적으로 생각해야 합니다. 가끔은 중복된 코드와 불필요한 추상화로 인한 복잡성 간의 맞바꿈이 있을 수 있습니다. 서로 다른 두 개의 모듈의 구현이 유사해 보이지만 서로 다른 도메인에 존재하는 경우, 코드 중복은 공통된 코드에서 추출해서 중복을 줄이는 것보다 나은 선택일 수 있습니다. 이 경우에 추출된 공통의 코드는 두 모듈 사이에서 간접적인 의존성이 나타나게 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;KJbmVqQh&quot; data-toc-id=&quot;KJbmVqQh&quot; data-block-id=&quot;ZEgzJj&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Object.assign&lt;/b&gt;&lt;b&gt; 혹은 구조 분해를 사용해서 기본 객체를 만드세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MHaxa-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;WlQnLa&quot;&gt;type MenuConfig = { title?: string, body?: string, buttonText?: string, cancellable?: boolean }; function createMenu(config: MenuConfig) { config.title = config.title || 'Foo'; config.body = config.body || 'Bar'; config.buttonText = config.buttonText || 'Baz'; config.cancellable = config.cancellable !== undefined ? config.cancellable : true; // ... } createMenu({ body: 'Bar' });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;AHMU7R&quot;&gt;type MenuConfig = { title?: string, body?: string, buttonText?: string, cancellable?: boolean }; function createMenu(config: MenuConfig) { const menuConfig = Object.assign({ title: 'Foo', body: 'Bar', buttonText: 'Baz', cancellable: true }, config); // ... } createMenu({ body: 'Bar' });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대안으로, 기본 값을 구조 분해를 사용해서 해결할 수 있습니다&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;qml88F&quot;&gt;type MenuConfig = { title?: string, body?: string, buttonText?: string, cancellable?: boolean }; function createMenu({ title = 'Foo', body = 'Bar', buttonText = 'Baz', cancellable = true }: MenuConfig) { // ... } createMenu({ body: 'Bar' });&lt;/li&gt;
&lt;li&gt;사이드 이펙트와 undefined 혹은 null 값을 명시적으로 넘기는 예상치 못한 행동을 피하기 위해서 타입스크립트 컴파일러에게 그것을 허락하지 않도록 설정할 수 있습니다. 타입스크립트에서 &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#--strictnullchecks&quot;&gt;--strictNullChecks&lt;/a&gt; 옵션을 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3dppaJFA&quot; data-toc-id=&quot;3dppaJFA&quot; data-block-id=&quot;ypdY4C&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사이드 이펙트를 피하세요 (파트 1)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;TWVEzK&quot; data-ke-size=&quot;size16&quot;&gt;함수는 값을 가져와서 다른 값을 반환하는 것 이외에 다른 것을 할 경우 사이드 이펙트를 발생시킬 수 있습니다. 사이드 이펙트는 파일을 쓴다거나, 전역 변수를 조작한다거나, 뜻하지 않게 낯선 사람에게 당신의 전재산을 송금할 수 있습니다.&lt;br /&gt;당신은 가끔 프로그램에서 사이드 이펙트를 가질 필요가 있습니다. 이전의 사례에서와 같이 당신은 파일을 써야할 때가 있습니다. 당신이 하고 싶은 것은 이것을 중앙화하는 것입니다. 특정 파일을 쓰기 위해 몇 개의 함수와 클래스를 만들지 마세요. 그것을 행하는 서비스를 단 하나만 만드세요.&lt;br /&gt;중요한 것은 어떠한 구조도 없이 객체 사이에 상태를 공유하거나 어떤 것에 의해서든지 변경될 수 있는 데이터 타입을 사용하거나 사이드 이펙트가 일어나는 곳을 중앙화 하지 않는 것과 같은 위험 요소를 피하는 것입니다. 만약 그렇게 할 수 있다면, 당신은 대부분의 다른 프로그래머들보다 더욱 행복할 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KXcpQ7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;elFxkv&quot;&gt;// 아래의 함수에서 참조하는 전역 변수입니다. let name = 'Robert C. Martin'; function toBase64() { name = btoa(name); } toBase64(); // 이 이름을 사용하는 다른 함수가 있다면, 그것은 Base64 값을 반환할 것입니다 console.log(name); // 'Robert C. Martin'이 출력되는 것을 예상했지만 'Um9iZXJ0IEMuIE1hcnRpbg=='가 출력됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;zRJlNh&quot;&gt;const name = 'Robert C. Martin'; function toBase64(text: string): string { return btoa(text); } const encodedName = toBase64(name); console.log(name);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tqVhZoJJ&quot; data-toc-id=&quot;tqVhZoJJ&quot; data-block-id=&quot;iz-_i2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사이드 이펙트를 피하세요 (파트 2)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;lRyPFD&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 원시값은 값에 의해 전달되고 객체/배열은 참조에 의해 전달됩니다. 예를 들어, 객체와 배열의 경우 어떤 함수가 쇼핑 장바구니 배열을 변경하는 기능을 가지고 있다면, 구매하려는 아이템이 추가됨으로써 cart 배열을 사용하는 다른 함수는 이 추가의 영향을 받을 수 있습니다. 이것은 장점이 될 수도 있지만 단점이 될 수도 있습니다. 최악의 상황을 상상해보겠습니다:&lt;br /&gt;사용자는 네트워크 요청을 생성하고 서버에 cart 배열을 전송하는 purchase 함수를 호출하는 '구매' 버튼을 클릭합니다. 네트워크 연결 불량 때문에 purchase 함수는 요청을 재시도해야 합니다. 네트워크 요청이 시작되기 전에 사용자가 원하지 않은 아이템을 실수로 '장바구니에 추가하기' 버튼을 누르면 어떻게 될까요? 네트워크 요청이 시작되면, purchase 함수는 addItemToCart 함수가 변경한 쇼핑 장바구니 배열을 참조하고 있기 때문에 purchase 함수는 실수로 추가된 아이템을 보낼 것입니다.&lt;br /&gt;훌륭한 해법은 addItemToCart 함수에서 cart 배열을 복제하고 그것을 수정하고 그 복제한 값을 반환하는 것입니다. 이는 쇼핑 장바구니 배열을 참조하고 있는 값을 들고 있는 어떤 다른 함수도 다른 변경에 의해 영향을 받지 않는 것을 보장합니다.&lt;br /&gt;이 접근법에 대한 두 가지 주의사항:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;HgU_Aw&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실제로는 입력된 객체값을 변경하기를 원하는 경우가 있을 수 있습니다. 하지만 이러한 프로그래밍 관례를 선택할 때 당신은 이러한 경우가 매우 드물다는 것을 알게 될 것입니다. 대부분은 사이드 이펙트가 없도록 리팩토링될 수 있습니다! (&lt;a href=&quot;https://en.wikipedia.org/wiki/Pure_function&quot;&gt;Pure Function&lt;/a&gt;를 확인해주세요)&lt;/li&gt;
&lt;li&gt;큰 객체를 복제하는 것은 성능 관점에서 비용이 높을 수 있습니다. 다행히도 이러한 프로그래밍 접근법을 가능하게 해주는 훌륭한 라이브러리가 있기 때문에 큰 문제는 아닙니다. 이는 수동으로 객체와 배열을 복제해주는 것만큼 메모리 집약적이지 않게 해주고 빠르게 복제해줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;2VNjjJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;HbmwNC&quot;&gt;function addItemToCart(cart: CartItem[], item: Item): void { cart.push({ item, date: Date.now() }); };&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Z4S7jM&quot;&gt;function addItemToCart(cart: CartItem[], item: Item): CartItem[] { return [...cart, { item, date: Date.now() }]; };&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5eFybrJO&quot; data-toc-id=&quot;5eFybrJO&quot; data-block-id=&quot;YKYC0O&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;명령형 프로그래밍보다 함수형 프로그래밍을 지향하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;TiIHIe&quot; data-ke-size=&quot;size16&quot;&gt;가능하다면 이런 방식의 프로그래밍을 지향하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;DV1Or0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;DnJw1u&quot;&gt;const contributions = [ { name: 'Uncle Bobby', linesOfCode: 500 }, { name: 'Suzie Q', linesOfCode: 1500 }, { name: 'Jimmy Gosling', linesOfCode: 150 }, { name: 'Gracie Hopper', linesOfCode: 1000 } ]; let totalOutput = 0; for (let i = 0; i &amp;lt; contributions.length; i++) { totalOutput += contributions[i].linesOfCode; }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;QMTuxE&quot;&gt;const contributions = [ { name: 'Uncle Bobby', linesOfCode: 500 }, { name: 'Suzie Q', linesOfCode: 1500 }, { name: 'Jimmy Gosling', linesOfCode: 150 }, { name: 'Gracie Hopper', linesOfCode: 1000 } ]; const totalOutput = contributions .reduce((totalLines, output) =&amp;gt; totalLines + output.linesOfCode, 0);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Pk7C3pbP&quot; data-toc-id=&quot;Pk7C3pbP&quot; data-block-id=&quot;1ldBiG&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;조건문을 캡슐화하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BOoCZu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;ymuSn_&quot;&gt;if (subscription.isTrial || account.balance &amp;gt; 0) { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;wUkBil&quot;&gt;function canActivateService(subscription: Subscription, account: Account) { return subscription.isTrial || account.balance &amp;gt; 0; } if (canActivateService(subscription, account)) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vMpy8T-b&quot; data-toc-id=&quot;vMpy8T-b&quot; data-block-id=&quot;zrUTg6&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;부정 조건문을 피하세요&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BAe42L&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;z-FNqH&quot;&gt;function isEmailNotUsed(email: string): boolean { // ... } if (isEmailNotUsed(email)) { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;zHlI7V&quot;&gt;function isEmailUsed(email): boolean { // ... } if (!isEmailUsed(node)) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Vw8kwD10&quot; data-toc-id=&quot;Vw8kwD10&quot; data-block-id=&quot;hVIK_Y&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 체킹을 피하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;a_CzFl&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트는 자바스크립트의 엄격한 구문적 상위 집합이며 언어에 선택적인 정적 타입 검사 기능을 추가합니다. 타입스크립트의 기능을 최대한 활용하기 위해 항상 변수의 타입, 매개변수, 반환값의 타입을 지정하도록 하세요. 그렇게 하면 리팩토링이 매우 쉬워집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KrHz7m&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;l0U_PD&quot;&gt;function travelToTexas(vehicle: Bicycle | Car) { if (vehicle instanceof Bicycle) { vehicle.pedal(currentLocation, new Location('texas')); } else if (vehicle instanceof Car) { vehicle.drive(currentLocation, new Location('texas')); } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Wz-JBA&quot;&gt;type Vehicle = Bicycle | Car; function travelToTexas(vehicle: Vehicle) { vehicle.move(currentLocation, new Location('texas')); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;OfaRVOOP&quot; data-toc-id=&quot;OfaRVOOP&quot; data-block-id=&quot;jUk5b0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;필요 이상으로 최적화하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;sAQGJz&quot; data-ke-size=&quot;size16&quot;&gt;현대 브라우저는 런타임에서 많은 최적화를 수행합니다. 많은 시간을 최적화하는 데에 사용하고 있다면 시간 낭비입니다. 최적화가 부족한 부분을 확인할 수 있는 좋은 &lt;a href=&quot;https://github.com/petkaantonov/bluebird/wiki/Optimization-killers&quot;&gt;자료&lt;/a&gt;가 있습니다. 이것을 참조하여 최적화가 부족한 부분만 최적화해줄 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;1nx725&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;zJSN6_&quot;&gt;// 예전 브라우저에서는 캐시되지 않은 `list.length`를 사용한 각 순회는 비용이 많이 들 것입니다. // `list.length`의 재계산 때문입니다. 현대 브라우저에서는 이 부분이 최적화됩니다. for (let i = 0, len = list.length; i &amp;lt; len; i++) { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;3fjFqZ&quot;&gt;for (let i = 0; i &amp;lt; list.length; i++) { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3z_tbJnp&quot; data-toc-id=&quot;3z_tbJnp&quot; data-block-id=&quot;70h3AU&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;필요하지 않는 코드는 제거하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;jZ7Zdv&quot; data-ke-size=&quot;size16&quot;&gt;사용하지 않은 코드는 중복된 코드만큼 나쁩니다. 당신의 코드에서 이것을 유지할 이유는 없습니다. 호출되지 않은 코드가 있다면 제거하세요! 지운 코드를 다시 확인할 필요가 있다면 버전 기록에서 볼 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;YX4npt&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;smIfwC&quot;&gt;function oldRequestModule(url: string) { // ... } function requestModule(url: string) { // ... } const req = requestModule; inventoryTracker('apples', req, 'www.inventory-awesome.io');&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Z2920q&quot;&gt;function requestModule(url: string) { // ... } const req = requestModule; inventoryTracker('apples', req, 'www.inventory-awesome.io');&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;UZPnpivZ&quot; data-toc-id=&quot;UZPnpivZ&quot; data-block-id=&quot;ZV9XSx&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;iterator&lt;/b&gt;&lt;b&gt;와 &lt;/b&gt;&lt;b&gt;generator&lt;/b&gt;&lt;b&gt;를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;oDkpq3&quot; data-ke-size=&quot;size16&quot;&gt;스트림과 같이 사용되는 데이터 콜렉션을 사용할 때는 generator와 iterable을 사용하세요. 몇 가지의 좋은 이유가 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;z80AHk&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피호출자가 접근할 아이템 수를 결정한다는 의미에서 피호출자를 generator 구현으로부터 분리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;지연 실행, 아이템은 요구에 의해 스트림 처리될 수 있습니다.&lt;/li&gt;
&lt;li&gt;for-of 구문을 사용해 아이템을 순회하는 내장 지원이 있습니다.&lt;/li&gt;
&lt;li&gt;iterable은 최적화된 iterator 패턴을 구현할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;es3R2Z&quot;&gt;function fibonacci(n: number): number[] { if (n === 1) return [0]; if (n === 2) return [0, 1]; const items: number[] = [0, 1]; while (items.length &amp;lt; n) { items.push(items[items.length - 2] + items[items.length - 1]); } return items; } function print(n: number) { fibonacci(n).forEach(fib =&amp;gt; console.log(fib)); } // 피보나치 숫자의 첫 번째 10개 숫자를 출력합니다. print(10);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;jREhWh&quot;&gt;// 피보나치 숫자의 무한 스트림을 생성합니다. // `generator`는 모든 숫자의 배열을 유지하고 있지 않습니다. function* fibonacci(): IterableIterator&amp;lt;number&amp;gt; { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } function print(n: number) { let i = 0; for (const fib of fibonacci()) { if (i++ === n) break; console.log(fib); } } // 피보나치 숫자의 첫 번째 10개 숫자를 출력합니다. print(10);&lt;/li&gt;
&lt;li&gt;map, slice, forEach 등과 같은 메소드를 연결함으로써 네이티브 배열을 비슷한 방법으로 iterable로 작업할 수 있게 하는 라이브러리가 있습니다. iterable의 발전된 조작의 사례를 위해 &lt;a href=&quot;https://www.npmjs.com/package/itiriri&quot;&gt;itiriri&lt;/a&gt;를 확인해주세요. (또는 비동기 iterable의 조작을 위해서 &lt;a href=&quot;https://www.npmjs.com/package/itiriri-async&quot;&gt;itiriri-async&lt;/a&gt;를 확인해주세요.)&lt;/li&gt;
&lt;li data-block-id=&quot;7-hp9r&quot;&gt;import itiriri from 'itiriri'; function* fibonacci(): IterableIterator&amp;lt;number&amp;gt; { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } itiriri(fibonacci()) .take(10) .forEach(fib =&amp;gt; console.log(fib));&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;mITD8iC8&quot; data-toc-id=&quot;mITD8iC8&quot; data-block-id=&quot;oJMIsH&quot;&gt;&lt;br /&gt;객체와 자료구조&lt;/h1&gt;
&lt;h2 id=&quot;6DKWE-LV&quot; data-toc-id=&quot;6DKWE-LV&quot; data-block-id=&quot;P-y9Po&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 vs 인터페이스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;1AN33n&quot; data-ke-size=&quot;size16&quot;&gt;합집합 또는 교집합이 필요할 때 타입을 사용하세요. extends 또는 implements가 필요할 때 인터페이스를 사용하세요. 엄격한 규칙은 없지만 당신에게 맞는 방법을 사용하세요.&lt;br /&gt;타입스크립트에서 type과 interface 사이의 다른 점에 대해서 더 상세한 설명을 원한다면 이 &lt;a href=&quot;https://stackoverflow.com/questions/37233735/typescript-interfaces-vs-types/54101543#54101543&quot;&gt;답변&lt;/a&gt;을 참고하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;7tKUg2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;iRSmlF&quot;&gt;interface EmailConfig { // ... } interface DbConfig { // ... } interface Config { // ... } //... type Shape = { // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;JRkyKS&quot;&gt;type EmailConfig = { // ... } type DbConfig = { // ... } type Config = EmailConfig | DbConfig; // ... interface Shape { // ... } class Circle implements Shape { // ... } class Square implements Shape { // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;nVXvrYL9&quot; data-toc-id=&quot;nVXvrYL9&quot; data-block-id=&quot;j0UxgM&quot;&gt;&lt;br /&gt;클래스&lt;/h1&gt;
&lt;h2 id=&quot;9nPVNFa1&quot; data-toc-id=&quot;9nPVNFa1&quot; data-block-id=&quot;gBHlpz&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클래스는 작아야 합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;ZwP7cw&quot; data-ke-size=&quot;size16&quot;&gt;클래스의 크기는 책임에 의해 측정됩니다. 단일 책임 원칙에 따르면 클래스는 작아야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;EGvxii&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;1D4CFZ&quot;&gt;class Dashboard { getLanguage(): string { /* ... */ } setLanguage(language: string): void { /* ... */ } showProgress(): void { /* ... */ } hideProgress(): void { /* ... */ } isDirty(): boolean { /* ... */ } disable(): void { /* ... */ } enable(): void { /* ... */ } addSubscription(subscription: Subscription): void { /* ... */ } removeSubscription(subscription: Subscription): void { /* ... */ } addUser(user: User): void { /* ... */ } removeUser(user: User): void { /* ... */ } goToHomePage(): void { /* ... */ } updateProfile(details: UserDetails): void { /* ... */ } getVersion(): string { /* ... */ } // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;uM9AHG&quot;&gt;class Dashboard { disable(): void { /* ... */ } enable(): void { /* ... */ } getVersion(): string { /* ... */ } } // 다른 클래스에 남은 메소드를 이동시킴으로써 책임을 분산시키세요 // ...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;XilTej1z&quot; data-toc-id=&quot;XilTej1z&quot; data-block-id=&quot;a_g2x6&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;높은 응집도와 낮은 결합도&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;VhJKgY&quot; data-ke-size=&quot;size16&quot;&gt;응집도는 클래스 멤버가 서로에게 연관되어 있는 정도를 정의합니다. 이상적으로, 클래스 안의 모든 필드는 각 메소드에 의해 사용되어야 합니다. 그 때 우리는 클래스가 최대한으로 응집되어있다라고 말합니다. 이것은 항상 가능하지도 않고 권장하지 않습니다. 그러나 응집도를 높이는 것을 선호해야 합니다.&lt;br /&gt;결합도는 두 클래스가 얼마나 서로에게 관련되어있거나 종속적인 정도를 뜻합니다. 하나의 클래스의 변경이 다른 클래스에게 영향을 주지 않는다면 그 클래스들의 결합도는 낮다고 말합니다.&lt;br /&gt;좋은 소프트웨어 설계는 &lt;b&gt;높은 응집도&lt;/b&gt;와 &lt;b&gt;낮은 결합도&lt;/b&gt;를 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Uoad8p&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;YVyTO6&quot;&gt;class UserManager { // Bad: 각 private 변수는 메소드의 하나 혹은 또 다른 그룹에 의해 사용됩니다. // 클래스가 단일 책임 이상의 책임을 가지고 있다는 명백한 증거입니다. // 사용자의 트랜잭션을 얻기 위해 서비스를 생성하기만 하면 되는 경우, // 여전히 `emailSender` 인스턴스를 전달해야 합니다. constructor( private readonly db: Database, private readonly emailSender: EmailSender) { } async getUser(id: number): Promise&amp;lt;User&amp;gt; { return await db.users.findOne({ id }); } async getTransactions(userId: number): Promise&amp;lt;Transaction[]&amp;gt; { return await db.transactions.find({ userId }); } async sendGreeting(): Promise&amp;lt;void&amp;gt; { await emailSender.send('Welcome!'); } async sendNotification(text: string): Promise&amp;lt;void&amp;gt; { await emailSender.send(text); } async sendNewsletter(): Promise&amp;lt;void&amp;gt; { // ... } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;QzUMUk&quot;&gt;class UserService { constructor(private readonly db: Database) { } async getUser(id: number): Promise&amp;lt;User&amp;gt; { return await this.db.users.findOne({ id }); } async getTransactions(userId: number): Promise&amp;lt;Transaction[]&amp;gt; { return await this.db.transactions.find({ userId }); } } class UserNotifier { constructor(private readonly emailSender: EmailSender) { } async sendGreeting(): Promise&amp;lt;void&amp;gt; { await this.emailSender.send('Welcome!'); } async sendNotification(text: string): Promise&amp;lt;void&amp;gt; { await this.emailSender.send(text); } async sendNewsletter(): Promise&amp;lt;void&amp;gt; { // ... } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;AL4uKuQP&quot; data-toc-id=&quot;AL4uKuQP&quot; data-block-id=&quot;6EV2aW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상속(inheritance)보다 조합(composition)을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Z9pd7M&quot; data-ke-size=&quot;size16&quot;&gt;Gang of Four의 &lt;a href=&quot;https://en.wikipedia.org/wiki/Design_Patterns&quot;&gt;디자인 패턴&lt;/a&gt;에 나와있듯이 할 수 있는 대로 상속보다 조합을 사용해야 합니다. 상속과 조합을 사용해야 하는 좋은 이유들은 각각 많습니다. 이 교훈에서 중요한 점은 당신의 마음이 본능적으로 상속을 추구한다면, 조합이 당신의 문제를 더 좋게 해결할 수 있을지 고민해보라는 것입니다. 어떤 경우에는 더 좋을 수 있습니다.&lt;br /&gt;당신은 '언제 상속을 사용해야 할까요?' 라고 의문점을 가질 것입니다. 그것은 당면한 문제에 달려 있습니다. 조합보다 상속이 더 좋은 경우가 아래에 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;x3BXmT&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;'has-a' 관계가 아닌 'is-a' 관계일 때 (사람-&amp;gt;동물 vs 사용자-&amp;gt;사용자 정보)&lt;/li&gt;
&lt;li&gt;기반이 되는 클래스로부터 코드를 재사용할 수 있을 때 (사람은 모든 동물처럼 움직일 수 있습니다.)&lt;/li&gt;
&lt;li&gt;기반이 되는 클래스를 변경하여 파생된 클래스를 전체적으로 변경하려는 경우 (모든 동물은 움직일 때 칼로리가 소비됩니다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;w8KalW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;elv3HK&quot;&gt;class Employee { constructor( private readonly name: string, private readonly email: string) { } // ... } // `Employee`가 세금 데이터를 가지기 때문에 나쁜 에입니다. `EmployeeTaxData`는 `Employee`의 타입이 아닙니다. class EmployeeTaxData extends Employee { constructor( name: string, email: string, private readonly ssn: string, private readonly salary: number) { super(name, email); } // ... }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;3noAda&quot;&gt;class Employee { private taxData: EmployeeTaxData; constructor( private readonly name: string, private readonly email: string) { } setTaxData(ssn: string, salary: number): Employee { this.taxData = new EmployeeTaxData(ssn, salary); return this; } // ... } class EmployeeTaxData { constructor( public readonly ssn: string, public readonly salary: number) { } // ... }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;qfnr2bCo&quot; data-toc-id=&quot;qfnr2bCo&quot; data-block-id=&quot;_dG7E8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메소드 체이닝을 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;DV4r64&quot; data-ke-size=&quot;size16&quot;&gt;이 패턴은 매우 유용하고 많은 라이브러리에서 공통적으로 사용하고 있습니다. 이것은 당신의 코드를 표현력이 있게 해주고 덜 장황하게 해줍니다. 이러한 이유로 메소드 체이닝을 사용해서 당신의 코드가 얼마나 명료해지는지 살펴보시길 바랍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SP4n8D&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;U4ds1L&quot;&gt;class QueryBuilder { private collection: string; private pageNumber: number = 1; private itemsPerPage: number = 100; private orderByFields: string[] = []; from(collection: string): void { this.collection = collection; } page(number: number, itemsPerPage: number = 100): void { this.pageNumber = number; this.itemsPerPage = itemsPerPage; } orderBy(...fields: string[]): void { this.orderByFields = fields; } build(): Query { // ... } } // ... const queryBuilder = new QueryBuilder(); queryBuilder.from('users'); queryBuilder.page(1, 100); queryBuilder.orderBy('firstName', 'lastName'); const query = queryBuilder.build();&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;j-YCfL&quot;&gt;class QueryBuilder { private collection: string; private pageNumber: number = 1; private itemsPerPage: number = 100; private orderByFields: string[] = []; from(collection: string): this { this.collection = collection; return this; } page(number: number, itemsPerPage: number = 100): this { this.pageNumber = number; this.itemsPerPage = itemsPerPage; return this; } orderBy(...fields: string[]): this { this.orderByFields = fields; return this; } build(): Query { // ... } } // ... const query = new QueryBuilder() .from('users') .page(1, 100) .orderBy('firstName', 'lastName') .build();&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;qWfeUxcr&quot; data-toc-id=&quot;qWfeUxcr&quot; data-block-id=&quot;3yE1DP&quot;&gt;인터페이스 &amp;amp; 타입&lt;/h1&gt;
&lt;h2 id=&quot;xP5Lg9vY&quot; data-toc-id=&quot;xP5Lg9vY&quot; data-block-id=&quot;jRI5d0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터페이스 (&lt;/b&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;QrRuqa&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;br /&gt;I를 접두어로 사용하지 않습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oN9LBC&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전에는 인터페이스 변수 앞에&amp;nbsp;I를 붙이는 경우가 많았는데 현재는 비관습적인 이유로 사용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;zh_93J&quot;&gt;&lt;code&gt;// Bad
interface IFoo {
}

// Good
interface Foo {
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;IZLn-14O&quot; data-toc-id=&quot;IZLn-14O&quot; data-block-id=&quot;5olrBY&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 (&lt;/b&gt;&lt;b&gt;Type&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Di831s&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;br /&gt;멤버는&amp;nbsp;camelCase를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;elm&quot; data-block-id=&quot;P3VDKF&quot;&gt;&lt;code&gt;// Bad
type car {
  ModelInfo: string;
}

// Good
type Car {
  modelInfo: string;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dlZWiMj8&quot; data-toc-id=&quot;dlZWiMj8&quot; data-block-id=&quot;OkCgZE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Type&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;2KHE-c&quot; data-ke-size=&quot;size16&quot;&gt;Union&lt;b&gt;이나&amp;nbsp;&lt;/b&gt;&lt;b&gt;Intersection&lt;/b&gt;&lt;b&gt;이 필요할 때 Type을 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot; data-block-id=&quot;SoXTvG&quot;&gt;&lt;code&gt;type Foo = number | { someProperty: number }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;GZ-Gl8&quot; data-ke-size=&quot;size16&quot;&gt;extends&amp;nbsp;&lt;b&gt;또는&amp;nbsp;&lt;/b&gt;&lt;b&gt;implements&lt;/b&gt;&lt;b&gt;를 사용하고 싶을 때는&amp;nbsp;&lt;/b&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;b&gt;를 사용합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;V3iEH4&quot;&gt;&lt;code&gt;interface Foo {
  foo: string;
}

interface FooBar extends Foo {
  bar: string;
}

class X implements FooBar {
  foo: string;
  bar: string;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;Ae9oIRDE&quot; data-toc-id=&quot;Ae9oIRDE&quot; data-block-id=&quot;gH5OcK&quot;&gt;&lt;b&gt;네임스페이스 &amp;amp; ENUM&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;6J6rMCYc&quot; data-toc-id=&quot;6J6rMCYc&quot; data-block-id=&quot;vqySCT&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네임스페이스 (&lt;/b&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;rKzqXI&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hYsxtJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 팀에서 정한 약속입니다.&lt;/li&gt;
&lt;li&gt;네임스페이스들은 정적멤버를 갖는 클래스, 클래스 이름도&amp;nbsp;PascalCase를 사용하기 때문에 동일하게 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;il6naY&quot;&gt;&lt;code&gt;// Bad
namespace foo {
}

// Good
namespace Foo {
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;q0n40LvG&quot; data-toc-id=&quot;q0n40LvG&quot; data-block-id=&quot;vsx9VQ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Plbr_l&quot; data-ke-size=&quot;size16&quot;&gt;PascalCase를 사용합니다.&lt;br /&gt;enum의 멤버에는&amp;nbsp;PascalCase를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VooH1T&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 팀에서 정한 약속입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;protobuf&quot; data-block-id=&quot;daHyxB&quot;&gt;&lt;code&gt;// Bad
enum color {
  red
}

// Good
enum Color {
  Red
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;CwuPyc2i&quot; data-toc-id=&quot;CwuPyc2i&quot; data-block-id=&quot;GuJ98z&quot;&gt;명확하지 않은 변수 타입&lt;/h1&gt;
&lt;h2 id=&quot;nXnV3Tpg&quot; data-toc-id=&quot;nXnV3Tpg&quot; data-block-id=&quot;OyG_qy&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;any&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;unknown&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uarkyx&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;unknown&amp;nbsp;타입을 사용합니다.&lt;/li&gt;
&lt;li&gt;any,&amp;nbsp;unknown&amp;nbsp;타입 모두 아무때나 사용할 수 있지만&amp;nbsp;unknown&amp;nbsp;타입은 사용하는 쪽에서 방어처리를 해서 안전하게 사용이 가능합니다.&lt;/li&gt;
&lt;li&gt;any&amp;nbsp;타입은 타입스크립트를 쓰는 의미가 없게 되버릴 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gml&quot; data-block-id=&quot;B3erNp&quot;&gt;&lt;code&gt;const prettyPrint: string = (x: unknown) =&amp;gt; {
  if (Array.isArray(x)) {
    return '[' + x.map(prettyPrint).join(', ') + ']'
  }
  if (typeof x === 'string') {
    return `'${x}'`
  }
  if (typeof x === 'number') {
    return String(x)
  } 
  return 'etc.'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;KjjJW7&quot; data-ke-size=&quot;size16&quot;&gt;x를&amp;nbsp;any로 했을 경우&amp;nbsp;map(),&amp;nbsp;join()을 사용할 수 있는데&amp;nbsp;unknown일 때&amp;nbsp;x가 배열인 경우에만&amp;nbsp;map(),&amp;nbsp;join()을 사용할 수 있도록 강제해줍니다.&lt;/p&gt;
&lt;h2 id=&quot;cW2mQVQC&quot; data-toc-id=&quot;cW2mQVQC&quot; data-block-id=&quot;-9FFmw&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;undefined&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KY7IuD&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명백히 값이 없을 때에도 사용하지 않도록 합니다.&lt;/li&gt;
&lt;li&gt;타입스크립트에서&amp;nbsp;type으로 구조를 암시할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gml&quot; data-block-id=&quot;L3VxoV&quot;&gt;&lt;code&gt;// Bad
let foo = { x: 123, y: undefined }

// Good
let foo = { x: number, y?: number } = { x: 123 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;bUG5CY&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로&amp;nbsp;undefined를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;LABTdk&quot;&gt;&lt;code&gt;return undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;JF6Lhj&quot; data-ke-size=&quot;size16&quot;&gt;null이나&amp;nbsp;undefined&amp;nbsp;값을 갖는 객체는&amp;nbsp;truthy하게 검사합니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot; data-block-id=&quot;p3mPY8&quot;&gt;&lt;code&gt;// Bad
if (error === null)

// Good
if (error)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;ECLNVq&quot; data-ke-size=&quot;size16&quot;&gt;null이나&amp;nbsp;undefined를 체크할 때&amp;nbsp;===&amp;nbsp;혹은&amp;nbsp;!==를 사용하지 않고&amp;nbsp;==&amp;nbsp;혹은&amp;nbsp;!=를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;c38faC&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null이나&amp;nbsp;undefined에는 작동하지만 다른&amp;nbsp;fasly&amp;nbsp;값들 ('', 0,&amp;nbsp;false)에는 작동하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot; data-block-id=&quot;7CVtCe&quot;&gt;&lt;code&gt;// Bad
if (error !== null)

// Good
if (error != null)&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;STT6UR6l&quot; data-toc-id=&quot;STT6UR6l&quot; data-block-id=&quot;PeNb29&quot;&gt;SOLID&lt;/h1&gt;
&lt;h2 id=&quot;dn6-Czco&quot; data-toc-id=&quot;dn6-Czco&quot; data-block-id=&quot;e-8nWm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;단일 책임 원칙 (SRP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;KBu3Te&quot; data-ke-size=&quot;size16&quot;&gt;클린 코드에서 말하듯이, '클래스를 변경할 때는 단 한 가지 이유만 존재해야 합니다'. 여행갈 때 가방 하나에 많은 것을 챙기는 것과 같이, 클래스를 많은 기능으로 꽉 채우고 싶은 유혹이 있습니다. 이러한 문제는 당신의 클래스가 개념적으로 응집력이 있지 않으며 변경될 많은 이유가 존재한다는 것을 말합니다. 클래스를 변경하는 많은 시간을 줄이는 것은 중요합니다. 왜냐하면 너무 많은 기능이 한 클래스에 있고 그 안에서 하나의 기능을 수정한다면, 다른 종속된 모듈에 어떻게 영향을 줄지 이해하는 것이 어렵기 때문입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;u9y9I6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;D3f6tx&quot;&gt;class UserSettings { constructor(private readonly user: User) { } changeSettings(settings: UserSettings) { if (this.verifyCredentials()) { // ... } } verifyCredentials() { // ... } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;H0u_9v&quot;&gt;class UserAuth { constructor(private readonly user: User) { } verifyCredentials() { // ... } } class UserSettings { private readonly auth: UserAuth; constructor(private readonly user: User) { this.auth = new UserAuth(user); } changeSettings(settings: UserSettings) { if (this.auth.verifyCredentials()) { // ... } } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3u-ZPjUf&quot; data-toc-id=&quot;3u-ZPjUf&quot; data-block-id=&quot;-ZKbsO&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개방 폐쇄 원칙 (OCP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;PM1uHb&quot; data-ke-size=&quot;size16&quot;&gt;Bertrand Meyer가 말했듯이, '소프트웨어 엔터티(클래스, 모듈, 함수 등)는 상속에 개방되어 있습니다. 하지만 수정에는 폐쇄되어 있습니다.' 이것이 무엇을 의미할까요? 이 원칙은 기본적으로 기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 하는 것을 명시합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;XuCV6I&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;K90gvG&quot;&gt;class AjaxAdapter extends Adapter { constructor() { super(); } // ... } class NodeAdapter extends Adapter { constructor() { super(); } // ... } class HttpRequester { constructor(private readonly adapter: Adapter) { } async fetch&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { if (this.adapter instanceof AjaxAdapter) { const response = await makeAjaxCall&amp;lt;T&amp;gt;(url); // response 값을 변경하고 반환합니다. } else if (this.adapter instanceof NodeAdapter) { const response = await makeHttpCall&amp;lt;T&amp;gt;(url); // response 값을 변경하고 반환합니다. } } } function makeAjaxCall&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { // 서버에 요청하고 프로미스를 반환합니다. } function makeHttpCall&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { // 서버에 요청하고 프로미스를 반환합니다. }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;9fVSyO&quot;&gt;abstract class Adapter { abstract async request&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt;; // 하위 클래스와 공유하는 코드 ... } class AjaxAdapter extends Adapter { constructor() { super(); } async request&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt;{ // 서버에 요청하고 프로미스를 반환합니다. } // ... } class NodeAdapter extends Adapter { constructor() { super(); } async request&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt;{ // 서버에 요청하고 프로미스를 반환합니다. } // ... } class HttpRequester { constructor(private readonly adapter: Adapter) { } async fetch&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;T&amp;gt; { const response = await this.adapter.request&amp;lt;T&amp;gt;(url); // response 값을 변경하고 반환합니다. } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tBdH_xK2&quot; data-toc-id=&quot;tBdH_xK2&quot; data-block-id=&quot;C-6GA7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;리스코프 치환 원칙 (LSP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;0pePQw&quot; data-ke-size=&quot;size16&quot;&gt;매우 단순한 개념을 뜻하는 어려워보이는 용어입니다. '만약 S가 T의 하위 타입이라면, T 타입의 객체는 S 타입의 객체로 대체될 수 있습니다. (예: S 타입 객체는 T 타입 객체로 치환될 수도 있습니다.) 이는 프로그램이 갖추어야할 속성(정확성, 수행되는 작업 등)을 변경하지 않아도 대체될 수 있습니다.' 더욱 어려워보이는 정의입니다.&lt;br /&gt;이를 위한 최고의 설명은 다음과 같습니다. 만약 부모 클래스와 자식 클래스가 있다면, 부모 클래스와 자식 클래스는 잘못된 결과 없이 서로 교환하여 사용될 수 있습니다. 여전히 혼란스러울 수 있습니다. 고전적인 정사각형-직사각형 예제를 살펴보세요. 수학적으로, 정사각형은 직사각형입니다. 그러나 상속을 통해 'is-a' 관계로 설계한다면, 당신은 곤경에 빠질 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;c60V5C&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;KSbU1F&quot;&gt;class Rectangle { constructor( protected width: number = 0, protected height: number = 0) { } setColor(color: string): this { // ... } render(area: number) { // ... } setWidth(width: number): this { this.width = width; return this; } setHeight(height: number): this { this.height = height; return this; } getArea(): number { return this.width * this.height; } } class Square extends Rectangle { setWidth(width: number): this { this.width = width; this.height = width; return this; } setHeight(height: number): this { this.width = height; this.height = height; return this; } } function renderLargeRectangles(rectangles: Rectangle[]) { rectangles.forEach((rectangle) =&amp;gt; { const area = rectangle .setWidth(4) .setHeight(5) .getArea(); // BAD: `Square` 클래스에서는 25를 반환합니다. 20이 반환되어야 합니다. rectangle.render(area); }); } const rectangles = [new Rectangle(), new Rectangle(), new Square()]; renderLargeRectangles(rectangles);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;VqvO7h&quot;&gt;abstract class Shape { setColor(color: string): this { // ... } render(area: number) { // ... } abstract getArea(): number; } class Rectangle extends Shape { constructor( private readonly width = 0, private readonly height = 0) { super(); } getArea(): number { return this.width * this.height; } } class Square extends Shape { constructor(private readonly length: number) { super(); } getArea(): number { return this.length * this.length; } } function renderLargeShapes(shapes: Shape[]) { shapes.forEach((shape) =&amp;gt; { const area = shape.getArea(); shape.render(area); }); } const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)]; renderLargeShapes(shapes);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;6xd6UTEm&quot; data-toc-id=&quot;6xd6UTEm&quot; data-block-id=&quot;2dmxqJ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터페이스 분리 원칙 (ISP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;dUn-5q&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스 분리 원칙은 '클라이언트는 사용하지 않는 인터페이스에 의존하지 않는다' 라는 것입니다. 이 원칙은 단일 책임 원칙과 많은 관련이 있습니다. 이 말의 뜻은 클라이언트가 노출된 메소드를 사용하는 대신에 전체 파이를 얻지 않는 방식으로 추상화를 설계해야 한다는 것입니다. 그것은 또한 클라이언트에게 클라이언트가 실제로 필요하지 않은 메소드의 구현을 강요하는 것도 포함합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5bnMvv&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;lDj02q&quot;&gt;interface SmartPrinter { print(); fax(); scan(); } class AllInOnePrinter implements SmartPrinter { print() { // ... } fax() { // ... } scan() { // ... } } class EconomicPrinter implements SmartPrinter { print() { // ... } fax() { throw new Error('Fax not supported.'); } scan() { throw new Error('Scan not supported.'); } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;asS-ol&quot;&gt;interface Printer { print(); } interface Fax { fax(); } interface Scanner { scan(); } class AllInOnePrinter implements Printer, Fax, Scanner { print() { // ... } fax() { // ... } scan() { // ... } } class EconomicPrinter implements Printer { print() { // ... } }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hSsfqciT&quot; data-toc-id=&quot;hSsfqciT&quot; data-block-id=&quot;EW3fer&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의존성 역전 원칙 (DIP)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;ULNYmI&quot; data-ke-size=&quot;size16&quot;&gt;이 원칙은 두 가지 필수적인 사항을 명시합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;a7-Mc0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상위 레벨의 모듈은 하위 레벨의 모듈에 의존하지 않아야 합니다. 두 모듈은 모두 추상화에 의존해야합니다.&lt;/li&gt;
&lt;li&gt;추상화는 세부사항에 의존하지 않아야 합니다. 세부사항은 추상화에 의존해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-block-id=&quot;OuvnBg&quot; data-ke-size=&quot;size16&quot;&gt;처음에 바로 이해하기는 어려울 수 있습니다. Angular를 사용해봤다면, 의존성 주입(DI)의 형태 안에서 이 원칙의 구현을 확인해봤을 것입니다. 동일한 개념은 아니지만, DIP는 상위 레벨의 모듈이 하위 레벨의 모듈의 세부사항에 접근하고 설정하지 못하도록 지킵니다. DI를 통해서도 마찬가지로 성취할 수 있습니다. 이것의 큰 장점은 모듈 사이의 결합도를 줄일 수 있다는 것입니다. 결합도는 코드를 리팩토링하기 어렵게 하기 때문에 매우 나쁜 개발 패턴입니다.&lt;br /&gt;DIP는 주로 IoC 컨테이너를 사용함으로써 달성됩니다. 타입스크립트를 위한 강력한 IoC 컨테이너의 예제는 &lt;a href=&quot;https://www.npmjs.com/package/inversify&quot;&gt;InversifyJs&lt;/a&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ZViXuT&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;b23Fr7&quot;&gt;import { readFile as readFileCb } from 'fs'; import { promisify } from 'util'; const readFile = promisify(readFileCb); type ReportData = { // .. } class XmlFormatter { parse&amp;lt;T&amp;gt;(content: string): T { // XML 문자열을 T 객체로 변환 } } class ReportReader { // BAD: 특정 요청의 구현에 의존하는 것을 만들었습니다. // `parse` 메소드에 의존하는 `ReportReader`를 만들어야 합니다. private readonly formatter = new XmlFormatter(); async read(path: string): Promise&amp;lt;ReportData&amp;gt; { const text = await readFile(path, 'UTF8'); return this.formatter.parse&amp;lt;ReportData&amp;gt;(text); } } // ... const reader = new ReportReader(); await report = await reader.read('report.xml');&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;6WfOj_&quot;&gt;import { readFile as readFileCb } from 'fs'; import { promisify } from 'util'; const readFile = promisify(readFileCb); type ReportData = { // .. } interface Formatter { parse&amp;lt;T&amp;gt;(content: string): T; } class XmlFormatter implements Formatter { parse&amp;lt;T&amp;gt;(content: string): T { // XML 문자열을 T 객체로 변환 } } class JsonFormatter implements Formatter { parse&amp;lt;T&amp;gt;(content: string): T { // JSON 문자열을 T 객체로 변환 } } class ReportReader { constructor(private readonly formatter: Formatter) { } async read(path: string): Promise&amp;lt;ReportData&amp;gt; { const text = await readFile(path, 'UTF8'); return this.formatter.parse&amp;lt;ReportData&amp;gt;(text); } } // ... const reader = new ReportReader(new XmlFormatter()); await report = await reader.read('report.xml'); // 또는 json 보고서가 필요한 경우 const reader = new ReportReader(new JsonFormatter()); await report = await reader.read('report.json');&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;Upe64Grr&quot; data-toc-id=&quot;Upe64Grr&quot; data-block-id=&quot;sbuUJ0&quot;&gt;&lt;br /&gt;TEST&lt;/h1&gt;
&lt;h2 id=&quot;4GgWEMYs&quot; data-toc-id=&quot;4GgWEMYs&quot; data-block-id=&quot;7OBdWp&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Ghqxao&quot; data-ke-size=&quot;size16&quot;&gt;테스트는 배포보다 중요합니다. 테스트가 없거나 부족한 경우, 코드를 배포할 때마다 당신은 어떤 것이 작동하지 않을지 확실하지 않을 것입니다. 적절한 양의 테스트를 구성하는 것은 당신의 팀에게 달려있지만, (모든 문장과 브랜치에서) 100%의 커버리지를 가진다면 매우 높은 자신감과 마음의 평화를 얻을 것입니다. 이는 훌륭한 테스트 프레임워크뿐만 아니라, 좋은 &lt;a href=&quot;https://github.com/gotwarlost/istanbul&quot;&gt;커버리지 도구&lt;/a&gt;를 사용해야 한다는 것을 의미합니다.&lt;br /&gt;테스트를 작성하지 않을 이유는 없습니다. 타입스크립트의 타입을 지원하는 &lt;a href=&quot;http://jstherightway.org/#testing-tools&quot;&gt;많은 양의 좋은 자바스크립트 테스트 프레임워크&lt;/a&gt;가 있으므로 당신의 팀이 선호하는 것을 찾아 사용하세요. 당신의 팀에 적합한 테스트 프레임워크를 찾았다면, 당신이 만드는 모든 새로운 기능/모듈을 위한 테스트를 항상 작성하는 것을 목표로 하세요. 테스트 기반 개발(TDD)이 당신이 선호하는 방법이라면, 매우 좋습니다. 하지만 중요한 건 어떤 기능을 만들거나 기존의 것을 리팩토링하기 전에 목표하는 커버리지를 달성하는 것입니다.&lt;/p&gt;
&lt;h2 id=&quot;Hjo7vsxb&quot; data-toc-id=&quot;Hjo7vsxb&quot; data-block-id=&quot;V7120u&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TDD의 세 가지 법칙&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;py-LUS&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실패하는 단위 테스트를 작성하기 전에는 실제 코드를 작성하지 마세요.&lt;/li&gt;
&lt;li&gt;컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성하세요.&lt;/li&gt;
&lt;li&gt;실패하는 단위 테스트를 통과할 정도로만 실제 코드를 작성하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;Em3xV9S0&quot; data-toc-id=&quot;Em3xV9S0&quot; data-block-id=&quot;muvEm2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;F.I.R.S.T 규칙&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;K79ETV&quot; data-ke-size=&quot;size16&quot;&gt;명료한 테스트는 다음 규칙을 따라야 합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;E8PBZm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Fast&lt;/b&gt; 테스트는 빈번하게 실행되므로 빨라야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Independent&lt;/b&gt; 테스트는 서로 종속적이지 않습니다. 독립적으로 실행하든지 순서 상관없이 모두 실행하든지 동일한 결과가 나와야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Repeatable&lt;/b&gt; 테스트는 어떤 환경에서든 반복될 수 있습니다. 테스트가 실패하는데에 이유가 없어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Self-Validating&lt;/b&gt; 테스트는 통과 혹은 실패로 답해야 합니다. 테스트가 통과되었다면 로그 파일을 보며 비교할 필요는 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Timely&lt;/b&gt; 단위 테스트는 실제 코드를 작성하기 전에 작성해야 합니다. 실제 코드를 작성한 후에 테스트를 작성한다면, 테스트를 작성하는 것이 너무 고단하게 느껴질 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;qwjUDMzP&quot; data-toc-id=&quot;qwjUDMzP&quot; data-block-id=&quot;EmfxiI&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테스트 하나에 하나의 개념을 작성하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;sZadf_&quot; data-ke-size=&quot;size16&quot;&gt;또한, 테스트는 단일 책임 원칙을 따라야 합니다. 단위 테스트 하나당 하나의 assert 구문을 작성하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;KA_rh8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;3Y3gLY&quot;&gt;import { assert } from 'chai'; describe('AwesomeDate', () =&amp;gt; { it('handles date boundaries', () =&amp;gt; { let date: AwesomeDate; date = new AwesomeDate('1/1/2015'); assert.equal('1/31/2015', date.addDays(30)); date = new AwesomeDate('2/1/2016'); assert.equal('2/29/2016', date.addDays(28)); date = new AwesomeDate('2/1/2015'); assert.equal('3/1/2015', date.addDays(28)); }); });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;cogI3u&quot;&gt;import { assert } from 'chai'; describe('AwesomeDate', () =&amp;gt; { it('handles 30-day months', () =&amp;gt; { const date = new AwesomeDate('1/1/2015'); assert.equal('1/31/2015', date.addDays(30)); }); it('handles leap year', () =&amp;gt; { const date = new AwesomeDate('2/1/2016'); assert.equal('2/29/2016', date.addDays(28)); }); it('handles non-leap year', () =&amp;gt; { const date = new AwesomeDate('2/1/2015'); assert.equal('3/1/2015', date.addDays(28)); }); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;c8In7FuG&quot; data-toc-id=&quot;c8In7FuG&quot; data-block-id=&quot;edvtef&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테스트의 이름은 테스트의 의도가 드러나야 합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;tir1pd&quot; data-ke-size=&quot;size16&quot;&gt;테스트가 실패할 때, 테스트의 이름은 어떤 것이 잘못되었는지 볼 수 있는 첫 번째 표시입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;C-slFM&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;xqL_g5&quot;&gt;describe('Calendar', () =&amp;gt; { it('2/29/2020', () =&amp;gt; { // ... }); it('throws', () =&amp;gt; { // ... }); });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;Tes196&quot;&gt;describe('Calendar', () =&amp;gt; { it('should handle leap year', () =&amp;gt; { // ... }); it('should throw when format is invalid', () =&amp;gt; { // ... }); });&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;7mwp8oo-&quot; data-toc-id=&quot;7mwp8oo-&quot; data-block-id=&quot;SIHmFK&quot;&gt;&lt;br /&gt;동시성&lt;/h1&gt;
&lt;h2 id=&quot;ovAMhO1j&quot; data-toc-id=&quot;ovAMhO1j&quot; data-block-id=&quot;pYuN1l&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로미스 vs 콜백&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;TYJNKY&quot; data-ke-size=&quot;size16&quot;&gt;콜백은 명료하지 않고, 지나친 양의 중첩된 콜백 지옥을 유발할 수 있습니다.&lt;br /&gt;콜백 방식을 사용하고 있는 기존의 함수를 프로미스를 반환하는 함수로 변환시켜주는 유틸리티 라이브러리가 있습니다. (Node.js를 사용한다면 &lt;a href=&quot;https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original&quot;&gt;util.promisify&lt;/a&gt;를 확인해주세요. 일반적인 목적이라면 &lt;a href=&quot;https://www.npmjs.com/package/pify&quot;&gt;pify&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/es6-promisify&quot;&gt;es6-promisify&lt;/a&gt;를 확인해주세요.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MEyTO8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;SOhx-_&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; function downloadPage(url: string, saveTo: string, callback: (error: Error, content?: string) =&amp;gt; void) { get(url, (error, response) =&amp;gt; { if (error) { callback(error); } else { writeFile(saveTo, response.body, (error) =&amp;gt; { if (error) { callback(error); } else { callback(null, response.body); } }); } }); } downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html', (error, content) =&amp;gt; { if (error) { console.error(error); } else { console.log(content); } });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;JUg_9D&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; import { promisify } from 'util'; const write = promisify(writeFile); function downloadPage(url: string, saveTo: string): Promise { return get(url) .then(response =&amp;gt; write(saveTo, response)); } downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html') .then(content =&amp;gt; console.log(content)) .catch(error =&amp;gt; console.error(error));&lt;/li&gt;
&lt;li&gt;프로미스는 코드를 더욱 간결하게 해주는 몇몇의 헬퍼 메소드를 지원합니다:패턴설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;ZoFcmR&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.resolve(value)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;해결(resolve)된 프로미스로 값을 변환함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.reject(error)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;거부(reject)된 프로미스로 에러를 변환함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.all(promises)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;전달된 모든 프로미스가 이행한 값의 배열을 이행하는 새 프로미스 객체를 반환하거나 거부된 첫 번째 프로미스의 이유로 거부함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Promise.race(promises)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;전달된 프로미스의 배열에서 가장 먼저 완료된 결과/에러로 이행/거부된 새 프로미스 객체를 반환함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
Promise.all는 병렬적으로 작업을 수행할 필요가 있을 때 유용합니다. Promise.race는 프로미스를 위한 타임아웃과 같은 것을 구현하는 것을 쉽게 할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dLwPPsKJ&quot; data-toc-id=&quot;dLwPPsKJ&quot; data-block-id=&quot;0eofgk&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로미스보다 &lt;/b&gt;&lt;b&gt;async&lt;/b&gt;&lt;b&gt;/&lt;/b&gt;&lt;b&gt;await&lt;/b&gt;&lt;b&gt;가 더 명료합니다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;UbD70s&quot; data-ke-size=&quot;size16&quot;&gt;async/await 구문을 사용하면 연결된 프로미스 구문보다 훨씬 더 명료하고 이해하기 쉬운 코드를 작성할 수 있습니다. async키워드가 앞에 붙여진 함수는 await 키워드에서 코드의 실행을 멈춘다는 것을 자바스크립트 런타임에게 알려줍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;kPg88P&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;lBvNO-&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; import { promisify } from 'util'; const write = util.promisify(writeFile); function downloadPage(url: string, saveTo: string): Promise { return get(url).then(response =&amp;gt; write(saveTo, response)); } downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html') .then(content =&amp;gt; console.log(content)) .catch(error =&amp;gt; console.error(error));&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;9Oup1-&quot;&gt;import { get } from 'request'; import { writeFile } from 'fs'; import { promisify } from 'util'; const write = promisify(writeFile); async function downloadPage(url: string, saveTo: string): Promise { const response = await get(url); await write(saveTo, response); return response; } // somewhere in an async function try { const content = await downloadPage('&lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&quot;&gt;https://en.wikipedia.org/wiki/Robert_Cecil_Martin',&lt;/a&gt; 'article.html'); console.log(content); } catch (error) { console.error(error); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;ELuxpg_x&quot; data-toc-id=&quot;ELuxpg_x&quot; data-block-id=&quot;CHxMtd&quot;&gt;&lt;br /&gt;에러처리&lt;/h1&gt;
&lt;h2 id=&quot;EAwbfOc4&quot; data-toc-id=&quot;EAwbfOc4&quot; data-block-id=&quot;efFz7d&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;WFlCAi&quot; data-ke-size=&quot;size16&quot;&gt;에러를 던지는 것은 좋은 것입니다! 에러를 던진다는 것은 런타임이 당신의 프로그램에서 뭔가 잘못되었을 때 식별하고 현재 스택에서 함수 실행을 멈추고, (노드에서) 프로세스를 종료하며, 스택 트레이스를 콘솔에 보여줌으로써 당신에게 해당 에러를 알려주는 것을 의미합니다.&lt;/p&gt;
&lt;h2 id=&quot;s33MT67I&quot; data-toc-id=&quot;s33MT67I&quot; data-block-id=&quot;d3jySZ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;catch&lt;/b&gt;&lt;b&gt; 절에서 에러 처리 부분을 비워두지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;F9O3eL&quot; data-ke-size=&quot;size16&quot;&gt;catch 절에서 단지 에러를 받는 것만으로는 해당 에러에 대응할 수 없습니다. 또한, 콘솔에 에러를 기록하는 것(console.log)은 콘솔에 출력된 많은 것들 사이에서 발견되지 못할 수 있기 때문에 그다지 좋은 선택은 아닙니다. 당신이 어떤 코드를 try/catch로 감쌌다면, 그 코드에서 에러가 일어날 수 있으며, 즉 에러가 발생했을 때에 대한 계획이나 장치가 있어야 한다는 것을 의미합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;1n40M4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;eFmWh1&quot;&gt;try { functionThatMightThrow(); } catch (error) { console.log(error); } // 아래 예제는 훨씬 나쁩니다. try { functionThatMightThrow(); } catch (error) { // 에러를 무시 }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;ez5JH6&quot;&gt;import { logger } from './logging' try { functionThatMightThrow(); } catch (error) { logger.log(error); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;d2wpb5RO&quot; data-toc-id=&quot;d2wpb5RO&quot; data-block-id=&quot;T6b3Nr&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요청이 거부된 프로미스 객체를 무시하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;jSJxl5&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 try/catch 절에서 받은 에러 처리 부분을 비워두면 안됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;G8EtV3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;tfuqBl&quot;&gt;getUser() .then((user: User) =&amp;gt; { return sendEmail(user.email, 'Welcome!'); }) .catch((error) =&amp;gt; { console.log(error); });&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;X72MKm&quot;&gt;import { logger } from './logging' getUser() .then((user: User) =&amp;gt; { return sendEmail(user.email, 'Welcome!'); }) .catch((error) =&amp;gt; { logger.log(error); }); // 또는 async/await 구문을 사용할 수 있습니다: try { const user = await getUser(); await sendEmail(user.email, 'Welcome!'); } catch (error) { logger.log(error); }&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;uFh7cIWV&quot; data-toc-id=&quot;uFh7cIWV&quot; data-block-id=&quot;Rnt2Zj&quot;&gt;&lt;br /&gt;서식&lt;/h1&gt;
&lt;h2 id=&quot;RAEzVDiG&quot; data-toc-id=&quot;RAEzVDiG&quot; data-block-id=&quot;auRycR&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;m3gQDi&quot; data-ke-size=&quot;size16&quot;&gt;서식은 주관적입니다. 여기에 있는 많은 규칙들과 같이 당신이 따르기 어려운 규칙은 없습니다. 중요한 점은 서식에 대해서 논쟁하지 않는 것입니다. 서식을 자동화하기 위한 도구들이 매우 많습니다. 그 중 하나를 사용하세요! 서식에 대해 논쟁하는 것은 엔지니어에게 시간과 돈 낭비일 뿐입니다. 따라야하는 일반적인 규칙은 일관적인 서식 규칙을 지켜야하는 것입니다.&lt;br /&gt;&lt;a href=&quot;https://palantir.github.io/tslint/&quot;&gt;TSLint&lt;/a&gt;라고 불리는 타입스크립트를 위한 강력한 도구가 있습니다. 이것은 코드의 가독성과 유지보수성을 극적으로 개선시키도록 도와주는 정적 분석 도구입니다. 프로젝트에 참고할 수 있는 TSLint 설정을 사용할 준비가 되었습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;iELpGl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-standard&quot;&gt;TSLint Config Standard&lt;/a&gt; - 표준 스타일 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-airbnb&quot;&gt;TSLint Config Airbnb&lt;/a&gt; - 에어비엔비 스타일 가이드&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-clean-code&quot;&gt;TSLint Clean Code&lt;/a&gt; - &lt;a href=&quot;https://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882&quot;&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt;에 영감 받은 TSLint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-react&quot;&gt;TSLint react&lt;/a&gt; - React &amp;amp; JSX와 관련된 lint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-prettier&quot;&gt;TSLint + Prettier&lt;/a&gt; - &lt;a href=&quot;https://github.com/prettier/prettier&quot;&gt;Prettier&lt;/a&gt; 코드 포맷터를 위한 lint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-eslint-rules&quot;&gt;ESLint rules for TSLint&lt;/a&gt; - 타입스크립트를 위한 ESLint 규칙&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-immutable&quot;&gt;Immutable&lt;/a&gt; - 타입스크립트에서 변경을 허락하지 않는 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;n2QcPZ&quot; data-ke-size=&quot;size16&quot;&gt;또한, 훌륭한 자료인 &lt;a href=&quot;https://basarat.gitbook.io/typescript/styleguide&quot;&gt;타입스크립트 스타일 가이드와 코딩 컨벤션&lt;/a&gt;을 참고해주세요.&lt;/p&gt;
&lt;blockquote data-block-id=&quot;cfztys&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-block-id=&quot;kS4BLe&quot; data-ke-size=&quot;size16&quot;&gt;TSLint는 deprecated되었습니다. &lt;a href=&quot;https://github.com/palantir/tslint/issues/4534&quot;&gt;Roadmap: TSLint -&amp;gt; ESLint&lt;/a&gt; 이슈를 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;a2EtVjP7&quot; data-toc-id=&quot;a2EtVjP7&quot; data-block-id=&quot;kD-aeJ&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;일관적으로 대소문자를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;nCIbao&quot; data-ke-size=&quot;size16&quot;&gt;대소문자를 구분하여 작성하는 것은 당신에게 변수, 함수 등에 대해서 많은 것을 알려줍니다. 이 규칙은 주관적이어서, 당신의 팀이 원하는 것을 선택해야 합니다. 중요한 점은 어떤 걸 선택하였든지 간에 일관적이어야 한다는 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;og-kXm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;lsFhdY&quot;&gt;const DAYS_IN_WEEK = 7; const daysInMonth = 30; const songs = ['Back In Black', 'Stairway to Heaven', 'Hey Jude']; const Artists = ['ACDC', 'Led Zeppelin', 'The Beatles']; function eraseDatabase() {} function restore_database() {} type animal = { /* ... */ } type Container = { /* ... */ }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;zMNwVh&quot;&gt;const DAYS_IN_WEEK = 7; const DAYS_IN_MONTH = 30; const SONGS = ['Back In Black', 'Stairway to Heaven', 'Hey Jude']; const ARTISTS = ['ACDC', 'Led Zeppelin', 'The Beatles']; function eraseDatabase() {} function restoreDatabase() {} type Animal = { /* ... */ } type Container = { /* ... */ }&lt;/li&gt;
&lt;li&gt;클래스, 인터페이스, 타입 그리고 네임스페이스 이름에는 PascalCase를 사용하세요.&lt;/li&gt;
&lt;li&gt;변수, 함수 그리고 클래스 멤버 이름에는 camelCase를 사용하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bxgDFlJA&quot; data-toc-id=&quot;bxgDFlJA&quot; data-block-id=&quot;pOXzn0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;import 구문을 특정 순서대로 정리하세요(ESLint)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;yHUIxV&quot; data-ke-size=&quot;size16&quot;&gt;import 구문을 읽기 쉽고 명료하게 하면 당신은 현재 코드의 의존성을 빠르게 확인할 수 있습니다. 다음과 같은 import 구문 정리를 위한 좋은 방법들을 적용해보세요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;V0IpmO&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import 구문은 알파벳 순서대로 배열하고 그룹화해야 합니다.&lt;/li&gt;
&lt;li&gt;사용하지 않은 import 구문은 제거되어야 합니다.&lt;/li&gt;
&lt;li&gt;이름이 있는 import 구문은 알파벳 순서대로 배열해야 합니다. (예: import {A, B, C} from 'foo';)&lt;/li&gt;
&lt;li&gt;import 하는 소스코드는 그룹 내에서 알파벳 순서대로 배열해야 합니다. (예: import as foo from 'a'; import as bar from 'b';)&lt;/li&gt;
&lt;li&gt;import 구문의 그룹은 빈 줄로 구분되어야 합니다.&lt;/li&gt;
&lt;li&gt;그룹은 다음 순서를 준수해야 합니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5EXuGa&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폴리필 (예: import 'reflect-metadata';)&lt;/li&gt;
&lt;li&gt;Node 내장 모듈 (예: import fs from 'fs';)&lt;/li&gt;
&lt;li&gt;외부 모듈 (예: import { query } from 'itiriri';)&lt;/li&gt;
&lt;li&gt;내부 모듈 (예: import { UserService } from 'src/services/userService';)&lt;/li&gt;
&lt;li&gt;상위 디렉토리에서 불러오는 모듈 (예: import foo from '../foo'; import qux from '../../foo/qux';)&lt;/li&gt;
&lt;li&gt;동일한 계층의 디렉토리에서 불러오는 모듈 (예: import bar from './bar'; import baz from './bar/baz';)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;wbvfu1&quot;&gt;import { TypeDefinition } from '../types/typeDefinition'; import { AttributeTypes } from '../model/attribute'; import { ApiCredentials, Adapters } from './common/api/authorization'; import fs from 'fs'; import { ConfigPlugin } from './plugins/config/configPlugin'; import { BindingScopeEnum, Container } from 'inversify'; import 'reflect-metadata';&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;I-g45C&quot;&gt;import 'reflect-metadata'; import fs from 'fs'; import { BindingScopeEnum, Container } from 'inversify'; import { AttributeTypes } from '../model/attribute'; import { TypeDefinition } from '../types/typeDefinition'; import { ApiCredentials, Adapters } from './common/api/authorization'; import { ConfigPlugin } from './plugins/config/configPlugin';&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;eqeRA48P&quot; data-toc-id=&quot;eqeRA48P&quot; data-block-id=&quot;9RPc4Z&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입스크립트 앨리어스를 사용하세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;6_zoU9&quot; data-ke-size=&quot;size16&quot;&gt;tsconfig.json의 compilerOptions 섹션 안에서 paths와 baseUrl 속성을 정의해 더 보기 좋은 import 구문을 작성해주세요.&lt;br /&gt;이 방법은 import 구문을 사용할 때 긴 상대경로를 작성하는 것을 피하게 도와줄 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VpMUHg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;5yaT4_&quot;&gt;import { UserService } from '../../../services/UserService';&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;
&lt;pre class=&quot;prolog&quot; data-block-id=&quot;XbbL7l&quot;&gt;&lt;code&gt;// tsconfig.json
...
  'compilerOptions': {
    ...
    'baseUrl': 'src',
    'paths': {
      '@services': ['services/*']
    }
    ...
  }
...&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-block-id=&quot;W3onGd&quot;&gt;import { UserService } from '@services/UserService';&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;Qg_uZnaA&quot; data-toc-id=&quot;Qg_uZnaA&quot; data-block-id=&quot;ImvIcH&quot;&gt;&lt;br /&gt;주석&lt;/h1&gt;
&lt;h2 id=&quot;9homR6O3&quot; data-toc-id=&quot;9homR6O3&quot; data-block-id=&quot;Aa-kk0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;당신의 코드를 주석 처리하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;Z8Gq0q&quot; data-ke-size=&quot;size16&quot;&gt;버전 관리 시스템이 존재하는 이유입니다. 사용하지 않는 코드는 기록에 남기세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5QjA2r&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;qb6NF-&quot;&gt;type User = { name: string; email: string; // age: number; // jobPosition: string; }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;PB6E32&quot;&gt;type User = { name: string; email: string; }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;6ibiMcek&quot; data-toc-id=&quot;6ibiMcek&quot; data-block-id=&quot;O5if0F&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;일기 같은 주석을 달지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;DbkKPF&quot; data-ke-size=&quot;size16&quot;&gt;버전 관리 시스템을 사용하세요! 죽은 코드, 주석 처리된 코드, 특히 일기 같은 주석은 필요 없습니다. 대신에 기록을 보기 위해 git log 명령어를 사용하세요!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;6NbJIW&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;V9HdDt&quot;&gt;/** * 2016-12-20: 이해하지 못해서 모나드를 제거함 (RM) * 2016-10-01: 특별한 모나드를 사용해 개선함 (JP) * 2016-02-03: 타입 체킹 추가함 (LI) * 2015-03-14: combine 함수를 구현함 (JR) */ function combine(a: number, b: number): number { return a + b; }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;yWSF5c&quot;&gt;function combine(a: number, b: number): number { return a + b; }&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;NfpVUfXN&quot; data-toc-id=&quot;NfpVUfXN&quot; data-block-id=&quot;iOFxWF&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드의 위치를 설명하는 주석을 사용하지 마세요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;hD-k7z&quot; data-ke-size=&quot;size16&quot;&gt;이건 보통 코드를 어지럽히기만 합니다. 함수와 변수 이름을 적절한 들여쓰기와 서식으로 당신의 코드에 시각적인 구조가 보이도록 하세요.&lt;br /&gt;대부분의 IDE(통합 개발 환경)에서는 코드 블록을 접기/펼치기 할 수 있는 기능을 지원합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dS1glu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;UCQBRY&quot;&gt;//////////////////////////////////////////////////////////////////////////////// // Client 클래스 //////////////////////////////////////////////////////////////////////////////// class Client { id: number; name: string; address: Address; contact: Contact; //////////////////////////////////////////////////////////////////////////////// // public 메소드 //////////////////////////////////////////////////////////////////////////////// public describe(): string { // ... } //////////////////////////////////////////////////////////////////////////////// // private 메소드 //////////////////////////////////////////////////////////////////////////////// private describeAddress(): string { // ... } private describeContact(): string { // ... } };&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;wfySui&quot;&gt;class Client { id: number; name: string; address: Address; contact: Contact; public describe(): string { // ... } private describeAddress(): string { // ... } private describeContact(): string { // ... } };&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;peQGOhZg&quot; data-toc-id=&quot;peQGOhZg&quot; data-block-id=&quot;gZKWR1&quot;&gt;&lt;b&gt;TODO 주석&lt;/b&gt;&lt;/h1&gt;
&lt;p data-block-id=&quot;3nuwFT&quot; data-ke-size=&quot;size16&quot;&gt;추후에 개선을 위해 코드에 메모를 남겨야할 때, // TODO 주석을 사용하세요. 대부분의 IDE는 이런 종류의 주석을 특별하게 지원하기 때문에 해야할 일 목록을 빠르게 검토할 수 있습니다.&lt;br /&gt;하지만 TODO 주석이 나쁜 코드를 작성할 이유는 아니라는 것을 명심하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hgfC3n&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bad&lt;/li&gt;
&lt;li data-block-id=&quot;5y2YdR&quot;&gt;function getActiveSubscriptions(): Promise&amp;lt;Subscription[]&amp;gt; { // ensure `dueDate` is indexed. return db.subscriptions.find({ dueDate: { $lte: new Date() } }); }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good&lt;/b&gt;&lt;/li&gt;
&lt;li data-block-id=&quot;19uWxL&quot;&gt;function getActiveSubscriptions(): Promise&amp;lt;Subscription[]&amp;gt; { // TODO: ensure `dueDate` is indexed. return db.subscriptions.find({ dueDate: { $lte: new Date() } }); }&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-block-id=&quot;0Zsp3M&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;iKRYetZg&quot; data-toc-id=&quot;iKRYetZg&quot; data-block-id=&quot;CpZfVZ&quot;&gt;참고&lt;/h1&gt;
&lt;p data-block-id=&quot;EVj3Ax&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/tsguide.html&quot;&gt;https://google.github.io/styleguide/tsguide.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;loivRh&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/tsguide.html#source-file-basics&quot;&gt;https://google.github.io/styleguide/tsguide.html#source-file-basics&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;KFG97r&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://paullabworkspace.notion.site/8a6058561b924c0c95eb3933e480b367&quot;&gt;https://paullabworkspace.notion.site/8a6058561b924c0c95eb3933e480b367&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;e9hLNX&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://radlohead.gitbook.io/typescript-deep-dive/styleguide&quot;&gt;https://radlohead.gitbook.io/typescript-deep-dive/styleguide&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;Pyjc5B&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://techblog.woowahan.com/9804/&quot;&gt;https://techblog.woowahan.com/9804/&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;hJA7To&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://738.github.io/clean-code-typescript/&quot;&gt;https://738.github.io/clean-code-typescript/&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;hqhWot&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/tipjs/javascript-style-guide&quot;&gt;https://github.com/tipjs/javascript-style-guide&lt;/a&gt;&lt;/p&gt;
&lt;p data-block-id=&quot;H10iAB&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@cada/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%BD%94%EB%94%A9-%EB%B0%8F-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%BB%A8%EB%B2%A4%EC%85%98-1%ED%8E%B8&quot;&gt;https://velog.io/@cada/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%BD%94%EB%94%A9-%EB%B0%8F-%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%BB%A8%EB%B2%A4%EC%85%98-1%ED%8E%B8&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/425</guid>
      <comments>https://gregorio78.tistory.com/425#entry425comment</comments>
      <pubDate>Wed, 28 Jan 2026 10:11:53 +0900</pubDate>
    </item>
    <item>
      <title>JAVA Coding Conventions</title>
      <link>https://gregorio78.tistory.com/424</link>
      <description>&lt;h1 id=&quot;2NfEiRft&quot; data-pm-slice=&quot;1 3 []&quot; data-toc-id=&quot;2NfEiRft&quot; data-block-id=&quot;a9rbQa&quot;&gt;&lt;b&gt;1. 코드 표준&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;v7Vy8wj0&quot; data-toc-id=&quot;v7Vy8wj0&quot; data-block-id=&quot;lMgOoe&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1&amp;nbsp;코드&amp;nbsp;표준의&amp;nbsp;필요성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;qlDfvx&quot; data-ke-size=&quot;size16&quot;&gt;프로그램의&amp;nbsp;코드&amp;nbsp;표준은&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;이유로&amp;nbsp;프로그래밍에&amp;nbsp;있어서&amp;nbsp;중요성을&amp;nbsp;지닌다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BzEygG&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어의&amp;nbsp;생명주기에&amp;nbsp;있어서&amp;nbsp;비용의&amp;nbsp;80%&amp;nbsp;이상이&amp;nbsp;관리에&amp;nbsp;소요된다.&lt;/li&gt;
&lt;li&gt;코드&amp;nbsp;표준은&amp;nbsp;소프트웨어의&amp;nbsp;가독성(Readablity)을&amp;nbsp;높여&amp;nbsp;주며&amp;nbsp;개발자로&amp;nbsp;하여금&amp;nbsp;새로운&amp;nbsp;코드를&amp;nbsp;보다&amp;nbsp;빠르고&amp;nbsp;완벽하게&amp;nbsp;이해하도록&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;제품으로서&amp;nbsp;소스&amp;nbsp;코드를&amp;nbsp;납품해야&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;다른&amp;nbsp;제품과&amp;nbsp;마찬가지로&amp;nbsp;코드를&amp;nbsp;잘&amp;nbsp;정리하고&amp;nbsp;깔끔하게&amp;nbsp;해야&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;재&amp;nbsp;작업으로&amp;nbsp;발생하는&amp;nbsp;오류를&amp;nbsp;예방&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;li&gt;이를&amp;nbsp;위해&amp;nbsp;표준이&amp;nbsp;잘&amp;nbsp;적용되도록&amp;nbsp;하기&amp;nbsp;위해서는&amp;nbsp;&lt;b&gt;소프트웨어&amp;nbsp;작성자&amp;nbsp;모두가&amp;nbsp;코딩&amp;nbsp;표준을&amp;nbsp;반드시&amp;nbsp;준수&lt;/b&gt;해야&amp;nbsp;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;F0Mn186R&quot; data-toc-id=&quot;F0Mn186R&quot; data-block-id=&quot;PSclHE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2&amp;nbsp;코드&amp;nbsp;표준이&amp;nbsp;적용될&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;경우&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;O9Oha-&quot; data-ke-size=&quot;size16&quot;&gt;표준&amp;nbsp;적용에&amp;nbsp;예외가&amp;nbsp;발생하는&amp;nbsp;경우에는&amp;nbsp;표준을&amp;nbsp;저해하는&amp;nbsp;잠재적인&amp;nbsp;가능성&amp;nbsp;및&amp;nbsp;표준이&amp;nbsp;적용되기&amp;nbsp;이전에&amp;nbsp;발생한&amp;nbsp;어떤&amp;nbsp;조건이나&amp;nbsp;상황&amp;nbsp;및&amp;nbsp;대처방식을&amp;nbsp;문서화&amp;nbsp;해&amp;nbsp;놓으면,&amp;nbsp;다른&amp;nbsp;사람으로&amp;nbsp;하여금&amp;nbsp;표준을&amp;nbsp;지키지&amp;nbsp;않은&amp;nbsp;코드를&amp;nbsp;이해하는데&amp;nbsp;편리성을&amp;nbsp;제공하며&amp;nbsp;코드&amp;nbsp;표준을&amp;nbsp;보다&amp;nbsp;견실히&amp;nbsp;하는데&amp;nbsp;도움이&amp;nbsp;된다.&lt;/p&gt;
&lt;h1 id=&quot;RR9ymUIR&quot; data-toc-id=&quot;RR9ymUIR&quot; data-block-id=&quot;Nmy2H4&quot;&gt;&lt;b&gt;2. 명명 규칙(Naming Rule)&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;YXsx1x5J&quot; data-toc-id=&quot;YXsx1x5J&quot; data-block-id=&quot;bFCFYc&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1&amp;nbsp;일반&amp;nbsp;사항&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;OxR3Wr&quot; data-ke-size=&quot;size16&quot;&gt;언어 간의 혼란을 피하고 통합을 보장하려면 약어 사용과 관련된 다음 규칙을 따라야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;CrLjoJ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업무 영역에 적합하게 정의된 용어를 사용한다.&lt;/li&gt;
&lt;li&gt;같은 유형에 명명할 때, 비슷한 명칭이나 대소문자만 다른 명칭 사용을 금지한다.&lt;/li&gt;
&lt;li&gt;자주 사용되는 JDK의 Package와 중복되지 않도록 한다. 또한 JDK 및 각 언어에서 사용하는 키워드와 중복되지 않아야 한다.&lt;/li&gt;
&lt;li&gt;약어 또는 축약어를 식별자 이름의 일부로 사용하지 않습니다. 예를 들어, getWin 대신 getWindow를 사용합니다.&lt;/li&gt;
&lt;li&gt;컴퓨팅 분야에서 일반적으로 받아 들여지지 않는 Prefix는 사용을 금지한다.&lt;/li&gt;
&lt;li&gt;적절한 경우에는 길이가 긴 구 이름 대신 잘 알려진 머리 글자어를 사용한다. 예를 들어, User Interface 대신 UI를 사용하고 On-line Analytical Processing 대신 OLAP를 사용합니다.&lt;/li&gt;
&lt;li&gt;명칭(Class, Method 등)의 길이는 31자 이내로 한다.&lt;/li&gt;
&lt;li&gt;동일한 변수명과 함수명을 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;명칭은 &amp;ldquo;_&amp;rdquo; 이외의 특수 문자를 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;중괄호는 시작 문장의 마지막 열에 삽입, 닫는 중괄호는 새로운 시작열에 삽입한다.(if문, else-if문, else문, for문, while문, do-while문, switch문, try-catch문)&lt;/li&gt;
&lt;li&gt;하나의 문장이 여러 줄로 작성될 경우 아래와 같은 규칙에 의해 행을 나눈다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;sQIW_N&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;80자 초과 시, 쉼표 다음 문자부터 새로운 행을 시작한다.&lt;/li&gt;
&lt;li&gt;이전 행과 동일한 수준의 표현식과 열을 맞춘다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot; data-block-id=&quot;NCiWIY&quot;&gt;&lt;code&gt;int result = getEmployees(recordsFromEmployeeTable, readCount,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recordsToEmployeeTable, writeCount);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;3IQLA6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열을 선언하는 경우 반드시 요소 수를 명시적으로 선언하거나 초기화에 의해 묵시적으로 결정되도록 한다.&lt;/li&gt;
&lt;li&gt;지역 변수는 선언과 동시에 초기화 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;2VL0Se&quot;&gt;&lt;code&gt;int&amp;nbsp;result&amp;nbsp;=&amp;nbsp;0;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;4HEJ3g&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 리터럴을 직접적으로 소스코드 안에 삽입하지 않는다.&lt;/li&gt;
&lt;li&gt;단항 연산자는 피연산자와 붙여 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;actionscript&quot; data-block-id=&quot;EYD1hf&quot;&gt;&lt;code&gt;var++;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;16BKeX&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.(dot) 연산자를 제외한 모든 이항 연산자 전후는 공백으로 구분한다.&lt;/li&gt;
&lt;li&gt;조건부 연산자에서 &amp;ldquo;?&amp;rdquo; 연산자 앞에 이항 연산식이 나타날 경우 괄호로 구분한다.&lt;/li&gt;
&lt;li&gt;증감 연산자는 수식에서 다릉 연산자와 결합하여 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;3개 이상의 연산자를 사용하는 경우 괄호로 연산의 우선순위를 표현한다.&lt;/li&gt;
&lt;li&gt;Switch-case 문에서는 반드시 default 문을 작성하고 마지막 항목에 위치한다.&lt;/li&gt;
&lt;li&gt;For 문을 제어하는 수식에 실수 값을 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;반복문 내부에서 반복중단을 위한 break 문은 가능한 한번만 사용하도록 한다.&lt;/li&gt;
&lt;li&gt;if ~ else if 문은 반드시 else 문으로 끝나도록 한다.&lt;/li&gt;
&lt;li&gt;문자열 변수는 null로 초기화 하지 않는다.&lt;/li&gt;
&lt;li&gt;문자열 비교 시 ==를 사용 하지 말고 equals()를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;G59VI1&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;if (&amp;ldquo;COMPANY_NAME&amp;rdquo;.equals(companyName)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;// some code
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;dx4XwQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 맴버변수를 public으로 선언하지 않는다.&lt;/li&gt;
&lt;li&gt;패키즈를 import 할 때 &amp;ldquo;*&amp;rdquo;를 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;광범위한 예외 클래스인 Exception을 사용하여 예외처리 하지 않는다.&lt;/li&gt;
&lt;li&gt;예외를 처리할 때, 민감한 정보를 외부에 노출하지 않는다.&lt;/li&gt;
&lt;li&gt;널리 알려진 축약형을 사용할 때 첫 문자만 대문자를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot; data-block-id=&quot;UpY2zq&quot;&gt;&lt;code&gt;loadXmlDocument()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;F5xShK&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비슷한 이름은 사용을 배제한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;cjQQlF&quot;&gt;&lt;code&gt;Object&amp;nbsp;persistentObject;
Object&amp;nbsp;persistentObjects;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tEGAZaD4&quot; data-toc-id=&quot;tEGAZaD4&quot; data-block-id=&quot;Uudnfp&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2&amp;nbsp;대문자&amp;nbsp;표시&amp;nbsp;스타일&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;-PvzpY&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;대문자&amp;nbsp;표시&amp;nbsp;스타일&amp;nbsp;규칙은&amp;nbsp;다음&amp;nbsp;세가지를&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;h3 id=&quot;-gghXuzd&quot; data-toc-id=&quot;-gghXuzd&quot; data-block-id=&quot;TxMsFk&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.1&amp;nbsp;Pascal&amp;nbsp;Case&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;0wkQK_&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자와&amp;nbsp;연결된&amp;nbsp;각&amp;nbsp;후속&amp;nbsp;단어의&amp;nbsp;첫번째&amp;nbsp;문자를&amp;nbsp;대문자로&amp;nbsp;표시&amp;nbsp;합니다.&amp;nbsp;세개&amp;nbsp;이상의&amp;nbsp;문자로&amp;nbsp;구성된&amp;nbsp;식별자에&amp;nbsp;파스칼식을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;_r9CeO&quot;&gt;&lt;code&gt;String&amp;nbsp;BackColor;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;lF1bRNah&quot; data-toc-id=&quot;lF1bRNah&quot; data-block-id=&quot;OeEqXw&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.2&amp;nbsp;Camel&amp;nbsp;Case&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;Npn4Wp&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자는&amp;nbsp;소문자로&amp;nbsp;표시하고&amp;nbsp;연결된&amp;nbsp;각&amp;nbsp;후속&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자는&amp;nbsp;대문자로&amp;nbsp;표시합니다.&lt;/p&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;6KSdn8&quot;&gt;&lt;code&gt;String&amp;nbsp;backColor;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;gwaAmK0q&quot; data-toc-id=&quot;gwaAmK0q&quot; data-block-id=&quot;rjdVRo&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2.3&amp;nbsp;모두&amp;nbsp;대문자&amp;nbsp;표시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;ziRWvb&quot; data-ke-size=&quot;size16&quot;&gt;식별자의&amp;nbsp;모든&amp;nbsp;문자를&amp;nbsp;대문자로&amp;nbsp;표시합니다.&amp;nbsp;이&amp;nbsp;규칙은&amp;nbsp;두개&amp;nbsp;이하의&amp;nbsp;문자로&amp;nbsp;구성된&amp;nbsp;식별자에만&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; data-block-id=&quot;9CiIC5&quot;&gt;&lt;code&gt;OLAP
LDAP&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;7y24sT&quot; data-ke-size=&quot;size16&quot;&gt;열거형&amp;nbsp;및&amp;nbsp;상수&amp;nbsp;값에&amp;nbsp;모두&amp;nbsp;대문자로&amp;nbsp;표시된&amp;nbsp;문자가&amp;nbsp;자주&amp;nbsp;사용되는&amp;nbsp;기존의&amp;nbsp;관리되지&amp;nbsp;않는&amp;nbsp;기호&amp;nbsp;스키마와의&amp;nbsp;호환성을&amp;nbsp;유지하기&amp;nbsp;위해&amp;nbsp;식별자를&amp;nbsp;대문자로&amp;nbsp;표시해야&amp;nbsp;하는&amp;nbsp;경우도&amp;nbsp;있습니다.&lt;br /&gt;일반적으로&amp;nbsp;이러한&amp;nbsp;기호는&amp;nbsp;해당&amp;nbsp;기호를&amp;nbsp;사용하는&amp;nbsp;어셈블리&amp;nbsp;외부에서는&amp;nbsp;표시될&amp;nbsp;수&amp;nbsp;없습니다.&lt;br /&gt;다음&amp;nbsp;표에서는&amp;nbsp;대문자&amp;nbsp;표시&amp;nbsp;규칙에&amp;nbsp;대해&amp;nbsp;간단히&amp;nbsp;설명하고&amp;nbsp;여러&amp;nbsp;형식의&amp;nbsp;식별자에&amp;nbsp;대한&amp;nbsp;예를&amp;nbsp;보여&amp;nbsp;줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;식별자&lt;/b&gt;&lt;b&gt;대문자 표시 규칙&lt;/b&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;minHs3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;클래스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;AppDomain&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;열거형 형식&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;ErrorLevel&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;열거형 값&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;FatalError&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;이벤트&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;ValueChange&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;읽기 전용 정적 필드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Pascal&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;RedValue&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;매서스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;toString&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;패키지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://java.io&quot;&gt;java.io&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;매개변수&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;typeName&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;GET/SET&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Camel&amp;nbsp;Case&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;getBackColor/setBackColor&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;kMt06LaP&quot; data-toc-id=&quot;kMt06LaP&quot; data-block-id=&quot;53OEy1&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.3&amp;nbsp;Package&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;slshTj&quot; data-ke-size=&quot;size16&quot;&gt;Java에서는&amp;nbsp;클래스를&amp;nbsp;논리적으로&amp;nbsp;그룹화하기&amp;nbsp;위해&amp;nbsp;계층화된&amp;nbsp;Package를&amp;nbsp;통해&amp;nbsp;분류한다.&lt;br /&gt;그러므로,&amp;nbsp;사전에&amp;nbsp;체계적으로&amp;nbsp;패키지를&amp;nbsp;잘&amp;nbsp;정의해&amp;nbsp;두는&amp;nbsp;것이&amp;nbsp;필수적이다.&lt;br /&gt;Package의&amp;nbsp;이름을&amp;nbsp;지정하기&amp;nbsp;위한&amp;nbsp;일반적인&amp;nbsp;규칙은&amp;nbsp;&lt;b&gt;국가.조직분류.회사&lt;/b&gt;&amp;nbsp;이름&amp;nbsp;다음에&amp;nbsp;기술&amp;nbsp;이름과&amp;nbsp;선택적&amp;nbsp;요소로&amp;nbsp;기능&amp;nbsp;및&amp;nbsp;디자인을&amp;nbsp;차례로&amp;nbsp;사용하는&amp;nbsp;것이다.&lt;br /&gt;예를&amp;nbsp;들면&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;&lt;b&gt;국가.조직분류.회사명.기술-제품명.하위제품명-모듈&lt;/b&gt;&amp;nbsp;등을&amp;nbsp;마침표(.)를&amp;nbsp;통해&amp;nbsp;구분한다.&amp;nbsp;이때,&amp;nbsp;각&amp;nbsp;이름은&amp;nbsp;캐멀식을&amp;nbsp;사용해야&amp;nbsp;한다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;JB95rb&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;kr.co.company.[feature-technology Name].[module]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;yy2gx5&quot; data-ke-size=&quot;size16&quot;&gt;본&amp;nbsp;표준에서는&amp;nbsp;업무용&amp;nbsp;시스템에&amp;nbsp;맞게&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;Package&amp;nbsp;구조를&amp;nbsp;따르기를&amp;nbsp;권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수준&lt;/b&gt;&lt;b&gt;내용&lt;/b&gt;&lt;b&gt;고정값 / 예제&lt;/b&gt;&lt;b&gt;생략&amp;nbsp;가능&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;R9aTYj&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;국가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;kr, en 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;조직분류&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;com, co, go 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;회사&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;회사명&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;어플리케이션/시스템명&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;제품명, 프로젝트명 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모듈&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모듈명 등&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;zAevg5ro&quot; data-toc-id=&quot;zAevg5ro&quot; data-block-id=&quot;khQ79n&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.4&amp;nbsp;Class&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;LgfPSB&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;클래스&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;AdEfdc&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 이름에는 명사 또는 명사구를 사용합니다.&lt;/li&gt;
&lt;li&gt;파스칼식 대문자 표시 스타일을 사용합니다.&lt;/li&gt;
&lt;li&gt;Java의 naming rule에 따라 Class의 이름은 명사를 사용하고, 첫 문자는 대문자로 시작을 하며 Internal word의 첫 번째 문자는 대문자를 사용합니다.&lt;/li&gt;
&lt;li&gt;약어는 꼭 필요한 경우에만 사용합니다.&lt;/li&gt;
&lt;li&gt;클래스 이름에는 클래스를 나타내는 C 등의 형식 접두사를 사용하지 않습니다. 예를 들어 CFileStream 대신 FileStream을 사용합니다.&lt;/li&gt;
&lt;li&gt;밑줄(_)를 사용하지 않습니다.&lt;/li&gt;
&lt;li&gt;시스템 및 서브시스템을 표시할 수 있는 Prefix를 사용하거나 Class의 특징을 나타내는 Suffix를 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Prefix는 시스템의 특징을 나타내는(구별하는) 취지에서 사용합니다.&lt;/li&gt;
&lt;li&gt;Suffix는 파일구조에서 말하는 확장자가 아니고, 클래스이름을 정할 때 이름의 끝에 들어가는 접미사로 파일의 클래스의 특징 및 해당 이름을 가진 코드들의 기능(데이터삭제, 등록, 조회 등)을 구별하는 취지에서 사용합니다.&lt;/li&gt;
&lt;li&gt;서브시스템이 존재하는 프로젝트에서는 Prefix로 서브시스템을 나타내는 문자를 사용할 것을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;8tghLif9&quot; data-toc-id=&quot;8tghLif9&quot; data-block-id=&quot;xHPvt3&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.5&amp;nbsp;Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;gGP2iO&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;인터페이스&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;5C5-cQ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스 이름을 지정할 때는 명사 또는 명사구나 동작을 설명하는 형용사를 사용합니다.&lt;/li&gt;
&lt;li&gt;예를 들어, Component라는 인터페이스 이름에서는 설명적인 명사를 사용합니다.&lt;/li&gt;
&lt;li&gt;또한 CustomAttributeProvider라는 인터페이스 이름에서는 명사구를 사용하며, Persistable라는 이름에서는 형용사를 사용합니다.&lt;/li&gt;
&lt;li&gt;파스칼식 대문자 표시 스타일을 사용합니다.&lt;/li&gt;
&lt;li&gt;약어는 꼭 필요한 경우에만 사용합니다.&lt;/li&gt;
&lt;li&gt;클래스가 인터페이스의 표준 구현인 경우 해당 클래스/인터페이스 쌍을 정의할 땐느 유사한 이름을 사용합니다. 클래스 이름에 Impl 접미사가 있는 점만 제외하고 두 이름은 동일해야 합니다.&lt;/li&gt;
&lt;li&gt;밑줄(_)을 사용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;3wQ1lu&quot;&gt;&lt;code&gt;public interface CodeService {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Implementation code goes here.
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;a2L9I7&quot;&gt;&lt;code&gt;//&amp;nbsp;인터페이스
public interface CodeService {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Implementation code goes here.
}

//&amp;nbsp;인터페이스&amp;nbsp;구현&amp;nbsp;클래스
public class CodeServiceImpl implements CodeService {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Implementation code goes here.
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;IvsL9hqa&quot; data-toc-id=&quot;IvsL9hqa&quot; data-block-id=&quot;QXmplx&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.6&amp;nbsp;Method&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;aKzjn0&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;클래스의&amp;nbsp;멤버&amp;nbsp;메서드&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;FdcTIF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메소드는 동사를 사용합니다.&lt;/li&gt;
&lt;li&gt;첫 번째 문자는 소문자로 나타냅니다.&lt;/li&gt;
&lt;li&gt;여러 단어가 조합될 경우 조합되는 단어의 첫 번째 문자는 대문자로 시작되어야 합니다.&lt;/li&gt;
&lt;li&gt;get / set 메서드
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;PgOmnb&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 멤버변수 접근(Access)을 위한 get / set 뒤에 멤버변수명을 쓰는 것을 원칙으로 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메서드 명은 동사형으로 시작하며 동사 + 목적어 형태로 기술합니다.&lt;/li&gt;
&lt;li&gt;메서드 명은 구체적인 용어로 표기하지 않고, 일반적인 메시지 형태로 표기합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;72pUxt&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘못된 예) saveToDB() &amp;ndash; DB같은 구체적인 용어를 사용하지 말고 일반적인 메시지 형태로 표기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;_Rmrmc&quot;&gt;&lt;code&gt;//&amp;nbsp;get / set 메서드
private String name = null;
public String getName() {
&amp;nbsp; &amp;nbsp; return name;
}
public void setName(String name) {
&amp;nbsp; &amp;nbsp; this.name = name;
}

//&amp;nbsp;그 밖의 메서드
create(), checkOut(), attachToDesk(), fileTransfer(), run() 등&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;HeJv70D2&quot; data-toc-id=&quot;HeJv70D2&quot; data-block-id=&quot;cgn4Zr&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.7&amp;nbsp;변수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;nGrr0H&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;규칙은&amp;nbsp;변수&amp;nbsp;명명&amp;nbsp;지침을&amp;nbsp;요약한&amp;nbsp;것&amp;nbsp;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Vgixty&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 문자는 소문자로 나타냅니다.&lt;/li&gt;
&lt;li&gt;변수 및 필드 이름에는 헝가리어 표기법 접두사를 사용하지 않습니다. 단, 임시변수는 헝가리안 표기법으로 작성합니다.&lt;/li&gt;
&lt;li&gt;여러 단어가 조합될 경우 조합되는 단어의 첫 번째 문자는 대문자로 시작되어야 합니다.&lt;/li&gt;
&lt;li&gt;변수명의 시작을 밑줄문자(_) 또는 $ 문자로 사용하지 말아야 합니다.&lt;/li&gt;
&lt;li&gt;변수명은 짧으면서도 충분히 의미가 느껴지도록 하고, 뇌리에 선명하게 남도록 하는 것을 정해야 합니다.&lt;/li&gt;
&lt;li&gt;Collection type의 변수 이거나 배열인 경우 복수로 표현한다.&lt;/li&gt;
&lt;li&gt;멤버 변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MgBJ_8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멤버 변수라 함은 메서드 외부에서 정의하는 변수를 의미한다.&lt;/li&gt;
&lt;li&gt;final&amp;nbsp;상수&amp;nbsp;제외&amp;nbsp;: 상수에&amp;nbsp;대한&amp;nbsp;규칙은&amp;nbsp;&lt;b&gt;2.8&amp;nbsp;상수&lt;/b&gt;&amp;nbsp;참고&lt;/li&gt;
&lt;li&gt;접근자(Access&amp;nbsp;Modifier)
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;59GQnA&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 멤버변수 영역은 protected를 원칙으로 한다.&lt;/li&gt;
&lt;li&gt;Protected로 선언된 멤버변수가 하위 클래스를 제외한 다른 클래스에서 사용될 때는 get / set 메서드를 사용하도록 한다.&lt;/li&gt;
&lt;li&gt;변수의 특징에 따라 Access Modifier는 변경될 수 있다.(get / set 메서드에 대한 규칙&amp;nbsp;&lt;b&gt;2.6&amp;nbsp;Method&lt;/b&gt;&amp;nbsp;참고)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;processing&quot; data-block-id=&quot;wWV0Rq&quot;&gt;&lt;code&gt;protected&amp;nbsp;int&amp;nbsp;objID;
private&amp;nbsp;Table&amp;nbsp;tableTab;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;yInCb4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬&amp;nbsp;변수라&amp;nbsp;함은&amp;nbsp;Method&amp;nbsp;내에&amp;nbsp;정의하는&amp;nbsp;변수를&amp;nbsp;의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;MhAYJm&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬&amp;nbsp;변수의&amp;nbsp;첫&amp;nbsp;문자는&amp;nbsp;소문자로&amp;nbsp;사용하고,&amp;nbsp;여러&amp;nbsp;단어가&amp;nbsp;조합될&amp;nbsp;경우&amp;nbsp;조합되는&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문자는&amp;nbsp;대문자로&amp;nbsp;시작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;abnf&quot; data-block-id=&quot;wVE0ND&quot;&gt;&lt;code&gt;float myWidth;
String userID;
int seq;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;0qAQEB&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임시&amp;nbsp;변수라&amp;nbsp;함은&amp;nbsp;loop&amp;nbsp;&amp;nbsp;문이나&amp;nbsp;condition&amp;nbsp;문에서&amp;nbsp;임시로&amp;nbsp;사용하는&amp;nbsp;변수를&amp;nbsp;의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;Hisq6F&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임시변수는&amp;nbsp;헝가리안&amp;nbsp;표기법(Hungarian Notation)으로&amp;nbsp;작성합니다.&lt;/li&gt;
&lt;li&gt;한&amp;nbsp;개의&amp;nbsp;문자로&amp;nbsp;변수명을&amp;nbsp;구성하는&amp;nbsp;것은&amp;nbsp;임시&amp;nbsp;변수인&amp;nbsp;경우에만&amp;nbsp;사용하며,&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;정의한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gml&quot; data-block-id=&quot;zO5FyH&quot;&gt;&lt;code&gt;i, j, k, l&amp;nbsp;//&amp;nbsp;정수형
c, d //&amp;nbsp;문자형 임시 변수
x, y, z&amp;nbsp;//&amp;nbsp;좌표
e //&amp;nbsp;예외
g //&amp;nbsp;그래픽
o //&amp;nbsp;객체
s&amp;nbsp;//&amp;nbsp;문자열&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wJV-Xka3&quot; data-toc-id=&quot;wJV-Xka3&quot; data-block-id=&quot;ahIVpm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.8&amp;nbsp;상수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;vV6UEQ&quot; data-ke-size=&quot;size16&quot;&gt;클래스&amp;nbsp;상수&amp;nbsp;또는&amp;nbsp;일반&amp;nbsp;상수로&amp;nbsp;정의된&amp;nbsp;변수명은&amp;nbsp;&lt;b&gt;Snake&amp;nbsp;Case를&amp;nbsp;사용&lt;/b&gt;한다.&amp;nbsp;즉,&amp;nbsp;단어&amp;nbsp;간의&amp;nbsp;밑줄문자(_)로&amp;nbsp;분리되는&amp;nbsp;대문자&amp;nbsp;사용한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;UBWx-D&quot;&gt;&lt;code&gt;static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Lo5vNg9A&quot; data-toc-id=&quot;Lo5vNg9A&quot; data-block-id=&quot;JheKEE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.9&amp;nbsp;파라미터(인자)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;liN768&quot; data-ke-size=&quot;size16&quot;&gt;생성자(Constructor)나&amp;nbsp;set&amp;nbsp;Method에서&amp;nbsp;멤버&amp;nbsp;필드에&amp;nbsp;값을&amp;nbsp;지정할&amp;nbsp;때,&amp;nbsp;파라미터&amp;nbsp;이름은&amp;nbsp;멤버&amp;nbsp;필드&amp;nbsp;이름과&amp;nbsp;동일하게&amp;nbsp;부여&amp;nbsp;한다.(this&amp;nbsp;키워드&amp;nbsp;사용)&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;ZCdRIu&quot;&gt;&lt;code&gt;public class Dude {
&amp;nbsp;&amp;nbsp; &amp;nbsp; private String name;
&amp;nbsp;&amp;nbsp; &amp;nbsp; public Dude(String name) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name;
&amp;nbsp;&amp;nbsp; &amp;nbsp; }
&amp;nbsp;&amp;nbsp; &amp;nbsp; public void setName(String name) {
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name;
&amp;nbsp;&amp;nbsp; &amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;jj98pCMp&quot; data-toc-id=&quot;jj98pCMp&quot; data-block-id=&quot;YetL9Z&quot;&gt;&lt;b&gt;3. 주석 사용 지침&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;jUo-zcOt&quot; data-toc-id=&quot;jUo-zcOt&quot; data-block-id=&quot;zsv5vU&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1&amp;nbsp;일반&amp;nbsp;사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BFIHev&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 코드만 가지고는 정확하게 코드가 의미하는 바가 무엇인지 이해하기 힘들다.&lt;/li&gt;
&lt;li&gt;주석(Comment)은 코드에 추가적인 설명을 달아서 코드를 보다 읽기 쉽게 만들어 준다.&lt;/li&gt;
&lt;li&gt;여기에서는 개발자들이 준수해야 하는 주석 사용 지침을 설명한다.&lt;/li&gt;
&lt;li&gt;코드에 장식을 하지 않는다(배너식의 주석 사용을 자제한다.)&lt;/li&gt;
&lt;li&gt;주석은 가능한 단순하게 한다.&lt;/li&gt;
&lt;li&gt;코드 작성 이전에 주석부터 작성한다.&lt;/li&gt;
&lt;li&gt;&amp;lsquo;무엇이 되었다&amp;rsquo;가 아니라 &amp;lsquo;무엇이 이러한 이유로 이렇게 되었다&amp;rsquo; 식으로 작성한다.&lt;/li&gt;
&lt;li&gt;주석 위치는 클래스의 시작, 각 메서드 선언의 바로 위에 한다.&lt;/li&gt;
&lt;li&gt;메서드 내부에서도 단계별로 구분지어서 설명할 필요가 있을 때도 주석을 작성한다.&lt;/li&gt;
&lt;li&gt;변수 하나의 의미를 쓰는 주석 등은 사용하지 않는다.&lt;/li&gt;
&lt;li&gt;변수 이름을 명확하게 주어서 주석&amp;nbsp;작성의&amp;nbsp;필요를&amp;nbsp;제거한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aTj0YY1H&quot; data-toc-id=&quot;aTj0YY1H&quot; data-block-id=&quot;l0c2RI&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2&amp;nbsp;주석의&amp;nbsp;종류&amp;nbsp;및&amp;nbsp;사용방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주석의 종류&lt;/b&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;BXywf-&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;2&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;문서화 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;4&quot;&gt;&lt;span&gt;코드구현 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;블록주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Single-line 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;/* */&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Trailing 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;소스코드 + /* */&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;End-of-Line 주석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;//&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;qkWqtl0V&quot; data-toc-id=&quot;qkWqtl0V&quot; data-block-id=&quot;qLcj_D&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.1&amp;nbsp;기본&amp;nbsp;원칙&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;hrjnjl&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스(또는 인터페이스), 메서드, 멤버 변수의 주석으로는 JavaDoc 주석 사용을 권장한다.&lt;/li&gt;
&lt;li&gt;메서드 안의 코드 설명 또는 로컬변수의 주석으로는 단일라인 주석만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3QPY0zcg&quot; data-toc-id=&quot;3QPY0zcg&quot; data-block-id=&quot;CL9Mv2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.2&amp;nbsp;문서화&amp;nbsp;주석&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;mjdLJbPk&quot; data-toc-id=&quot;mjdLJbPk&quot; data-block-id=&quot;p6BaSF&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2.2.1&amp;nbsp;Class&amp;nbsp;Comments&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;yt55E_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 소스의 가장 앞 부분에 다음과 같이 클래스 이름, 하는 작업, 작성일 Comments와 버전정보, 작성자를 명기한다.&lt;/li&gt;
&lt;li&gt;여기서 작성일과 작성자의 다음의 괄호 부분엔 수정일과 수정자의 이름이 명기되며 수정일 뒤에는 수정이유를 간단하게 밝힌다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;30E-W_&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;/**
 * &amp;lt;pre&amp;gt;
 * 각종 문자열, 스트링, 데이트 형식에 따른 유틸리티
 * &amp;lt;/pre&amp;gt;
 *
 * @author COMPANY.co., Ltd
 * @version
 * &amp;lt;ul&amp;gt;
 *     &amp;lt;li&amp;gt;1.0.0 (2025.03.28) 홍길동(test@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt; 
 * &amp;lt;/ul&amp;gt;
 * @code &amp;lt;pre&amp;gt;{@code
 * @Autowired
 * private FormatUtil formatUtil;
 * }&amp;lt;/pre&amp;gt;
 * @since 2025.03.28
 */&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;wP396R-U&quot; data-toc-id=&quot;wP396R-U&quot; data-block-id=&quot;P4tJJa&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2.2.2&amp;nbsp;Method&amp;nbsp;Comment&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;rYOmBa&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;/**
 * &amp;lt;pre&amp;gt;
 * 현재 실행 중인 스레드의 ClassLoader 객체를 반환하며, 만약 해당 스레드에 ClassLoader 객체가 설정되지 않은 경우, 대체 객체(defaultObject)의 클래스에 대한 ClassLoader 객체를 반환
 * &amp;lt;/pre&amp;gt;
 *
 * @param defaultObject 대체 객체
 * @return the class loader
 * @code &amp;lt;pre&amp;gt;{@code
 * @Autowired
 * this.getCurrentClassLoader(params)
 * }&amp;lt;/pre&amp;gt;
 * @history
 * &amp;lt;ul&amp;gt;
 *     &amp;lt;li&amp;gt;2025.03.28 홍길동(test@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt;
 * &amp;lt;/ul&amp;gt;
 */&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;XiVx0IvB&quot; data-toc-id=&quot;XiVx0IvB&quot; data-block-id=&quot;KOOCsd&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.3&amp;nbsp;단일&amp;nbsp;라인&amp;nbsp;주석(Single&amp;nbsp;Line&amp;nbsp;Comment)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ccMa3w&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;// 로 시작하며, 해당 라인의 끝까지 적용된다.&lt;/li&gt;
&lt;li&gt;설명하고자 하는 코드의 바로 윗줄이나, 코드와 같은 라인의 오른쪽에 작성한다.&lt;/li&gt;
&lt;li&gt;하나의 라인이나 한 라인의 일부를 주석처리해서 컴파일&amp;nbsp;되지 않도록 임시로 막을때로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;oHSmhU&quot;&gt;&lt;code&gt;public class FileStream {
&amp;nbsp; &amp;nbsp; // 여기에 코드를 입력하세요.
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;qnTzAtCq&quot; data-toc-id=&quot;qnTzAtCq&quot; data-block-id=&quot;_yRAEV&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.4&amp;nbsp;블럭&amp;nbsp;주석(Block&amp;nbsp;Comment)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;UhXIjF&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/* 로 시작하여 */ 까지 적용된다.&lt;/li&gt;
&lt;li&gt;메서드안에서는 단일라인 주석을 사용한다.&lt;/li&gt;
&lt;li&gt;짧은 내용의 주석을 다음 라인에 기술될 코드이 들여쓰기에 맞춰서 한 라인에 표현할 수 도 있다.&lt;/li&gt;
&lt;li&gt;만약 한 라인에 다 표현하지 못 할 경우에는 블록주석 방식을 사용한다.&lt;/li&gt;
&lt;li&gt;한줄 또는 여러 줄을 주석처리하거나, 코드의 블록이 컴파일 되지 않게 임시로 막을 때로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;4NUKDR&quot;&gt;&lt;code&gt;public class FileStream {
&amp;nbsp; &amp;nbsp; /*
&amp;nbsp; &amp;nbsp; 여기에 코드를
&amp;nbsp; &amp;nbsp; 입력하세요.
&amp;nbsp; &amp;nbsp; */
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;AYAYN4XB&quot; data-toc-id=&quot;AYAYN4XB&quot; data-block-id=&quot;tRh5lo&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.5&amp;nbsp;Trailing&amp;nbsp;comment&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;D3OJv-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매우 짧은 주석으로 사용할 수 있는 코드로써 같은 라인에 나타낼 수 있지만 코드를 문(statement)으로부터 분리하기 위해서는 충분히 떨어져야&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;만일 하나 이상의 짧은 주석이 큰 덩어리의 코드로 나타날 경우 동일한 위치에서 들여쓰기를 하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-block-id=&quot;CITNAb&quot;&gt;&lt;code&gt;if(a==2) {
&amp;nbsp; &amp;nbsp; return true;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* special case */
} else {
&amp;nbsp; &amp;nbsp; return isPrime(a); &amp;nbsp; &amp;nbsp; /* works only for odd a */
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;Io7O21F-&quot; data-toc-id=&quot;Io7O21F-&quot; data-block-id=&quot;R78XpF&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2.6&amp;nbsp;End-of-Line&amp;nbsp;Comment&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;kVBHvg&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;//&amp;rdquo; comment delimiter는 라인 전체 또는 일부를 주석으로 처리 할 수 있으며 &amp;ldquo;//&amp;rdquo;는 문장 주석을 위한 연속한 여러 라인에 사용되어서는 안된다.&lt;/li&gt;
&lt;li&gt;단, 코드의 특정섹션을 처리하기 위해서는 연속한 라인에 사용&amp;nbsp;되어도 무방하다.&lt;/li&gt;
&lt;li&gt;변수선언 후 변수에 대한 설명으로 사용하거나 또는 특정라인에 대한 설명으로 사용한다.&lt;/li&gt;
&lt;li&gt;복잡한 제어구조에서 각 제어문의 끝을 나타내기 위해서 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gcode&quot; data-block-id=&quot;iD7_CT&quot;&gt;&lt;code&gt;for(&amp;hellip;) {
&amp;nbsp; &amp;nbsp; while(&amp;hellip;){
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(&amp;hellip;) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(&amp;hellip;) {
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;hellip;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } // end switch
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } // end if
&amp;nbsp; &amp;nbsp; } // end while
} // end for&lt;/code&gt;&lt;/pre&gt;
&lt;p data-block-id=&quot;Ny3QU2&quot; data-ke-size=&quot;size16&quot;&gt;3.3 IntelliJ Class/Method Comment Template 설정 방법&lt;/p&gt;
&lt;h2 id=&quot;jQhamOBX&quot; data-toc-id=&quot;jQhamOBX&quot; data-block-id=&quot;ErIWw5&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.3 IntelliJ Class/Method Comment Template 설정 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;qxOf6cIs&quot; data-toc-id=&quot;qxOf6cIs&quot; data-block-id=&quot;5Jy-qW&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3.1 Class&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;MpLrPc&quot; data-ke-size=&quot;size16&quot;&gt;아래 그림과 같이 설정&amp;gt; 도구&amp;gt; JavaDoc&amp;gt; Templates 이동 후 Class level Regular expression 설정 변경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;e2jmW8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.+ : 목록 순서를 첫번째로 변경&lt;/li&gt;
&lt;li&gt;개발자_이름 : 본인 이름 입력&lt;/li&gt;
&lt;li&gt;이메일 계정 : 본인 이메일 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;dQULq6&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;/**\n
* &amp;lt;pre&amp;gt;\n
* 여기에 설명을 작성하세요.\n
* &amp;lt;/pre&amp;gt;\n
* @apiNote (선택)API 사용자(개발자)가 알아야 할 중요한 사항을 기록\n
* @implSpec (선택)구현 클래스가 반드시 따라야 할 규칙을 명시\n
* @implNote (선택)구현 방식을 변경할 때 고려해야 할 점 등을 설명\n
* @since ${.now?string('yyyy.MM.dd')}\n
* @author Company.co., Ltd\n
* @version\n
* &amp;lt;ul&amp;gt;\n
*     &amp;lt;li&amp;gt;1.0.0 (${.now?string('yyyy.MM.dd')}) 개발자_이름(이메일_계정@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt;\n
* &amp;lt;/ul&amp;gt;\n
* @code &amp;lt;pre&amp;gt;{@code\n
*  }&amp;lt;/pre&amp;gt;\n
&amp;lt;#if element.typeParameters?has_content&amp;gt;        * \n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.typeParameters as typeParameter&amp;gt;
        * @param &amp;lt;${typeParameter.name}&amp;gt; the type parameter\n
&amp;lt;/#list&amp;gt;
*/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;MzloiyNX&quot; data-toc-id=&quot;MzloiyNX&quot; data-block-id=&quot;RcNejU&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3.2 Method&lt;/b&gt;&lt;/h3&gt;
&lt;p data-block-id=&quot;vderei&quot; data-ke-size=&quot;size16&quot;&gt;아래 그림과 같이 설정&amp;gt; 도구&amp;gt; JavaDoc&amp;gt; Templates 이동 후 Method level Regular expression 설정 변경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RluJyH&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.+ : 목록 순서를 첫번째로 변경&lt;/li&gt;
&lt;li&gt;개발자_이름 : 본인 이름 입력&lt;/li&gt;
&lt;li&gt;이메일 계정 : 본인 이메일 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-block-id=&quot;ZW1Wz_&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;/**\n
 * &amp;lt;pre&amp;gt;\n
 * 여기에 Method 설명을 작성하세요.\n
 * &amp;lt;/pre&amp;gt;\n
&amp;lt;#if element.typeParameters?has_content&amp;gt;         * \n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.typeParameters as typeParameter&amp;gt;
         * @param &amp;lt;${typeParameter.name}&amp;gt; the type parameter\n
&amp;lt;/#list&amp;gt;
&amp;lt;#if element.parameterList.parameters?has_content&amp;gt;
         *\n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.parameterList.parameters as parameter&amp;gt;
         * @param ${parameter.name} the ${paramNames[parameter.name]}\n
&amp;lt;/#list&amp;gt;
&amp;lt;#if isNotVoid&amp;gt;
         *\n
         * @return the ${return}\n
&amp;lt;/#if&amp;gt;
&amp;lt;#if element.throwsList.referenceElements?has_content&amp;gt;
         *\n
&amp;lt;/#if&amp;gt;
&amp;lt;#list element.throwsList.referenceElements as exception&amp;gt;
         * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&amp;lt;/#list&amp;gt;
 * @code &amp;lt;pre&amp;gt;{@code\n
 * 여기에 Method 사용법을 작성하세요.\n
 * }&amp;lt;/pre&amp;gt;\n
 * @history\n
 * &amp;lt;ul&amp;gt;\n
 *     &amp;lt;li&amp;gt;${.now?string('yyyy.MM.dd')} 개발자_이름(이메일_계정@company.co.kr) - 최초 구현&amp;lt;/li&amp;gt;\n
 * &amp;lt;/ul&amp;gt;\n
 */&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;lOyrN6n8&quot; data-toc-id=&quot;lOyrN6n8&quot; data-block-id=&quot;0pL41T&quot;&gt;&lt;b&gt;4. 선언(Declaration)&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;zAzi7kKo&quot; data-toc-id=&quot;zAzi7kKo&quot; data-block-id=&quot;1XZexc&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.1&amp;nbsp;Number&amp;nbsp;per&amp;nbsp;Line&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;LwIF_6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 라인당 하나의 선언이 추천되는데 이는 주석을 달기 좋기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot; data-block-id=&quot;03W3jy&quot;&gt;&lt;code&gt;int level; // indentation level
int size; // size of table
object currentEntry; // currently selected table entry&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;QgMlVD&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래의 코드보다 위의 코드가 가독성이 편리하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot; data-block-id=&quot;LxE4eF&quot;&gt;&lt;code&gt;int level, size;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;vEps1x&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 예처럼 서로 다른 유형을 동일라인에 표현하는 것은 피해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; data-block-id=&quot;CDGih4&quot;&gt;&lt;code&gt;int foo, fooArray[]; // wrong!&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Xb4hrpBy&quot; data-toc-id=&quot;Xb4hrpBy&quot; data-block-id=&quot;Cp-RNe&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.2&amp;nbsp;배치&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;BQDb9C&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선언문의 배치는 블록의 제일 앞에 배치한다.&lt;/li&gt;
&lt;li&gt;여기서 블록이란 중괄호&amp;rdquo;{&amp;ldquo;, &amp;ldquo;}&amp;rdquo;로 둘러쌓인 모든 코드를 말한다.&lt;/li&gt;
&lt;li&gt;선언문이 블록의 중간에 나타나는 것은 좋은 방법이 아니다.&lt;/li&gt;
&lt;li&gt;상위 레벨의 선언을 무효화 시키는 지역선언은 배제되어야 하며 예를 들어 내부 블록내에 동일한 변수명을 선언하는 것은 좋지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;axapta&quot; data-block-id=&quot;-YywsX&quot;&gt;&lt;code&gt;int count;
&amp;hellip;
myMethod() {
&amp;nbsp; &amp;nbsp; if(condition) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int count&amp;nbsp;=&amp;nbsp;0; // AVOID!
&amp;nbsp; &amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;VwIRI-GI&quot; data-toc-id=&quot;VwIRI-GI&quot; data-block-id=&quot;hwrEBm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.3&amp;nbsp;클래스와&amp;nbsp;인터페이스&amp;nbsp;및&amp;nbsp;배열&amp;nbsp;선언&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;FbxKsC&quot; data-ke-size=&quot;size16&quot;&gt;클래스나&amp;nbsp;인터페이스를&amp;nbsp;개발&amp;nbsp;할&amp;nbsp;때에는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;구성&amp;nbsp;원칙을&amp;nbsp;따른다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;km_TYn&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드는 이름과 파라메터 목록이 시작되는 괄호&amp;rdquo;(&amp;ldquo; 사이에는 공백을 두지 않는다.&lt;/li&gt;
&lt;li&gt;열린 중괄호(opening brace, &amp;ldquo;{&amp;ldquo;)는 선언문과 같은 라인에 위치한다.&lt;/li&gt;
&lt;li&gt;닫힌 중괄호(closing brace, &amp;ldquo;}&amp;rdquo;)는 열린 중괄호와 상응하도록 들여쓰기를 적용하되 열린 중괄호 뒤가 null 문장인 경우에는 닫힌 중괄호가 바로 대치되도록 한다.&lt;/li&gt;
&lt;li&gt;메서드는 공백라인에 의해 분리된다.&lt;/li&gt;
&lt;li&gt;상황에 따라서는 열린 중괄호를 선언문 다름 라인에 위치 할 수도 있다.&lt;/li&gt;
&lt;li&gt;배열선은은 타입 바로 다음에 배열기로&amp;rdquo;[ ]&amp;rdquo;가 오게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;0GNVO_I-&quot; data-toc-id=&quot;0GNVO_I-&quot; data-block-id=&quot;EHThZu&quot;&gt;&lt;b&gt;5. 공백 및 들여쓰기&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;ON0Peoc8&quot; data-toc-id=&quot;ON0Peoc8&quot; data-block-id=&quot;bYeI7C&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.1&amp;nbsp;공백&amp;nbsp;라인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;oovuQi&quot; data-ke-size=&quot;size16&quot;&gt;공백&amp;nbsp;라인은&amp;nbsp;논리적으로&amp;nbsp;관련된&amp;nbsp;코드&amp;nbsp;섹션을&amp;nbsp;분리하여&amp;nbsp;가독성을&amp;nbsp;향상&amp;nbsp;시킨다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;ZLjq0H&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두줄의 공백 라인은 다음 상황에서만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;jl-Ref&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;소스파일의 섹션 구분&lt;/li&gt;
&lt;li&gt;클래스나 인터페이스의 정의 구분&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;SkSyYu&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한줄의 공백 라인은 다음의 상황에서만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-block-id=&quot;2AieMZ&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메서드의 구분&lt;/li&gt;
&lt;li&gt;메서드 내의 지역변수와 첫 문장 구분&lt;/li&gt;
&lt;li&gt;블록 주석 또는 단일문 주석의 앞&lt;/li&gt;
&lt;li&gt;가독성 향상을 위해 메서드 내의 논리 섹션간의 구분&lt;/li&gt;
&lt;li&gt;package 선언 후&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;QRyLIgp3&quot; data-toc-id=&quot;QRyLIgp3&quot; data-block-id=&quot;zRr8Mv&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.2&amp;nbsp;공백&amp;nbsp;문자&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;19X9aT&quot; data-ke-size=&quot;size16&quot;&gt;공백&amp;nbsp;문자는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;상황에서&amp;nbsp;사용된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;oLnM51&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매개변수 목록에서 콤마(,) 다음에 공백문자를 사용한다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;.&amp;rdquo;를 제외한 모든 Binary 연산자는 Operand로부터 공백문자를 통해 분리되며 공백문자는 단항연산자(unary), minus(&amp;ldquo;-&amp;ldquo;), increment(&amp;ldquo;++&amp;rdquo;), decrement(&amp;ldquo;--&amp;ldquo;)등과 같은 단항연산자를 operend로부터 분리해서는 안된다.&lt;/li&gt;
&lt;li&gt;for 문 내의 표현식은 공백문자에 의해 분리되어야 한다.&lt;/li&gt;
&lt;li&gt;형 변환에 공백문자를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;35XJjBkU&quot; data-toc-id=&quot;35XJjBkU&quot; data-block-id=&quot;81zVSW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.3&amp;nbsp;줄&amp;nbsp;간&amp;nbsp;이어&amp;nbsp;쓰기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-block-id=&quot;RajRxM&quot; data-ke-size=&quot;size16&quot;&gt;들여쓰기의 단위로는 공백문자(Space) 4개를 이용하며, &lt;b&gt;Tabs은 4개의 공백문자로 설정&lt;/b&gt;하며,&amp;nbsp;한 라인에 표현되기 어려운 문장의 경우에는 다음 일반원칙에 따라 라인을 분리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;m9pVLZ&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Comma(&amp;ldquo;,&amp;rdquo;)뒤에서 분리&lt;/li&gt;
&lt;li&gt;연산자 다음에 분리&lt;/li&gt;
&lt;li&gt;레벨에 있어서는 하위 레벨보다는 상위 레벨에서 분리&lt;/li&gt;
&lt;li&gt;새 라인은 이전 동일 레벨에 있는 표현문장의 시작위치에 맞추어야 한다.&lt;/li&gt;
&lt;li&gt;만약 위 원칙이 코드를 혼란케 하거나 오른쪽 여백을 손상케 하는 경우에는 그냥 2개의 공백문자를 이용하여 들여쓰기를 하여야 한다.&lt;/li&gt;
&lt;li&gt;조건문 작성시 조건문이 길어질 경우 조건당 한줄로 작성한다.&lt;/li&gt;
&lt;li&gt;If 조건절의 줄간 이어쓰기는 일반적으로 2개의 공백문자를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;sgfi5DwG&quot; data-toc-id=&quot;sgfi5DwG&quot; data-block-id=&quot;7iVb7U&quot;&gt;6. 기타&lt;/h1&gt;
&lt;h2 id=&quot;CMKUSoOh&quot; data-toc-id=&quot;CMKUSoOh&quot; data-block-id=&quot;5KsdHb&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.1&amp;nbsp;인스턴스와&amp;nbsp;클래스&amp;nbsp;변수에&amp;nbsp;대한&amp;nbsp;접근&amp;nbsp;허용&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;RTEqr5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스&amp;nbsp;변수에&amp;nbsp;대한&amp;nbsp;public&amp;nbsp;&amp;nbsp;접근은&amp;nbsp;사능한&amp;nbsp;허용해서는&amp;nbsp;안된다.&lt;/li&gt;
&lt;li&gt;대체로&amp;nbsp;인스턴스&amp;nbsp;변수는&amp;nbsp;명시적으로&amp;nbsp;값을&amp;nbsp;설정하거나&amp;nbsp;읽혀질 필요성을 지니고 있지 않은데, 명시적으로 값이 설정 또는 읽혀질 경우는 메서드 호출의 부작용으로 발생한다.&lt;/li&gt;
&lt;li&gt;클래스가&amp;nbsp;단순히&amp;nbsp;자료구조의&amp;nbsp;역할을&amp;nbsp;하는&amp;nbsp;경우에는&amp;nbsp;인스턴스&amp;nbsp;변수를&amp;nbsp;public으로&amp;nbsp;접근하도록&amp;nbsp;한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;_sQ4bTum&quot; data-toc-id=&quot;_sQ4bTum&quot; data-block-id=&quot;Cs9ROW&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.2&amp;nbsp;클래스&amp;nbsp;변수와&amp;nbsp;메서드의&amp;nbsp;참조&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;TUA8e6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스&amp;nbsp;변수와&amp;nbsp;클래스&amp;nbsp;메서드에&amp;nbsp;접근하기&amp;nbsp;위해&amp;nbsp;오브젝트&amp;nbsp;인터페이스는&amp;nbsp;가능한&amp;nbsp;이용해서는&amp;nbsp;안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;DGNKYrQG&quot; data-toc-id=&quot;DGNKYrQG&quot; data-block-id=&quot;P7JbiS&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.3&amp;nbsp;상수&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;VjtI6_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자&amp;nbsp;상수는&amp;nbsp;직접코드화&amp;nbsp;하지&amp;nbsp;말고,&amp;nbsp;반드시&amp;nbsp;정의한&amp;nbsp;후&amp;nbsp;사용한다.&lt;/li&gt;
&lt;li&gt;-1,&amp;nbsp;0,&amp;nbsp;1&amp;nbsp;등과&amp;nbsp;같이&amp;nbsp;for&amp;nbsp;loop&amp;nbsp;에서&amp;nbsp;counter로&amp;nbsp;사용되는&amp;nbsp;상수들은&amp;nbsp;그냥&amp;nbsp;사용해도&amp;nbsp;무방하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wGs_D4TQ&quot; data-toc-id=&quot;wGs_D4TQ&quot; data-block-id=&quot;uqdURE&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.4&amp;nbsp;변수&amp;nbsp;할당&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;uKn6A0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일문에서&amp;nbsp;여러&amp;nbsp;번수에&amp;nbsp;동일한&amp;nbsp;값을&amp;nbsp;할당&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;가독성이&amp;nbsp;저하된다.&lt;/li&gt;
&lt;li&gt;Equality&amp;nbsp;operator('==')와&amp;nbsp;쉽게&amp;nbsp;혼동&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;위치에서의&amp;nbsp;Assignment('=')&amp;nbsp;사용은&amp;nbsp;가급적&amp;nbsp;지양한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ti6rpMxC&quot; data-toc-id=&quot;ti6rpMxC&quot; data-block-id=&quot;fIWBpa&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.5&amp;nbsp;괄호&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;0evoo9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연산자가&amp;nbsp;복잡하게&amp;nbsp;사용&amp;nbsp;된&amp;nbsp;경우에&amp;nbsp;연산자&amp;nbsp;우선순위&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;괄호를&amp;nbsp;활발하게&amp;nbsp;사용하는&amp;nbsp;것을&amp;nbsp;권장한다.&lt;/li&gt;
&lt;li&gt;이는&amp;nbsp;실상&amp;nbsp;연산자&amp;nbsp;우선순위가&amp;nbsp;개발자&amp;nbsp;본인에게는&amp;nbsp;명백히&amp;nbsp;보인다&amp;nbsp;할지라도&amp;nbsp;다른&amp;nbsp;개발자를&amp;nbsp;위한&amp;nbsp;배려를&amp;nbsp;베풀어야&amp;nbsp;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;Z9wJcvDN&quot; data-toc-id=&quot;Z9wJcvDN&quot; data-block-id=&quot;jIwPza&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.6&amp;nbsp;기타&amp;nbsp;고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-block-id=&quot;fBuEa9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러&amp;nbsp;줄의&amp;nbsp;String을&amp;nbsp;결합할&amp;nbsp;경우&amp;nbsp;String&amp;nbsp;=&amp;nbsp;String&amp;nbsp;+&amp;nbsp;String&amp;nbsp;보다는&amp;nbsp;StringBuffer를&amp;nbsp;사용한다.&lt;/li&gt;
&lt;li&gt;비록&amp;nbsp;크기가&amp;nbsp;작은&amp;nbsp;클라스하도&amp;nbsp;새로&amp;nbsp;인스턴스화&amp;nbsp;하지&amp;nbsp;말고&amp;nbsp;최대한&amp;nbsp;재&amp;nbsp;사용해야&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/424</guid>
      <comments>https://gregorio78.tistory.com/424#entry424comment</comments>
      <pubDate>Wed, 28 Jan 2026 10:09:01 +0900</pubDate>
    </item>
    <item>
      <title>Git Branch Strategy</title>
      <link>https://gregorio78.tistory.com/423</link>
      <description>&lt;h1 id=&quot;1nXEd-xm&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;1nXEd-xm&quot; data-block-id=&quot;QC4Cs8&quot;&gt;1.&amp;nbsp;Promise&amp;nbsp;&amp;amp;&amp;nbsp;Branch&amp;nbsp;Role&lt;/h1&gt;
&lt;h2 id=&quot;PYJoJfJr&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;PYJoJfJr&quot; data-block-id=&quot;tHgawv&quot; data-ke-size=&quot;size26&quot;&gt;1.1&amp;nbsp;Promise&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;u0zQme&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※&amp;nbsp;작업을&amp;nbsp;할&amp;nbsp;때&amp;nbsp;지켜야&amp;nbsp;할&amp;nbsp;서로&amp;nbsp;간의&amp;nbsp;약속입니다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;9aGJ77&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업&amp;nbsp;시작하기&amp;nbsp;전&amp;nbsp;&lt;b&gt;{{ticket&amp;nbsp;or&amp;nbsp;task}}&lt;/b&gt;&amp;nbsp;로&amp;nbsp;Branch를&amp;nbsp;생성한다.&lt;/li&gt;
&lt;li&gt;하나의&amp;nbsp;&lt;b&gt;{{ticket&amp;nbsp;or&amp;nbsp;task}}&lt;/b&gt;은&amp;nbsp;되도록&amp;nbsp;하나의&amp;nbsp;commit으로&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;commit&amp;nbsp;graph는&amp;nbsp;최대한&amp;nbsp;단순하게&amp;nbsp;가져간다.&lt;/li&gt;
&lt;li&gt;서로&amp;nbsp;공유하는&amp;nbsp;branch의&amp;nbsp;commit&amp;nbsp;graph는&amp;nbsp;함부로&amp;nbsp;변경하지&amp;nbsp;않습니다.&lt;/li&gt;
&lt;li&gt;Reviewer(=Project&amp;nbsp;Leaser&amp;nbsp;or&amp;nbsp;Part&amp;nbsp;Leader&amp;nbsp;or&amp;nbsp;동료)에게&amp;nbsp;꼭&amp;nbsp;Review를&amp;nbsp;받습니다.&lt;/li&gt;
&lt;li&gt;자신의&amp;nbsp;Pull&amp;nbsp;Request는&amp;nbsp;스스로&amp;nbsp;merge&amp;nbsp;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3CPM6cPm&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;3CPM6cPm&quot; data-block-id=&quot;9Hz8oE&quot; data-ke-size=&quot;size26&quot;&gt;1.2&amp;nbsp;Branch&amp;nbsp;Role&lt;/h2&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;hjfXii&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Branch&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;비고&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;master&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Source의&amp;nbsp;안전한&amp;nbsp;보관을&amp;nbsp;위한&amp;nbsp;branch&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;production&amp;nbsp;merge&amp;nbsp;후&amp;nbsp;2주/4주&amp;nbsp;경과된&amp;nbsp;branch&amp;nbsp;merge&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;production&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Staging&amp;nbsp;테스트가&amp;nbsp;끝난&amp;nbsp;기능에&amp;nbsp;대해&amp;nbsp;운영환경에&amp;nbsp;배포하기&amp;nbsp;위한&amp;nbsp;branch&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;staging&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;b&gt;(option)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;production&amp;nbsp;merge&amp;nbsp;전&amp;nbsp;운영환경과&amp;nbsp;유사한&amp;nbsp;환경&amp;nbsp;테스트를&amp;nbsp;위한&amp;nbsp;branch&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;hotfix&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;출시&amp;nbsp;버전에서&amp;nbsp;발생한&amp;nbsp;버그를&amp;nbsp;수정하는&amp;nbsp;branch&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;develop&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;다음&amp;nbsp;출시&amp;nbsp;버전을&amp;nbsp;준비하는&amp;nbsp;branch&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;feature&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모든&amp;nbsp;기능&amp;nbsp;구현은&amp;nbsp;feature&amp;nbsp;branch에서&amp;nbsp;시작&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;feature/&lt;b&gt;{{ticket&amp;nbsp;or&amp;nbsp;task&amp;nbsp;no}}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;feature/251&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&quot;m_-t6RnK&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;m_-t6RnK&quot; data-block-id=&quot;3kaaMH&quot;&gt;2. Branch Flow(예시)&lt;/h1&gt;
&lt;h2 id=&quot;6wBP6JjI&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;6wBP6JjI&quot; data-block-id=&quot;kQEcKI&quot; data-ke-size=&quot;size26&quot;&gt;2.1 1안&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2T3qG/dJMcafMcCP2/ZODxKnsAs0UQPQ9p1enCrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2T3qG/dJMcafMcCP2/ZODxKnsAs0UQPQ9p1enCrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2T3qG/dJMcafMcCP2/ZODxKnsAs0UQPQ9p1enCrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2T3qG%2FdJMcafMcCP2%2FZODxKnsAs0UQPQ9p1enCrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;533&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;vKLUd3gk&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;vKLUd3gk&quot; data-block-id=&quot;kQsiMK&quot; data-ke-size=&quot;size26&quot;&gt;2.2&amp;nbsp;2안&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBSXD6/dJMcacu9sTs/TftZBiWL3wi1grKDr09K71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBSXD6/dJMcacu9sTs/TftZBiWL3wi1grKDr09K71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBSXD6/dJMcacu9sTs/TftZBiWL3wi1grKDr09K71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBSXD6%2FdJMcacu9sTs%2FTftZBiWL3wi1grKDr09K71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;543&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id=&quot;ZChapLWX&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;ZChapLWX&quot; data-block-id=&quot;JoLfy2&quot;&gt;3. Conflict (충돌) 해결 절차&lt;/h1&gt;
&lt;div id=&quot;code_1769499055061&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;quot;ko&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;Git Conflict 해결 절차&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            padding: 40px 20px;
            min-height: 100vh;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
            background: white;
            border-radius: 20px;
            padding: 40px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
        }
        
        h1 {
            text-align: center;
            color: #2d3748;
            margin-bottom: 15px;
            font-size: 32px;
        }
        
        .subtitle {
            text-align: center;
            color: #64748b;
            margin-bottom: 40px;
            font-size: 16px;
        }
        
        /* Diagram Section */
        .diagram-section {
            background: #f8fafc;
            border-radius: 15px;
            padding: 30px;
            margin-bottom: 40px;
            border: 2px solid #e2e8f0;
        }
        
        .flow-container {
            display: flex;
            flex-direction: column;
            gap: 20px;
            margin: 20px 0;
        }
        
        .flow-step {
            display: flex;
            align-items: center;
            gap: 20px;
        }
        
        .step-number {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            width: 50px;
            height: 50px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 20px;
            font-weight: bold;
            flex-shrink: 0;
            box-shadow: 0 4px 10px rgba(102, 126, 234, 0.4);
        }
        
        .step-content {
            flex: 1;
            background: white;
            padding: 20px;
            border-radius: 12px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
        
        .step-title {
            font-size: 18px;
            font-weight: bold;
            color: #1e293b;
            margin-bottom: 8px;
        }
        
        .step-desc {
            color: #475569;
            font-size: 14px;
            line-height: 1.6;
        }
        
        .code-block {
            background: #1e293b;
            color: #e2e8f0;
            padding: 15px;
            border-radius: 8px;
            font-family: 'Courier New', monospace;
            font-size: 13px;
            margin-top: 10px;
            overflow-x: auto;
        }
        
        .command {
            color: #10b981;
        }
        
        .output {
            color: #f59e0b;
        }
        
        .arrow-down {
            text-align: center;
            color: #94a3b8;
            font-size: 24px;
            margin: 10px 0;
        }
        
        /* Conflict Example */
        .conflict-example {
            background: #fef2f2;
            border: 2px solid #fca5a5;
            border-radius: 12px;
            padding: 20px;
            margin: 20px 0;
        }
        
        .conflict-title {
            font-size: 18px;
            font-weight: bold;
            color: #dc2626;
            margin-bottom: 15px;
        }
        
        .conflict-marker {
            background: #1e293b;
            color: #e2e8f0;
            padding: 15px;
            border-radius: 8px;
            font-family: 'Courier New', monospace;
            font-size: 13px;
            white-space: pre;
        }
        
        .marker-head {
            color: #ef4444;
            font-weight: bold;
        }
        
        .marker-sep {
            color: #f59e0b;
            font-weight: bold;
        }
        
        .marker-tail {
            color: #3b82f6;
            font-weight: bold;
        }
        
        /* Resolution Methods */
        .resolution-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 20px;
            margin: 30px 0;
        }
        
        .resolution-card {
            background: white;
            border-radius: 12px;
            padding: 20px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.1);
            border-left: 4px solid;
        }
        
        .resolution-card.accept-current {
            border-left-color: #10b981;
        }
        
        .resolution-card.accept-incoming {
            border-left-color: #3b82f6;
        }
        
        .resolution-card.manual {
            border-left-color: #f59e0b;
        }
        
        .resolution-card h3 {
            font-size: 16px;
            margin-bottom: 10px;
            color: #1e293b;
        }
        
        .resolution-card p {
            color: #64748b;
            font-size: 14px;
            line-height: 1.6;
        }
        
        /* Tips Section */
        .tips-section {
            background: #eff6ff;
            border-left: 4px solid #3b82f6;
            border-radius: 10px;
            padding: 20px;
            margin-top: 30px;
        }
        
        .tips-section h3 {
            color: #1e40af;
            margin-bottom: 15px;
            font-size: 18px;
        }
        
        .tips-section ul {
            list-style: none;
            padding-left: 0;
        }
        
        .tips-section li {
            color: #475569;
            padding: 8px 0;
            padding-left: 25px;
            position: relative;
        }
        
        .tips-section li:before {
            content: &amp;quot; &amp;quot;;
            position: absolute;
            left: 0;
        }
        
        /* Visual Diagram */
        .visual-diagram {
            background: white;
            border-radius: 12px;
            padding: 30px;
            margin: 30px 0;
            box-shadow: 0 4px 12px rgba(0,0,0,0.1);
        }
        
        .branch-visual {
            display: flex;
            flex-direction: column;
            gap: 15px;
            margin: 20px 0;
        }
        
        .branch-line {
            display: flex;
            align-items: center;
            gap: 15px;
        }
        
        .branch-label {
            width: 100px;
            font-weight: bold;
            color: #475569;
        }
        
        .commit-line {
            display: flex;
            align-items: center;
            gap: 10px;
            flex: 1;
        }
        
        .commit {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 12px;
            font-weight: bold;
            color: white;
            box-shadow: 0 2px 6px rgba(0,0,0,0.2);
        }
        
        .commit.main {
            background: #3b82f6;
        }
        
        .commit.feature {
            background: #10b981;
        }
        
        .commit.conflict {
            background: #ef4444;
            animation: pulse 2s infinite;
        }
        
        @keyframes pulse {
            0%, 100% { transform: scale(1); }
            50% { transform: scale(1.1); }
        }
        
        .line {
            height: 2px;
            flex: 1;
            background: #cbd5e1;
        }
        
        .conflict-zone {
            background: #fef2f2;
            border: 2px dashed #ef4444;
            border-radius: 8px;
            padding: 15px;
            text-align: center;
            color: #dc2626;
            font-weight: bold;
        }
        
        @media (max-width: 768px) {
            .container {
                padding: 20px;
            }
            
            .resolution-grid {
                grid-template-columns: 1fr;
            }
            
            .flow-step {
                flex-direction: column;
                align-items: flex-start;
            }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
        &amp;lt;h1&amp;gt;  Git Conflict (충돌) 해결 절차&amp;lt;/h1&amp;gt;
        &amp;lt;p class=&amp;quot;subtitle&amp;quot;&amp;gt;Git 병합 충돌의 발생 원인과 해결 방법&amp;lt;/p&amp;gt;
        
        &amp;lt;!-- Visual Diagram --&amp;gt;
        &amp;lt;div class=&amp;quot;visual-diagram&amp;quot;&amp;gt;
            &amp;lt;h2 style=&amp;quot;color: #1e293b; margin-bottom: 20px;&amp;quot;&amp;gt;  충돌 발생 시나리오&amp;lt;/h2&amp;gt;
            
            &amp;lt;div class=&amp;quot;branch-visual&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;branch-line&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;branch-label&amp;quot;&amp;gt;main 브랜치&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;commit-line&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;commit main&amp;quot;&amp;gt;A&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;line&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;commit main&amp;quot;&amp;gt;B&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;line&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;commit main&amp;quot;&amp;gt;C&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;line&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;commit main&amp;quot;&amp;gt;D&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;branch-line&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;branch-label&amp;quot;&amp;gt;feature 브랜치&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;commit-line&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;commit main&amp;quot;&amp;gt;A&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;line&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;commit main&amp;quot;&amp;gt;B&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;line&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;commit feature&amp;quot;&amp;gt;E&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;line&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;commit feature&amp;quot;&amp;gt;F&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;conflict-zone&amp;quot;&amp;gt;
                    ⚠️ C와 E가 같은 파일의 같은 부분을 수정 &amp;rarr; 충돌 발생!
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Conflict Example --&amp;gt;
        &amp;lt;div class=&amp;quot;conflict-example&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;conflict-title&amp;quot;&amp;gt;⚠️ 충돌 파일 예시 (Conflict Markers)&amp;lt;/div&amp;gt;
            &amp;lt;div class=&amp;quot;conflict-marker&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;marker-head&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&amp;lt;/span&amp;gt;
현재 브랜치의 변경 사항 (예: main)
const title = &amp;quot;Main Branch Title&amp;quot;;
&amp;lt;span class=&amp;quot;marker-sep&amp;quot;&amp;gt;=======&amp;lt;/span&amp;gt;
병합하려는 브랜치의 변경 사항 (예: feature)
const title = &amp;quot;Feature Branch Title&amp;quot;;
&amp;lt;span class=&amp;quot;marker-tail&amp;quot;&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; feature&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Resolution Steps --&amp;gt;
        &amp;lt;div class=&amp;quot;diagram-section&amp;quot;&amp;gt;
            &amp;lt;h2 style=&amp;quot;color: #1e293b; margin-bottom: 20px;&amp;quot;&amp;gt;  충돌 해결 절차&amp;lt;/h2&amp;gt;
            
            &amp;lt;div class=&amp;quot;flow-container&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;flow-step&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;step-number&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;step-content&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;step-title&amp;quot;&amp;gt;충돌 발견&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;step-desc&amp;quot;&amp;gt;merge 또는 rebase 시 충돌이 발생하면 Git이 자동으로 알려줍니다.&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git merge feature&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;output&amp;quot;&amp;gt;Auto-merging file.js
CONFLICT (content): Merge conflict in file.js
Automatic merge failed; fix conflicts and then commit the result.&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;arrow-down&amp;quot;&amp;gt;&amp;darr;&amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;flow-step&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;step-number&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;step-content&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;step-title&amp;quot;&amp;gt;충돌 파일 확인&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;step-desc&amp;quot;&amp;gt;충돌이 발생한 파일 목록을 확인합니다.&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git status&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;output&amp;quot;&amp;gt;On branch main
You have unmerged paths.

Unmerged paths:
  (use &amp;quot;git add &amp;amp;lt;file&amp;amp;gt;...&amp;quot; to mark resolution)
        both modified:   file.js&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;arrow-down&amp;quot;&amp;gt;&amp;darr;&amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;flow-step&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;step-number&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;step-content&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;step-title&amp;quot;&amp;gt;충돌 해결 방법 선택&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;step-desc&amp;quot;&amp;gt;아래 3가지 방법 중 하나를 선택하여 충돌을 해결합니다.&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Resolution Methods --&amp;gt;
        &amp;lt;h2 style=&amp;quot;color: #1e293b; margin: 30px 0 20px 0;&amp;quot;&amp;gt;  충돌 해결 방법&amp;lt;/h2&amp;gt;
        
        &amp;lt;div class=&amp;quot;resolution-grid&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;resolution-card accept-current&amp;quot;&amp;gt;
                &amp;lt;h3&amp;gt;✅ 방법 1: 현재 브랜치 변경사항 유지&amp;lt;/h3&amp;gt;
                &amp;lt;p&amp;gt;현재 브랜치(HEAD)의 변경사항을 선택합니다.&amp;lt;/p&amp;gt;
                &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git checkout --ours file.js&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git add file.js&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;div class=&amp;quot;resolution-card accept-incoming&amp;quot;&amp;gt;
                &amp;lt;h3&amp;gt;✅ 방법 2: 들어오는 브랜치 변경사항 유지&amp;lt;/h3&amp;gt;
                &amp;lt;p&amp;gt;병합하려는 브랜치의 변경사항을 선택합니다.&amp;lt;/p&amp;gt;
                &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git checkout --theirs file.js&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git add file.js&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;div class=&amp;quot;resolution-card manual&amp;quot;&amp;gt;
                &amp;lt;h3&amp;gt;✅ 방법 3: 수동으로 편집&amp;lt;/h3&amp;gt;
                &amp;lt;p&amp;gt;파일을 직접 열어서 충돌 마커를 제거하고 원하는 대로 수정합니다.&amp;lt;/p&amp;gt;
                &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
# 1. 에디터로 파일 열기
# 2. &amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;, =======, &amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; 제거
# 3. 원하는 코드로 수정
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git add file.js&amp;lt;/span&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Final Steps --&amp;gt;
        &amp;lt;div class=&amp;quot;diagram-section&amp;quot;&amp;gt;
            &amp;lt;h2 style=&amp;quot;color: #1e293b; margin-bottom: 20px;&amp;quot;&amp;gt;  충돌 해결 완료&amp;lt;/h2&amp;gt;
            
            &amp;lt;div class=&amp;quot;flow-container&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;flow-step&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;step-number&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;step-content&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;step-title&amp;quot;&amp;gt;변경사항 스테이징&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;step-desc&amp;quot;&amp;gt;해결한 파일을 스테이징 영역에 추가합니다.&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git add &amp;amp;lt;충돌해결된파일&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;comment&amp;quot;&amp;gt;# 또는 모든 파일 추가&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git add .&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;arrow-down&amp;quot;&amp;gt;&amp;darr;&amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;flow-step&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;step-number&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;step-content&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;step-title&amp;quot;&amp;gt;병합 커밋 생성&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;step-desc&amp;quot;&amp;gt;충돌 해결 후 병합 커밋을 완료합니다.&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git commit -m &amp;quot;Merge conflict resolved&amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;comment&amp;quot;&amp;gt;# 또는 기본 병합 메시지 사용&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git commit&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;arrow-down&amp;quot;&amp;gt;&amp;darr;&amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;flow-step&amp;quot;&amp;gt;
                    &amp;lt;div class=&amp;quot;step-number&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;quot;step-content&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;step-title&amp;quot;&amp;gt;원격 저장소에 푸시&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;step-desc&amp;quot;&amp;gt;해결된 내용을 원격 저장소에 반영합니다.&amp;lt;/div&amp;gt;
                        &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git push origin main&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Abort Option --&amp;gt;
        &amp;lt;div class=&amp;quot;conflict-example&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;conflict-title&amp;quot;&amp;gt;  병합 취소 (충돌 해결 포기)&amp;lt;/div&amp;gt;
            &amp;lt;p style=&amp;quot;color: #475569; margin-bottom: 10px;&amp;quot;&amp;gt;충돌 해결이 어렵거나 병합을 취소하고 싶을 때:&amp;lt;/p&amp;gt;
            &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git merge --abort&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;comment&amp;quot;&amp;gt;# 또는 rebase 중이었다면&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git rebase --abort&amp;lt;/span&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Tips Section --&amp;gt;
        &amp;lt;div class=&amp;quot;tips-section&amp;quot;&amp;gt;
            &amp;lt;h3&amp;gt;  충돌을 줄이는 Best Practices&amp;lt;/h3&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;자주 pull/merge:&amp;lt;/strong&amp;gt; main 브랜치의 최신 변경사항을 자주 가져와 큰 충돌을 방지&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;작은 단위로 커밋:&amp;lt;/strong&amp;gt; 작고 논리적인 단위로 자주 커밋하여 충돌 범위 최소화&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;코드 리뷰:&amp;lt;/strong&amp;gt; Pull Request를 통해 병합 전 코드 리뷰로 충돌 예방&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;책임 영역 분리:&amp;lt;/strong&amp;gt; 팀원들이 서로 다른 파일/모듈을 작업하도록 조율&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;IDE 도구 활용:&amp;lt;/strong&amp;gt; VS Code, IntelliJ 등의 병합 도구 활용으로 시각적 해결&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;테스트 실행:&amp;lt;/strong&amp;gt; 충돌 해결 후 반드시 테스트를 실행하여 정상 동작 확인&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- Common Tools --&amp;gt;
        &amp;lt;div class=&amp;quot;visual-diagram&amp;quot;&amp;gt;
            &amp;lt;h2 style=&amp;quot;color: #1e293b; margin-bottom: 20px;&amp;quot;&amp;gt; ️ 충돌 해결 도구&amp;lt;/h2&amp;gt;
            
            &amp;lt;div class=&amp;quot;resolution-grid&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;resolution-card accept-current&amp;quot;&amp;gt;
                    &amp;lt;h3&amp;gt;VS Code&amp;lt;/h3&amp;gt;
                    &amp;lt;p&amp;gt;내장된 3-way merge 에디터로 충돌을 시각적으로 해결할 수 있습니다. &amp;quot;Accept Current Change&amp;quot;, &amp;quot;Accept Incoming Change&amp;quot;, &amp;quot;Accept Both Changes&amp;quot; 버튼 제공.&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;resolution-card accept-incoming&amp;quot;&amp;gt;
                    &amp;lt;h3&amp;gt;Git GUI Tools&amp;lt;/h3&amp;gt;
                    &amp;lt;p&amp;gt;GitKraken, SourceTree, GitHub Desktop 등 GUI 도구들은 충돌을 시각적으로 표시하고 쉽게 해결할 수 있는 인터페이스를 제공합니다.&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div class=&amp;quot;resolution-card manual&amp;quot;&amp;gt;
                    &amp;lt;h3&amp;gt;git mergetool&amp;lt;/h3&amp;gt;
                    &amp;lt;p&amp;gt;명령줄에서 외부 병합 도구(vimdiff, meld, kdiff3 등)를 실행하여 충돌을 해결할 수 있습니다.&amp;lt;/p&amp;gt;
                    &amp;lt;div class=&amp;quot;code-block&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;command&amp;quot;&amp;gt;$ git mergetool&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&gt;
&lt;style&gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            padding: 40px 20px;
            min-height: 100vh;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
            background: white;
            border-radius: 20px;
            padding: 40px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
        }
        
        h1 {
            text-align: center;
            color: #2d3748;
            margin-bottom: 15px;
            font-size: 32px;
        }
        
        .subtitle {
            text-align: center;
            color: #64748b;
            margin-bottom: 40px;
            font-size: 16px;
        }
        
        /* Diagram Section */
        .diagram-section {
            background: #f8fafc;
            border-radius: 15px;
            padding: 30px;
            margin-bottom: 40px;
            border: 2px solid #e2e8f0;
        }
        
        .flow-container {
            display: flex;
            flex-direction: column;
            gap: 20px;
            margin: 20px 0;
        }
        
        .flow-step {
            display: flex;
            align-items: center;
            gap: 20px;
        }
        
        .step-number {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            width: 50px;
            height: 50px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 20px;
            font-weight: bold;
            flex-shrink: 0;
            box-shadow: 0 4px 10px rgba(102, 126, 234, 0.4);
        }
        
        .step-content {
            flex: 1;
            background: white;
            padding: 20px;
            border-radius: 12px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
        
        .step-title {
            font-size: 18px;
            font-weight: bold;
            color: #1e293b;
            margin-bottom: 8px;
        }
        
        .step-desc {
            color: #475569;
            font-size: 14px;
            line-height: 1.6;
        }
        
        .code-block {
            background: #1e293b;
            color: #e2e8f0;
            padding: 15px;
            border-radius: 8px;
            font-family: 'Courier New', monospace;
            font-size: 13px;
            margin-top: 10px;
            overflow-x: auto;
        }
        
        .command {
            color: #10b981;
        }
        
        .output {
            color: #f59e0b;
        }
        
        .arrow-down {
            text-align: center;
            color: #94a3b8;
            font-size: 24px;
            margin: 10px 0;
        }
        
        /* Conflict Example */
        .conflict-example {
            background: #fef2f2;
            border: 2px solid #fca5a5;
            border-radius: 12px;
            padding: 20px;
            margin: 20px 0;
        }
        
        .conflict-title {
            font-size: 18px;
            font-weight: bold;
            color: #dc2626;
            margin-bottom: 15px;
        }
        
        .conflict-marker {
            background: #1e293b;
            color: #e2e8f0;
            padding: 15px;
            border-radius: 8px;
            font-family: 'Courier New', monospace;
            font-size: 13px;
            white-space: pre;
        }
        
        .marker-head {
            color: #ef4444;
            font-weight: bold;
        }
        
        .marker-sep {
            color: #f59e0b;
            font-weight: bold;
        }
        
        .marker-tail {
            color: #3b82f6;
            font-weight: bold;
        }
        
        /* Resolution Methods */
        .resolution-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 20px;
            margin: 30px 0;
        }
        
        .resolution-card {
            background: white;
            border-radius: 12px;
            padding: 20px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.1);
            border-left: 4px solid;
        }
        
        .resolution-card.accept-current {
            border-left-color: #10b981;
        }
        
        .resolution-card.accept-incoming {
            border-left-color: #3b82f6;
        }
        
        .resolution-card.manual {
            border-left-color: #f59e0b;
        }
        
        .resolution-card h3 {
            font-size: 16px;
            margin-bottom: 10px;
            color: #1e293b;
        }
        
        .resolution-card p {
            color: #64748b;
            font-size: 14px;
            line-height: 1.6;
        }
        
        /* Tips Section */
        .tips-section {
            background: #eff6ff;
            border-left: 4px solid #3b82f6;
            border-radius: 10px;
            padding: 20px;
            margin-top: 30px;
        }
        
        .tips-section h3 {
            color: #1e40af;
            margin-bottom: 15px;
            font-size: 18px;
        }
        
        .tips-section ul {
            list-style: none;
            padding-left: 0;
        }
        
        .tips-section li {
            color: #475569;
            padding: 8px 0;
            padding-left: 25px;
            position: relative;
        }
        
        .tips-section li:before {
            content: &quot; &quot;;
            position: absolute;
            left: 0;
        }
        
        /* Visual Diagram */
        .visual-diagram {
            background: white;
            border-radius: 12px;
            padding: 30px;
            margin: 30px 0;
            box-shadow: 0 4px 12px rgba(0,0,0,0.1);
        }
        
        .branch-visual {
            display: flex;
            flex-direction: column;
            gap: 15px;
            margin: 20px 0;
        }
        
        .branch-line {
            display: flex;
            align-items: center;
            gap: 15px;
        }
        
        .branch-label {
            width: 100px;
            font-weight: bold;
            color: #475569;
        }
        
        .commit-line {
            display: flex;
            align-items: center;
            gap: 10px;
            flex: 1;
        }
        
        .commit {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 12px;
            font-weight: bold;
            color: white;
            box-shadow: 0 2px 6px rgba(0,0,0,0.2);
        }
        
        .commit.main {
            background: #3b82f6;
        }
        
        .commit.feature {
            background: #10b981;
        }
        
        .commit.conflict {
            background: #ef4444;
            animation: pulse 2s infinite;
        }
        
        @keyframes pulse {
            0%, 100% { transform: scale(1); }
            50% { transform: scale(1.1); }
        }
        
        .line {
            height: 2px;
            flex: 1;
            background: #cbd5e1;
        }
        
        .conflict-zone {
            background: #fef2f2;
            border: 2px dashed #ef4444;
            border-radius: 8px;
            padding: 15px;
            text-align: center;
            color: #dc2626;
            font-weight: bold;
        }
        
        @media (max-width: 768px) {
            .container {
                padding: 20px;
            }
            
            .resolution-grid {
                grid-template-columns: 1fr;
            }
            
            .flow-step {
                flex-direction: column;
                align-items: flex-start;
            }
        }
    &lt;/style&gt;
&lt;div class=&quot;container&quot;&gt;
&lt;h1&gt;  Git Conflict (충돌) 해결 절차&lt;/h1&gt;
&lt;p class=&quot;subtitle&quot; data-ke-size=&quot;size16&quot;&gt;Git 병합 충돌의 발생 원인과 해결 방법&lt;/p&gt;
&lt;!-- Visual Diagram --&gt;
&lt;div class=&quot;visual-diagram&quot;&gt;
&lt;h2 style=&quot;color: #1e293b; margin-bottom: 20px;&quot; data-ke-size=&quot;size26&quot;&gt;  충돌 발생 시나리오&lt;/h2&gt;
&lt;div class=&quot;branch-visual&quot;&gt;
&lt;div class=&quot;branch-line&quot;&gt;
&lt;div class=&quot;branch-label&quot;&gt;main 브랜치&lt;/div&gt;
&lt;div class=&quot;commit-line&quot;&gt;
&lt;div class=&quot;commit main&quot;&gt;A&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;commit main&quot;&gt;B&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;commit main&quot;&gt;C&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;commit main&quot;&gt;D&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;branch-line&quot;&gt;
&lt;div class=&quot;branch-label&quot;&gt;feature 브랜치&lt;/div&gt;
&lt;div class=&quot;commit-line&quot;&gt;
&lt;div class=&quot;commit main&quot;&gt;A&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;commit main&quot;&gt;B&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;commit feature&quot;&gt;E&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;commit feature&quot;&gt;F&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;conflict-zone&quot;&gt;⚠️ C와 E가 같은 파일의 같은 부분을 수정 &amp;rarr; 충돌 발생!&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- Conflict Example --&gt;
&lt;div class=&quot;conflict-example&quot;&gt;
&lt;div class=&quot;conflict-title&quot;&gt;⚠️ 충돌 파일 예시 (Conflict Markers)&lt;/div&gt;
&lt;div class=&quot;conflict-marker&quot;&gt;&lt;span class=&quot;marker-head&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;/span&gt; 현재 브랜치의 변경 사항 (예: main) const title = &quot;Main Branch Title&quot;; &lt;span class=&quot;marker-sep&quot;&gt;=======&lt;/span&gt; 병합하려는 브랜치의 변경 사항 (예: feature) const title = &quot;Feature Branch Title&quot;; &lt;span class=&quot;marker-tail&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;!-- Resolution Steps --&gt;
&lt;div class=&quot;diagram-section&quot;&gt;
&lt;h2 style=&quot;color: #1e293b; margin-bottom: 20px;&quot; data-ke-size=&quot;size26&quot;&gt;  충돌 해결 절차&lt;/h2&gt;
&lt;div class=&quot;flow-container&quot;&gt;
&lt;div class=&quot;flow-step&quot;&gt;
&lt;div class=&quot;step-number&quot;&gt;1&lt;/div&gt;
&lt;div class=&quot;step-content&quot;&gt;
&lt;div class=&quot;step-title&quot;&gt;충돌 발견&lt;/div&gt;
&lt;div class=&quot;step-desc&quot;&gt;merge 또는 rebase 시 충돌이 발생하면 Git이 자동으로 알려줍니다.&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git merge feature&lt;/span&gt; &lt;span class=&quot;output&quot;&gt;Auto-merging file.js CONFLICT (content): Merge conflict in file.js Automatic merge failed; fix conflicts and then commit the result.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow-down&quot;&gt;&amp;darr;&lt;/div&gt;
&lt;div class=&quot;flow-step&quot;&gt;
&lt;div class=&quot;step-number&quot;&gt;2&lt;/div&gt;
&lt;div class=&quot;step-content&quot;&gt;
&lt;div class=&quot;step-title&quot;&gt;충돌 파일 확인&lt;/div&gt;
&lt;div class=&quot;step-desc&quot;&gt;충돌이 발생한 파일 목록을 확인합니다.&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git status&lt;/span&gt; &lt;span class=&quot;output&quot;&gt;On branch main You have unmerged paths. Unmerged paths: (use &quot;git add &amp;lt;file&amp;gt;...&quot; to mark resolution) both modified: file.js&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow-down&quot;&gt;&amp;darr;&lt;/div&gt;
&lt;div class=&quot;flow-step&quot;&gt;
&lt;div class=&quot;step-number&quot;&gt;3&lt;/div&gt;
&lt;div class=&quot;step-content&quot;&gt;
&lt;div class=&quot;step-title&quot;&gt;충돌 해결 방법 선택&lt;/div&gt;
&lt;div class=&quot;step-desc&quot;&gt;아래 3가지 방법 중 하나를 선택하여 충돌을 해결합니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- Resolution Methods --&gt;
&lt;h2 style=&quot;color: #1e293b; margin: 30px 0 20px 0;&quot; data-ke-size=&quot;size26&quot;&gt;  충돌 해결 방법&lt;/h2&gt;
&lt;div class=&quot;resolution-grid&quot;&gt;
&lt;div class=&quot;resolution-card accept-current&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 방법 1: 현재 브랜치 변경사항 유지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 브랜치(HEAD)의 변경사항을 선택합니다.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git checkout --ours file.js&lt;/span&gt; &lt;span class=&quot;command&quot;&gt;$ git add file.js&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;resolution-card accept-incoming&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 방법 2: 들어오는 브랜치 변경사항 유지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병합하려는 브랜치의 변경사항을 선택합니다.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git checkout --theirs file.js&lt;/span&gt; &lt;span class=&quot;command&quot;&gt;$ git add file.js&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;resolution-card manual&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 방법 3: 수동으로 편집&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 직접 열어서 충돌 마커를 제거하고 원하는 대로 수정합니다.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;# 1. 에디터로 파일 열기 # 2. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;, =======, &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; 제거 # 3. 원하는 코드로 수정 &lt;span class=&quot;command&quot;&gt;$ git add file.js&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- Final Steps --&gt;
&lt;div class=&quot;diagram-section&quot;&gt;
&lt;h2 style=&quot;color: #1e293b; margin-bottom: 20px;&quot; data-ke-size=&quot;size26&quot;&gt;  충돌 해결 완료&lt;/h2&gt;
&lt;div class=&quot;flow-container&quot;&gt;
&lt;div class=&quot;flow-step&quot;&gt;
&lt;div class=&quot;step-number&quot;&gt;4&lt;/div&gt;
&lt;div class=&quot;step-content&quot;&gt;
&lt;div class=&quot;step-title&quot;&gt;변경사항 스테이징&lt;/div&gt;
&lt;div class=&quot;step-desc&quot;&gt;해결한 파일을 스테이징 영역에 추가합니다.&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git add &amp;lt;충돌해결된파일&amp;gt;&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# 또는 모든 파일 추가&lt;/span&gt; &lt;span class=&quot;command&quot;&gt;$ git add .&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow-down&quot;&gt;&amp;darr;&lt;/div&gt;
&lt;div class=&quot;flow-step&quot;&gt;
&lt;div class=&quot;step-number&quot;&gt;5&lt;/div&gt;
&lt;div class=&quot;step-content&quot;&gt;
&lt;div class=&quot;step-title&quot;&gt;병합 커밋 생성&lt;/div&gt;
&lt;div class=&quot;step-desc&quot;&gt;충돌 해결 후 병합 커밋을 완료합니다.&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git commit -m &quot;Merge conflict resolved&quot;&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# 또는 기본 병합 메시지 사용&lt;/span&gt; &lt;span class=&quot;command&quot;&gt;$ git commit&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow-down&quot;&gt;&amp;darr;&lt;/div&gt;
&lt;div class=&quot;flow-step&quot;&gt;
&lt;div class=&quot;step-number&quot;&gt;6&lt;/div&gt;
&lt;div class=&quot;step-content&quot;&gt;
&lt;div class=&quot;step-title&quot;&gt;원격 저장소에 푸시&lt;/div&gt;
&lt;div class=&quot;step-desc&quot;&gt;해결된 내용을 원격 저장소에 반영합니다.&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git push origin main&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- Abort Option --&gt;
&lt;div class=&quot;conflict-example&quot;&gt;
&lt;div class=&quot;conflict-title&quot;&gt;  병합 취소 (충돌 해결 포기)&lt;/div&gt;
&lt;p style=&quot;color: #475569; margin-bottom: 10px;&quot; data-ke-size=&quot;size16&quot;&gt;충돌 해결이 어렵거나 병합을 취소하고 싶을 때:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git merge --abort&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;# 또는 rebase 중이었다면&lt;/span&gt; &lt;span class=&quot;command&quot;&gt;$ git rebase --abort&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;!-- Tips Section --&gt;
&lt;div class=&quot;tips-section&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  충돌을 줄이는 Best Practices&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자주 pull/merge:&lt;/b&gt; main 브랜치의 최신 변경사항을 자주 가져와 큰 충돌을 방지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작은 단위로 커밋:&lt;/b&gt; 작고 논리적인 단위로 자주 커밋하여 충돌 범위 최소화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 리뷰:&lt;/b&gt; Pull Request를 통해 병합 전 코드 리뷰로 충돌 예방&lt;/li&gt;
&lt;li&gt;&lt;b&gt;책임 영역 분리:&lt;/b&gt; 팀원들이 서로 다른 파일/모듈을 작업하도록 조율&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IDE 도구 활용:&lt;/b&gt; VS Code, IntelliJ 등의 병합 도구 활용으로 시각적 해결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 실행:&lt;/b&gt; 충돌 해결 후 반드시 테스트를 실행하여 정상 동작 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- Common Tools --&gt;
&lt;div class=&quot;visual-diagram&quot;&gt;
&lt;h2 style=&quot;color: #1e293b; margin-bottom: 20px;&quot; data-ke-size=&quot;size26&quot;&gt; ️ 충돌 해결 도구&lt;/h2&gt;
&lt;div class=&quot;resolution-grid&quot;&gt;
&lt;div class=&quot;resolution-card accept-current&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VS Code&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내장된 3-way merge 에디터로 충돌을 시각적으로 해결할 수 있습니다. &quot;Accept Current Change&quot;, &quot;Accept Incoming Change&quot;, &quot;Accept Both Changes&quot; 버튼 제공.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;resolution-card accept-incoming&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Git GUI Tools&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitKraken, SourceTree, GitHub Desktop 등 GUI 도구들은 충돌을 시각적으로 표시하고 쉽게 해결할 수 있는 인터페이스를 제공합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;resolution-card manual&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;git mergetool&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령줄에서 외부 병합 도구(vimdiff, meld, kdiff3 등)를 실행하여 충돌을 해결할 수 있습니다.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;span class=&quot;command&quot;&gt;$ git mergetool&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/423</guid>
      <comments>https://gregorio78.tistory.com/423#entry423comment</comments>
      <pubDate>Tue, 27 Jan 2026 16:31:59 +0900</pubDate>
    </item>
    <item>
      <title>MySQL UTC 설정</title>
      <link>https://gregorio78.tistory.com/422</link>
      <description>&lt;h1 id=&quot;K7Xpc2x9&quot; style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 1 []&quot; data-toc-id=&quot;K7Xpc2x9&quot; data-block-id=&quot;pFRAp-&quot;&gt;1. 파일 다운로드 및 unzip 설치&lt;/h1&gt;
&lt;h2 id=&quot;bskEg9a1&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;bskEg9a1&quot; data-block-id=&quot;k5aWiR&quot; data-ke-size=&quot;size26&quot;&gt;1.1 파일 다운로드&lt;/h2&gt;
&lt;pre class=&quot;awk&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;BZ3Lh-&quot;&gt;&lt;code&gt;# 다운로드 경로 이동
cd /usr/share/zoneinfo/

# 다운로드
wget https://downloads.mysql.com/general/timezone_2025b_posix_sql.zip&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;znl4bCfN&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;znl4bCfN&quot; data-block-id=&quot;fQVt_S&quot; data-ke-size=&quot;size26&quot;&gt;1.2 unzip 설치 및 압축 해제&lt;/h2&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;TVlSoP&quot;&gt;&lt;code&gt;# 설치
sudo dnf install -y unzip
# 압축 해제
unzip timezone_2025b_posix_sql.zip&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;IJSTHzyK&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;IJSTHzyK&quot; data-block-id=&quot;9AuykY&quot;&gt;2. Database&lt;/h1&gt;
&lt;h2 id=&quot;HfungdzG&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;HfungdzG&quot; data-block-id=&quot;zj8S_T&quot; data-ke-size=&quot;size26&quot;&gt;2.1 MySQL 현재 시간대 확인&lt;/h2&gt;
&lt;pre class=&quot;autoit&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;gmzbn4&quot;&gt;&lt;code&gt;SELECT&amp;nbsp;@@global.time_zone, @@session.time_zone;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;PhMpwL&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적용 전&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;F1M8-h&quot;&gt;&lt;code&gt;+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +09:00 (또는 현재 서버 시간대) |
+--------------------+---------------------+&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;5A4yil&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적용 후&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;xoIyr3&quot;&gt;&lt;code&gt;+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;RhcmPxSr&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;RhcmPxSr&quot; data-block-id=&quot;IdAEjo&quot; data-ke-size=&quot;size26&quot;&gt;2.2 MySQL 설정 정보 변경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;CadqV6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mysql config 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;vim&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;VtkFZt&quot;&gt;&lt;code&gt;sudo vi /etc/my.cnf&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;xQH24L&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 내용 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;ja1etQ&quot;&gt;&lt;code&gt;[mysqld]
default_time_zone&amp;nbsp;=&amp;nbsp;'+00:00'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;Ud4Ah4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mysql 서비스 재시작&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;hJdA9u&quot;&gt;&lt;code&gt;sudo systemctl restart mysql&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;kuOm5cIH&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;kuOm5cIH&quot; data-block-id=&quot;kAabdN&quot; data-ke-size=&quot;size26&quot;&gt;2.3 TimeZone 정보 설치&lt;/h2&gt;
&lt;pre class=&quot;gradle&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;cx-JbS&quot;&gt;&lt;code&gt;use mysql;
SOURCE /usr/share/zoneinfo/timezone_2025b_posix_sql/timezone_posix.sql;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3ZFKW4AM&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;3ZFKW4AM&quot; data-block-id=&quot;SutpFj&quot; data-ke-size=&quot;size26&quot;&gt;2.4 데이터 저장 및 조회&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;eBKs80&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조회 : TimeZone(예: 남아공 Africa/Johannesburg)을 기준으로 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;eVx1Kx&quot;&gt;&lt;code&gt;SELECT CONVERT_TZ(CONVERT_TZ(), 'UTC', 'Africa/Johannesburg');&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;KAO9CP&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장 : UTC 기준으로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;2dc_vQ&quot;&gt;&lt;code&gt;SELECT UTC_TIMESTAMP();&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;iPlLQOUV&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;iPlLQOUV&quot; data-block-id=&quot;CDpX8-&quot;&gt;3. Spring Boot 설정&lt;/h1&gt;
&lt;pre class=&quot;dts&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;vCAa2O&quot;&gt;&lt;code&gt;# application.yml
spring:
  jackson:
    time-zone: UTC
  datasource:
    url: jdbc:mysql://localhost:3306/your_db?serverTimezone=UTC&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;PzqTHstM&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;PzqTHstM&quot; data-block-id=&quot;ib9Uhq&quot;&gt;4. Docker 환경에서 UTC 시간 고정&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상설정 방법&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-block-id=&quot;Tq8Hn_&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Container OS 시간대&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;TZ=UTC&amp;nbsp;환경 변수 설정 또는&amp;nbsp;/etc/localtime&amp;nbsp;볼륨 마운트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Spring Boot Container&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;TZ=UTC&amp;nbsp;환경 변수 +&amp;nbsp;application.yml에서&amp;nbsp;time-zone&amp;nbsp;설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;nGcoQ-jY&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;nGcoQ-jY&quot; data-block-id=&quot;Ms2U07&quot; data-ke-size=&quot;size26&quot;&gt;4.1 Container OS 시간대&lt;/h2&gt;
&lt;h3 id=&quot;mOUKVS-b&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;mOUKVS-b&quot; data-block-id=&quot;h_swRh&quot; data-ke-size=&quot;size23&quot;&gt;Docker run 예시&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;1cVKQS&quot;&gt;&lt;code&gt;docker run -e TZ=UTC image-file&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;SKu5NKjs&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;SKu5NKjs&quot; data-block-id=&quot;EMs_Mv&quot; data-ke-size=&quot;size23&quot;&gt;docker-compose.yml 예시&lt;/h3&gt;
&lt;pre class=&quot;dts&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;wBENNU&quot;&gt;&lt;code&gt;services:
  app:
    image: your-spring-boot-app
    environment:
      - TZ=UTC&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;VV_E-SAO&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;VV_E-SAO&quot; data-block-id=&quot;hc9FGk&quot; data-ke-size=&quot;size26&quot;&gt;4.2 Spring Boot Container&lt;/h2&gt;
&lt;h3 id=&quot;f6HcDQEX&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;f6HcDQEX&quot; data-block-id=&quot;8Ak8jD&quot; data-ke-size=&quot;size23&quot;&gt;Dockerfile 또는 docker-compose.yml 예시&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;hAW2Qx&quot;&gt;&lt;code&gt;services:
  spring-app:
    image: your-spring-boot-app
    environment:
      - TZ=UTC&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;OU5YIDXJ&quot; style=&quot;color: #000000; text-align: start;&quot; data-toc-id=&quot;OU5YIDXJ&quot; data-block-id=&quot;8_rSVy&quot; data-ke-size=&quot;size26&quot;&gt;4.3 확인 방법&lt;/h2&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;njvmwC&quot;&gt;&lt;code&gt;docker exec -it container-name date&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-block-id=&quot;qQsBN_&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출력 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot; data-block-id=&quot;84tqBY&quot;&gt;&lt;code&gt;Thu May  8 10:00:00 UTC 2025&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/422</guid>
      <comments>https://gregorio78.tistory.com/422#entry422comment</comments>
      <pubDate>Tue, 27 Jan 2026 16:19:37 +0900</pubDate>
    </item>
    <item>
      <title>Spring Cloud Netflix Eureka 구축 방법</title>
      <link>https://gregorio78.tistory.com/421</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Spring Cloud Netflix Eureka 개념&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 Eureka란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Eureka&lt;/b&gt;&lt;span&gt;는 Netflix OSS 기반의 &lt;/span&gt;&lt;b&gt;Service Discovery(Server/Client)&lt;/b&gt;&lt;span&gt; 컴포넌트로, &lt;/span&gt;&lt;span&gt;MSA 환경에서 &lt;/span&gt;&lt;b&gt;각 마이크로서비스의 위치(IP, Port)를 동적으로 관리&lt;/b&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;핵심 역할&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 등록(Register)&lt;/li&gt;
&lt;li&gt;서비스 조회(Discovery)&lt;/li&gt;
&lt;li&gt;헬스 체크(Heartbeat)&lt;/li&gt;
&lt;li&gt;장애 인스턴스 제거(Self-Preservation)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 Eureka 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2310&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBiHsG/dJMcahJ00Ea/5RNHi1jpknejlltwXtvaq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBiHsG/dJMcahJ00Ea/5RNHi1jpknejlltwXtvaq0/img.png&quot; data-alt=&quot;Eureka 디스커리비 서비스 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBiHsG/dJMcahJ00Ea/5RNHi1jpknejlltwXtvaq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBiHsG%2FdJMcahJ00Ea%2F5RNHi1jpknejlltwXtvaq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2310&quot; height=&quot;1606&quot; data-origin-width=&quot;2310&quot; data-origin-height=&quot;1606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Eureka 디스커리비 서비스 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Eureka Server (Port: 8761)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 레지스트리 역할&lt;/li&gt;
&lt;li&gt;등록된 서비스 목록 관리&lt;/li&gt;
&lt;li&gt;30초마다 Heartbeat로 Health Check&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Eureka Clients (마이크로서비스들)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User Service (8081)&lt;/li&gt;
&lt;li&gt;Order Service (8082)&lt;/li&gt;
&lt;li&gt;Product Service (8083)&lt;/li&gt;
&lt;li&gt;Payment Service (8084)&lt;/li&gt;
&lt;li&gt;각 서비스는 @EnableEurekaClient 어노테이션 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;API Gateway (Port: 8080)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eureka에서 서비스 목록 조회&lt;/li&gt;
&lt;li&gt;동적 라우팅 및 로드밸런싱&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 흐름:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 등록&lt;/b&gt;: 각 서비스가 시작 시 Eureka에 자신의 정보 등록&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Heartbeat&lt;/b&gt;: 30초마다 살아있음을 알림&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 조회&lt;/b&gt;: Gateway가 Eureka에서 서비스 위치 파악&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 라우팅&lt;/b&gt;: 요청을 적절한 서비스로 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동적 서비스 발견, 로드 밸런싱, Health Check&lt;/li&gt;
&lt;li&gt;자가 복구, 동적 확장, 무중단 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Eureka Server&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 목록 저장 및 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Eureka Client&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스 자신을 서버에 등록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Heartbeat&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;주기적 상태 보고&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Self-Preservation&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;네트워크 장애 시 서비스 보호&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.3 Eureka를 사용하는 이유 (SI&amp;middot;MSA 관점)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;고정 IP 제거&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Auto Scaling 환경 대응&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;장애 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Down 인스턴스 자동 제거&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;서비스 분리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Gateway&amp;middot;Client 간 결합도 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;클라우드 친화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Docker / Kubernetes / AWS에 적합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. IntelliJ IDEA에서 Eureka Server 프로젝트 생성 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 프로젝트 생성 절차&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;IntelliJ IDEA &amp;rarr; New Project&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spring Initializr 선택&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Project 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Project: &lt;span&gt;Maven&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Language: &lt;span&gt;Java&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Spring Boot: &lt;span&gt;3.2.x&lt;/span&gt; 또는 &lt;span&gt;3.3.x&lt;/span&gt; 권장&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Group: &lt;/span&gt;com.example&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Artifact: &lt;/span&gt;eureka-server&lt;/li&gt;
&lt;li&gt;Packaging: &lt;span&gt;Jar&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Java: &lt;span&gt;17&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dependencies 선택&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring Cloud Discovery &amp;rarr; Eureka Server&lt;/li&gt;
&lt;li&gt;&lt;span&gt;(Optional) &lt;/span&gt;Spring Boot Actuator&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Finish&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 Spring Cloud 버전 설정 (중요)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;pom.xml&lt;/span&gt;&lt;span&gt;에 &lt;/span&gt;&lt;b&gt;Spring Cloud BOM&lt;/b&gt;&lt;span&gt; 반드시 추가해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;Spring Boot 3.x + Spring Cloud 2023.x 조합 필수&lt;/blockquote&gt;
&lt;pre id=&quot;code_1769497242557&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2023.0.1&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Eureka Server 애플리케이션 구성&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1 메인 클래스 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1769497296960&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;application.yml&lt;/b&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구성 예제 (Eureka Server)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 단일 Eureka Server (개발&amp;middot;기본)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1769497373474&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  client:
    register-with-eureka: false   # Server는 Client가 아니므로 false
    fetch-registry: false         # 단일 서버일 경우 false
  server:
    enable-self-preservation: true # 네트워크 장애 대비&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 운영 환경용 (권장 옵션 포함)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1769497501323&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: eureka-01
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka-01:8761/eureka/
  server:
    eviction-interval-timer-in-ms: 60000
    enable-self-preservation: true&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.3 Eureka Server HA 구성 (2대 이상)&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;실무에서는 &lt;/span&gt;&lt;b&gt;Load Balancer + 2~3대 Eureka Server&lt;/b&gt;&lt;span&gt; 구성 권장&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1769497519920&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: &amp;gt;
        http://eureka-01:8761/eureka/,
        http://eureka-02:8761/eureka/&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Eureka Client (Spring Boot)&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1769497565566&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  application:
    name: order-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 실무 운영 시 주의사항&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;&lt;b&gt;권장&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Eureka 보안&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;내부망 전용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Gateway 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Gateway는 반드시 Eureka Client&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Kubernetes&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;K8s 환경에서는 Eureka 대신 K8s Service 고려&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;장애 보호&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Self-Preservation 비활성화 금지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모니터링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;Actuator + &lt;/span&gt;/actuator/health&lt;span&gt; 연계&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA/Spring Cloud Eureka</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/421</guid>
      <comments>https://gregorio78.tistory.com/421#entry421comment</comments>
      <pubDate>Tue, 27 Jan 2026 16:08:13 +0900</pubDate>
    </item>
    <item>
      <title>Agile의 가치/원칙 및 전략/운영/연계</title>
      <link>https://gregorio78.tistory.com/420</link>
      <description>&lt;h1&gt;&lt;b&gt;1. Agile Manifesto 4대 가치 &amp;middot; 12원칙 정리&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.1 Agile Manifesto 4대 가치&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스와 도구보다 개인과 상호작용&lt;/li&gt;
&lt;li&gt;계약 협상보다 고객과의 협업&lt;/li&gt;
&lt;li&gt;계획 준수보다 변화에 대한 대응&lt;/li&gt;
&lt;li&gt;포괄적인 문서보다 작동하는 소프트웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.2 Agile 12원칙 요약&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고객 만족을 최우선으로 한다&lt;/li&gt;
&lt;li&gt;요구사항 변경을 환영한다&lt;/li&gt;
&lt;li&gt;짧은 주기로 작동하는 소프트웨어를 제공한다&lt;/li&gt;
&lt;li&gt;비즈니스와 개발자는 매일 협업한다&lt;/li&gt;
&lt;li&gt;동기부여된 개인 중심의 팀을 구성한다&lt;/li&gt;
&lt;li&gt;대면 커뮤니케이션을 가장 효과적으로 본다&lt;/li&gt;
&lt;li&gt;작동하는 소프트웨어가 진척도의 기준이다&lt;/li&gt;
&lt;li&gt;지속 가능한 개발 속도를 유지한다&lt;/li&gt;
&lt;li&gt;기술적 완성도와 좋은 설계를 중시한다&lt;/li&gt;
&lt;li&gt;단순성을 추구한다&lt;/li&gt;
&lt;li&gt;자율적인 팀에서 최상의 결과가 나온다&lt;/li&gt;
&lt;li&gt;정기적으로 프로세스를 개선한다&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;&lt;b&gt;2. SI&amp;middot;공공 프로젝트에서 Agile 적용 전략&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1 공공&amp;middot;SI 프로젝트의 현실적 제약&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;제약 사항&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;계약 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;고정 범위&amp;middot;고정 금액&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;문서 요구&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;산출물 중심 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;절차&amp;middot;승인 복잡&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;감사&amp;middot;감리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Waterfall 기반 기준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;순수 Agile 적용은 현실적으로 어려움&quot;&lt;/b&gt;이 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2 실무적 대안: Hybrid Agile&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZvFjR/dJMcabwePLt/in5EdljlQPKLA2REbHXKmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZvFjR/dJMcabwePLt/in5EdljlQPKLA2REbHXKmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZvFjR/dJMcabwePLt/in5EdljlQPKLA2REbHXKmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZvFjR%2FdJMcabwePLt%2Fin5EdljlQPKLA2REbHXKmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1592&quot; height=&quot;1080&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;관리 체계는 Waterfall, 실행은 Agile&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;영역&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;적용 전략&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구사항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상위 요구사항 고정 + 상세 요구사항 Sprint 단위&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Sprint 산출물을 문서로 환원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Change 요청 &amp;rarr; Backlog 재정렬&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;감리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Sprint 결과물 기준 검증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;b&gt;3. Scrum 기반 실무 운영 예시&lt;/b&gt;&lt;/h1&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.1 Scrum 기본 구성&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;책임&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Product Owner&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;요구사항 우선순위&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Scrum Master&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;프로세스 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Dev Team&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개발&amp;middot;테스트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.2 실무 Sprint 운영 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxKTi/dJMcaiIRVhs/uKYCqJFzKdbHm8SSJHvFm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxKTi/dJMcaiIRVhs/uKYCqJFzKdbHm8SSJHvFm1/img.png&quot; data-alt=&quot;2주(10일) Sprint 주기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxKTi/dJMcaiIRVhs/uKYCqJFzKdbHm8SSJHvFm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxKTi%2FdJMcaiIRVhs%2FuKYCqJFzKdbHm8SSJHvFm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2196&quot; height=&quot;1306&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2주(10일) Sprint 주기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sprint 사이클 (2주/10일):&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Sprint Planning&lt;/b&gt; (4시간)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sprint Goal 설정&lt;/li&gt;
&lt;li&gt;User Story 선정&lt;/li&gt;
&lt;li&gt;Task 분해 및 추정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발 기간&lt;/b&gt; (10일)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설계 및 구현&lt;/li&gt;
&lt;li&gt;코드 리뷰, 단위/통합 테스트&lt;/li&gt;
&lt;li&gt;CI/CD 파이프라인, 버그 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Daily Scrum&lt;/b&gt; (매일 15분)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어제 무엇을 했나?&lt;/li&gt;
&lt;li&gt;오늘 무엇을 할 것인가?&lt;/li&gt;
&lt;li&gt;장애물이 있나?&lt;/li&gt;
&lt;li&gt;서서 진행, 같은 시간/장소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sprint Review&lt;/b&gt; (2시간)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;완성된 기능 시연&lt;/li&gt;
&lt;li&gt;이해관계자 피드백&lt;/li&gt;
&lt;li&gt;Product Backlog 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sprint Retrospective&lt;/b&gt; (1.5시간)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘한 점 (Keep)&lt;/li&gt;
&lt;li&gt;개선할 점 (Problem)&lt;/li&gt;
&lt;li&gt;실행 계획 (Try)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Daily Scrum은 개발 기간 동안 매일 반복&lt;/li&gt;
&lt;li&gt;모든 이벤트는 Time-boxed&lt;/li&gt;
&lt;li&gt;회고 후 다음 Sprint로 순환&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;b&gt;4. MSA&amp;middot;DevOps 환경에서 Agile 연계 구조&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.1 Agile + MSA 구조적 궁합&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;b&gt;Agile 특성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;b&gt;MSA와의 연계&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;반복 개발&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;서비스 단위 배포&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;자율 팀&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;서비스별 독립 팀&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;빠른 피드백&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;독립 장애 영향&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.2 Agile &amp;middot; DevOps &amp;middot; MSA 통합 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2140&quot; data-origin-height=&quot;1498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWgbE6/dJMcajuerRy/mpUSSa8p11opKVGNPQmEPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWgbE6/dJMcajuerRy/mpUSSa8p11opKVGNPQmEPk/img.png&quot; data-alt=&quot;Agile = 개발 방식, DevOps = 전달 방식, MSA = 구조적 기반&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWgbE6/dJMcajuerRy/mpUSSa8p11opKVGNPQmEPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWgbE6%2FdJMcajuerRy%2FmpUSSa8p11opKVGNPQmEPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2140&quot; height=&quot;1498&quot; data-origin-width=&quot;2140&quot; data-origin-height=&quot;1498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Agile = 개발 방식, DevOps = 전달 방식, MSA = 구조적 기반&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.3 실무 기술 스택 예시&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;영역&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;기술&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Gateway&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Spring Cloud Gateway&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Discovery&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Eureka&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;CI/CD&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Jenkins + Docker&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Infra&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;AWS / Kubernetes&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Observability&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ELK, Loki, Prometheus&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Config&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Spring Cloud Config&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/420</guid>
      <comments>https://gregorio78.tistory.com/420#entry420comment</comments>
      <pubDate>Tue, 27 Jan 2026 15:47:03 +0900</pubDate>
    </item>
    <item>
      <title>Agile 개발방법론</title>
      <link>https://gregorio78.tistory.com/419</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 요구사항의 지속적인 변화와 단순 설계의 시작 기법, Agile 방법론의 개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 소프트웨어 개발 환경에서는 요구사항을 초기에 명확히 정의하고 이를 기반으로 순차적으로 개발을 진행하는 방식이 주를 이루었다. 그러나 인터넷, 모바일, 클라우드 환경의 확산과 함께 비즈니스 환경이 급변하면서 &lt;span&gt;&lt;b&gt;요구사항은 개발 도중에도 지속적으로 변경&lt;/b&gt;&lt;/span&gt;되는 것이 일반화되었다. 이러한 변화 속에서 초기 요구사항을 고정하는 방식은 오히려 프로젝트 실패의 원인이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile 방법론은 이러한 한계를 극복하기 위해 등장하였다. Agile의 핵심 전제는 &lt;b&gt;&amp;ldquo;변화는 필연적이며, 변화에 대응하는 능력이 곧 경쟁력&amp;rdquo;&lt;/b&gt;이라는 인식이다. 따라서 Agile에서는 모든 요구사항을 처음부터 완벽히 정의하지 않고, &lt;span&gt;&lt;b&gt;가장 중요한 기능부터 단순하게 설계(Simple Design)&lt;/b&gt;&lt;/span&gt; 한 뒤 반복적(iterative)으로 개선해 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Agile은 다음과 같은 개발 철학을 기반으로 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항은 개발 과정 전반에 걸쳐 지속적으로 진화한다.&lt;/li&gt;
&lt;li&gt;완벽한 초기 설계보다 &lt;span&gt;&lt;b&gt;지속적인 피드백과 개선&lt;/b&gt;&lt;/span&gt;이 중요하다.&lt;/li&gt;
&lt;li&gt;짧은 개발 주기를 통해 빠르게 가치를 전달한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 철학을 구체화한 것이 &lt;span&gt;&lt;b&gt;Agile 개발방법론&lt;/b&gt;&lt;/span&gt;이며, 이는 2001년 발표된 &lt;b&gt;Agile Manifesto(애자일 선언문)&lt;/b&gt;를 이론적 기반으로 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Agile 방법론의 특징 및 종류&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 Agile 방법론의 주요 특징&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;Agile은 &amp;ldquo;빠르게 만들고, 자주 검증하며, 지속적으로 개선하는 개발 방식&amp;rdquo;이다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%; text-align: center;&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%; text-align: center;&quot;&gt;&lt;b&gt;개념적 설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%; text-align: center;&quot;&gt;&lt;b&gt;실무 적용 관점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;반복적&amp;middot;점진적 개발 (Iterative &amp;amp; Incremental)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;짧은 주기로 설계&amp;middot;개발&amp;middot;테스트를 반복하며 기능을 점진적으로 확장&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;Sprint 단위로 기능을 나누어 개발 및 단계적 오픈&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;변화 중심 요구사항 관리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;요구사항 변경을 예외가 아닌 정상 흐름으로 수용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;Backlog 재정렬로 변경사항 즉시 반영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;단순 설계(Simple Design)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;현재 요구사항을 충족하는 최소 설계부터 시작&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;과도한 선설계 제거, 리팩토링 전제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;작동하는 소프트웨어 우선&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;문서보다 실제 동작 가능한 결과물 중시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;Sprint 종료 시 실행 가능한 화면&amp;middot;API 제공&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;고객과의 지속적 협업&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;고객&amp;middot;업무 담당자가 개발 과정에 직접 참여&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;Sprint Review를 통한 정기 피드백&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;자율적&amp;middot;협업 중심 팀&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;팀이 스스로 계획&amp;middot;추정&amp;middot;문제 해결 수행&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;PO&amp;middot;개발팀 간 의사결정 최소 간섭&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;지속 가능한 개발 속도&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;단기 성과보다 장기적 안정성 중시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;무리한 야근 배제, Velocity 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;품질 내재화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;테스트와 품질 관리를 개발 과정에 통합&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;TDD, 자동화 테스트, CI 적용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;투명한 진행 상황 공유&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;진행 상황을 실시간으로 가시화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;Task Board, Burn-down Chart 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;span&gt;지속적 개선(Inspect &amp;amp; Adapt)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.6512%;&quot;&gt;&lt;span&gt;정기적 회고를 통해 프로세스 개선&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.5814%;&quot;&gt;&lt;span&gt;Sprint Retrospective 실행&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 Agile 방법론의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile은 단일 방법론이 아니라, 여러 실천 기법(Methodology)의 집합이다. 대표적인 종류는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법론&lt;/b&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 29.8837%;&quot;&gt;&lt;b&gt;&lt;span&gt;방법론&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 70%;&quot;&gt;&lt;b&gt;&lt;span&gt;주요 특징&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8837%;&quot;&gt;&lt;span&gt;&lt;b&gt;Scrum&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&lt;span&gt;가장 널리 사용, Sprint 기반 개발, Product Owner&amp;middot;Scrum Master&amp;middot;Development Team 역할 구분&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8837%;&quot;&gt;&lt;span&gt;&lt;b&gt;XP (Extreme Programming)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&lt;span&gt;코드 품질 강조, TDD, Pair Programming, 지속적 통합(CI)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8837%;&quot;&gt;&lt;span&gt;&lt;b&gt;Kanban&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&lt;span&gt;작업 흐름 시각화, WIP 제한, 운영&amp;middot;유지보수 환경에 적합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8837%;&quot;&gt;&lt;span&gt;&lt;b&gt;Lean Software Development&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&lt;span&gt;낭비 제거, 가치 중심 개발&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.8837%;&quot;&gt;&lt;span&gt;&lt;b&gt;SAFe (Scaled Agile Framework)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70%;&quot;&gt;&lt;span&gt;대규모 조직에서 Agile 확장 적용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Agile 방법론과 전통적 개발 방법론 비교&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile 방법론과 전통적 개발 방법론(Waterfall 등)은 근본적인 접근 방식에서 차이가 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;전통적 개발 방법론&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;Agile 방법론&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;요구사항&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;초기에 고정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속적으로 변경 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;개발 방식&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;순차적 단계 진행&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;반복&amp;middot;점진적 개발&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;설계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;상세 설계 선행&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단순 설계 후 점진적 보완&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;고객 참여&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제한적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속적 참여&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;비용&amp;middot;절차 부담 큼&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;자연스럽게 수용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;산출물&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;최종 단계에서 제공&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;반복 주기마다 제공&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;리스크 대응&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;후반에 집중&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;초기부터 분산 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적 방법론은 요구사항이 명확하고 변경 가능성이 낮은 프로젝트에 적합한 반면, Agile은 &lt;span&gt;&lt;b&gt;불확실성과 변화가 큰 환경&lt;/b&gt;&lt;/span&gt;에서 강점을 발휘한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Agile 방법론의 적용분야 및 평가&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 Agile 방법론의 적용 분야&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile 방법론은 현재 다음과 같은 분야에서 활발히 적용되고 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;웹&amp;middot;모바일 서비스 개발&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클라우드 및 MSA 기반 시스템&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스타트업 및 신사업 개발&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DevOps&amp;middot;CI/CD 환경&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SI 프로젝트 중 일부 모듈 또는 단계적 오픈 구조&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 요구사항 변경이 빈번하고, 빠른 시장 반응이 필요한 서비스 개발에서 효과가 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 Agile 방법론의 평가&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;한계&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변화에 대한 대응력 우수&lt;/li&gt;
&lt;li&gt;고객 만족도 향상&lt;/li&gt;
&lt;li&gt;빠른 가치 전달&lt;/li&gt;
&lt;li&gt;리스크 조기 발견 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명확한 문서 산출물이 부족할 수 있음&lt;/li&gt;
&lt;li&gt;팀원의 숙련도에 따라 성과 편차 발생&lt;/li&gt;
&lt;li&gt;대규모 조직에서는 관리 복잡성 증가&lt;/li&gt;
&lt;li&gt;공공&amp;middot;규제 중심 프로젝트에는 적용 시 조정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Agile은 &lt;span&gt;&lt;b&gt;모든 프로젝트에 만능 해법은 아니며&lt;/b&gt;&lt;/span&gt;, 조직 문화, 프로젝트 성격, 계약 구조를 고려한 &lt;span&gt;&lt;b&gt;혼합형(Hybrid) 접근&lt;/b&gt;&lt;/span&gt;이 현실적인 대안으로 평가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론적 정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile 개발방법론은 단순한 개발 기법이 아니라, &lt;span&gt;&lt;b&gt;변화를 수용하는 사고방식이자 조직 운영 철학&lt;/b&gt;&lt;/span&gt;이다. 지속적으로 변화하는 IT 환경 속에서 Agile은 빠른 대응력과 고객 중심 가치를 제공하지만, 성공적인 적용을 위해서는 조직 문화와 프로젝트 특성에 맞는 전략적 선택이 필요하다.&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;주요 출처&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[공식 출처]&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Agile Manifesto (2001)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kent Beck, Martin Fowler, Ken Schwaber 등 17인의 개발자 공동 선언&lt;/li&gt;
&lt;li&gt;공식 사이트:&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://agilemanifesto.org&quot;&gt;https://agilemanifesto.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scrum Guide&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ken Schwaber &amp;amp; Jeff Sutherland&lt;/li&gt;
&lt;li&gt;Scrum의 공식 정의 문서&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scrumguides.org&quot;&gt;https://scrumguides.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Extreme Programming Explained&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kent Beck&lt;/li&gt;
&lt;li&gt;XP 방법론의 이론적 기반 서적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[학술&amp;middot;실무 참고 문헌]&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sommerville, &lt;i&gt;Software Engineering&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Pressman, &lt;i&gt;Software Engineering: A Practitioner&amp;rsquo;s Approach&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;PMI, &lt;i&gt;Agile Practice Guide&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;SAFe 공식 문서: &lt;a href=&quot;https://scaledagileframework.com&quot;&gt;https://scaledagileframework.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>정보관리기술사/SW공학</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/419</guid>
      <comments>https://gregorio78.tistory.com/419#entry419comment</comments>
      <pubDate>Tue, 27 Jan 2026 15:28:19 +0900</pubDate>
    </item>
    <item>
      <title>Spring Cloud MSA 아키텍처</title>
      <link>https://gregorio78.tistory.com/418</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Spring Cloud MSA 개념도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDaTZL/dJMcahpHPUc/xVPPkK7qVURfeG4kyQ2Whk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDaTZL/dJMcahpHPUc/xVPPkK7qVURfeG4kyQ2Whk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDaTZL/dJMcahpHPUc/xVPPkK7qVURfeG4kyQ2Whk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDaTZL%2FdJMcahpHPUc%2FxVPPkK7qVURfeG4kyQ2Whk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;774&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;컴포넌트별 역할 및 관계&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;background-color: #ffffff; color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #667eea; text-align: center;&quot;&gt;&lt;b&gt;컴포넌트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #4a5568; text-align: center;&quot;&gt;&lt;b&gt;주요 역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #4a5568; text-align: center;&quot;&gt;&lt;b&gt;다른 컴포너트와의 관계&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #667eea;&quot;&gt;Eureka Server&lt;br /&gt;(Service Registry)&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull; 마이크로서비스 등록 및 관리&lt;br /&gt;&amp;bull; 서비스 인스턴스 정보 저장&lt;br /&gt;&amp;bull; 서비스 Health Check&lt;br /&gt;&amp;bull; 서비스 디스커버리 제공&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Spring Boot 서비스들:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 서비스가 시작 시 Eureka에 자동 등록 (Eureka Client)&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Gateway:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway가 Eureka를 조회하여 서비스 위치 파악&lt;br /&gt;&amp;bull; 30초마다 Heartbeat로 서비스 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #667eea;&quot;&gt;Spring Cloud Gateway&lt;br /&gt;(API Gateway)&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull; 단일 진입점(Single Entry Point)&lt;br /&gt;&amp;bull; 동적 라우팅 및 로드밸런싱&lt;br /&gt;&amp;bull; 인증/인가 처리&lt;br /&gt;&amp;bull; Rate Limiting, Circuit Breaker&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Client:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든 클라이언트 요청을 받는 진입점&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Eureka:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Eureka에서 서비스 목록을 조회하여 동적 라우팅&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Spring Boot 서비스들:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요청을 적절한 서비스로 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f7fafc;&quot;&gt;
&lt;td style=&quot;color: #667eea;&quot;&gt;Spring Boot Services&lt;br /&gt;(Microservices)&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull; 각 도메인별 비즈니스 로직 처리&lt;br /&gt;&amp;bull; 독립적인 배포 및 확장&lt;br /&gt;&amp;bull; 자체 데이터베이스 관리&lt;br /&gt;&amp;bull; RESTful API 제공&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Eureka:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시작 시 Eureka에 자신을 등록 (@EnableEurekaClient)&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Gateway:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway를 통해 요청을 받음&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;다른 서비스들:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Feign Client로 서비스 간 통신 (Eureka 통해 서비스 검색)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동작 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 서비스 시작:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 Spring Boot 서비스가 시작되면 Eureka Server에 자동 등록&lt;/span&gt;&lt;br /&gt;&lt;b&gt;2. 클라이언트 요청:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클라이언트가 Gateway(8080)로 요청 전송&lt;/span&gt;&lt;br /&gt;&lt;b&gt;3. 서비스 검색:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway가 Eureka에서 대상 서비스의 인스턴스 정보 조회&lt;/span&gt;&lt;br /&gt;&lt;b&gt;4. 라우팅:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway가 로드밸런싱을 통해 적절한 서비스 인스턴스로 요청 전달&lt;/span&gt;&lt;br /&gt;&lt;b&gt;5. 응답 반환:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서비스 처리 후 Gateway를 통해 클라이언트에 응답 반환&lt;/span&gt;&lt;/p&gt;</description>
      <category>MSA</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/418</guid>
      <comments>https://gregorio78.tistory.com/418#entry418comment</comments>
      <pubDate>Tue, 27 Jan 2026 15:21:04 +0900</pubDate>
    </item>
    <item>
      <title>Spring Cloud MSA 아키텍처</title>
      <link>https://gregorio78.tistory.com/417</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Spring Cloud MSA 개념도&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDaTZL/dJMcahpHPUc/xVPPkK7qVURfeG4kyQ2Whk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDaTZL/dJMcahpHPUc/xVPPkK7qVURfeG4kyQ2Whk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDaTZL/dJMcahpHPUc/xVPPkK7qVURfeG4kyQ2Whk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDaTZL%2FdJMcahpHPUc%2FxVPPkK7qVURfeG4kyQ2Whk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;774&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;컴포넌트별 역할 및 관계&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;background-color: #ffffff; color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #667eea; text-align: center;&quot;&gt;&lt;b&gt;컴포넌트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #4a5568; text-align: center;&quot;&gt;&lt;b&gt;주요 역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #4a5568; text-align: center;&quot;&gt;&lt;b&gt;다른 컴포너트와의 관계&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #667eea;&quot;&gt;Eureka Server&lt;br /&gt;(Service Registry)&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull; 마이크로서비스 등록 및 관리&lt;br /&gt;&amp;bull; 서비스 인스턴스 정보 저장&lt;br /&gt;&amp;bull; 서비스 Health Check&lt;br /&gt;&amp;bull; 서비스 디스커버리 제공&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Spring Boot 서비스들:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 서비스가 시작 시 Eureka에 자동 등록 (Eureka Client)&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Gateway:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway가 Eureka를 조회하여 서비스 위치 파악&lt;br /&gt;&amp;bull; 30초마다 Heartbeat로 서비스 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #667eea;&quot;&gt;Spring Cloud Gateway&lt;br /&gt;(API Gateway)&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull; 단일 진입점(Single Entry Point)&lt;br /&gt;&amp;bull; 동적 라우팅 및 로드밸런싱&lt;br /&gt;&amp;bull; 인증/인가 처리&lt;br /&gt;&amp;bull; Rate Limiting, Circuit Breaker&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Client:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든 클라이언트 요청을 받는 진입점&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Eureka:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Eureka에서 서비스 목록을 조회하여 동적 라우팅&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Spring Boot 서비스들:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요청을 적절한 서비스로 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f7fafc;&quot;&gt;
&lt;td style=&quot;color: #667eea;&quot;&gt;Spring Boot Services&lt;br /&gt;(Microservices)&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull; 각 도메인별 비즈니스 로직 처리&lt;br /&gt;&amp;bull; 독립적인 배포 및 확장&lt;br /&gt;&amp;bull; 자체 데이터베이스 관리&lt;br /&gt;&amp;bull; RESTful API 제공&lt;/td&gt;
&lt;td style=&quot;color: #4a5568;&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Eureka:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시작 시 Eureka에 자신을 등록 (@EnableEurekaClient)&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Gateway:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway를 통해 요청을 받음&lt;br /&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;다른 서비스들:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Feign Client로 서비스 간 통신 (Eureka 통해 서비스 검색)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동작 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 서비스 시작:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 Spring Boot 서비스가 시작되면 Eureka Server에 자동 등록&lt;/span&gt;&lt;br /&gt;&lt;b&gt;2. 클라이언트 요청:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클라이언트가 Gateway(8080)로 요청 전송&lt;/span&gt;&lt;br /&gt;&lt;b&gt;3. 서비스 검색:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway가 Eureka에서 대상 서비스의 인스턴스 정보 조회&lt;/span&gt;&lt;br /&gt;&lt;b&gt;4. 라우팅:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gateway가 로드밸런싱을 통해 적절한 서비스 인스턴스로 요청 전달&lt;/span&gt;&lt;br /&gt;&lt;b&gt;5. 응답 반환:&lt;/b&gt;&lt;span style=&quot;background-color: #edf2f7; color: #4a5568; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서비스 처리 후 Gateway를 통해 클라이언트에 응답 반환&lt;/span&gt;&lt;/p&gt;</description>
      <category>MSA</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/417</guid>
      <comments>https://gregorio78.tistory.com/417#entry417comment</comments>
      <pubDate>Tue, 27 Jan 2026 12:30:31 +0900</pubDate>
    </item>
    <item>
      <title>MSA&amp;middot;클라우드 환경에 적용하는 관점과 공공/SI 프로젝트 기준의 실무 체크리스트</title>
      <link>https://gregorio78.tistory.com/416</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. MSA&amp;middot;클라우드 환경에서의 IT Governance 적용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 전통적 IT Governance와 MSA/클라우드의 차이&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;전통적 환경&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;MSA&amp;middot;클라우드 환경&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;아키텍처&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;모놀리식&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;분산형(Microservices)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;인프라&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;온프레미스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;클라우드(IaaS/PaaS/SaaS)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;변경 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;느리고 중앙집중&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;빈번하고 자동화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;책임 구조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 부서 중심&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;제품/도메인 중심&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;위험 요소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;단일 장애&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;복잡성&amp;middot;연쇄 장애&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;➡ &lt;/span&gt;&lt;b&gt;MSA&amp;middot;클라우드 환경에서는 &amp;lsquo;통제 중심&amp;rsquo;이 아닌 &amp;lsquo;가드레일 기반 거버넌스&amp;rsquo;가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 MSA&amp;middot;클라우드 환경에서 IT Governance 핵심 적용 원칙&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;① 전략적 연계 (Strategic Alignment)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비즈니스 전략 &amp;harr; 클라우드/MSA 전환 로드맵 연계&lt;/li&gt;
&lt;li&gt;&amp;ldquo;왜 MSA인가?&amp;rdquo;에 대한 명확한 경영적 근거 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용 예&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 확장성 &amp;rarr; Auto Scaling&lt;/li&gt;
&lt;li&gt;글로벌 서비스 &amp;rarr; Multi-Region 설계&lt;/li&gt;
&lt;li&gt;빠른 출시 &amp;rarr; CI/CD + DevOps&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;② 가치 전달 (Value Delivery)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라우드 비용과 성과를 연계한 &lt;span&gt;&lt;b&gt;FinOps 거버넌스&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;서비스 단위 ROI 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스별 비용 태깅 (Cost Allocation Tag)&lt;/li&gt;
&lt;li&gt;불필요한 리소스 자동 정리&lt;/li&gt;
&lt;li&gt;SLA 기반 성능&amp;middot;가용성 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;③ 위험 관리 (Risk Management)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA&amp;middot;클라우드 특유의 리스크 관리가 핵심&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;리스크&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.4651%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;거버넌스 대응&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;&lt;span&gt;서비스 간 장애 전파&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.4651%;&quot;&gt;&lt;span&gt;Circuit Breaker, Timeout&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;&lt;span&gt;보안 경계 붕괴&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.4651%;&quot;&gt;&lt;span&gt;Zero Trust, API Gateway&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;&lt;span&gt;설정 오류&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.4651%;&quot;&gt;&lt;span&gt;IaC(Terraform)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;&lt;span&gt;로그 분산&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.4651%;&quot;&gt;&lt;span&gt;중앙 로그(ELK/Loki)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;④ 거버넌스 자원 관리 (Resource Management)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;중앙 통제 + 팀 자율성의 균형&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;표준 플랫폼 제공, 구현은 팀 책임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대표 자원 관리 대상&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너 표준&lt;/li&gt;
&lt;li&gt;API 규약&lt;/li&gt;
&lt;li&gt;공통 인증/로그/모니터링&lt;/li&gt;
&lt;li&gt;Redis, DB, 메시징 표준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⑤ 성과 측정 (Performance Measurement)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기술 지표 &amp;rarr; 비즈니스 지표로 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;영역&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;KPI 예시&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;안정성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;장애 건수, MTTR&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;민첩성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;배포 빈도, 리드 타임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;서비스별 클라우드 비용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;품질&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;에러율, 응답 시간&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.3 MSA&amp;middot;클라우드 환경 IT Governance 구조 예시&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;1464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I7cXZ/dJMcaaKSeTT/O9IyYkAvGUJFfSW2Qa49Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I7cXZ/dJMcaaKSeTT/O9IyYkAvGUJFfSW2Qa49Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I7cXZ/dJMcaaKSeTT/O9IyYkAvGUJFfSW2Qa49Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI7cXZ%2FdJMcaaKSeTT%2FO9IyYkAvGUJFfSW2Qa49Q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;646&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;1464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 공공 / SI 프로젝트 기준 IT Governance 체크리스트&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 공공&amp;middot;SI 프로젝트 특성&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;감사&amp;middot;규정&amp;middot;문서 중요&lt;/li&gt;
&lt;li&gt;계약 기반 범위 관리&lt;/li&gt;
&lt;li&gt;다수 이해관계자&lt;/li&gt;
&lt;li&gt;운영 안정성 최우선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;➡ &lt;/span&gt;&lt;b&gt;형식적 거버넌스가 아닌 &amp;lsquo;감사 대응 가능한 실질 거버넌스&amp;rsquo; 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 단계별 IT Governance 체크리스트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;단계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;Governance&lt;br /&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;주요 체크 항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;핵심 산출물&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;책임 주체&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;기획 / 제안&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;전략적 연계 및 거버넌스 체계 수립&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; IT Governance 조직 정의&amp;middot; 사업 목표 &amp;harr; IT 목표 매핑&amp;middot; 기술&amp;middot;보안 표준 기준 수립&amp;middot; 주요 리스크 식별&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; IT Governance 운영 방안서&amp;middot; 기술 표준 정의서&amp;middot; 리스크 관리 계획&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;발주처, PMO, CIO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;분석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;현황 파악 및 통제 범위 확정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; AS-IS / TO-BE 분석&amp;middot; EA 적용 여부 검토&amp;middot; 데이터 거버넌스 정의&amp;middot; 법&amp;middot;규제 준수 검토&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 업무/시스템 분석서&amp;middot; EA 산출물&amp;middot; 데이터 정책 문서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;아키텍트, 분석가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;설계&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;안정성&amp;middot;보안&amp;middot;확장성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 아키텍처 적합성 검토&amp;middot; 보안/접근 통제 설계&amp;middot; DR/BCP 설계&amp;middot; 성능&amp;middot;SLA 기준 정의&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 아키텍처 설계서&amp;middot; 보안 설계서&amp;middot; DR/BCP 계획서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;아키텍트, 보안 담당&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;개발&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;품질&amp;middot;변경 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 형상 관리 전략&amp;middot; 코드 리뷰&amp;middot;정적 분석&amp;middot; 보안 취약점 점검&amp;middot; 변경 승인 절차 운영&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 형상 관리 계획서&amp;middot; 개발 표준서&amp;middot; 변경 관리 기록&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;개발 리더, QA&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;품질 검증 및 리스크 최소화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 통합 테스트 수행&amp;middot; 보안&amp;middot;모의해킹 테스트&amp;middot; 성능&amp;middot;부하 테스트&amp;middot; 사용자 검증(UAT)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 테스트 결과 보고서&amp;middot; 성능 시험 보고서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;QA, 발주처&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;구축 / 이행&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영 안정성 확보&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 운영 이관 절차 검증&amp;middot; 권한&amp;middot;계정 통제&amp;middot; 로그 및 감사 설정&amp;middot; 오픈 승인 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 운영 매뉴얼&amp;middot; 이행 체크리스트&amp;middot; 오픈 승인서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영팀, PM&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;운영&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지속적 성과 및 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; SLA/KPI 모니터링&amp;middot; 장애&amp;middot;보안 사고 관리&amp;middot; 정기 감사 및 점검&amp;middot; 개선 과제 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 운영 성과 보고서&amp;middot; 장애/보안 이력&amp;middot; 개선 계획서&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;운영팀, CIO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3 공공/SI 프로젝트 IT Governance 필수 산출물&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT Governance 운영 방안서&lt;/li&gt;
&lt;li&gt;기술 표준서&lt;/li&gt;
&lt;li&gt;아키텍처 설계서&lt;/li&gt;
&lt;li&gt;보안 설계서&lt;/li&gt;
&lt;li&gt;형상 관리 계획&lt;/li&gt;
&lt;li&gt;변경 관리 절차서&lt;/li&gt;
&lt;li&gt;장애 대응 매뉴얼&lt;/li&gt;
&lt;li&gt;운영 KPI 정의서&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA&amp;middot;클라우드 환경에서의 IT Governance는 &lt;b&gt;&amp;ldquo;통제&amp;rdquo;가 아니라 &amp;ldquo;방향과 가드레일&amp;rdquo;을 제공하는 체계&lt;/b&gt;&lt;span&gt;다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 공공&amp;middot;SI 프로젝트에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전략적 연계의 명확성&lt;/li&gt;
&lt;li&gt;문서 기반 책임 체계&lt;/li&gt;
&lt;li&gt;감사 대응 가능한 실행력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 결합되어야 &lt;/span&gt;&lt;b&gt;형식적 거버넌스를 넘어 실효성 있는 거버넌스&lt;/b&gt;&lt;span&gt;가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT Governance는 기술이 아니라 &lt;span&gt;&lt;b&gt;조직의 성숙도와 의사결정 방식&lt;/b&gt;&lt;/span&gt;을 반영하는 거울이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 참고 / 출처&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;ISACA, &lt;/span&gt;&lt;b&gt;COBIT 2019 Framework&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ISO/IEC 38500:2015, &lt;i&gt;Governance of IT for the organization&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;AXELOS, &lt;/span&gt;&lt;b&gt;ITIL 4 Foundation&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Gartner, &lt;i&gt;Governing Cloud and Distributed Architectures&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;대한민국 행정안전부, &lt;/span&gt;&lt;b&gt;전자정부 표준프레임워크 아키텍처 가이드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Weill, P. &amp;amp; Ross, J. (2004), &lt;i&gt;IT Governance&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/IT경영</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/416</guid>
      <comments>https://gregorio78.tistory.com/416#entry416comment</comments>
      <pubDate>Tue, 27 Jan 2026 12:01:50 +0900</pubDate>
    </item>
    <item>
      <title>IT Governance(IT 거버넌스)</title>
      <link>https://gregorio78.tistory.com/415</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 전환(Digital Transformation)이 가속화되면서 IT는 더 이상 단순한 지원 수단이 아니라 &lt;span&gt;&lt;b&gt;기업 전략을 실현하는 핵심 자산&lt;/b&gt;&lt;/span&gt;으로 자리 잡았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 IT 투자 규모가 커질수록 실패 위험, 보안 위협, 규제 준수 문제 또한 증가하게 된다. 이러한 복잡한 환경에서 &lt;span&gt;&lt;b&gt;IT가 기업의 전략과 일관되게 운영되고, 투자 대비 가치를 창출하며, 위험을 통제하도록 관리하는 체계&lt;/b&gt;&lt;/span&gt;가 바로 &lt;b&gt;IT Governance(IT 거버넌스)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT 거버넌스는 &amp;ldquo;IT를 누가, 어떤 기준으로, 어떤 방식으로 의사결정하고 통제할 것인가&amp;rdquo;에 대한 문제를 다루며, 경영진&amp;middot;IT 조직&amp;middot;현업 간의 역할과 책임을 명확히 정의하는 경영 프레임워크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 IT Governance의 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IT Governance&lt;/b&gt;&lt;span&gt;란&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;&amp;ldquo;기업의 목표 달성을 위해 IT가 전략적으로 정렬(Alignment)되고, 가치를 창출하며, 위험을 관리하도록 하는 의사결정 구조와 책임 체계&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 단순한 IT 관리(IT Management)가 아니라,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;무엇을 할 것인가(방향)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;누가 결정할 것인가(책임)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성과를 어떻게 측정할 것인가(통제)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;를 포함하는 &lt;/span&gt;&lt;b&gt;경영 차원의 통제 메커니즘&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 IT Governance의 목적&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;전략적 연계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 전략과 기업 전략의 일관성 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;가치 전달&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 투자를 통해 비즈니스 가치 창출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;위험 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;보안, 장애, 규제 리스크 최소화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;자원 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인력, 인프라, 데이터, 애플리케이션 최적 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성과 측정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 성과를 정량&amp;middot;정성적으로 평가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3 IT Governance의 핵심 키워드&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;키워드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;정의&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;주요 관리 대상&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;적용 방식&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;성과 지표&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;전략적 연계&lt;br /&gt;(Strategic Alignment)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 전략이 기업&amp;middot;사업 전략과 일관되게 정렬되도록 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 로드맵, 아키텍처, 투자 계획&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; IT 중장기 로드맵 수립&amp;middot; EA 기반 전략 매핑&amp;middot; 사업 목표 &amp;harr; IT 목표 연결&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 전략 과제 달성률&amp;middot; IT 과제의 사업 연계 비율&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;가치 전달&lt;br /&gt;(Value Delivery)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 투자가 실제 비즈니스 가치를 창출하도록 보장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 투자, 서비스 성과, 비용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; ROI/TCO 분석&amp;middot; 서비스 단위 가치 평가&amp;middot; FinOps 적용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; IT 투자 대비 ROI&amp;middot; 운영비 절감률&amp;middot; 서비스 만족도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;위험 관리&lt;br /&gt;(Risk Management)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 관련 위험을 식별&amp;middot;통제하여 조직 피해 최소화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;보안, 장애, 규제, 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 보안 정책 수립&amp;middot; DR/BCP 운영&amp;middot; 접근 통제 및 로그 감사&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 보안 사고 건수&amp;middot; 장애 발생률&amp;middot; MTTR&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;거버넌스 자원 관리&lt;br /&gt;(Resource Management)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 자원을 효율적으로 배분&amp;middot;활용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;인력, 인프라, 애플리케이션, 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 기술 표준화&amp;middot; 공통 플랫폼 운영&amp;middot; 중복 시스템 제거&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; 인프라 활용률&amp;middot; 중복 시스템 감소율&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;성과 측정&lt;br /&gt;(Performance Measurement)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IT 활동 성과를 정량&amp;middot;정성적으로 측정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;KPI, SLA, 운영 지표&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; KPI 정의 및 대시보드&amp;middot; SLA 기반 운영 평가&amp;middot; 정기 성과 리뷰&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;middot; SLA 준수율&amp;middot; 배포 빈도&amp;middot; 장애 대응 시간&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.4 IT Governance의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8837%; text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%; text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8837%;&quot;&gt;경영 중심적&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%;&quot;&gt;CIO/CTO뿐 아니라 CEO&amp;middot;이사회 관여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8837%;&quot;&gt;의사 결정 중심&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%;&quot;&gt;기술이 아닌 &amp;ldquo;결정 구조&amp;rdquo;에 초점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8837%;&quot;&gt;표준 기반&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%;&quot;&gt;국제 프레임워크(COBIT, ITIL 등) 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8837%;&quot;&gt;지속적 개선&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%;&quot;&gt;정기적 평가 및 성숙도 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.5 IT Governance의 기능 및 기술&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT 정책 및 표준 수립&lt;/li&gt;
&lt;li&gt;투자 우선순위 결정&lt;/li&gt;
&lt;li&gt;리스크 및 컴플라이언스 관리&lt;/li&gt;
&lt;li&gt;성과 모니터링 및 보고&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;대표 프레임워크 / 기술&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 30.1163%;&quot;&gt;&lt;b&gt;&lt;span&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 69.7674%;&quot;&gt;&lt;b&gt;&lt;span&gt;내용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.1163%;&quot;&gt;&lt;span&gt;COBIT&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.7674%;&quot;&gt;&lt;span&gt;IT 거버넌스 및 관리 통합 프레임워크&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.1163%;&quot;&gt;&lt;span&gt;ITIL&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.7674%;&quot;&gt;&lt;span&gt;IT 서비스 관리(ITSM) 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.1163%;&quot;&gt;&lt;span&gt;ISO/IEC 38500&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.7674%;&quot;&gt;&lt;span&gt;IT 거버넌스 국제 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.1163%;&quot;&gt;&lt;span&gt;ISO 27001&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.7674%;&quot;&gt;&lt;span&gt;정보보안 관리체계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.1163%;&quot;&gt;&lt;span&gt;EA(Enterprise Architecture)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.7674%;&quot;&gt;&lt;span&gt;비즈니스-IT 정렬 도구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.1163%;&quot;&gt;&lt;span&gt;KPI/BSC&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.7674%;&quot;&gt;&lt;span&gt;성과 측정 도구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.6 IT Governance의 장점과 단점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IT 투자 효율성 증대&lt;/li&gt;
&lt;li&gt;리스크 및 장애 감소&lt;/li&gt;
&lt;li&gt;경영진의 가시성 확보&lt;/li&gt;
&lt;li&gt;IT와 비즈니스 간 협업 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 구축 비용과 시간 소요&lt;/li&gt;
&lt;li&gt;문서&amp;middot;프로세스 중심으로 경직될 위험&lt;/li&gt;
&lt;li&gt;조직 문화 미성숙 시 형식화 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.7 IT Governance 사례&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사례 1: 글로벌 금융사&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;COBIT 기반 IT Governance 도입&lt;/li&gt;
&lt;li&gt;IT 투자 심의 위원회 운영&lt;/li&gt;
&lt;li&gt;결과: IT 프로젝트 실패율 감소, 규제 대응 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사례 2: 국내 대기업&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EA + ITIL 기반 거버넌스 수립&lt;/li&gt;
&lt;li&gt;중복 시스템 통합 및 표준화&lt;/li&gt;
&lt;li&gt;결과: 운영 비용 절감, 서비스 안정성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사례 3: 공공기관&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISO/IEC 38500 및 ISMS 적용&lt;/li&gt;
&lt;li&gt;감사&amp;middot;보안 중심 거버넌스 강화&lt;/li&gt;
&lt;li&gt;결과: 감사 지적 감소, 대국민 서비스 신뢰도 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT Governance는 단순히 IT를 &amp;ldquo;관리&amp;rdquo;하는 체계가 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기업 전략을 실현하고 지속 가능한 가치를 창출하기 위한 경영 도구&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;span&gt;&lt;b&gt;전략적 연계, 가치 전달, 위험 관리, 자원 관리, 성과 측정&lt;/b&gt;&lt;/span&gt;이라는 다섯 가지 핵심 요소를 균형 있게 운영할 때, IT는 비용 중심 조직에서 &lt;span&gt;&lt;b&gt;경쟁 우위의 원천&lt;/b&gt;&lt;/span&gt;으로 전환될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 기술이 경영의 중심이 된 오늘날, IT Governance는 선택이 아닌 &lt;span&gt;&lt;b&gt;필수적인 경영 역량&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 참고 / 출처&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;ISACA, &lt;/span&gt;&lt;b&gt;COBIT 2019 Framework&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ISO/IEC 38500:2015, &lt;i&gt;Governance of IT for the organization&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;ITIL Foundation, AXELOS&lt;/li&gt;
&lt;li&gt;Weill, P. &amp;amp; Ross, J. (2004), &lt;i&gt;IT Governance: How Top Performers Manage IT Decision Rights&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Gartner, &lt;i&gt;IT Governance Best Practices&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/IT경영</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/415</guid>
      <comments>https://gregorio78.tistory.com/415#entry415comment</comments>
      <pubDate>Tue, 27 Jan 2026 11:04:19 +0900</pubDate>
    </item>
    <item>
      <title>데이터 아키텍처(Data Architecture, DA)</title>
      <link>https://gregorio78.tistory.com/414</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 전환(Digital Transformation)이 가속화되면서 데이터는 더 이상 단순한 저장 대상이 아니라, &lt;span&gt;&lt;b&gt;비즈니스 경쟁력을 좌우하는 핵심 자산&lt;/b&gt;&lt;/span&gt;이 되었다. 그러나 많은 조직은 데이터가 여러 시스템에 분산되어 있고, 표준 없이 생성&amp;middot;관리되면서 품질 저하, 중복, 분석 한계 등의 문제를 겪고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위한 체계적인 접근 방식이 바로 &lt;b&gt;데이터 아키텍처(Data Architecture, DA)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DA는 조직의 비즈니스 전략을 지원하기 위해 &lt;span&gt;&lt;b&gt;데이터를 어떻게 정의하고, 저장하고, 통합하고, 활용할 것인가&lt;/b&gt;&lt;/span&gt;를 구조적으로 설계하는 활동이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 본론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.1 데이터 아키텍처의 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 아키텍처(Data Architecture)&lt;/b&gt;란 다음을 포괄하는 개념이다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e;&quot; data-ke-style=&quot;style1&quot;&gt;조직의 데이터 자산에 대한 &lt;span&gt;&lt;b&gt;구조, 표준, 흐름, 관리 원칙&lt;/b&gt;&lt;/span&gt;을 정의하고, 이를 기반으로 데이터의 생성부터 활용까지 전 생명주기를 설계하는 아키텍처&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, DA는 단순한 DB 설계가 아니라 &lt;/span&gt;&lt;b&gt;비즈니스&amp;ndash;애플리케이션&amp;ndash;데이터를 연결하는 상위 설계 체계&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 데이터 아키텍처의 주요 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;비고&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 모델&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;개념/논리/물리 데이터 모델&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 모준&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;용어, 도메인, 코드 명명 규칙&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 저장소&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;RDB, NoSQL, Data Lake, Cache&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 흐름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;수집, 적재, 변환(ETL/ELT), 전송&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 통합&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;MDM, CDC, API, 메시징&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 품질&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;정합성, 정확성, 중복 제거&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 보안&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;접근 제어, 암호화, 마스킹&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;데이터 거버넌스&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;정책, 책임, 관리 체계&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3 데이터 아키텍처 계층 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 아키텍처는 일반적으로 &lt;span&gt;&lt;b&gt;3단계 모델링 계층&lt;/b&gt;&lt;/span&gt;으로 구성된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;주요 산출물&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;개념 데이터 모델&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;비즈니스 관점 이해&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;엔티티, 관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;논리 데이터 모델&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;시스템 독립 설계&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;속성, 정규화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;물리 데이터 모델&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;실제 구현&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;테이블 인덱스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WFdhW/dJMcafSXBAM/fhkxboMq9Gh9I1EDJDRP0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WFdhW/dJMcafSXBAM/fhkxboMq9Gh9I1EDJDRP0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WFdhW/dJMcafSXBAM/fhkxboMq9Gh9I1EDJDRP0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWFdhW%2FdJMcafSXBAM%2FfhkxboMq9Gh9I1EDJDRP0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;676&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;1612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.4 엔터프라이즈 환경에서의 DA 유형&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) 전통적 모놀리식 환경&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 RDB 중심&lt;/li&gt;
&lt;li&gt;정규화된 데이터 모델&lt;/li&gt;
&lt;li&gt;중앙 집중형 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) MSA(Microservices Architecture) 환경&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스별 독립 DB (Database per Service)&lt;/li&gt;
&lt;li&gt;데이터 중복 허용&lt;/li&gt;
&lt;li&gt;이벤트 기반 데이터 동기화&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;모놀리식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;MSA&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;DB 구조&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;중앙 집중&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;서비스별 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;데이터 공유&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;중앙 집중&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;API / 이벤트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;변경 영향&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;작음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;DA 난이도&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;보통&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.5 데이터 아키텍처 예시 (MSA 기반)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;1410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0uleC/dJMb99ZvoTI/XCO1XT5dSpGGYdVH7Y4eL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0uleC/dJMb99ZvoTI/XCO1XT5dSpGGYdVH7Y4eL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0uleC/dJMb99ZvoTI/XCO1XT5dSpGGYdVH7Y4eL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0uleC%2FdJMb99ZvoTI%2FXCO1XT5dSpGGYdVH7Y4eL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;679&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;1410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서 DA는 다음을 정의한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스별 데이터 소유권&lt;/li&gt;
&lt;li&gt;공통 코드 및 참조 데이터 관리 방식&lt;/li&gt;
&lt;li&gt;로그&amp;middot;이력 데이터의 저장 및 분석 흐름&lt;/li&gt;
&lt;li&gt;트랜잭션 데이터와 분석 데이터의 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.6 데이터 아키텍처와 다른 아키텍처의 관계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;아키텍처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;비즈니스 아키텍처&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;업무 구조 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;어플리케이션 아키텍처&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;시스템 기능 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;데이터 아키텍처&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;데이터 구조 및 흐름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;기술 아키텍처&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;인프라, 플랫폼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  DA는 &lt;span&gt;&lt;b&gt;모든 아키텍처의 기반&lt;/b&gt;&lt;/span&gt;이며, 잘못 설계될 경우 시스템 전체의 복잡도가 급격히 증가한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 아키텍처는 단순히 &amp;ldquo;DB를 잘 설계하는 일&amp;rdquo;이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조직의 데이터 활용 능력을 결정하는 핵심 설계 활동&lt;/b&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 다음과 같은 환경에서는 DA의 중요성이 더욱 커진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MSA 기반 분산 시스템&lt;/li&gt;
&lt;li&gt;대용량 데이터 처리 및 분석&lt;/li&gt;
&lt;li&gt;멀티 DB(RDB + NoSQL + Cache) 환경&lt;/li&gt;
&lt;li&gt;글로벌 서비스 및 다국어&amp;middot;다시간대 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 설계된 데이터 아키텍처는 다음과 같은 효과를 제공한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 품질 향상&lt;/li&gt;
&lt;li&gt;시스템 확장성 확보&lt;/li&gt;
&lt;li&gt;분석 및 AI 활용 기반 마련&lt;/li&gt;
&lt;li&gt;운영 비용 및 리스크 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;결국 &lt;/span&gt;&lt;b&gt;DA는 기술이 아닌 전략이며, 설계가 아닌 경영 자산&lt;/b&gt;&lt;span&gt;이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고 문헌 및 출처&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DAMA International, &lt;i&gt;DAMA-DMBOK 2.0 (Data Management Body of Knowledge)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Ralph Kimball, &lt;i&gt;The Data Warehouse Toolkit&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Martin Fowler, &lt;i&gt;Patterns of Enterprise Application Architecture&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;TOGAF&amp;reg; Standard, The Open Group&lt;/li&gt;
&lt;li&gt;Microsoft Azure Architecture Center &amp;ndash; Data Architecture Concepts&lt;/li&gt;
&lt;li&gt;AWS Well-Architected Framework &amp;ndash; Data Pillar&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>정보관리기술사/데이터베이스</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/414</guid>
      <comments>https://gregorio78.tistory.com/414#entry414comment</comments>
      <pubDate>Tue, 27 Jan 2026 10:35:27 +0900</pubDate>
    </item>
    <item>
      <title>실시간 미세먼지 확인</title>
      <link>https://gregorio78.tistory.com/354</link>
      <description>&lt;p&gt;&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; src=&quot;https://earth.nullschool.net/#current/chem/surface/level/overlay=cosc/orthographic=124.77,36.61,3000/loc=127.583,37.726&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;미세먼지가 해롭다는 것은 다들 알고 계실 것 입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;좋음, 나쁨, 이렇게 보는 것보다는 실시간으로 보는 것이 좋을 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;많은 도움이 됐으면 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; padding: 10px; border: 10px solid rgb(254, 137, 67); line-height: 1.5; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; font-size: 14px; text-align: start; background-color: rgb(254, 222, 199);&quot;&gt;
&lt;p style=&quot;color: rgb(101, 101, 101); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 13px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: rgb(250, 224, 212); color: rgb(0, 0, 0); font-family: Dotum, sans-serif; font-size: 14.6667px; font-weight: bold;&quot;&gt;도움이 되셨다면 로그인 없이 가능한&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;color: rgb(101, 101, 101); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 13px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(161, 161, 161); font-family: Dotum, sans-serif; font-size: 14.6667px; font-weight: bold;&quot;&gt;&lt;span style=&quot;background-color: rgb(255, 216, 216);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); background-color: rgb(250, 224, 212);&quot;&gt;아래&lt;/span&gt;&lt;span style=&quot;background-color: rgb(250, 224, 212);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0); font-size: 12pt; background-color: rgb(250, 224, 212);&quot;&gt;하트♥공감&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: rgb(250, 224, 212); color: rgb(0, 0, 0);&quot;&gt;버튼을 꾹 눌러주세요!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/354</guid>
      <comments>https://gregorio78.tistory.com/354#entry354comment</comments>
      <pubDate>Tue, 16 Oct 2018 11:03:49 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]batch</title>
      <link>https://gregorio78.tistory.com/262</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;시스템 부하가 일정 이하가 되면 예약 명령을 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/usr/bin/batch&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;batch [-V][-q 큐이름][-f 파일명][-mv][시간]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-q queue : queue 이름을 지정한다. 큐 이름으로 a~z, A~Z가 쓰일 수 있따. 큐 이름을 지정하지 않으면 at는 a, batch는 b를 사용한다. 알파벳 순서로 뒤의 이름을 갖는 큐는 더 큰 niceness 값을 갖는다. '=' 큐는 현재 수행되는 작업에 대한 큐로 예약된다. 대문자 이름의 큐에 추가된 작업은 batch의 작업처럼 처리된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-m : 출력 결과가 없어도 작업이 완료되면 사용자에게 메일을 보낸다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-f 파일명 : 스크립트 파일 등을 실행할 때 사용한다.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;batch는 시스템의 평균 부하가 0.8 이하로 내려가면 예약한 내용을 실행한다. 시스템 부하가 많이 걸리는 명령을 실행할 때 유용하다. 먼저 현재 시스템의 평균 부하를 살펴보자.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 575px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BEA84A5B8E91C614&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BEA84A5B8E91C614&quot; width=&quot;575&quot; height=&quot;53&quot; filename=&quot;uptime 실행결과.PNG&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;평균 부하가 0 정도인 것을 확인 할 수 있다. batch를 이용해 시스템의 부하를 피해 실행할 스크립트를 등록한다. 등록 후 atq 명령어를 사용해서 예약한 작업 목록을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# batch -f system_backup -m now
job 9 at 2010-06-25 04:01
#atq
9 2010-06-25 04:01 b root&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;등록된 시간을 보고 예약한 내용을 확인할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/262</guid>
      <comments>https://gregorio78.tistory.com/262#entry262comment</comments>
      <pubDate>Tue, 4 Sep 2018 23:10:26 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]basename</title>
      <link>https://gregorio78.tistory.com/261</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;경로와 확장자를 제거한 순수 파일 이름만 돌려받는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/bin/basename&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;basename [경로+파일 이름] [확장자]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;경로+파일이름 : 경로를 포함한 파일 이름&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;확장자 : 선택 옵션으로 확장자까지 제거하고 싶을 때 사용한다. 이 확장자로 파일 이름의 맨 마지막에 오는 문자열은 삭제한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;--help : 도움말을 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;--version : 버전 정보를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;basename 명령어는 경로를 포함한 파일 이름을 인수로 받아, 파일 경로를 제거하고 필요에 따라서는 확장자로 삭제하여 순수하게 파일명만 남게한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;basename을 이용하여 /etc/issue.net에서 파일 경로와 확장자를 지워보자.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 497px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9977694D5B8E900E10&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9977694D5B8E900E10&quot; width=&quot;497&quot; height=&quot;37&quot; filename=&quot;basename 실행결과.PNG&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;쉘 스크립트 등을 작성할 때, 경로를 포함한 파일 이름을 가진 어떤 변수에서 파일 이름만 추출하여 사용하고 싶을 때 basename을 사용하면 편리하다. 시스템 변수 중 MAIL은 로그인 사용자의 mail 파일과 경로를 저장한다. 이중 로그인 사용자 명만 추출하고 싶다면 다음과 같이 할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 368px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991EE4405B8E907918&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991EE4405B8E907918&quot; width=&quot;368&quot; height=&quot;69&quot; filename=&quot;basename 실행결과2.PNG&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;관련 명령어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;dirname : 경로+파일명에서 경로만 추출한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;pwd : 지정한 파일의 절대 경로를 알려준다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/261</guid>
      <comments>https://gregorio78.tistory.com/261#entry261comment</comments>
      <pubDate>Tue, 4 Sep 2018 23:03:21 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]at</title>
      <link>https://gregorio78.tistory.com/260</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;명령어나 스크립트의 실행을 예약한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/usr/bin/at&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;at [옵션] [시간] [날짜] [+증가시간]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;시간 날짜 : 명령어나 스크립트를 실행할 시간과 날짜를 지정한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;+증가시간 : 앞서 명시한 시간을 기준으로 증가 시간 만큼이 지난 후 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-q queue : queue 이름을 지정한다. 큐 이름으로 a~z, A~Z가 쓰일 수 있따. 큐 이름을 지정하지 않으면 at는 a, batch는 b를 사용한다. 알파벳 순서로 뒤의 이름을 갖는 큐는 더 큰 niceness 값을 갖는다. '=' 큐는 현재 수행되는 작업에 대한 큐로 예약된다. 대문자 이름의 큐에 추가된 작업은 batch의 작업처럼 처리된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-m : 출력 결과가 없더라도 작업이 완료될 때 사용자에게 메일을 보낸다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-f filename : 스크립트 파일 등을 실행해 줄 때 사용한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-l : 예약된 작업 목록을 보여준다. atq 명령어와 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-v : 작업이 수행될 시간을 보여준다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-d : 예약된 작업을 삭제한다.(리눅스 명령어), atrm 명령어와 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-r : 예약된 작업을 삭제한다.(유닉스 명령어), atrm 명령어와 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;at는 명령어와 스크립트 파일을 특정 시간에 실행할 수 있도록 예약하는 기능을 한다. 즉, 시스템의 부하가 적은 시간에 실행하거나 예약된 시간에 꼭 실행해야 하는 작업을 자동으로 처리하고자 할 때 사용한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;at으로 시행할 시간 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;예약작업 기능이므로 시간 설정이 중요하다. at 시간 설정은 날짜와 시간을 정해주는 시간 설정과 현재 시간이나 정해진 시간에서 증가시간을 설정해 주는 방법이 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;증가시간을 이용한 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;지금부터 6시간 뒤에 Control.sh 스크립트를 실행하고 싶으면 -f 옵션을 사용하여 예약 작업으로 등록한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# at now + 6 hours -f Control.sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;리다이렉션(&amp;lt;)을 이용해도 된다.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# at now + 6 hours &amp;lt; Control.sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4번 예약 작업을 삭제하고 싶다면 -d 옵션 다음에 삭제할 작업번호를 지정한다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# at -d 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;at의 사용 권한 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;at 명령어는 at.allow와 at.deny 두 파일을 이용해 일반 사용자의 사용 권한을 지정해 줄 수 있따. /etc/at.allow 파일이 있으면 at.allow에 기록된 사용자만 at 명령어를 사용할 수 있으며, 이 파일이 없으면 /etc/at.deny에 기록되지 않은 사용자만 사용할 수 있다. 두 파일 모두 없다면 관리자만 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;관련 명령어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;atq : 예약된 작업 목록을 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;atrm : 예약된 작업 목록을 삭제한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;batch : 시스템 부하가 일정 이하일 때 명령을 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;cron : 정기적으로 예약된 작업을 수행한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/260</guid>
      <comments>https://gregorio78.tistory.com/260#entry260comment</comments>
      <pubDate>Tue, 4 Sep 2018 22:55:40 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]arping</title>
      <link>https://gregorio78.tistory.com/259</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;ARP 요청을 이용한 네트워크 연결을 확인한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/sbin/arping&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;arping&amp;nbsp;[option]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-c count : arping의 개수를 지정한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-w timeout : w 옵션 뒤 시간(초)를 지정하여 그 시간(초) 까지만 arping을 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-I&amp;nbsp;device : 이너넷 장치를 지정한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-s source : source IP를 지정한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;ping의 변경으로 ICMP 패킷 대신 ARP 요청과 응답을 이용하여 해당 IP 주소의 MAC 주소를 찾거나, MAC 주소가 있을 때 IP 주소를 찾는다. 또한 ICMP 패킷을 차단한 호스트라도 단지 연결성만을 검사하고 싶은 경우라면, arping를 써도 좋다. 다음은 자신의 시스템으로 arping을 3번 보내서 확인하는 예제이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 428px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C9C8395B8E8BA90A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C9C8395B8E8BA90A&quot; width=&quot;428&quot; height=&quot;68&quot; filename=&quot;arping 실행결과.PNG&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#0055ff&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;관련 명령어&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;ping : 네트워크의 연결성을 분석한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/259</guid>
      <comments>https://gregorio78.tistory.com/259#entry259comment</comments>
      <pubDate>Tue, 4 Sep 2018 22:43:09 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]arp</title>
      <link>https://gregorio78.tistory.com/258</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;연결하려는 시스템의 MAC 주소를 확인한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/sbin/arp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;arp [option]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-v : ARP 상태를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-t type : ARP 캐시에 올라와 있는 타입을 검색한다. ether(Enternet), ax25(AX25 packet radio)등이 있으며, ether가 기본 타입이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-a [host] : 등록된 호스트 중 지정한 호스트의 내용을 보여준다. 호스트를 지정하지 않으면 등록된 모든 호스트를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-d [host] : 지정한 호스트를 목록에서 삭제한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-s host hardware-address : 호스트의 하드웨어 주소. 즉, 호스트 MAC 주소를 추가한다. 이더넷 카드의 경우 6자리의 16진수로 되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-f file : 파일에 있는 목록을 추가한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;TCP/IP 명령어 이다. 시스템 사이의 통신에는 상대방의 MAC 주소가 필요하다. 이때 arp는 ARP를 이용하여 상대 시스템 IP에 신호를 보내 MAC 주소를 받아온다. 서브넷의 ARP 정보는 연결 효율을 높이기 위해 /proc/net/arp에 저장된다. 캐시에 저장된 정보는 추가/삭제할 수 있다. 이와 같이 저장된 ARP 캐시의 내용을 자세히 보고 싶다면 다음과 같이 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 578px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C9BB405B8E893F25&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C9BB405B8E893F25&quot; width=&quot;578&quot; height=&quot;78&quot; filename=&quot;arp 실행결과.PNG&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;관련 명령어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;arping : 대상 주소에 ARP 패킷을 보낸다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;arpwatch : Ethernet/IP 주소의 진로를 추적한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;arpsnmp :&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Ethernet/IP 주소의 진로를 추적한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;tcpdump : 네트워크 인터페이스에서의 패킷 헤더를 출력한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/258</guid>
      <comments>https://gregorio78.tistory.com/258#entry258comment</comments>
      <pubDate>Tue, 4 Sep 2018 22:36:02 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]arch</title>
      <link>https://gregorio78.tistory.com/255</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;시스템의 아키텍처를 확인한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/bin/arch&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;arch&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;시스템의 CPU 타입을 보여준다. x86의 인텔 계열 CPU는 i386, i486, i586, i686등으로 출력하며, 그 외는 alpha, sparc, arm m68k, mips, ppc 등과 같이 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;인텔 펜티엄 시스템에서 arch 명령어를 이용하여 CPU 타입을 확인해 보자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# arch
i686&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;아래 그림은 VirtualBox &lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Centos7 실행결과 이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 287px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999B004E5B8D3F040D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999B004E5B8D3F040D&quot; width=&quot;287&quot; height=&quot;32&quot; filename=&quot;arch 명령어 결과.PNG&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/255</guid>
      <comments>https://gregorio78.tistory.com/255#entry255comment</comments>
      <pubDate>Mon, 3 Sep 2018 23:03:29 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]apropos</title>
      <link>https://gregorio78.tistory.com/254</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;검색어와 관련있는 명령어를 설명과 함께 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/usr/bin/apropos&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;apropos [검색어]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;검색어 : 검색하고 싶은 문자열&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;apropos는 검색어와 관련 있는 명령어를 whatis DB에서 검색하여 간단한 설명과 함께 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;whatis는 검색어가 whatis DB의 명령어 리스트와 이름이 동일한 경우만 출력하지만, apropos는 검색어 일부가 명령어나 설명에 포함된 경우까지 모두 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;예를 들어 리눅스에서 GIMP 등의 그래픽 툴을 사용하지 않고도 비트맵 파일을 jpeg 파일로 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;그런데 그 명령어가 생각나지 않을 경우 다음과 같이 입력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# apropos jpeg&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;apropos 명령어에 검색어로 jpeg을 사용하면, 명령어나 요약 설명에 jpeg이라는 단어가 들어있는 모든 명령어를 출력한다.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;우리가 찾는 이미지를 jpeg 파일로 만들어 주는 명령어는 가장 위에 있는 cjpeg 임을 알 수 있따. 또한 반대로 jpeg 파일을 비트맵이나 그 외의 파일오 만드는 djpeg이라는 명령어가 있다는 것도 알 수 있따.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;관련 명령어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;man : -k 옵션을 사용하면, apropos와 같은 기능을 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;whatis : whatis DB에서 명령어와 일치하는 요약 내용을 검색하여 출력한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/254</guid>
      <comments>https://gregorio78.tistory.com/254#entry254comment</comments>
      <pubDate>Mon, 3 Sep 2018 22:59:20 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]apm</title>
      <link>https://gregorio78.tistory.com/253</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;노트북 등 이동식 장치에서 배터리 잔여량을 보여주고, 상태에 따라 시스템을 대기/종료 시킨다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/usr/bin/apm&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;access [-option]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-V, --version : 버전 정보를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-v, --verbose : 자세한 APM 바이오스의 버전과 전원상태 정보를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-m, -minutes : 배터리의 남은 시간을 출력한다.(분 단위)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-M, --monitor : 배터리 상태 정보를 계속해서 모니터하고 업데이트 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-s, --suspend : 시스템을 서스펜드 상태로 만든다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-S, --standby : 시스템을 스탠바이 상태로 만든다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-d, --debug : 디버깅에 유용하도록 세부적인 APM 상태 정보를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;노트북 사용자의 경우 배터리 관리는 아주 중요한 문제이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;apm은 APM(Advanced Power Management) BIOS의 정보가 있는 /proc/apm 파일을 읽어 시스템의 전원 상태를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;이 명령어로 배터리의 현재 잔여량을 알 수 있으며 시스템을 정지상태나 대기상태로 만들 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;노트북에서 리눅스를 사용할 때 꼭 필요한 명령어 이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;그러면 다음과 같은 이 배터리의 남은 시간을 확인해 보자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# apm -m
5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;여기에서 5는 현재 상태에서 전원 연결 없이 배터리로 사용할 수 있는 시간을 분 단위로 나타낸 것이다.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;만약에 데스크탑 환경이나 전원이 연결된 노트북에서 이 명령어를 실행 하면 다음과 같은 메세지를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# apm -m
apm 19AC on-line, no system battery&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;관련 명령어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;apmd : 전원관리 데몬&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/253</guid>
      <comments>https://gregorio78.tistory.com/253#entry253comment</comments>
      <pubDate>Mon, 3 Sep 2018 22:48:09 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]alias</title>
      <link>https://gregorio78.tistory.com/252</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;복잡한 명령어와 옵션을 짧은 문자열로 바꿔준다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;alias name[=value]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;옵션을 포함한 긴 명령어를 자주 사용한다면, 매번 입력하지 않고 짧은 문자열로 바꿔주는 alias를 이용한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;예를 들어 터미널에서 rm 명령어를 이용하여 파일을 삭제할 때, 파일을 지울 것인지 다시 물어보는 옵션을 별도로 사용하지 않아도 rm 명령어가 이 옵션을 사용하고 있다. 또한 ls 명령어를 이용해 파일 목록을 보았을 때 색으로 구분되는 것은 시스템 환경에서 미리 alias로 해당 옵션을 예약해 놓았기 때문이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;쉘을 내부 명령어 alias와 unalias를 이용하여 단축 명령어를 목록에 추가하고 삭제한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;어떠한 명령어가 입력되면 이 명령어의 앞에서부터 문자열과 일치하는 alias된 문자열이 목록에 있는지 확인하고, 일치하면 원래의 명령어로 바꿔서 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;쉘 프롬프트에서 alias를 입력해보자. 현재 시스템에 정의된 alias 목록을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;#alias
alias cp='cp -i'
alias l. = 'ls -d .* --color=tty'
alias ll = 'ls -l --color=tty'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;이전에 alias 관련 명령을 실행해본 적이 없다면, 위 내용은 운영체제에 기본 설정된 내용일 것이다.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;원래 cp 명령은 복사할 파일이 이미 있는지를 고려하지 않고 덮어쓰지만, &lt;b&gt;cp -i&lt;/b&gt; 옵션은 같은 이름의 파일이 있을 때 덮어 쓸 것인지 물어본다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;이 옵션을 사용하면 기존 파일을 무시하고 덮어쓰는 실수를 막을 수 있으므로, 운영체제에서 미리 alias를 이용하여 &lt;b&gt;cp -i&lt;/b&gt;를 cp로 지정하였다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;그러면 cp의 alias를 삭제해보자. alias 삭제 명령은 &lt;b&gt;unalias&lt;/b&gt; 이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# unalias cp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;삭제 후 alias명령을 내리면 cp alias가 목록에서 사라진 것을 확인 할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;그러면 다시 cp alias를 목록에 추가해 보자&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# alias cp = 'cp -i'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;다시 alias 명령으로 확인하면 추가 된 cp alias를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;위와 같은 방법으로 자주 쓰는 명령어와 옵션을 간단한 문자열로 줄여 쓸 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;예를 들어 자주 쓰는 tar 명령과 옵션을 다음과 같이 만들어 놓으면 편리하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# alias tarx = 'tar xvpf'&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
# alias tarc = 'tar cvpf'
# alias tarz = 'tar xvpfz'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;다른 명령어도 같은 방식으로 응용해 보자. 또한 alias가 설정되었어도 다음과 같은 방법으로 원래의 명령어를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12pt;&quot;&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px;&quot;&gt;&lt;code style=&quot;color: rgb(58, 65, 69); font-family: Inconsolata, monospace, sans-serif; font-size: inherit; letter-spacing: 0.1px; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# &lt;/span&gt;&lt;/code&gt;&lt;font color=&quot;#3a4145&quot; face=&quot;맑은 고딕, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 13.3333px; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;＼cp&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;p style=&quot;font-size: 12pt;&quot;&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;혹은&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# /bin/cp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;명령어 앞에&amp;nbsp;&lt;span style=&quot;font-size: 16px;&quot;&gt;＼(백슬래시)가 붙어 있으면 alias를 무시고 원래의 명령을 실행하라는 뜻이다.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;또한 명령어가 위치한 절대 경로를 입력하여 명령어를 실행해도 alias를 무시한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/252</guid>
      <comments>https://gregorio78.tistory.com/252#entry252comment</comments>
      <pubDate>Mon, 3 Sep 2018 22:40:34 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 명령어]access</title>
      <link>https://gregorio78.tistory.com/251</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;지정한 파일의 존재 유무와 권한을 확인한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;경로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;/usr/bin/access&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;사용방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;access [모드] [파일명]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;-- help :&amp;nbsp; 사용법을 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;-- version : 버전 정보를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(0, 85, 255); font-size: 12pt;&quot;&gt;설명 및 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;현재 사용자 권한으로 지정한 파일이 존재 하는지, 읽기/쓰기/실행 권한이 있는지를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;독립적으로 사용되기 보다는 쉘 스크립트 안에서 사용된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&quot;모드&quot; 인수에는 r(Read), w(Write), x(Execute)을 대입하여 파일에 권한이 있는지 질의할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;r(Read), w(Write) 권한이 있는 테스트 파일을 access 명령어를 이용하여 권한을 확인해 보자&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ ls -l testfile
-rw-rw-r-- 1 gregorio78&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; gregorio78 @ Mar 3 01:58 testfile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;현재 터미널 사용자는 gregorio78이며, 아래와 같이 testfile은 gregorio78 사용자와 그룹에 r(Read), w(Write) 권한이 있는 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;access 명령어를 실행하면, 인수를 제대로 입력하여도 아무런 결과도 출력하지 않는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;echo &quot;$?&quot; 명령어를 이용하여 access 명령어의 결과가 성공(0)했는지, 실패(1) 했는지 확인 할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;$ access rw testfile
$ echo &quot;$?&quot;
0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;testfile에 r(Read), w(Write) 권한은 있지만 &lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;x(Execute) 권한은 없으므로, 모든 인수를 rwx로 질의할 경우 결과는 실패(1)를 출력한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;overflow: auto; font-family: Inconsolata, monospace, sans-serif; font-size: 0.9em; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.75em; border: 1px solid rgb(227, 237, 243); width: 100%; padding: 10px; background: rgb(247, 250, 251); border-radius: 3px; color: rgb(58, 65, 69); letter-spacing: 0.1px;&quot;&gt;&lt;code style=&quot;font-family: Inconsolata, monospace, sans-serif; font-size: inherit; padding: 0px; white-space: pre-wrap; border: none; background: transparent; border-radius: 2px; font-feature-settings: &amp;quot;liga&amp;quot; 0;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ access rwx testfile&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
$ echo &quot;$?&quot;
1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;모드에 대한 자세한 설명은 chmod를 참고하시기 바랍니다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/251</guid>
      <comments>https://gregorio78.tistory.com/251#entry251comment</comments>
      <pubDate>Mon, 3 Sep 2018 22:22:49 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL]Insert, Update, Delete Query Generator</title>
      <link>https://gregorio78.tistory.com/216</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;정보시스템을 개발하기 위해서는 데이터베이스 기반으로 개발을 해야 할 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;필자는 과거 프로젝트를 진행하면서 데이터베이스의 테이블 생성 또는 변경 시 테이블의 Insert, Update, Delete 쿼리를 지속적으로 작성했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;아마 여러 개발자님들도 DBA(규모가 있는 프로젝트 인 경우) 또는 PM/PL이 추가/변경한 테이블에 대한 Insert, Update, Delete 쿼리를 필자와 마찬가지고 작성하셨을 것 이라고 생각합니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;이 부분이 단순작업이고 귀찮은 작업입니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;단순한 테이블 같은 경우 직접 작성하시면 되지만, 복잡한? 컬럼이 많은 테이블의 Insert/Update/Delete 쿼리를 작성하실 때는 최소 5분 정도의 시간이 걸릴 것 입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;이런 시간도 아깝다고 생각하여, 단순 노가다(?) 같은 작업을 자동화 하기 위해 Insert/Update/Delete 쿼리를 작성해주는 쿼리를 작성했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;아래의 쿼리를 복사하셔서 &lt;b&gt;&lt;u&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&amp;amp;TBLNM을 테이블명으로 치환&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;하셔서 실행하시면 MyBatis Tag와 쿼리를 작성하여 줍니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;여러분의 개발시간을 단 5분이라도 단축해 드리고자 이렇게 공유하여 드립니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;u&gt;&amp;amp;BEAN_NM은 VolueObject Class Name으로 치환&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;하시면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;brush:sql;&quot;&gt;SELECT CONCAT('&amp;lt;!-- ', 'INSERT QUERY --&amp;gt;') AS QUERY UNION ALL
SELECT CONCAT('&amp;lt;insert id=&quot;insert&quot; parameterClass=&quot;', IFNULL('&amp;amp;BEAN_NM', ''), '&quot;&amp;gt;') UNION ALL
SELECT CONCAT('INSERT INTO ', UPPER('&amp;amp;TBLNM'), ' (') UNION ALL
SELECT LEFT(COLUMN_NAMES, LENGTH(COLUMN_NAMES) - 2) AS COLUMN_NAMES
  FROM (
       SELECT CONCAT(
              IFNULL(CONCAT(COLUMN01, ', '), ''), IFNULL(CONCAT(COLUMN02, ', '), ''), IFNULL(CONCAT(COLUMN03, ', '), ''), IFNULL(CONCAT(COLUMN04, ', '), ''), IFNULL(CONCAT(COLUMN05, ', '), ''), IFNULL(CONCAT(COLUMN06, ', '), ''), IFNULL(CONCAT(COLUMN07, ', '), ''), IFNULL(CONCAT(COLUMN08, ', '), ''), IFNULL(CONCAT(COLUMN09, ', '), ''), IFNULL(CONCAT(COLUMN10, ', '), ''), 
              IFNULL(CONCAT(COLUMN11, ', '), ''), IFNULL(CONCAT(COLUMN12, ', '), ''), IFNULL(CONCAT(COLUMN13, ', '), ''), IFNULL(CONCAT(COLUMN14, ', '), ''), IFNULL(CONCAT(COLUMN15, ', '), ''), IFNULL(CONCAT(COLUMN16, ', '), ''), IFNULL(CONCAT(COLUMN17, ', '), ''), IFNULL(CONCAT(COLUMN18, ', '), ''), IFNULL(CONCAT(COLUMN19, ', '), ''), IFNULL(CONCAT(COLUMN20, ', '), ''), 
              IFNULL(CONCAT(COLUMN21, ', '), ''), IFNULL(CONCAT(COLUMN22, ', '), ''), IFNULL(CONCAT(COLUMN23, ', '), ''), IFNULL(CONCAT(COLUMN24, ', '), ''), IFNULL(CONCAT(COLUMN25, ', '), ''), IFNULL(CONCAT(COLUMN26, ', '), ''), IFNULL(CONCAT(COLUMN27, ', '), ''), IFNULL(CONCAT(COLUMN28, ', '), ''), IFNULL(CONCAT(COLUMN29, ', '), ''), IFNULL(CONCAT(COLUMN30, ', '), ''), 
              IFNULL(CONCAT(COLUMN31, ', '), ''), IFNULL(CONCAT(COLUMN32, ', '), ''), IFNULL(CONCAT(COLUMN33, ', '), ''), IFNULL(CONCAT(COLUMN34, ', '), ''), IFNULL(CONCAT(COLUMN35, ', '), ''), IFNULL(CONCAT(COLUMN36, ', '), ''), IFNULL(CONCAT(COLUMN37, ', '), ''), IFNULL(CONCAT(COLUMN38, ', '), ''), IFNULL(CONCAT(COLUMN39, ', '), ''), IFNULL(CONCAT(COLUMN40, ', '), ''), 
              IFNULL(CONCAT(COLUMN41, ', '), ''), IFNULL(CONCAT(COLUMN42, ', '), ''), IFNULL(CONCAT(COLUMN43, ', '), ''), IFNULL(CONCAT(COLUMN44, ', '), ''), IFNULL(CONCAT(COLUMN45, ', '), ''), IFNULL(CONCAT(COLUMN46, ', '), ''), IFNULL(CONCAT(COLUMN47, ', '), ''), IFNULL(CONCAT(COLUMN48, ', '), ''), IFNULL(CONCAT(COLUMN49, ', '), ''), IFNULL(CONCAT(COLUMN50, ', '), '')
              ) AS COLUMN_NAMES
         FROM (
                SELECT MAX(COLUMN01) AS COLUMN01, MAX(COLUMN02) AS COLUMN02, MAX(COLUMN03) AS COLUMN03, MAX(COLUMN04) AS COLUMN04, MAX(COLUMN05) AS COLUMN05, MAX(COLUMN06) AS COLUMN06, MAX(COLUMN07) AS COLUMN07, MAX(COLUMN08) AS COLUMN08, MAX(COLUMN09) AS COLUMN09, MAX(COLUMN10) AS COLUMN10,
                       MAX(COLUMN11) AS COLUMN11, MAX(COLUMN12) AS COLUMN12, MAX(COLUMN13) AS COLUMN13, MAX(COLUMN14) AS COLUMN14, MAX(COLUMN15) AS COLUMN15, MAX(COLUMN16) AS COLUMN16, MAX(COLUMN17) AS COLUMN17, MAX(COLUMN18) AS COLUMN18, MAX(COLUMN19) AS COLUMN19, MAX(COLUMN20) AS COLUMN20,
                       MAX(COLUMN21) AS COLUMN21, MAX(COLUMN22) AS COLUMN22, MAX(COLUMN23) AS COLUMN23, MAX(COLUMN24) AS COLUMN24, MAX(COLUMN25) AS COLUMN25, MAX(COLUMN26) AS COLUMN26, MAX(COLUMN27) AS COLUMN27, MAX(COLUMN28) AS COLUMN28, MAX(COLUMN29) AS COLUMN29, MAX(COLUMN30) AS COLUMN30,
                       MAX(COLUMN31) AS COLUMN31, MAX(COLUMN32) AS COLUMN32, MAX(COLUMN33) AS COLUMN33, MAX(COLUMN34) AS COLUMN34, MAX(COLUMN35) AS COLUMN35, MAX(COLUMN36) AS COLUMN36, MAX(COLUMN37) AS COLUMN37, MAX(COLUMN38) AS COLUMN38, MAX(COLUMN39) AS COLUMN39, MAX(COLUMN40) AS COLUMN40,
                       MAX(COLUMN41) AS COLUMN41, MAX(COLUMN42) AS COLUMN42, MAX(COLUMN43) AS COLUMN43, MAX(COLUMN44) AS COLUMN44, MAX(COLUMN45) AS COLUMN45, MAX(COLUMN46) AS COLUMN46, MAX(COLUMN47) AS COLUMN47, MAX(COLUMN48) AS COLUMN48, MAX(COLUMN49) AS COLUMN49, MAX(COLUMN50) AS COLUMN50
                  FROM (
                         SELECT ORDINAL_POSITION,
                                IF(ORDINAL_POSITION=1, COLUMN_NAME, NULL) AS COLUMN01, IF(ORDINAL_POSITION=2, COLUMN_NAME, NULL) AS COLUMN02, IF(ORDINAL_POSITION=3, COLUMN_NAME, NULL) AS COLUMN03, IF(ORDINAL_POSITION=4, COLUMN_NAME, NULL) AS COLUMN04, IF(ORDINAL_POSITION=5, COLUMN_NAME, NULL) AS COLUMN05, IF(ORDINAL_POSITION=6, COLUMN_NAME, NULL) AS COLUMN06, IF(ORDINAL_POSITION=7, COLUMN_NAME, NULL) AS COLUMN07, IF(ORDINAL_POSITION=8, COLUMN_NAME, NULL) AS COLUMN08, IF(ORDINAL_POSITION=9, COLUMN_NAME, NULL) AS COLUMN09, IF(ORDINAL_POSITION=10, COLUMN_NAME, NULL) AS COLUMN10,
                                IF(ORDINAL_POSITION=11, COLUMN_NAME, NULL) AS COLUMN11, IF(ORDINAL_POSITION=12, COLUMN_NAME, NULL) AS COLUMN12, IF(ORDINAL_POSITION=13, COLUMN_NAME, NULL) AS COLUMN13, IF(ORDINAL_POSITION=14, COLUMN_NAME, NULL) AS COLUMN14, IF(ORDINAL_POSITION=15, COLUMN_NAME, NULL) AS COLUMN15, IF(ORDINAL_POSITION=16, COLUMN_NAME, NULL) AS COLUMN16, IF(ORDINAL_POSITION=17, COLUMN_NAME, NULL) AS COLUMN17, IF(ORDINAL_POSITION=18, COLUMN_NAME, NULL) AS COLUMN18, IF(ORDINAL_POSITION=19, COLUMN_NAME, NULL) AS COLUMN19, IF(ORDINAL_POSITION=20, COLUMN_NAME, NULL) AS COLUMN20,
                                IF(ORDINAL_POSITION=21, COLUMN_NAME, NULL) AS COLUMN21, IF(ORDINAL_POSITION=22, COLUMN_NAME, NULL) AS COLUMN22, IF(ORDINAL_POSITION=23, COLUMN_NAME, NULL) AS COLUMN23, IF(ORDINAL_POSITION=24, COLUMN_NAME, NULL) AS COLUMN24, IF(ORDINAL_POSITION=25, COLUMN_NAME, NULL) AS COLUMN25, IF(ORDINAL_POSITION=26, COLUMN_NAME, NULL) AS COLUMN26, IF(ORDINAL_POSITION=27, COLUMN_NAME, NULL) AS COLUMN27, IF(ORDINAL_POSITION=28, COLUMN_NAME, NULL) AS COLUMN28, IF(ORDINAL_POSITION=29, COLUMN_NAME, NULL) AS COLUMN29, IF(ORDINAL_POSITION=30, COLUMN_NAME, NULL) AS COLUMN30,
                                IF(ORDINAL_POSITION=31, COLUMN_NAME, NULL) AS COLUMN31, IF(ORDINAL_POSITION=32, COLUMN_NAME, NULL) AS COLUMN32, IF(ORDINAL_POSITION=33, COLUMN_NAME, NULL) AS COLUMN33, IF(ORDINAL_POSITION=34, COLUMN_NAME, NULL) AS COLUMN34, IF(ORDINAL_POSITION=35, COLUMN_NAME, NULL) AS COLUMN35, IF(ORDINAL_POSITION=36, COLUMN_NAME, NULL) AS COLUMN36, IF(ORDINAL_POSITION=37, COLUMN_NAME, NULL) AS COLUMN37, IF(ORDINAL_POSITION=38, COLUMN_NAME, NULL) AS COLUMN38, IF(ORDINAL_POSITION=39, COLUMN_NAME, NULL) AS COLUMN39, IF(ORDINAL_POSITION=40, COLUMN_NAME, NULL) AS COLUMN40,
                                IF(ORDINAL_POSITION=41, COLUMN_NAME, NULL) AS COLUMN41, IF(ORDINAL_POSITION=42, COLUMN_NAME, NULL) AS COLUMN42, IF(ORDINAL_POSITION=43, COLUMN_NAME, NULL) AS COLUMN43, IF(ORDINAL_POSITION=44, COLUMN_NAME, NULL) AS COLUMN44, IF(ORDINAL_POSITION=45, COLUMN_NAME, NULL) AS COLUMN45, IF(ORDINAL_POSITION=46, COLUMN_NAME, NULL) AS COLUMN46, IF(ORDINAL_POSITION=47, COLUMN_NAME, NULL) AS COLUMN47, IF(ORDINAL_POSITION=48, COLUMN_NAME, NULL) AS COLUMN48, IF(ORDINAL_POSITION=49, COLUMN_NAME, NULL) AS COLUMN49, IF(ORDINAL_POSITION=50, COLUMN_NAME, NULL) AS COLUMN50
                           FROM INFORMATION_SCHEMA.COLUMNS
                          WHERE UPPER(TABLE_NAME) = UPPER('&amp;amp;TBLNM')
                            AND COLUMN_NAME NOT IN ('UPDATE_USER', 'UPDATE_DATE')
                       ) AS A
                ORDER BY ORDINAL_POSITION
              ) AS B
       ) AS C
UNION ALL
SELECT ') VALUES (' UNION ALL
SELECT LEFT(COLUMN_NAMES, LENGTH(COLUMN_NAMES) - 2) AS COLUMN_NAMES
  FROM (
       SELECT CONCAT(
              IFNULL(CONCAT('#{', LOWER(COLUMN01), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN02), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN03), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN04), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN05), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN06), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN07), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN08), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN09), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN10), '}, '), ''), 
              IFNULL(CONCAT('#{', LOWER(COLUMN11), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN12), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN13), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN14), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN15), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN16), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN17), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN18), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN19), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN20), '}, '), ''), 
              IFNULL(CONCAT('#{', LOWER(COLUMN21), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN22), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN23), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN24), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN25), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN26), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN27), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN28), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN29), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN30), '}, '), ''), 
              IFNULL(CONCAT('#{', LOWER(COLUMN31), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN32), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN33), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN34), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN35), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN36), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN37), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN38), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN39), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN40), '}, '), ''), 
              IFNULL(CONCAT('#{', LOWER(COLUMN41), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN42), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN43), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN44), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN45), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN46), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN47), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN48), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN49), '}, '), ''), IFNULL(CONCAT('#{', LOWER(COLUMN50), '}, '), '')
              ) AS COLUMN_NAMES
         FROM (
                SELECT MAX(COLUMN01) AS COLUMN01, MAX(COLUMN02) AS COLUMN02, MAX(COLUMN03) AS COLUMN03, MAX(COLUMN04) AS COLUMN04, MAX(COLUMN05) AS COLUMN05, MAX(COLUMN06) AS COLUMN06, MAX(COLUMN07) AS COLUMN07, MAX(COLUMN08) AS COLUMN08, MAX(COLUMN09) AS COLUMN09, MAX(COLUMN10) AS COLUMN10,
                       MAX(COLUMN11) AS COLUMN11, MAX(COLUMN12) AS COLUMN12, MAX(COLUMN13) AS COLUMN13, MAX(COLUMN14) AS COLUMN14, MAX(COLUMN15) AS COLUMN15, MAX(COLUMN16) AS COLUMN16, MAX(COLUMN17) AS COLUMN17, MAX(COLUMN18) AS COLUMN18, MAX(COLUMN19) AS COLUMN19, MAX(COLUMN20) AS COLUMN20,
                       MAX(COLUMN21) AS COLUMN21, MAX(COLUMN22) AS COLUMN22, MAX(COLUMN23) AS COLUMN23, MAX(COLUMN24) AS COLUMN24, MAX(COLUMN25) AS COLUMN25, MAX(COLUMN26) AS COLUMN26, MAX(COLUMN27) AS COLUMN27, MAX(COLUMN28) AS COLUMN28, MAX(COLUMN29) AS COLUMN29, MAX(COLUMN30) AS COLUMN30,
                       MAX(COLUMN31) AS COLUMN31, MAX(COLUMN32) AS COLUMN32, MAX(COLUMN33) AS COLUMN33, MAX(COLUMN34) AS COLUMN34, MAX(COLUMN35) AS COLUMN35, MAX(COLUMN36) AS COLUMN36, MAX(COLUMN37) AS COLUMN37, MAX(COLUMN38) AS COLUMN38, MAX(COLUMN39) AS COLUMN39, MAX(COLUMN40) AS COLUMN40,
                       MAX(COLUMN41) AS COLUMN41, MAX(COLUMN42) AS COLUMN42, MAX(COLUMN43) AS COLUMN43, MAX(COLUMN44) AS COLUMN44, MAX(COLUMN45) AS COLUMN45, MAX(COLUMN46) AS COLUMN46, MAX(COLUMN47) AS COLUMN47, MAX(COLUMN48) AS COLUMN48, MAX(COLUMN49) AS COLUMN49, MAX(COLUMN50) AS COLUMN50
                  FROM (
                         SELECT ORDINAL_POSITION,
                                IF(ORDINAL_POSITION=1, COLUMN_NAME, NULL) AS COLUMN01, IF(ORDINAL_POSITION=2, COLUMN_NAME, NULL) AS COLUMN02, IF(ORDINAL_POSITION=3, COLUMN_NAME, NULL) AS COLUMN03, IF(ORDINAL_POSITION=4, COLUMN_NAME, NULL) AS COLUMN04, IF(ORDINAL_POSITION=5, COLUMN_NAME, NULL) AS COLUMN05, IF(ORDINAL_POSITION=6, COLUMN_NAME, NULL) AS COLUMN06, IF(ORDINAL_POSITION=7, COLUMN_NAME, NULL) AS COLUMN07, IF(ORDINAL_POSITION=8, COLUMN_NAME, NULL) AS COLUMN08, IF(ORDINAL_POSITION=9, COLUMN_NAME, NULL) AS COLUMN09, IF(ORDINAL_POSITION=10, COLUMN_NAME, NULL) AS COLUMN10,
                                IF(ORDINAL_POSITION=11, COLUMN_NAME, NULL) AS COLUMN11, IF(ORDINAL_POSITION=12, COLUMN_NAME, NULL) AS COLUMN12, IF(ORDINAL_POSITION=13, COLUMN_NAME, NULL) AS COLUMN13, IF(ORDINAL_POSITION=14, COLUMN_NAME, NULL) AS COLUMN14, IF(ORDINAL_POSITION=15, COLUMN_NAME, NULL) AS COLUMN15, IF(ORDINAL_POSITION=16, COLUMN_NAME, NULL) AS COLUMN16, IF(ORDINAL_POSITION=17, COLUMN_NAME, NULL) AS COLUMN17, IF(ORDINAL_POSITION=18, COLUMN_NAME, NULL) AS COLUMN18, IF(ORDINAL_POSITION=19, COLUMN_NAME, NULL) AS COLUMN19, IF(ORDINAL_POSITION=20, COLUMN_NAME, NULL) AS COLUMN20,
                                IF(ORDINAL_POSITION=21, COLUMN_NAME, NULL) AS COLUMN21, IF(ORDINAL_POSITION=22, COLUMN_NAME, NULL) AS COLUMN22, IF(ORDINAL_POSITION=23, COLUMN_NAME, NULL) AS COLUMN23, IF(ORDINAL_POSITION=24, COLUMN_NAME, NULL) AS COLUMN24, IF(ORDINAL_POSITION=25, COLUMN_NAME, NULL) AS COLUMN25, IF(ORDINAL_POSITION=26, COLUMN_NAME, NULL) AS COLUMN26, IF(ORDINAL_POSITION=27, COLUMN_NAME, NULL) AS COLUMN27, IF(ORDINAL_POSITION=28, COLUMN_NAME, NULL) AS COLUMN28, IF(ORDINAL_POSITION=29, COLUMN_NAME, NULL) AS COLUMN29, IF(ORDINAL_POSITION=30, COLUMN_NAME, NULL) AS COLUMN30,
                                IF(ORDINAL_POSITION=31, COLUMN_NAME, NULL) AS COLUMN31, IF(ORDINAL_POSITION=32, COLUMN_NAME, NULL) AS COLUMN32, IF(ORDINAL_POSITION=33, COLUMN_NAME, NULL) AS COLUMN33, IF(ORDINAL_POSITION=34, COLUMN_NAME, NULL) AS COLUMN34, IF(ORDINAL_POSITION=35, COLUMN_NAME, NULL) AS COLUMN35, IF(ORDINAL_POSITION=36, COLUMN_NAME, NULL) AS COLUMN36, IF(ORDINAL_POSITION=37, COLUMN_NAME, NULL) AS COLUMN37, IF(ORDINAL_POSITION=38, COLUMN_NAME, NULL) AS COLUMN38, IF(ORDINAL_POSITION=39, COLUMN_NAME, NULL) AS COLUMN39, IF(ORDINAL_POSITION=40, COLUMN_NAME, NULL) AS COLUMN40,
                                IF(ORDINAL_POSITION=41, COLUMN_NAME, NULL) AS COLUMN41, IF(ORDINAL_POSITION=42, COLUMN_NAME, NULL) AS COLUMN42, IF(ORDINAL_POSITION=43, COLUMN_NAME, NULL) AS COLUMN43, IF(ORDINAL_POSITION=44, COLUMN_NAME, NULL) AS COLUMN44, IF(ORDINAL_POSITION=45, COLUMN_NAME, NULL) AS COLUMN45, IF(ORDINAL_POSITION=46, COLUMN_NAME, NULL) AS COLUMN46, IF(ORDINAL_POSITION=47, COLUMN_NAME, NULL) AS COLUMN47, IF(ORDINAL_POSITION=48, COLUMN_NAME, NULL) AS COLUMN48, IF(ORDINAL_POSITION=49, COLUMN_NAME, NULL) AS COLUMN49, IF(ORDINAL_POSITION=50, COLUMN_NAME, NULL) AS COLUMN50
                           FROM INFORMATION_SCHEMA.COLUMNS
                          WHERE UPPER(TABLE_NAME) = UPPER('&amp;amp;TBLNM')
                            AND COLUMN_NAME NOT IN ('UPDATE_USER', 'UPDATE_DATE')
                       ) AS A
                ORDER BY ORDINAL_POSITION
              ) AS B
       ) AS C
UNION ALL
SELECT ')' UNION ALL
SELECT '&amp;lt;/insert&amp;gt;' UNION ALL
SELECT '' UNION ALL
SELECT CONCAT('&amp;lt;!-- ', 'UPDATE QUERY --&amp;gt;')  UNION ALL
SELECT CONCAT('&amp;lt;update id=&quot;update&quot; parameterClass=&quot;', IFNULL('&amp;amp;BEAN_NM', ''), '&quot;&amp;gt;') UNION ALL
SELECT CONCAT('UPDATE ', '&amp;amp;TBLNM', ' SET') UNION ALL
SELECT CONCAT('       ', COLUMN_NAME, ' = #{', LOWER(COLUMN_NAME), '}, ')
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE UPPER(TABLE_NAME) = '&amp;amp;TBLNM'
   AND COLUMN_KEY = ''
   AND COLUMN_NAME NOT IN ('INIT_USER', 'INIT_DATE')
UNION ALL
SELECT ' WHERE' UNION ALL
SELECT CONCAT('   AND ', COLUMN_NAME, ' = #{', LOWER(COLUMN_NAME), '}, ')
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE UPPER(TABLE_NAME) = '&amp;amp;TBLNM'
   AND COLUMN_KEY = 'PRI'
   AND COLUMN_NAME NOT IN ('INIT_USER', 'INIT_DATE')
UNION ALL
SELECT '&amp;lt;/update&amp;gt;' UNION ALL
SELECT '' UNION ALL
SELECT CONCAT('&amp;lt;!-- ', 'DELETE QUERY --&amp;gt;')  UNION ALL
SELECT CONCAT('&amp;lt;delete id=&quot;delete&quot; parameterClass=&quot;', IFNULL('&amp;amp;BEAN_NM', ''), '&quot;&amp;gt;') UNION ALL
SELECT CONCAT('DELETE FROM ', UPPER('&amp;amp;TBLNM')) UNION ALL
SELECT ' WHERE' UNION ALL
SELECT CONCAT('   AND ', COLUMN_NAME, ' = #{', LOWER(COLUMN_NAME), '}, ')
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE UPPER(TABLE_NAME) = '&amp;amp;TBLNM'
   AND COLUMN_KEY = 'PRI'
   AND COLUMN_NAME NOT IN ('INIT_USER', 'INIT_DATE')
UNION ALL
SELECT '&amp;lt;/delete&amp;gt;'
&lt;/pre&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block;   height: auto; max-width: 100%;&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/99DB31445B84D0EF32&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/txt.gif&quot; style=&quot;vertical-align: middle;&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;[mysql]insert_update_delete query generator.txt&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/216</guid>
      <comments>https://gregorio78.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 21 Aug 2018 09:17:43 +0900</pubDate>
    </item>
    <item>
      <title>부정적인 감정이 반드시 나쁜 것은 아니다</title>
      <link>https://gregorio78.tistory.com/193</link>
      <description>&lt;h2 style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Dotum, sans-serif; font-size: 24px; color: rgb(82, 139, 44); padding-bottom: 25px;&quot;&gt;부정적인 감정이 반드시 나쁜 것은 아니다&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, Dotum, sans-serif; font-size: 14px;&quot;&gt;외로움, 슬픔, 분노, 두려움 등 부정적인 감정이&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, Dotum, sans-serif; font-size: 14px;&quot;&gt;반드시 나쁜 것만은 아닙니다.&lt;br /&gt;&lt;br /&gt;우리가 불안이나 두려움을 느끼지 못한다면,&lt;br /&gt;어떻게 목숨을 위협하는 위기상황에 대처하며&lt;br /&gt;인류가 지금까지 살아남을 수 있었겠습니까.&lt;br /&gt;&lt;br /&gt;우리의 삶에서 슬픔이나 분노가 아예 사라진다면&lt;br /&gt;삶이 얼마나 무미건조하고 단조롭고 얕을 것입니까.&lt;br /&gt;&lt;br /&gt;기쁨과 행복의 순간이&lt;br /&gt;아름답고 소중하게 느껴지는 까닭도&lt;br /&gt;그것을 돋보이게 하는&lt;br /&gt;인생의 힘든 순간들이 있기 때문입니다.&lt;br /&gt;&lt;br /&gt;감정이 일어나는 것은 자연스러운 일이지만&lt;br /&gt;그 감정에 빠져서 끌려다니는 것은 경계해야 합니다.&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, Dotum, sans-serif; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;from. 일지이승헌&quot; src=&quot;https://ci3.googleusercontent.com/proxy/enYnmVuVSqrLfoXnzBTrN7joAG3010RyWDHdB9wVMBDpuVpYeZf8nQHgkxDLyWN332qa2BtAsDJe5eknZKt8g1ULKBg=s0-d-e1-ft#http://www.ilchi.net/images/sub/print_from.gif&quot; class=&quot;CToWUd&quot; style=&quot;margin-top: 50px;&quot;&gt;&lt;/p&gt;</description>
      <category>기타/감동</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/193</guid>
      <comments>https://gregorio78.tistory.com/193#entry193comment</comments>
      <pubDate>Fri, 10 Aug 2018 10:59:25 +0900</pubDate>
    </item>
    <item>
      <title>데이터모델링의 개요</title>
      <link>https://gregorio78.tistory.com/177</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;１. 데이터 모델링 정의&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;가. 데이터 모델링 탄생 배경&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 현재의 기업 정보 시스템은 데이터베이스 관리 시스템(DBMS: DataBase Management System)을 논외로 하고는 설명할 수 없을 것이다. 하지만 초창기에는 데이터의 저장 매체가 존재하지 않았으며, 기업의 정보 시스템은 저장 매체가 없는 단지 배치(Batch) 프로그램 위주의 정보 시스템이었다. 이후 파일 이나 데이터베이스 관리 시스템과 같은 데이터 저장 매체의 발전과 더불어 온라인(On-line) 데이터 처리 정보 시스템이 태동하게 되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 현재의 관계형 데이터베이스 관리 시스템이 아닌 이러한 시기의 파일이나 데이터베이스 관리 시스템(대표적인 예로 IBM의 계층형 데이터 베이스 - HDB : Hierarchical Database)의 데이터 중심의 관리 기법이 아니라 배치 프로세스에서 태동한 프로세스 중심의 데이터 관리 기법(구조적 방법론)에 의하여 정보의 고립화라는 현상을 초래하게 되었으며, 많은 기업들은 정보시스템을 유지관리 하는데 막대한 비용을 투자해야만 했던 것이다. 이에 많은 학자들은 프로세스 중심의 정보 시스템 분석, 설계 기법에 문제점이 있다고 생각하게 되었고, 진정 기업 정보시스템의 핵심은 데이터(정보)를 어떻게하면 중복없이 정확하게 유지 관리할 수 있을가에 대한 보다 근본적인 안을 제시하게 되었다. 이와 함께 기업의 경영 정보 시스템에 근본적인 문제가 설계나 개발의 문제보다는 정확한 업무의 파악(데이터에 대한 정확한 분석)이 선결되어야 한다는 결론에 이르렀으며, 이러한 환경에서 보다 현실적(실세계를 좀 더 잘 표현할 수 있는)인 관계형 데이터베이스나 개체 관계 모델링 기법(ERD:Entity Relationship Diagram)을 발전시켜 왔던것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;나. 모델 정의&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 일상생활에서 많이 접할 수 있는 단어인 모델(Model)은 다양한 현장에서 사용된다. 예술 분야에서 그림, 사진 등과 같은 작품의 대상이 되는 인물이나 대상을 보통 모델이라고 한다. 또한 아파트 분양을 할때 시공 회사에서 제공하는 모델 하우스는 분양을 원하는 사람들에게 아직 아파트 자체가 현존하지는 않지만 어떤 모습과 환경으로 시공자가 아파트를 건설할 것인가에 대한 정보를 제공한다. 이와 같이 모델이란 어떤 대상을 의미하는 포괄적 의미를 가지고 있다고 할 수 있으며, 특히 데이터 모델은 현실 세계에 대해 우리가 관심있어 하는 대상을 데이터베이스화 하기 위한 개념적 도구라고 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 아래는 모델의 일반적 의미를 실례로 설명한 내용이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1) 물리적 모델&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 현실에 실재하는 것이 아닌 복잡한 자동차의 모형, 대형 선박의 스케치 또는 설계도, 자동차의 모의 실험용으로 사용되는 바람 터널에서의 자동차 축소 모형 등이 물리적 모델의 실례이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2) 개념적 모델&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 특정 시점에 맞게 기상을 예측하기 위해서 사용되는 수리적 공식이나 원형을 파괴하지 않고 조작·수정·변경시키기 위한 경제 모형 등을 들 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;다. 모델링 정의&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 모델링이라는 단어는 실체를 나타내는 일과 모형화라는 의미로 해석된다. ‘실체를 나타낸다’의 의미는‘대상을 나타낸다’라는 말로 해석될 수도 있다. 모형화라는 의미는‘형태를 만드는 일’혹은 ‘대상을 만드는 일’이라고 해석할 수 있다. 따라서 데이터 모델링이란 사용자의 요구사항으로부터 데이터의 실체를 나타내는 일이라고 해석할 수 있을 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 다음은 데이터 모델링의 다양한 관점에 대한 일반적 정의 사례이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 복잡한‘현실세계’를 단순화시켜 표현하는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 모델이란 사물 또는 사건에 관한 양상(Aspect)이나 관점(Perspective)을 연관된 사람이나 그룹을 위하여 명확하게 하는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델링을 다시 정의하면 기업 업무에 대한 종합적인 이해를 바탕으로 데이터에 존재하는 업무 규칙(Business Rule)에 대하여 참(True) 또는 거짓(False)을 판별할 수 있는 사실(사실명제)을 어떻게(How), 누가(Who) 접근하는지 또한 이에 대한 전산화와는 별개의 관점에서 이를 명확하게 표현하는 추상화 기법이라 할 수 있다. 즉, 현재 업무를 파악하여 문제점을 인식하고 개선 사항을 도출하며 미래에 적합한 설계를 이끌어 내기 위해 인간이 해야 할 대부분의 결정들을 내리는 단계까지&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;를 모두 포함하는 것이 데이터 모델링이다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;라. 데이터 모델이 제공하는 것&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 시스템을 현재 또는 원하는 모습으로 가시화하도록 도와준다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 시스템의 구조와 행동을 명세화 할 수 있게 한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 시스템을 구축하는 틀을 제공한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 우리가 결정한 것을 문서화한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 다양한 영역에 집중하기 위해 다른 영역의 세부 사항은 숨기는 다양한 관점을 제공한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■ 특정 목표에 따라 다양한 상세 수준을 제공한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;２. 데이터 모델링 필요성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델링은 프로세스 모델링과 함께 시스템 개발에 있어서 중요한 두 개의 축을 이룬다. 프로세스 중심의 분석/설계 방법을 통해 설계한 데이터 모델은 업무 프로세스의 변화에 따라 영향을 많이 받기 때문에 상대적으로 업무변화에 대한 영향을 적게 받으면서 유연한 시스템을 만들기 위해 데이터 중심의 설계에 많은 관심이 모아지고 있다. 개발 방법론에 따라 다소간 차이는 있으나 데이터 모델링과 프로세스 모델링은 상호 보완적인 관점에서 이해되어야 하며 특히 데이터 모델은 시스템의 뼈대가 되기 때문에 데이터 모델링의 결과에 따라 시스템의 안정성은 많은 영향을 받게 된다고 할 수 있다. 고품질의 데이터 모델은 시스템의 안정성과 유연성, 성능 등에 미치는 영향이 크기 때문에, 고품질의 데이터 모델을 확보하기 위한 데이터 모델링은 시스템 개발에 있어서 가장 핵심적인 과정이라 할 수 있다. 데이터 모델링의 필요성은 다음과 같은 관점에서 설명될 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99723B465B6281C12A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99723B465B6281C12A&quot; width=&quot;550&quot; height=&quot;214&quot; filename=&quot;프로세스 중심의 개발 방법의 문제점.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;가. 애플리케이션과 데이터의 통합&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 현재 기업에서는 진정한 정보 인프라 구축을 위해 데이터와 애플리케이션의 통합에 많은 노력을 기울이고 있다. 데이터 기반의 통합이 아닌 애플리케이션 코딩 차원의 통합 시도에는 너무나 많은 비용과 시간이 소요된다. 데이터를 기반으로 한 통합은 효과적이면서 동시에 저비용으로 통합 프로젝트를 안정적으로 수행하면서 성공적으로 완수하기 위한 필요조건이 되고 있다. 이로 인해 데이터 기반 통합의 핵심 요소인 데이터 모델링의 중요성은 날로 부각되고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;나. 개발자들의 시스템 이해&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 개발자들은 하나의 애플리케이션에서 사용되는 데이터가 어떤 것인지 파악하고 이해하는 것뿐만 아니라 전체 시스템에서 데이터가 어떻게 상호 연관성을 가지고 유기적으로 움직이고 있는가에 대해 명확하게 이해하는데 많은 어려움을 겪고 있다. 개발자들은 그들이 개발할 시스템과 데이터에 대해 좀더 확실하게 이해하기 위해 데이터의 모형화를 필요로 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1) 사용자 관점 데이터&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 프로세스 모델링과 같이 데이터 모델링은 사용자가 원하는 것의 논리적 개념과 시스템이 어떻게 그것을 제공하는지의 물리적 개념을 명확하게 나타낸다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2) 물리적 표현 또는 사용에 관계없는 데이터 그 자체의 본질&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;물리적인 것과 논리적인 것을 구별함으로써 저장 기법, 데이터와 파일 접근 방법 그리고 데이터를 사용하는 사람과 사용법에 대한 내역 등 변화되는 물리적인 것으로부터 독립되어 조직과 사용자가 필요로 하는 필수적이고 기본적인 데이터를 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3) 애플리케이션간 데이터 사용&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;데이터 모델링은 데이터 정의, 생명주기 정보(CRUD) 그리고 언제 어떻게 데이터가 사용되었는지를 추적할 수 있는 방법(매트릭스 분석 기법을 이용한 상호작용 분석) 등을 제공함으로써 애플리케이션을 통해 데이터가 어떻게 사용되는지를 개발자들이 쉽게 이해할 수 있도록 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;다. 데이터 모델링시 주의점&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1) 중복(Duplication)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델은 같은 데이터를 사용하는 사람, 시간, 그리고 장소를 파악하는데 도움을 준다. 이러한 지식 응용은 데이터베이스의 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2) 비유연성(Inflexibility)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무 변화에도 데이터 모델이 수시로 변경됨으로써 유지보수의 어려움을 가중시킬 수 있다. 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 수 있는 가능성을 줄인다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3) 비일관성(Inconsistency)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터의 중복이 없더라도 비일관성은 발생한다. 예를 들어 신용 상태에 대한 갱신 없이 고객의 납부 이력 정보를 갱신하는 것이다. 개발자가 다른 데이터와 모순된다는 고려 없이 일련의 데이터를 수정할 수 있기 때문이다. 데이터 모델링시 데이터와 데이터간 상호연관 관계에 대한 명확한 정의는 이러한 위험을 사전에 예방할 수 있도록 해준다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;３. 데이터 모델링 단계&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델링은 현실 세계의 기업 업무에서 발생하는 데이터에 대하여 물리적으로 데이터베이스화하기 위해 이루어지는 과정 중의 한 단계이다. 이 데이터 모델링은 개념 데이터 모델링, 논리 데이터 모델링, 물리 데이터 모델링 등 3단계로 나눌 수 있으며, 엄밀한 의미에서는 논리 데이터 모델링 까지를 데이터 모델링의 범주로 보기도 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 161px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9909D6505B6281C22D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9909D6505B6281C22D&quot; width=&quot;161&quot; height=&quot;162&quot; filename=&quot;데이터 모델링 단계.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 개념 데이터 모델링 단계에서는 주제별로 분류 가능한 업무를 분석한 후 핵심 엔터티(Entity)를 추출하고 그들간의 관계를 정의하여 전체 데이터 모델의 골격을 생성한다. 이렇게 도출된 엔터티(업무)간의 관계를 표현하기 위해 개체-관계 다이어그램(ERD, Entity-Relationship Diagram)을 작성한다. 논리 데이터 모델링 단계에서는 개념 데이터 모델링 단계에서 정의한 핵심 엔터티와 관계를 바탕으로 상세 속성을 정의하고 식별자를 확정하며 정규화와 같은 상세화 과정을 수행한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 마지막으로 물리 데이터 모델링 단계에서는 논리 데이터 모델을 기반으로 목표하는 DBMS의 특성 및 구현환경 등을 감안한 스키마(데이터 구조)를 일정한 기준과 규칙에 의해 도출하고 칼럼(Column)의 데이터 타입과 크기를 정의한다. 또한 데이터 사용량을 분석 예측하는 과정을 통해 효율적인 데이터베이스가 될 수 있도록 인덱스의 정의 및 역정규화 작업을 수행한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 이러한 단계별 내용은 프로젝트 진행과도 일치한다. 물리 데이터 모델링 단계 후에 얻어진 스키마를 실제 데이터베이스로 생성하면 본격적인 애플리케이션 개발 단계로 넘어가게 된다. 그럼 각 단계에 대해 좀더 알아보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■TIP&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. 어떠한 데이터가 중요한가?&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 어떻게 데이터가 표시될 것인가?&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 어디에 데이터가 저장될 것인가?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 우선 시스템 분석 및 설계와 데이터베이스 설계의 차이를 알아야 한다. 데이터 모델링에서는 시스템 분석보다 조직의 업무를 지원하기 위한 포괄적 데이터베이스를 개발하는데 초점이 맞춰진다. 반대로 시스템 분석에서는 데이터베이스 요구사항을 고려하기는 하지만 데이터의 흐름, 데이터 변환, 입력, 출력 설계, 데이터 처리를 위한 과정에 초점이 맞춰진다. 보통 데이터 모델링 과정은 개념적 데이터 모델링(개념 데이터 모델링), 논리적 데이터 모델링(논리 데이터 모델링), 물리적 데이터 모델링(물리 데이터 모델링) 과정을 포괄한다&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;가. 개념 데이터 모델링(Conceptual Data Modeling)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 개념 데이터 모델링은 조직, 사용자의 데이터 요구사항을 찾고 분석하는데서 시작한다. 이 과정은 어떠한 자료가 중요하며 또 어떠한 자료가 유지되어야 하는지를 결정하는 것도 포함한다. 이 단계에 있어서의 주요한 활동은 핵심 엔터티와 그들 간의 관계를 발견하고, 그것을 표현하기 위해서 개체-관계 다이어그램을 생성하는 것이다. 개체-관계 다이어그램은 조직과 다양한 데이터베이스 사용자에게 어떠한 데이터가 중요한지를 나타내기 위해서 사용된다. 데이터 모델링 과정이 전 조직에 걸쳐 이루어진다면, 그것은 전사적 데이터 모델(Enterprise Data Model)이라고 불린다. 개념 데이터 모델을 통해 조직의 데이터 요구를 공식화하는 것은 두 가지의 중요한 기능을 지원한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;첫째, 개념 데이터 모델은 사용자와 시스템 개발자가 데이터 요구 사항을 발견하는 것을 지원한다. 개념 데이터 모델은 추상적이다. 그렇기 때문에 그 모델은 상위의 문제에 대한 구조화를 쉽게 하며, 사용자와 개발자가 시스템 기능에 대해서 논의할 수 있는 기반을 형성한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;둘째, 개념 데이터 모델은 현 시스템이 어떻게 변형되어야 하는가를 이해하는데 유용하다. 일반적으로 매우 고립된(Stand Alone) 시스템도 간단하게 추상적 모델링을 통해서 좀더 쉽게 표현되고 설명된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;나. 논리 데이터 모델링(Logical Data Modeling)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 논리 데이터 모델링은 데이터 모델링 프로세스의 Input으로써 비즈니스 정보의 논리적인 구조와 규칙을 명확하게 표현하는 기법 또는 과정이라 할 수 있다. 논리 데이터 모델링의 결과로 얻어지는 논리 데이터 모델은 데이터 모델링이 최종적으로 완료된 상태라고 정의할 수 있다. 즉 물리적인 스키마 설계를 하기 전 단계의‘데이터 모델’상태를 일컫는 말이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 논리 데이터 모델링의 핵심은 어떻게 데이터에 액세스하고 누가 데이터에 액세스하며, 그러한 액세스는 전산화와는 독립적으로, 다시 말해서 누가(Who), 어떻게(How) 그리고 전산화는 별개로 비즈니스 데이터에 존재하는 사실들을 인식하여 기록하는 것이며 이것은 기법으로서의 의미를 넘어 하나의 철학이라고도 할 수 있다. 특히 데이터 모델링 과정에서 가장 핵심이 되는 부분이 논리 데이터 모델링이라고 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델링이란 모델링 과정을 통해서 조사하고 결정한 사실을 단지 객체-관계 다이어그램이라는 그림으로 그려내는 과정을 말하는 것이 아니다. 시스템 구축을 위해서 가장 먼저 시작할 기초적인 업무 조사를 하는 초기 단계부터 인간이 결정해야 할 대부분의 사항을 모두 정의하는 시스템 설계의 전 과정을 지원하는‘과정의 도구’라고 해야 할 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 이 단계에서 수행하는 또 한가지 중요한 활동은 정규화이다. 정규화는 논리 데이터 모델 상세화 과 정의 대표적인 활동으로 논리 데이터 모델의 일관성을 확보하고 중복을 제거하여 속성들이 가장 적절한 엔터티에 배치되도록 함으로써 좀더 신뢰성있는 데이터 구조를 얻는데 목적이 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 논리 데이터 모델의 상세화는 식별자 확정, 정규화, M:M 관계 해소, 참조 무결성 규칙 정의 등을 들 수 있으며, 추가적으로 이력 관리에 대한 전략을 정의하여 이를 논리 데이터 모델에 반영함으로써 데이터 모델링을 완료하게 된다. 이에 대한 상세한 내용은 제3장 논리 데이터 모델링에서 다루게 될 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;다. 물리 데이터 모델링(Physical Data Modeling)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터 모델링 과정의 세 번째 단계인 물리 데이터 모델링은 논리 데이터 모델이 데이터 저장소로서 어떻게 컴퓨터 하드웨어에 표현될 것인가를 다룬다. 데이터가 물리적으로 컴퓨터에 어떻게 저장될 것인가에 대한 정의를 물리적 스키마라고 한다. 이 단계에서 결정되는 것은 테이블, 칼럼 등으로 표현되는 물리적인 저장 구조와 사용될 저장 장치, 자료를 추출하기 위해 사용될 접근 방법 등이 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 계층적 데이터베이스 관리 시스템 환경에서는 데이터베이스 관리자가 물리적 스키마를 설계하고 구현하기 위해서 보다 많은 시간을 투자하여야 한다. 계층적 데이터베이스 관리 시스템 환경에서의 물리적 스키마 설계의 예는 데이터의 디스크상의 위치, 색인화할 레코드, 다양한 최적화 문제 등이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 이에 비해, 논리 데이터 모델은 매체에 물리적으로 구현되는 것과는 독립적으로 여겨진다. 현실적으로 물리 데이터 모델을 계층적 데이터베이스 관리 시스템에 구현하는 것은 그것이 구현될 하드웨 어와 밀접한 관계를 맺고 있다. 그러나 관계형 데이터베이스 관리 시스템의 출현으로 인해 그 초점이 개념 및 논리 데이터베이스 설계로 이동하고 있다. 그래서 관계형 데이터베이스 관리 시스템을 사용하는 조직에서는 데이터베이스 관리자가 잘 유지해야 하는 데이터 항목의 발견과 데이터 항목 간에 존재하는 논리 관계를 이해하는데 더 많은 시간을 할애한다. 관계형 데이터베이스 관리 시스템의 출현으로 인하여 물리적 데이터베이스 설계와 관련된 문제들은 많은 부분 관계형 데이터베이스 관리 시스템 소프트웨어에서 처리되고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;４. 모델링 기본원칙&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 일반적으로 모델링의 방법론, 기법, 도구와 같은 개발 보조 수단의 사용 없이는 시스템이 잘 설계될 수 없을 것이라 생각하게 된다. 하지만 과거의 수많은 시스템들은 이러한 개발 보조기구의 사용없이 성공적으로 개발됐다. 물론 과거의 시스템들은 단순해서 그러할 수 있었다고 주장한다면 그 말 역시 맞는 말이다. 그러나 이러한 사실들은 여기에서 말하려는 모델링의 핵심 사항은 아니다. 프로젝트의 어려움 정도 또는 도구와 기술에 상관없이 좋은 설계를 포함한 훌륭한 시스템 개발은 다음의 단순한 단계로부터 시작한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■해결해야 하는 문제점들을 선별, 결정한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■해결책을 위한 문제점들을 구체화한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■시스템을 구축한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;■실제로 구현한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 시스템 개발 실패의 주요 요인을 무엇이라 생각하는가? 그것은 처음의 요구 사항을 충족시키지 못하는 설계자의 무능력을 들 수 있다. 즉 적절한 시스템이 개발되기 위해서는 요구 사항을 완전하고 정확하게 식별해야 한다. 논리 데이터 모델링은 기능 또는 조직이 사용하는 물리적 설계 구조에 관계없이 기업의 비즈니스에 존재하는 데이터의 명확한 구조 및 정의를 제시한다. 이는 최종 사용자 관점에서 바라보는 정보구조를 개념화하고 추상화시킨 데이터의 구조이다. 다음에 설명할 세 가지 최우선 원칙들은 논리 데이터 모델링의 접근 방식을 성공적으로 이끄는 토대이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;가. 커뮤니케이션 원칙(Communication Principle)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 요구 사항은 모든 사람들이 이해할 수 있도록 명확하게 공표됨은 물론 최종 사용자 지향적으로 분명하게 파악되는 수준으로 작성되어야 한다. 논리 데이터 모델링의 주목적은 최종 사용자 데이터에대한 뷰(View)를 개념화하고 추상화하여 시스템 설계자들에게 전달하는 것이다. 물론 커뮤니케이션 원칙이 최종 사용자들에게만 적용되는 것은 아니다. 다른 배경과 기술을 가진 많은 사람들도 논리 데이터 모형의 이해를 필요로 한다.&lt;/span&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;924&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 215px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(140, 140, 140);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;그룹명&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 708px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204); background-color: rgb(140, 140, 140);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;필요성&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 215px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(189, 189, 189);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;최종사용자&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 708px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;- 개념화, 추상화, 정규화 기법을 통하여 중복없고, 데이터의 정확성을 보장하는 데이터 구조의 이해 및 사용&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 215px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(189, 189, 189);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;시스템 분석가&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 708px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;- 시스템에서 사용되어질 정확한 데이터의 구조 및 데이터가 갖는 업무 규칙의 이해&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 215px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(189, 189, 189);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;데이터베이스 관리자&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 708px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;- 논리데이터 모델의 구조와 물리 스키마(데이터의 구조)의 차이점을 이해하고, 최종 사용자에게는 데이터의 제공, 시스템 분석가에게는 물리 스키마의 제공을 위한 데이터 구조의 이해&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 215px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(189, 189, 189);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;타 프로젝트에서 작업하는 분석가&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 708px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;- 관련 프로젝트가 데이터를 어떻게 정의하고 있는지를 알아냄&lt;/p&gt;&lt;p&gt;&amp;nbsp;- 인터페이스가 개발되어지고 데이터가 애플리케이션 또는 시스템 간의 고유되기 위한 데이터 구조 및 업무 규칙의 이해&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 그룹 구성원들과의 커뮤니케이션을 용이하게 하기 위해서는 두 가지의 논리 데이터 모델을 생각해 볼 수 있다. 그것은 비즈니스 지향적인 최종 사용자 데이터 모델과 기술적인 상세 데이터 모델이다. 논리 데이터 모델의 문서와 그림을 작성할 때 그 목적을 명확히 해야 한다. 왜냐하면 모델을 보는 사람들에게 기술적으로 알아보기 힘든 혼란을 주는 것은 곤란하기 때문이다. 이와 같은 명확한 정의를 통해 시스템 개발 관련자와 최종 사용자들간에 비즈니스 요구 사항이 정확히 전달되어야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;나. 모델링 상세화 원칙(Granularity Principle)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 데이터의 상세화 정도를 제시하고 조직이 사용하는 정보 구조의‘최소 공통 분모’를 제시해야 한다. 또한 복잡한 구조는 요소적인 부분들로 쪼개야 하며 불필요한 구조와 중복은 제거되어야 한다. 일반적으로 논리 데이터 모델은 너무 상세화될 필요가 없다든지 애플리케이션에 대한 상세화는 물리데이터 모델에서 이룰 수 있다라는 생각은 위험한 태도이다. 모델링의 상세화 원칙은‘데이터는 데이터의 본질과 잠재적 사용을 이해할 수 있을 만큼 상세화 되어야 한다’는 것을 의미한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 사실 좋은 설계는 분석 단계(논리 데이터 모델)를 위한 상세 수준이 다른 단계(물리 데이터 모델)에서 선택된 수준만큼 상세화되어야 한다는 것을 의미한다. 많은 모델러(Modeler)들이 겪는 문제는 논리 데이터 모델에서 물리 데이터 모델로의 이동이 분해 과정이라고 오해하는 것이다. 하지만 논리 데이터 모델에서 물리 데이터 모델로의 이동은 분해가 아니라 보통 수준의 상세화에서 발생하는 변환(Transformation)이다. 즉 물리 데이터 모델링은 논리 데이터 모델에 대한 변환 과정이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999A313C5B6281C122&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999A313C5B6281C122&quot; width=&quot;550&quot; height=&quot;179&quot; filename=&quot;논리 데이터 모델에서 물리 데이터 모델로의 이동.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;다. 논리적 표현 원칙(Logical Representation Principle)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 조직의 데이터에 대한 논리적 측면을 최대한 표현해야 한다. 모델은 물리적 제약 조건 없이 비즈니스를 그대로 반영해야 한다. 즉 논리 데이터 모델은 특정 아키텍처, 기술 또는 제품과 독립적이어야 한다는 것이다. 그리고 최종 사용자들이 항상 시스템 개발자들에게 가지는 주요 불만 사항은 바로 ‘이해의 부족’이다. 사용자가 원하는 것에 근거를 두지 않은 프로젝트는 실패할 확률이 높다. 또한 기존 애플리케이션에 대한 빈약한 문서화의 주요 원인 중 하나는 성급하게 물리적 설계 단계로 들어 가려 하는 분석가들의 성향 때문이다. 논리적 설계와 물리적 설계를 구별하지 못하면 프로젝트가 추구하고자 하는 물리적 선택 사항을 제한하거나 잘못된 방향으로 진행하게 된다. 이러한 문제들을 예를 통해 이해해 보자.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1) 웬만한 분석의 결과는 잘 알고 있다(지름길을 좋아하는 것)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 어떤 이들은 여러 가지 이유(예를 들어, 자명하게 보이는 분석을 수행하는 데 시간 낭비를 줄이기 위해 또는 결과가 이미 정해져 있어서)때문에 분석을 생략하는 경우가 많다. 대부분의 경우에서 모델러들은 애플리케이션 개발 과정에서 발생할 수 있는 모든 것들을 알 수 없다. 또한 모델러들은 몇 십년내에 시스템에서 발생할 수 있는 것에 대해서도 확신하지는 못한다. 결론적으로 최적의 행동은 솔루션에 독립적인 방식으로 규칙을 따르고 문제를 문서화하는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2) 조급하게 솔루션을 구체화하는 것&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 문제를 조사할 때 데이터베이스가 어떻게 구현되어야 하는가에 관한 기발한 아이디어가 나오기란 어렵다. 이러한 점에서 섣불리 솔루션을 구체화하는 것은 잘못된 것이다. 그 이유는 문제의 일부분만&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;을 파악했을 때 이를 해결할 수 있는 모든 데이터가 확보된 것은 아니며 나중에 인식한 문제로부터 다른 솔루션을 발견할 수도 있기 때문이다. 또한 문제가 정확히 진술된 것이 아니기 때문에 작업물을 검토하는 다른 사람들은 솔루션이 문제를 해결하는 이유를 이해할 수 없을 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 이것은 분석가들이 솔루션을 그들의 머리에서 없애야 한다는 것이 아니라 솔루션에 대한 좋은 생각이 표면화 되었을 때 그것을 기록하여 논리적 설계 다음에 물리 데이터 모델 설계자에게 전달하여야 한다는 것을 의미한다. 논리적 설계의 컴포넌트가 부정확하거나 빼먹었을 때 물리 데이터 모델에서 논리 데이터 모델로의 회귀는 피할 수 없다. 물리 데이터 모델 제약 조건이 명시된 경우 조차도 논리 데이터 모델은 제약 조건이 없는 것처럼 진행해야 한다. 그럼에도 불구하고 이러한 경우들이 논리적 표현 원칙을 변화시키지는 않는다. 논리 데이터 모델링이 2년짜리 프로젝트의 첫 단계이든지 수많은 2주 짜리의 반복 과정이든지에 상관 없이 원칙은 솔루션을 구체화하기 전에 문제를 이해해야 한다는 것이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Database</category>
      <author>그레고리오78</author>
      <guid isPermaLink="true">https://gregorio78.tistory.com/177</guid>
      <comments>https://gregorio78.tistory.com/177#entry177comment</comments>
      <pubDate>Thu, 2 Aug 2018 13:05:54 +0900</pubDate>
    </item>
  </channel>
</rss>