<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Coding Story</title>
    <link>https://yeoncoding.tistory.com/</link>
    <description>기록하는 삶</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 00:26:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>연듀</managingEditor>
    <item>
      <title>[ISTQB 실러버스] 2장: 소프트웨어 개발수명주기(SDLC)와 테스팅</title>
      <link>https://yeoncoding.tistory.com/936</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;280&quot; data-start=&quot;247&quot; data-section-id=&quot;e6jbtn&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.1. 소프트웨어 개발수명주기(SDLC)에서의 테스팅&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;442&quot; data-start=&quot;282&quot; data-ke-size=&quot;size16&quot;&gt;SDLC는 소프트웨어 개발 과정의 단계와 활동을 정의하는 모델이다. 대표적인 예로는 폭포수 모델, V모델 같은 &lt;b&gt;순차적 모델&lt;/b&gt;, 나선형 모델 같은 &lt;b&gt;반복적 모델&lt;/b&gt;, 그리고 &lt;b&gt;점진적 개발 모델&lt;/b&gt; 등이 있다. &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;511&quot; data-start=&quot;444&quot; data-ke-size=&quot;size16&quot;&gt;각 SDLC 모델에 따라 &lt;b&gt;테스트 활동의 시기와 방법이 달라지기 때문에&lt;/b&gt;, 테스트 전략도 이에 맞게 조정되어야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;516&quot; data-start=&quot;513&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;560&quot; data-start=&quot;518&quot; data-section-id=&quot;1k13ulv&quot; data-ke-size=&quot;size23&quot;&gt;2.1.1. 소프트웨어 개발수명주기(SDLC)가 테스팅에 미치는 영향&lt;/h3&gt;
&lt;p data-end=&quot;589&quot; data-start=&quot;562&quot; data-ke-size=&quot;size16&quot;&gt;선택한 SDLC 모델은 다음 요소에 영향을 준다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;667&quot; data-start=&quot;591&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;607&quot; data-start=&quot;591&quot; data-section-id=&quot;1adcgft&quot;&gt;테스트 활동의 범위와 시기&lt;/li&gt;
&lt;li data-end=&quot;620&quot; data-start=&quot;608&quot; data-section-id=&quot;1bylaq8&quot;&gt;테스트 문서화 수준&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;621&quot; data-section-id=&quot;1yhqnc8&quot;&gt;테스트 기법과 테스트 접근 방식&lt;/li&gt;
&lt;li data-end=&quot;653&quot; data-start=&quot;641&quot; data-section-id=&quot;nw3g5&quot;&gt;테스트 자동화 범위&lt;/li&gt;
&lt;li data-end=&quot;667&quot; data-start=&quot;654&quot; data-section-id=&quot;2ditco&quot;&gt;테스터의 역할과 책임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;778&quot; data-start=&quot;669&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 순차적 개발 모델에서는 개발 후반에 실행 코드가 나오기 때문에 &lt;b&gt;동적 테스트는 후반에 집중되는 경향&lt;/b&gt;이 있다. &lt;span data-state=&quot;closed&quot;&gt;&lt;span&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;hr data-end=&quot;783&quot; data-start=&quot;780&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;827&quot; data-start=&quot;785&quot; data-section-id=&quot;1hfda6q&quot; data-ke-size=&quot;size23&quot;&gt;2.1.2. 소프트웨어 개발수명주기(SDLC)와 좋은 테스팅 프랙티스&lt;/h3&gt;
&lt;p data-end=&quot;863&quot; data-start=&quot;829&quot; data-ke-size=&quot;size16&quot;&gt;SDLC와 관계없이 적용되는 좋은 테스팅 원칙은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1035&quot; data-start=&quot;865&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1035&quot; data-start=&quot;865&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;895&quot; data-start=&quot;865&quot; data-section-id=&quot;wb83ge&quot;&gt;모든 개발 활동에 대응되는 테스트 활동을 수행한다.&lt;/li&gt;
&lt;li data-end=&quot;924&quot; data-start=&quot;896&quot; data-section-id=&quot;1jbehz3&quot;&gt;테스트 레벨마다 명확한 테스트 목적을 정의한다.&lt;/li&gt;
&lt;li data-end=&quot;955&quot; data-start=&quot;925&quot; data-section-id=&quot;2cs4vy&quot;&gt;개발 초기 단계부터 테스트 분석과 설계를 시작한다.&lt;/li&gt;
&lt;li data-end=&quot;1035&quot; data-start=&quot;956&quot; data-section-id=&quot;161inin&quot;&gt;문서 초안 단계에서 테스터가 리뷰에 참여해 결함을 조기에 발견한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1040&quot; data-start=&quot;1037&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1072&quot; data-start=&quot;1042&quot; data-section-id=&quot;1u5e5t1&quot; data-ke-size=&quot;size23&quot;&gt;2.1.3. 소프트웨어 개발 주도를 위한 테스팅&lt;/h3&gt;
&lt;p data-end=&quot;1106&quot; data-start=&quot;1074&quot; data-ke-size=&quot;size16&quot;&gt;테스트를 개발 방향을 결정하는 도구로 사용하는 접근법이다.&lt;/p&gt;
&lt;p data-end=&quot;1106&quot; data-start=&quot;1074&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1116&quot; data-start=&quot;1108&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 방법:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1331&quot; data-start=&quot;1118&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1190&quot; data-start=&quot;1118&quot; data-section-id=&quot;1kbgd4g&quot;&gt;&lt;b&gt;TDD (Test Driven Development)&lt;/b&gt;&lt;br /&gt;테스트를 먼저 작성하고 그 테스트를 통과하도록 코드를 개발&lt;/li&gt;
&lt;li data-end=&quot;1263&quot; data-start=&quot;1192&quot; data-section-id=&quot;1os95ct&quot;&gt;&lt;b&gt;ATDD (Acceptance Test Driven Development)&lt;/b&gt;&lt;br /&gt;인수 테스트를 먼저 정의한 후 개발&lt;/li&gt;
&lt;li data-end=&quot;1331&quot; data-start=&quot;1265&quot; data-section-id=&quot;6adbfd&quot;&gt;&lt;b&gt;BDD (Behavior Driven Development)&lt;/b&gt;&lt;br /&gt;사용자 행동 중심으로 테스트와 개발 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1439&quot; data-start=&quot;1333&quot; data-ke-size=&quot;size16&quot;&gt;이러한 방식은 &lt;b&gt;코드 작성 전에 테스트를 정의&lt;/b&gt;한다는 특징이 있으며, 조기 테스팅과 시프트 레프트 전략을 지원한다. &lt;span data-state=&quot;closed&quot;&gt;&lt;span&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;hr data-end=&quot;1444&quot; data-start=&quot;1441&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1474&quot; data-start=&quot;1446&quot; data-section-id=&quot;1harpmt&quot; data-ke-size=&quot;size23&quot;&gt;2.1.4. 데브옵스(DevOps)와 테스팅&lt;/h3&gt;
&lt;p data-end=&quot;1549&quot; data-start=&quot;1476&quot; data-ke-size=&quot;size16&quot;&gt;DevOps는 &lt;b&gt;개발(Development)과 운영(Operations)의 협업을 통해 빠르게 소프트웨어를 배포하는 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1549&quot; data-start=&quot;1476&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1562&quot; data-start=&quot;1551&quot; data-ke-size=&quot;size16&quot;&gt;테스팅과 관련된 특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1640&quot; data-start=&quot;1564&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1588&quot; data-start=&quot;1564&quot; data-section-id=&quot;r1u7eh&quot;&gt;지속적 통합(CI)과 지속적 배포(CD)&lt;/li&gt;
&lt;li data-end=&quot;1605&quot; data-start=&quot;1589&quot; data-section-id=&quot;x7p50x&quot;&gt;자동화된 테스트 활용 증가&lt;/li&gt;
&lt;li data-end=&quot;1618&quot; data-start=&quot;1606&quot; data-section-id=&quot;70mlsd&quot;&gt;빠른 피드백 사이클&lt;/li&gt;
&lt;li data-end=&quot;1640&quot; data-start=&quot;1619&quot; data-section-id=&quot;9zagsc&quot;&gt;개발, 테스트, 운영 간 협업 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1645&quot; data-start=&quot;1642&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1681&quot; data-start=&quot;1647&quot; data-section-id=&quot;19kcico&quot; data-ke-size=&quot;size23&quot;&gt;2.1.5. 시프트 레프트 접근법(Shift Left)&lt;/h3&gt;
&lt;p data-end=&quot;1719&quot; data-start=&quot;1683&quot; data-ke-size=&quot;size16&quot;&gt;테스트 활동을 &lt;b&gt;개발 초기 단계로 이동시키는 접근 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1719&quot; data-start=&quot;1683&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1723&quot; data-start=&quot;1721&quot; data-ke-size=&quot;size16&quot;&gt;목적&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1759&quot; data-start=&quot;1725&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1737&quot; data-start=&quot;1725&quot; data-section-id=&quot;pmmej8&quot;&gt;결함을 조기에 발견&lt;/li&gt;
&lt;li data-end=&quot;1748&quot; data-start=&quot;1738&quot; data-section-id=&quot;2v8l10&quot;&gt;수정 비용 감소&lt;/li&gt;
&lt;li data-end=&quot;1759&quot; data-start=&quot;1749&quot; data-section-id=&quot;mtk7n0&quot;&gt;개발 품질 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1763&quot; data-start=&quot;1761&quot; data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1803&quot; data-start=&quot;1765&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1774&quot; data-start=&quot;1765&quot; data-section-id=&quot;90kqq5&quot;&gt;요구사항 리뷰&lt;/li&gt;
&lt;li data-end=&quot;1786&quot; data-start=&quot;1775&quot; data-section-id=&quot;53x3ck&quot;&gt;설계 단계 테스트&lt;/li&gt;
&lt;li data-end=&quot;1803&quot; data-start=&quot;1787&quot; data-section-id=&quot;1i169lg&quot;&gt;코드 작성 전 테스트 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1808&quot; data-start=&quot;1805&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1833&quot; data-start=&quot;1810&quot; data-section-id=&quot;gg0efa&quot; data-ke-size=&quot;size23&quot;&gt;2.1.6. 회고 및 프로세스 개선&lt;/h3&gt;
&lt;p data-end=&quot;1886&quot; data-start=&quot;1835&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트나 반복 개발이 끝난 후 &lt;b&gt;팀이 수행한 활동을 돌아보고 개선점을 찾는 활동&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1886&quot; data-start=&quot;1835&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1894&quot; data-start=&quot;1888&quot; data-ke-size=&quot;size16&quot;&gt;회고의 목적&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1948&quot; data-start=&quot;1896&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1912&quot; data-start=&quot;1896&quot; data-section-id=&quot;twel05&quot;&gt;잘한 점과 개선할 점 분석&lt;/li&gt;
&lt;li data-end=&quot;1933&quot; data-start=&quot;1913&quot; data-section-id=&quot;16ry8zd&quot;&gt;다음 반복 개발에서 프로세스 개선&lt;/li&gt;
&lt;li data-end=&quot;1948&quot; data-start=&quot;1934&quot; data-section-id=&quot;165pn2v&quot;&gt;팀 협업 및 품질 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1953&quot; data-start=&quot;1950&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1975&quot; data-start=&quot;1955&quot; data-section-id=&quot;1nyzyg1&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.2 테스트 레벨과 테스트 유형&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1992&quot; data-start=&quot;1977&quot; data-section-id=&quot;18lfkhw&quot; data-ke-size=&quot;size23&quot;&gt;2.2.1 테스트 레벨&lt;/h3&gt;
&lt;p data-end=&quot;2034&quot; data-start=&quot;1994&quot; data-ke-size=&quot;size16&quot;&gt;테스트 레벨은 &lt;b&gt;테스트 대상 범위에 따라 구분되는 테스트 단계&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;2034&quot; data-start=&quot;1994&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2045&quot; data-start=&quot;2036&quot; data-ke-size=&quot;size16&quot;&gt;주요 테스트 레벨&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2214&quot; data-start=&quot;2047&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2086&quot; data-start=&quot;2047&quot; data-section-id=&quot;gbt829&quot;&gt;&lt;b&gt;컴포넌트 테스트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2086&quot; data-start=&quot;2066&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2086&quot; data-start=&quot;2066&quot; data-section-id=&quot;1vohlko&quot;&gt;개별 모듈 또는 함수 단위 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2126&quot; data-start=&quot;2088&quot; data-section-id=&quot;r2i0tm&quot;&gt;&lt;b&gt;통합 테스트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2126&quot; data-start=&quot;2105&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2126&quot; data-start=&quot;2105&quot; data-section-id=&quot;1d57mq8&quot;&gt;여러 컴포넌트 간 인터페이스 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2170&quot; data-start=&quot;2128&quot; data-section-id=&quot;1ea6bfz&quot;&gt;&lt;b&gt;시스템 테스트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2170&quot; data-start=&quot;2146&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2170&quot; data-start=&quot;2146&quot; data-section-id=&quot;1fb31xo&quot;&gt;전체 시스템이 요구사항을 충족하는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2214&quot; data-start=&quot;2172&quot; data-section-id=&quot;pd4e0h&quot;&gt;&lt;b&gt;인수 테스트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2214&quot; data-start=&quot;2189&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2214&quot; data-start=&quot;2189&quot; data-section-id=&quot;x3w2s1&quot;&gt;사용자 또는 고객이 시스템 수용 여부 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2248&quot; data-start=&quot;2216&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 레벨은 &lt;b&gt;서로 다른 테스트 목적&lt;/b&gt;을 가진다.&lt;/p&gt;
&lt;hr data-end=&quot;2253&quot; data-start=&quot;2250&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2270&quot; data-start=&quot;2255&quot; data-section-id=&quot;9pu99u&quot; data-ke-size=&quot;size23&quot;&gt;2.2.2 테스트 유형&lt;/h3&gt;
&lt;p data-end=&quot;2310&quot; data-start=&quot;2272&quot; data-ke-size=&quot;size16&quot;&gt;테스트 유형은 &lt;b&gt;무엇을 테스트하는지에 따라 구분되는 테스트&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;2319&quot; data-start=&quot;2312&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2331&quot; data-start=&quot;2321&quot; data-section-id=&quot;aulrqb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 기능 테스트&lt;/b&gt;: 시스템이 요구된 기능을 수행하는지 확인&lt;/p&gt;
&lt;p data-end=&quot;2366&quot; data-start=&quot;2355&quot; data-section-id=&quot;13c8693&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 비기능 테스트&lt;/b&gt;: 성능, 보안, 사용성 등 &lt;b&gt;품질 속성&lt;/b&gt;을 테스트&lt;/p&gt;
&lt;p data-end=&quot;2410&quot; data-start=&quot;2397&quot; data-section-id=&quot;2dlazm&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 구조 기반 테스트:&lt;/b&gt;&amp;nbsp;코드 구조나 내부 로직을 기준으로 테스트 수행&lt;/p&gt;
&lt;hr data-end=&quot;2441&quot; data-start=&quot;2438&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2469&quot; data-start=&quot;2443&quot; data-section-id=&quot;19ynl0w&quot; data-ke-size=&quot;size23&quot;&gt;2.2.3 확인 테스팅 및 리그레션 테스팅&lt;/h3&gt;
&lt;p data-end=&quot;2504&quot; data-start=&quot;2471&quot; data-section-id=&quot;1ia1ubi&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확인 테스팅 (Confirmation Testing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2541&quot; data-start=&quot;2506&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2541&quot; data-start=&quot;2506&quot; data-section-id=&quot;xjpmq9&quot;&gt;수정된 결함이 &lt;b&gt;정상적으로 해결되었는지 확인&lt;/b&gt;하는 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2576&quot; data-start=&quot;2543&quot; data-section-id=&quot;n22gt3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리그레션 테스팅 (Regression Testing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2625&quot; data-start=&quot;2578&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2625&quot; data-start=&quot;2578&quot; data-section-id=&quot;1teak6f&quot;&gt;수정이나 변경으로 인해 &lt;b&gt;기존 기능에 문제가 생기지 않았는지 확인&lt;/b&gt;하는 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2740&quot; data-start=&quot;2737&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2756&quot; data-start=&quot;2742&quot; data-section-id=&quot;dhv5vs&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.3 유지보수 테스팅&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2805&quot; data-start=&quot;2758&quot; data-ke-size=&quot;size16&quot;&gt;유지보수 테스팅은 &lt;b&gt;운영 중인 시스템에 변경이 발생했을 때 수행하는 테스트&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;2805&quot; data-start=&quot;2758&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2812&quot; data-start=&quot;2807&quot; data-ke-size=&quot;size16&quot;&gt;발생 원인&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2866&quot; data-start=&quot;2814&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2821&quot; data-start=&quot;2814&quot; data-section-id=&quot;n01xmp&quot;&gt;기능 개선&lt;/li&gt;
&lt;li data-end=&quot;2829&quot; data-start=&quot;2822&quot; data-section-id=&quot;bn3crh&quot;&gt;결함 수정&lt;/li&gt;
&lt;li data-end=&quot;2854&quot; data-start=&quot;2830&quot; data-section-id=&quot;2lzlhv&quot;&gt;환경 변화 (OS, DB, 브라우저 등)&lt;/li&gt;
&lt;li data-end=&quot;2866&quot; data-start=&quot;2855&quot; data-section-id=&quot;qcftip&quot;&gt;시스템 업그레이드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2870&quot; data-start=&quot;2868&quot; data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2919&quot; data-start=&quot;2872&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2885&quot; data-start=&quot;2872&quot; data-section-id=&quot;1ct4ol4&quot;&gt;변경 영향 분석 필요&lt;/li&gt;
&lt;li data-end=&quot;2899&quot; data-start=&quot;2886&quot; data-section-id=&quot;1oxxtzt&quot;&gt;리그레션 테스트 중요&lt;/li&gt;
&lt;li data-end=&quot;2919&quot; data-start=&quot;2900&quot; data-section-id=&quot;e0utm4&quot;&gt;기존 시스템 안정성 유지가 목적&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>QA</category>
      <category>ISTQB</category>
      <category>QA</category>
      <category>Syllabus</category>
      <category>실러버스</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/936</guid>
      <comments>https://yeoncoding.tistory.com/936#entry936comment</comments>
      <pubDate>Tue, 10 Mar 2026 14:51:08 +0900</pubDate>
    </item>
    <item>
      <title>[ISTQB 실러버스] 1장: 테스팅의 기초</title>
      <link>https://yeoncoding.tistory.com/935</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실러버스 1장 핵심 요약 GOGO ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;23&quot; data-start=&quot;0&quot; data-section-id=&quot;1ljduqi&quot; data-ke-size=&quot;size23&quot;&gt;테스팅이란 무엇인가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;148&quot; data-start=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;92&quot; data-start=&quot;25&quot; data-section-id=&quot;6d9aum&quot;&gt;&lt;b&gt;소프트웨어 테스팅&lt;/b&gt;은 결함을 발견하고 소프트웨어의 &lt;b&gt;품질을 평가하여 장애 위험을 줄이기 위한 활동&lt;/b&gt;이다.&lt;/li&gt;
&lt;li data-end=&quot;148&quot; data-start=&quot;93&quot; data-section-id=&quot;1q2wa0k&quot;&gt;테스트 대상이 되는 소프트웨어 산출물을 &lt;b&gt;테스트 대상(Test Object)&lt;/b&gt; 이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;167&quot; data-start=&quot;150&quot; 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-end=&quot;431&quot; data-start=&quot;169&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;207&quot; data-start=&quot;169&quot; data-section-id=&quot;8n6xuf&quot;&gt;테스팅은 단순히 &lt;b&gt;프로그램을 실행하는 것만 의미하지 않는다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;296&quot; data-start=&quot;208&quot; data-section-id=&quot;1sb3bcz&quot;&gt;&lt;b&gt;요구사항을 충족하는지 확인(Verification)&lt;/b&gt; 과&lt;br /&gt;&lt;b&gt;사용자의 실제 필요를 만족하는지 확인(Validation)&lt;/b&gt; 을 모두 포함한다.&lt;/li&gt;
&lt;li data-end=&quot;390&quot; data-start=&quot;297&quot; data-section-id=&quot;xoeoth&quot;&gt;테스팅은 두 가지 방식으로 수행된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;390&quot; data-start=&quot;322&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;351&quot; data-start=&quot;322&quot; data-section-id=&quot;p1ht4u&quot;&gt;&lt;b&gt;동적 테스팅&lt;/b&gt;: 소프트웨어를 실행하여 테스트&lt;/li&gt;
&lt;li data-end=&quot;390&quot; data-start=&quot;354&quot; data-section-id=&quot;1vuf3y5&quot;&gt;&lt;b&gt;정적 테스팅&lt;/b&gt;: 실행하지 않고 리뷰나 정적 분석으로 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;431&quot; data-start=&quot;391&quot; data-section-id=&quot;o6kbym&quot;&gt;또한 테스트 &lt;b&gt;계획, 관리, 모니터링 등 관리 활동&lt;/b&gt;도 포함된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;517&quot; data-start=&quot;441&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;517&quot; data-start=&quot;443&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 테스팅은 결함을 발견하고 품질을 평가하기 위해 수행하는 활동으로, 실행 테스트뿐 아니라 검증&amp;middot;검토&amp;middot;관리 활동까지 포함한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;87&quot; data-start=&quot;54&quot; data-section-id=&quot;18rnbyf&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;87&quot; data-start=&quot;54&quot; data-section-id=&quot;18rnbyf&quot; data-ke-size=&quot;size26&quot;&gt;1.1.1 테스트 목적 (Test Objectives)&lt;/h2&gt;
&lt;p data-end=&quot;108&quot; data-start=&quot;89&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;353&quot; data-start=&quot;110&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;140&quot; data-start=&quot;110&quot; data-section-id=&quot;ts89vp&quot;&gt;요구사항, 설계, 코드 등 &lt;b&gt;작업 산출물 평가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;160&quot; data-start=&quot;141&quot; data-section-id=&quot;1yrrh6n&quot;&gt;&lt;b&gt;결함 식별 및 장애 유발&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;182&quot; data-start=&quot;161&quot; data-section-id=&quot;vs33zl&quot;&gt;요구된 &lt;b&gt;테스트 커버리지 확보&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;206&quot; data-start=&quot;183&quot; data-section-id=&quot;nnmwmd&quot;&gt;&lt;b&gt;품질 부족으로 인한 리스크 감소&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;241&quot; data-start=&quot;207&quot; data-section-id=&quot;d8n240&quot;&gt;요구사항 충족 여부 확인 (&lt;b&gt;Verification&lt;/b&gt;)&lt;/li&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;242&quot; data-section-id=&quot;8xflpg&quot;&gt;계약, 법률, 규제 요구사항 준수 여부 확인&lt;/li&gt;
&lt;li data-end=&quot;296&quot; data-start=&quot;269&quot; data-section-id=&quot;1stl081&quot;&gt;이해관계자의 &lt;b&gt;의사결정을 위한 정보 제공&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;318&quot; data-start=&quot;297&quot; data-section-id=&quot;tgbqox&quot;&gt;제품 품질에 대한 &lt;b&gt;신뢰 확보&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;353&quot; data-start=&quot;319&quot; data-section-id=&quot;1tq71ku&quot;&gt;사용자 기대 충족 여부 확인 (&lt;b&gt;Validation&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;366&quot; data-start=&quot;355&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;428&quot; data-start=&quot;367&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;428&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;테스트 목적은 테스트 대상, 테스트 레벨, 리스크, 개발 방식, 비즈니스 환경 등에 따라 달라질 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;452&quot; data-start=&quot;435&quot; data-section-id=&quot;17rf6k3&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;452&quot; data-start=&quot;435&quot; data-section-id=&quot;17rf6k3&quot; data-ke-size=&quot;size26&quot;&gt;1.1.2 테스팅과 디버깅&lt;/h2&gt;
&lt;h3 data-end=&quot;513&quot; data-start=&quot;506&quot; data-section-id=&quot;1xklpij&quot; data-ke-size=&quot;size23&quot;&gt;테스팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;585&quot; data-start=&quot;514&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;537&quot; data-start=&quot;514&quot; data-section-id=&quot;n0ix4o&quot;&gt;결함을 발견하거나 장애를 유발하는 활동&lt;/li&gt;
&lt;li data-end=&quot;563&quot; data-start=&quot;538&quot; data-section-id=&quot;oed4c7&quot;&gt;동적 테스팅: 실행하여 장애 발생 확인&lt;/li&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;564&quot; data-section-id=&quot;1lkzasc&quot;&gt;정적 테스팅: 실행 없이 결함 발견&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;594&quot; data-start=&quot;587&quot; data-section-id=&quot;1xf2kpf&quot; data-ke-size=&quot;size23&quot;&gt;디버깅&lt;/h3&gt;
&lt;p data-end=&quot;624&quot; data-start=&quot;595&quot; data-ke-size=&quot;size16&quot;&gt;장애가 발생했을 때 &lt;b&gt;원인을 찾아 수정하는 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;637&quot; data-start=&quot;626&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 디버깅 과정&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;673&quot; data-start=&quot;639&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;647&quot; data-start=&quot;639&quot; data-section-id=&quot;1ih7l93&quot;&gt;장애 재현&lt;/li&gt;
&lt;li data-end=&quot;664&quot; data-start=&quot;648&quot; data-section-id=&quot;h58w3j&quot;&gt;원인 분석 (결함 찾기)&lt;/li&gt;
&lt;li data-end=&quot;673&quot; data-start=&quot;665&quot; data-section-id=&quot;al0w4t&quot;&gt;결함 수정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;688&quot; data-start=&quot;675&quot; data-ke-size=&quot;size16&quot;&gt;수정 후 수행하는 테스트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;823&quot; data-start=&quot;690&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;690&quot; data-section-id=&quot;sp5l1c&quot;&gt;&lt;b&gt;확인 테스팅 (Confirmation Testing)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 결함이 제대로 수정되었는지 확인&lt;/li&gt;
&lt;li data-end=&quot;823&quot; data-start=&quot;751&quot; data-section-id=&quot;varbx7&quot;&gt;&lt;b&gt;리그레션 테스팅 (Regression Testing)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 수정으로 인해 다른 기능에 문제가 생기지 않았는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;846&quot; data-start=&quot;830&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;902&quot; data-start=&quot;848&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;902&quot; data-start=&quot;850&quot; data-ke-size=&quot;size16&quot;&gt;테스팅은 결함을 발견하는 활동이고, 디버깅은 발견된 결함의 원인을 분석하고 수정하는 활동이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-start=&quot;430&quot; data-end=&quot;433&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;108&quot; data-start=&quot;90&quot; data-section-id=&quot;bpsue5&quot;&gt;1.2 테스팅이 왜 필요한가?&lt;/h1&gt;
&lt;p data-end=&quot;175&quot; data-start=&quot;110&quot; data-ke-size=&quot;size16&quot;&gt;테스팅은 &lt;b&gt;정해진 범위, 시간, 비용 안에서 테스트 목표를 달성하고 소프트웨어 품질을 관리하는 데 도움을 준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;226&quot; data-start=&quot;177&quot; data-ke-size=&quot;size16&quot;&gt;또한 모든 이해관계자가 참여하여 &lt;b&gt;결함을 발견하고 프로젝트 성공에 기여&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;257&quot; data-start=&quot;233&quot; data-section-id=&quot;1mvb5w5&quot; data-ke-size=&quot;size23&quot;&gt;1.2.1 테스팅이 성공에 기여하는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;421&quot; data-start=&quot;292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;320&quot; data-start=&quot;292&quot; data-section-id=&quot;1lcimq0&quot;&gt;&lt;b&gt;결함을 조기에 발견하여 품질 향상에 기여&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;344&quot; data-start=&quot;321&quot; data-section-id=&quot;1qcbucl&quot;&gt;소프트웨어 &lt;b&gt;품질 평가 정보 제공&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;368&quot; data-start=&quot;345&quot; data-section-id=&quot;o9c00g&quot;&gt;&lt;b&gt;릴리스 여부 등의 의사결정 지원&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;369&quot; data-section-id=&quot;1qc1kq1&quot;&gt;&lt;b&gt;사용자 요구사항을 간접적으로 검증&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;394&quot; data-section-id=&quot;c2gvns&quot;&gt;&lt;b&gt;계약, 법률, 규제 요구사항 준수 확인&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;429&quot; data-start=&quot;423&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;470&quot; data-start=&quot;430&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;432&quot; data-ke-size=&quot;size16&quot;&gt;테스팅은 결함을 발견하여 &lt;b&gt;품질 개선과 의사결정에 도움을 준다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 data-end=&quot;499&quot; data-start=&quot;477&quot; data-section-id=&quot;1pddlj2&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h3 data-end=&quot;499&quot; data-start=&quot;477&quot; data-section-id=&quot;1pddlj2&quot; data-ke-size=&quot;size23&quot;&gt;1.2.2 테스팅과 품질 보증(QA)&lt;/h3&gt;
&lt;p data-end=&quot;520&quot; data-start=&quot;501&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스팅(Testting)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;587&quot; data-start=&quot;521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;533&quot; data-start=&quot;521&quot; data-section-id=&quot;1trn72c&quot;&gt;제품 중심 활동&lt;/li&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;534&quot; data-section-id=&quot;8ab2yq&quot;&gt;&lt;b&gt;결함 발견 및 품질 확인&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;556&quot; data-section-id=&quot;1x7vxf2&quot;&gt;&lt;b&gt;품질 제어(Quality Control)&lt;/b&gt; 활동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;604&quot; data-start=&quot;589&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;품질 보증(QA)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;641&quot; data-start=&quot;605&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;605&quot; data-section-id=&quot;sh80no&quot;&gt;프로세스 중심 활동&lt;/li&gt;
&lt;li data-end=&quot;641&quot; data-start=&quot;620&quot; data-section-id=&quot;1leho6e&quot;&gt;&lt;b&gt;결함 예방 및 프로세스 개선&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;757&quot; data-start=&quot;732&quot; data-section-id=&quot;1l9vfh3&quot; data-ke-size=&quot;size23&quot;&gt;1.2.3 오류, 결함, 장애, 근본 원인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;910&quot; data-start=&quot;774&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;806&quot; data-start=&quot;774&quot; data-section-id=&quot;dzvrz9&quot;&gt;&lt;b&gt;오류(Error)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 사람이 저지른 실수&lt;/li&gt;
&lt;li data-end=&quot;856&quot; data-start=&quot;808&quot; data-section-id=&quot;1xwltpa&quot;&gt;&lt;b&gt;결함(Defect / Bug)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 오류로 인해 소프트웨어에 생긴 문제&lt;/li&gt;
&lt;li data-end=&quot;910&quot; data-start=&quot;858&quot; data-section-id=&quot;j52wpm&quot;&gt;&lt;b&gt;장애(Failure)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 결함이 실행되어 시스템이 제대로 동작하지 않는 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;916&quot; data-start=&quot;912&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;934&quot; data-start=&quot;918&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오류 &amp;rarr; 결함 &amp;rarr; 장애&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;977&quot; data-start=&quot;936&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;977&quot; data-start=&quot;936&quot; data-section-id=&quot;1bocu2b&quot;&gt;&lt;b&gt;근본 원인(Root Cause)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 문제의 근본적인 원인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1016&quot; data-start=&quot;979&quot; data-ke-size=&quot;size16&quot;&gt;근본 원인을 분석하면 &lt;b&gt;유사한 결함과 장애를 예방할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1128&quot; data-start=&quot;1039&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;433&quot; data-start=&quot;430&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;133&quot; data-start=&quot;114&quot; data-section-id=&quot;uch4tx&quot;&gt;1.3 테스팅의 원리 (7가지)&lt;/h1&gt;
&lt;h3 data-end=&quot;160&quot; data-start=&quot;135&quot; data-section-id=&quot;4nmm6&quot; data-ke-size=&quot;size23&quot;&gt;1. 테스팅은 결함의 존재만 보여준다&lt;/h3&gt;
&lt;p data-end=&quot;207&quot; data-start=&quot;161&quot; data-ke-size=&quot;size16&quot;&gt;테스팅은 &lt;b&gt;결함이 있음을 발견할 수 있지만, 결함이 없음을 증명할 수는 없다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;236&quot; data-start=&quot;214&quot; data-section-id=&quot;1d20mht&quot; data-ke-size=&quot;size23&quot;&gt;2. 완벽한 테스팅은 불가능하다&lt;/h3&gt;
&lt;p data-end=&quot;290&quot; data-start=&quot;237&quot; data-ke-size=&quot;size16&quot;&gt;모든 경우를 테스트하는 것은 불가능하므로&lt;br /&gt;&lt;b&gt;우선순위와 리스크 기반으로 테스트해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;311&quot; data-start=&quot;297&quot; data-section-id=&quot;5e70hg&quot; data-ke-size=&quot;size23&quot;&gt;3. 조기 테스팅&lt;/h3&gt;
&lt;p data-end=&quot;347&quot; data-start=&quot;312&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;초기에 결함을 발견할수록 시간과 비용을 절약할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;387&quot; data-start=&quot;354&quot; data-section-id=&quot;125cddk&quot; data-ke-size=&quot;size23&quot;&gt;4. 결함 집중 (Defect Clustering)&lt;/h3&gt;
&lt;p data-end=&quot;432&quot; data-start=&quot;388&quot; data-ke-size=&quot;size16&quot;&gt;대부분의 결함은 &lt;b&gt;소수의 모듈에 집중되는 경향&lt;/b&gt;이 있다.&lt;br /&gt;(파레토 법칙)&lt;/p&gt;
&lt;h3 data-end=&quot;476&quot; data-start=&quot;439&quot; data-section-id=&quot;8zv9fr&quot; data-ke-size=&quot;size23&quot;&gt;5. 테스트 효과 감소 (Pesticide Paradox)&lt;/h3&gt;
&lt;p data-end=&quot;533&quot; data-start=&quot;477&quot; data-ke-size=&quot;size16&quot;&gt;같은 테스트를 반복하면 &lt;b&gt;새로운 결함을 찾는 효과가 감소한다.&lt;/b&gt;&lt;br /&gt;&amp;rarr; 새로운 테스트 케이스 필요&lt;/p&gt;
&lt;h3 data-end=&quot;561&quot; data-start=&quot;540&quot; data-section-id=&quot;1k9er8p&quot; data-ke-size=&quot;size23&quot;&gt;6. 테스팅은 정황에 의존한다&lt;/h3&gt;
&lt;p data-end=&quot;597&quot; data-start=&quot;562&quot; data-ke-size=&quot;size16&quot;&gt;테스팅 방법은 &lt;b&gt;프로젝트, 시스템, 환경에 따라 달라진다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;649&quot; data-start=&quot;604&quot; data-section-id=&quot;1kih0qf&quot; data-ke-size=&quot;size23&quot;&gt;7. 결함 부재의 궤변 (Absence of Errors Fallacy)&lt;/h3&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;결함이 없더라도 &lt;b&gt;사용자 요구를 만족하지 못하면 소프트웨어는 실패한 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-start=&quot;430&quot; data-end=&quot;433&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;118&quot; data-start=&quot;91&quot; data-section-id=&quot;1y71ijt&quot;&gt;1.4 테스트 활동, 테스트웨어, 테스트 역할&lt;/h1&gt;
&lt;h2 data-end=&quot;153&quot; data-start=&quot;120&quot; data-section-id=&quot;11n2d7c&quot; data-ke-size=&quot;size26&quot;&gt;1.4.1 테스트 활동과 업무&lt;/h2&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;155&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;220&quot; data-start=&quot;172&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.테스트 계획 (Test Planning)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 목표와 전략 수립&lt;/p&gt;
&lt;p data-end=&quot;293&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.테스트 모니터링 &amp;amp; 제어 (Test Monitoring &amp;amp; Control)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 진행 상황 확인 및 조정&lt;/p&gt;
&lt;p data-end=&quot;342&quot; data-start=&quot;295&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.테스트 분석 (Test Analysis)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 무엇을 테스트할지 결정&lt;/p&gt;
&lt;p data-end=&quot;387&quot; data-start=&quot;344&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4.테스트 설계 (Test Design)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 케이스 설계&lt;/p&gt;
&lt;p data-end=&quot;446&quot; data-start=&quot;389&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5.테스트 구현 (Test Implementation)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 데이터, 스크립트 준비&lt;/p&gt;
&lt;p data-end=&quot;498&quot; data-start=&quot;448&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6.테스트 실행 (Test Execution)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 수행 및 결과 비교&lt;/p&gt;
&lt;p data-end=&quot;551&quot; data-start=&quot;500&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7.테스트 완료 (Test Completion)&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 결과 정리 및 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;611&quot; data-start=&quot;587&quot; data-section-id=&quot;vq3x5u&quot; data-ke-size=&quot;size26&quot;&gt;1.4.2 정황에 따른 테스트 프로세스&lt;/h2&gt;
&lt;p data-end=&quot;636&quot; data-start=&quot;613&quot; data-ke-size=&quot;size16&quot;&gt;테스팅 방법은 다음 요소에 따라 달라진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;714&quot; data-start=&quot;638&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;645&quot; data-start=&quot;638&quot; data-section-id=&quot;55so3g&quot;&gt;이해관계자&lt;/li&gt;
&lt;li data-end=&quot;652&quot; data-start=&quot;646&quot; data-section-id=&quot;acpyoc&quot;&gt;팀 역량&lt;/li&gt;
&lt;li data-end=&quot;663&quot; data-start=&quot;653&quot; data-section-id=&quot;9vbgzk&quot;&gt;비즈니스 도메인&lt;/li&gt;
&lt;li data-end=&quot;671&quot; data-start=&quot;664&quot; data-section-id=&quot;62j4al&quot;&gt;기술 환경&lt;/li&gt;
&lt;li data-end=&quot;690&quot; data-start=&quot;672&quot; data-section-id=&quot;1rf2018&quot;&gt;프로젝트 제약 (시간, 비용)&lt;/li&gt;
&lt;li data-end=&quot;698&quot; data-start=&quot;691&quot; data-section-id=&quot;1fkbs05&quot;&gt;조직 구조&lt;/li&gt;
&lt;li data-end=&quot;705&quot; data-start=&quot;699&quot; data-section-id=&quot;1j4cxn4&quot;&gt;SDLC&lt;/li&gt;
&lt;li data-end=&quot;714&quot; data-start=&quot;706&quot; data-section-id=&quot;1ra5s34&quot;&gt;테스트 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;742&quot; data-start=&quot;723&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;725&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스팅은 정황에 의존한다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;774&quot; data-start=&quot;749&quot; data-section-id=&quot;1hmr7bd&quot; data-ke-size=&quot;size26&quot;&gt;1.4.3 테스트웨어&amp;nbsp;&lt;/h2&gt;
&lt;p data-end=&quot;800&quot; data-start=&quot;776&quot; 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-end=&quot;876&quot; data-start=&quot;806&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;814&quot; data-start=&quot;806&quot; data-section-id=&quot;1ra13td&quot;&gt;테스트 계획&lt;/li&gt;
&lt;li data-end=&quot;824&quot; data-start=&quot;815&quot; data-section-id=&quot;ss5iiw&quot;&gt;테스트 케이스&lt;/li&gt;
&lt;li data-end=&quot;835&quot; data-start=&quot;825&quot; data-section-id=&quot;pj91x1&quot;&gt;테스트 스크립트&lt;/li&gt;
&lt;li data-end=&quot;845&quot; data-start=&quot;836&quot; data-section-id=&quot;set33g&quot;&gt;테스트 데이터&lt;/li&gt;
&lt;li data-end=&quot;854&quot; data-start=&quot;846&quot; data-section-id=&quot;1ra45to&quot;&gt;테스트 로그&lt;/li&gt;
&lt;li data-end=&quot;863&quot; data-start=&quot;855&quot; data-section-id=&quot;tjscbc&quot;&gt;결함 보고서&lt;/li&gt;
&lt;li data-end=&quot;876&quot; data-start=&quot;864&quot; data-section-id=&quot;g065iw&quot;&gt;테스트 완료 보고서&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;910&quot; data-start=&quot;883&quot; data-section-id=&quot;1txxlgy&quot; data-ke-size=&quot;size26&quot;&gt;1.4.4 테스트 베이시스와 테스트웨어 간의 추적성&lt;/h2&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;137&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추적성은 테스트 베이시스의 요소와 테스트웨어, 테스트 결과, 결함 사이의 관계를 연결하고 관리하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;236&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;테스트 베이시스 예&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;255&quot; data-start=&quot;237&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;245&quot; data-start=&quot;237&quot; data-section-id=&quot;4ksb69&quot;&gt;요구사항&lt;/li&gt;
&lt;li data-end=&quot;255&quot; data-start=&quot;246&quot; data-section-id=&quot;1e9vxsc&quot;&gt;설계 문서&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;266&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;테스트웨어 예&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;312&quot; data-start=&quot;267&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;267&quot; data-section-id=&quot;gd40ak&quot;&gt;테스트 컨디션&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;279&quot; data-section-id=&quot;j0572g&quot;&gt;테스트 케이스&lt;/li&gt;
&lt;li data-end=&quot;301&quot; data-start=&quot;291&quot; data-section-id=&quot;afybro&quot;&gt;테스트 결과&lt;/li&gt;
&lt;li data-end=&quot;312&quot; data-start=&quot;302&quot; data-section-id=&quot;2kbot4&quot;&gt;결함 보고서&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;325&quot; data-start=&quot;314&quot; data-section-id=&quot;158k0du&quot; data-ke-size=&quot;size23&quot;&gt;추적성의 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;497&quot; data-start=&quot;327&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;327&quot; data-section-id=&quot;1qxpg75&quot;&gt;&lt;b&gt;테스트 커버리지 확인&lt;/b&gt;&lt;br /&gt;&amp;rarr; 요구사항이 테스트 케이스로 충분히 검증되었는지 확인&lt;/li&gt;
&lt;li data-end=&quot;423&quot; data-start=&quot;381&quot; data-section-id=&quot;1m2ulu1&quot;&gt;&lt;b&gt;리스크 평가&lt;/b&gt;&lt;br /&gt;&amp;rarr; 테스트 결과를 통해 잔존 리스크 수준 파악&lt;/li&gt;
&lt;li data-end=&quot;469&quot; data-start=&quot;425&quot; data-section-id=&quot;1lbkkfi&quot;&gt;&lt;b&gt;변경 영향 분석&lt;/b&gt;&lt;br /&gt;&amp;rarr; 요구사항 변경 시 영향을 받는 테스트 식별&lt;/li&gt;
&lt;li data-end=&quot;497&quot; data-start=&quot;471&quot; data-section-id=&quot;4fcwwq&quot;&gt;&lt;b&gt;테스트 진행 상황 및 결과 보고 지원&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;506&quot; data-start=&quot;499&quot; data-ke-size=&quot;size16&quot;&gt;  예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;590&quot; data-start=&quot;507&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;552&quot; data-start=&quot;507&quot; data-section-id=&quot;6xud7t&quot;&gt;&lt;b&gt;요구사항 &amp;harr; 테스트 케이스&lt;/b&gt;&lt;br /&gt;&amp;rarr; 요구사항이 테스트되었는지 확인&lt;/li&gt;
&lt;li data-end=&quot;590&quot; data-start=&quot;554&quot; data-section-id=&quot;1wwrenl&quot;&gt;&lt;b&gt;테스트 결과 &amp;harr; 리스크&lt;/b&gt;&lt;br /&gt;&amp;rarr; 잔존 리스크 평가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1025&quot; data-start=&quot;1010&quot; data-section-id=&quot;1j956d&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1025&quot; data-start=&quot;1010&quot; data-section-id=&quot;1j956d&quot; data-ke-size=&quot;size26&quot;&gt;1.4.5 테스팅에서의 역할&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1048&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size16&quot;&gt;테스팅에는 두 가지 주요 역할이 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;1063&quot; data-start=&quot;1050&quot; data-section-id=&quot;1pc4ziv&quot; data-ke-size=&quot;size23&quot;&gt;테스트 관리 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1104&quot; data-start=&quot;1064&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1072&quot; data-start=&quot;1064&quot; data-section-id=&quot;1ra13td&quot;&gt;테스트 계획&lt;/li&gt;
&lt;li data-end=&quot;1083&quot; data-start=&quot;1073&quot; data-section-id=&quot;cg8t6x&quot;&gt;테스트 모니터링&lt;/li&gt;
&lt;li data-end=&quot;1092&quot; data-start=&quot;1084&quot; data-section-id=&quot;1rahrow&quot;&gt;테스트 제어&lt;/li&gt;
&lt;li data-end=&quot;1104&quot; data-start=&quot;1093&quot; data-section-id=&quot;1kg2qxo&quot;&gt;테스트 완료 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1116&quot; data-start=&quot;1106&quot; data-section-id=&quot;3e5o2b&quot; data-ke-size=&quot;size23&quot;&gt;테스터 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1152&quot; data-start=&quot;1117&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1125&quot; data-start=&quot;1117&quot; data-section-id=&quot;1ra3xa9&quot;&gt;테스트 분석&lt;/li&gt;
&lt;li data-end=&quot;1134&quot; data-start=&quot;1126&quot; data-section-id=&quot;1rajygo&quot;&gt;테스트 설계&lt;/li&gt;
&lt;li data-end=&quot;1143&quot; data-start=&quot;1135&quot; data-section-id=&quot;1ra1034&quot;&gt;테스트 구현&lt;/li&gt;
&lt;li data-end=&quot;1152&quot; data-start=&quot;1144&quot; data-section-id=&quot;1raj1yt&quot;&gt;테스트 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1157&quot; data-start=&quot;1154&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1314&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;117&quot; data-start=&quot;93&quot; data-section-id=&quot;yx7zm2&quot;&gt;1.5 테스팅의 필수 기술 및 모범 사례&lt;/h1&gt;
&lt;h2 data-end=&quot;140&quot; data-start=&quot;119&quot; data-section-id=&quot;1y16w94&quot; data-ke-size=&quot;size26&quot;&gt;1.5.1 테스팅에 보편적으로 필요한 기술&lt;/h2&gt;
&lt;p data-end=&quot;161&quot; data-start=&quot;142&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;258&quot; data-start=&quot;163&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;175&quot; data-start=&quot;163&quot; data-section-id=&quot;totuzc&quot;&gt;&lt;b&gt;테스팅 지식&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;192&quot; data-start=&quot;176&quot; data-section-id=&quot;1pctm2m&quot;&gt;&lt;b&gt;분석적&amp;middot;비판적 사고&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;211&quot; data-start=&quot;193&quot; data-section-id=&quot;563b4s&quot;&gt;&lt;b&gt;세부사항에 대한 주의력&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;233&quot; data-start=&quot;212&quot; data-section-id=&quot;7ietfi&quot;&gt;&lt;b&gt;의사소통 능력 및 협업 능력&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;245&quot; data-start=&quot;234&quot; data-section-id=&quot;120775x&quot;&gt;&lt;b&gt;기술 지식&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;258&quot; data-start=&quot;246&quot; data-section-id=&quot;fyb1x9&quot;&gt;&lt;b&gt;도메인 지식&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;316&quot; data-start=&quot;268&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;316&quot; data-start=&quot;270&quot; data-ke-size=&quot;size16&quot;&gt;테스터는 결함 정보를 &lt;b&gt;명확하고 건설적으로 전달하는 의사소통 능력&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;362&quot; data-start=&quot;323&quot; data-section-id=&quot;7poofc&quot; data-ke-size=&quot;size26&quot;&gt;1.5.2 전체 팀 접근법 (Whole Team Approach)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;454&quot; data-start=&quot;364&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;392&quot; data-start=&quot;364&quot; data-section-id=&quot;3l3xvr&quot;&gt;팀원 &lt;b&gt;모두가 품질에 대한 책임&lt;/b&gt;을 가진다.&lt;/li&gt;
&lt;li data-end=&quot;427&quot; data-start=&quot;393&quot; data-section-id=&quot;uyvl3m&quot;&gt;필요한 경우 &lt;b&gt;누구나 테스트 활동에 참여&lt;/b&gt;할 수 있다.&lt;/li&gt;
&lt;li data-end=&quot;454&quot; data-start=&quot;428&quot; data-section-id=&quot;2spu4q&quot;&gt;팀원 간 &lt;b&gt;협업과 의사소통을 강화&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;564&quot; data-start=&quot;521&quot; data-section-id=&quot;11vyn2c&quot; data-ke-size=&quot;size26&quot;&gt;1.5.3 테스팅의 독립성 (Independence of Testing)&lt;/h2&gt;
&lt;p data-end=&quot;605&quot; data-start=&quot;566&quot; data-ke-size=&quot;size16&quot;&gt;테스트는 &lt;b&gt;독립성이 높을수록 새로운 결함을 발견할 가능성이 높다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;605&quot; data-start=&quot;566&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;616&quot; data-start=&quot;607&quot; data-ke-size=&quot;size16&quot;&gt;독립성 수준 예시)&lt;/p&gt;
&lt;p data-end=&quot;616&quot; data-start=&quot;607&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;688&quot; data-start=&quot;618&quot; data-ke-size=&quot;size16&quot;&gt;1. 개발자가 직접 테스트&lt;br /&gt;2. 같은 팀 동료가 테스트&lt;br /&gt;3. 조직 내 별도 테스트 팀&lt;br /&gt;4. 외부 테스트 조직&lt;/p&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;690&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;697&quot; 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-end=&quot;722&quot; data-start=&quot;704&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;722&quot; data-start=&quot;704&quot; data-section-id=&quot;mpyy05&quot;&gt;다른 관점에서 결함 발견 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;730&quot; data-start=&quot;724&quot; 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-end=&quot;749&quot; data-start=&quot;731&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;731&quot; data-section-id=&quot;7m7jsw&quot;&gt;개발팀과 협업 문제 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;754&quot; data-start=&quot;751&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;899&quot; data-start=&quot;772&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>QA</category>
      <category>ISTQB</category>
      <category>QA</category>
      <category>실러버스</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/935</guid>
      <comments>https://yeoncoding.tistory.com/935#entry935comment</comments>
      <pubDate>Mon, 9 Mar 2026 20:05:00 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 재귀 쿼리 (RECURSIVE CTE)</title>
      <link>https://yeoncoding.tistory.com/934</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 쿼리는 자기 자신을 참조하여 쿼리를 실행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어로 Recursive CTE이다.&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;CTE란?&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;Common Table Expression의 약자&lt;/li&gt;
&lt;li&gt;WITH 문을 사용하여 만든 임시 테이블&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;p data-ke-size=&quot;size16&quot;&gt;[CTE 기본 구조]&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;WITH CTE_이름 AS (
    -- CTE 내부의 쿼리 정의
    SELECT ...
)
SELECT * FROM CTE_이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;재귀적(Recursive) CTE&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;Recursive CTE(재귀 공통 테이블 표현식)는 재귀적으로 데이터를 처리할 수 있는 CTE의 확장 버전&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;p data-ke-size=&quot;size16&quot;&gt;[기본적인 구조]&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- RECURSIVE CTE
WITH RECURSIVE cte (...) AS 
(
   SELECT ...   -- Non Recursive 부분
   UNION ALL 
   SELECT ...  -- Recursive 부분
)
SELECT * FROM cte;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 쿼리는 두개의 SELECT절로 이루어지며 각 SELECT절은 UNION으로 구분된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 SELECT절은 반복을 시작할 첫번째 행을 만드는 역할이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 SELECT절이 반복적으로 자기자신을 참조하여 쿼리를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부서들을 부모-자식 순으로 계층을 정렬하고, '가,나,다' 순으로 정렬하려 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;WITH RECURSIVE DeptHierarchy AS (
    -- 최상위 부서 선택
    SELECT
        Dept_code AS deptId,
        Dept_name AS deptName,
        NULLIF(Pdept_code, '0') AS parentDeptId,
        1 AS depth,
        Dept_name AS fullPath
    FROM
        v_rv_dept
    WHERE
        Pdept_code = '0' OR Pdept_code IS NULL

    UNION ALL

    -- 하위 부서를 재귀적으로 탐색
    SELECT
        child.Dept_code AS deptId,
        child.Dept_name AS deptName,
        NULLIF(child.Pdept_code, '0') AS parentDeptId,
        parent.depth + 1 AS depth,
        CONCAT(parent.fullPath, ' &amp;gt; ', child.Dept_name) AS fullPath
    FROM
        v_rv_dept child
    INNER JOIN
        DeptHierarchy parent
    ON
        child.Pdept_code = parent.deptId // 상위 부서와 연결된 하위 부서 찾기
)
SELECT
    deptId,
    deptName,
    parentDeptId,
    depth,
    fullPath
FROM
    DeptHierarchy
ORDER BY
    fullPath; // 부서 계층 구조 정렬&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 예제&lt;/b&gt; (v_rv_dept):&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 129px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Dept_code&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Dept_name&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Pdept_code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;연구소&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;개발팀&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;영업팀&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;해외영업팀&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4&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;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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 112px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;deptId&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;deptName&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;parentDeptId&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;depth&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;fullPath&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;연구소&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사 &amp;gt; 연구소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;개발팀&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사 &amp;gt; 연구소 &amp;gt; 개발팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;영업팀&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사 &amp;gt; 영업팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;해외영업팀&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;본사 &amp;gt; 영업팀 &amp;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@leo4study/SQL-RECURSIVE-CTE-이해하기&quot;&gt;https://velog.io/@leo4study/SQL-RECURSIVE-CTE-이해하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wildeveloperetrain.tistory.com/340&quot;&gt;https://wildeveloperetrain.tistory.com/340&lt;/a&gt;&lt;/p&gt;</description>
      <category>DB</category>
      <category>MySQL</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/934</guid>
      <comments>https://yeoncoding.tistory.com/934#entry934comment</comments>
      <pubDate>Tue, 17 Dec 2024 17:37:44 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 소프트웨어 관리 명령어 정리(파일 압축, RPM, YUM)</title>
      <link>https://yeoncoding.tistory.com/933</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;파일 압축과 풀기&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;tar(Tape ARchiver)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar [파일과 디렉터리들] &amp;hellip; : 하나의 파일로 묶기&lt;/li&gt;
&lt;li&gt;tar tvf [test.tar]: 묶여 있는 파일 미리보기&lt;/li&gt;
&lt;li&gt;tar xvf [test.tar] -C /tmp : test.tar를 /tmp에 풀기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x: 파일 풀어줌, C: 풀릴 위치 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;rm -rf test.tar: tar 파일 제거&lt;/li&gt;
&lt;li&gt;star 명령어: 복사/이동 시 보안 콘텍스트 유지되게 원래 속성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;GNU zip&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gzip [/root/install.log]: 파일 압축&lt;/li&gt;
&lt;li&gt;gzip -d [/root/install.log.gz]: 압축 파일 풀기&lt;/li&gt;
&lt;li&gt;gzip -r [/root]: 해당 디렉터리의 모든 파일/디렉터리 각각 압축&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;bzip2: gzip 보다 압축률 좋음&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;RPM&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedHat Package Manager&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;SRPM: RPM 소스코드&lt;/li&gt;
&lt;li&gt;rpm -옵션 [파일_명]: RPM 패키지 관리&lt;/li&gt;
&lt;li&gt;rpm -e: rpm 패키지 제거&lt;/li&gt;
&lt;li&gt;rpm -r: dr&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;YUM&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:RPM의 패키지 종속성 문제를 자동으로 해결하며 패키지를 설치해주는 패키지 관리시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DEVOPS/LINUX</category>
      <category>리눅스</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/933</guid>
      <comments>https://yeoncoding.tistory.com/933#entry933comment</comments>
      <pubDate>Tue, 30 Jul 2024 17:53:38 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 관리자 명령어 - 파일시스템 보안</title>
      <link>https://yeoncoding.tistory.com/932</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일시스템 보안 명령어 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;chroot: 어느 디렉터리를 가상의 최상위 / 디렉터리로 만들어 cd .. 했을 때 더이상 상위 디렉터리로 이동 못하게&lt;/li&gt;
&lt;li&gt;chcon: 파일 B의 보안설정이 파일 A의 보안설정과 동일하게 설정되도록&lt;/li&gt;
&lt;li&gt;chattr: 속성 변경
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;+i : 파일 속성 변경, 추가, 삭제 등 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;lsattr: 속성 보기&lt;/li&gt;
&lt;li&gt;SetUID: 파일의 소유자 권한으로 파일을 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;chmod 명령어 뒤에 4xxx를 붙이면 설정됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;setGID: 파일을 소유한 그룹의 권한으로 파일을 실행&lt;/li&gt;
&lt;li&gt;sticky bit: 이 비트가 설정된 디렉토리는 공용 디렉토리가 되지만, 파일을 소유한 사용자만 그 파일을 삭제하거나 수정할 수 있음&lt;/li&gt;
&lt;li&gt;IPC(Inter-Process Communication): 서로 다른 프로세스 간에 데이터를 주고받거나 통신을 하기 위한 메커니즘&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DEVOPS/LINUX</category>
      <category>리눅스</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/932</guid>
      <comments>https://yeoncoding.tistory.com/932#entry932comment</comments>
      <pubDate>Tue, 30 Jul 2024 17:51:24 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 프로시저, 이벤트 스케줄러 만들기</title>
      <link>https://yeoncoding.tistory.com/873</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;어떠한 동작을 일괄 처리하기 위한 쿼리문의 집합으로, MySQL에서의 메서드라고 보면 된다. 함수처럼 매개변수를 받고 그에 따라 결과를 나타내는 것이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 명령의 묶음으로, 프로시저로 묶인 SQL 문 질의들은 처리될 때 하나의 쿼리로 해석된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;DELIMITER //

CREATE PROCEDURE 프로시저명(매개변수)

BEGIN 

           SQL 문1;

           SQL 문2;

END
//
DELIMITER ;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;DELIMITER //&quot; 을 선언해서 기존 구분 문자인 &quot;;&quot; 에서 &quot;//&quot;로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CREATE PROCEDURE로 프로시저를 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로시저 등록을 마친 후 &quot;DELIMITER ;&quot;을 통해 다시 구분 문자를 &quot;;&quot;으로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;call 프로시저명; // 프로시저 호출
DROP PROCEDURE 프로시저명; // 프로시저 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버에 기본적으로 내장된 구성 요소로, 이벤트를 실행하는데 사용된다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 스케줄러 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW VARIABLES LIKE 'event%'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 스케줄러 ON으로 활성화&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET GLOBAL event_scheduler = ON;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테이블 생성 및 데이터 삽입&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717223735313&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    age INT
);

INSERT INTO users VALUES
(1, 'name', 20),
(2, 'name2', 21);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로시저 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717223752877&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELIMITER //
CREATE PROCEDURE update_user_age
(
    IN p_id INT,
    IN p_age INT
)
BEGIN
    UPDATE users
    SET age = p_age
    WHERE id = p_id;
END //
DELIMITER ;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로시저 생성 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717223768505&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW PROCEDURE STATUS;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로시저 호출&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717223782819&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CALL update_user_age(2, 40); // id가 2인 사용자의 나이를 40으로 업데이트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717223803608&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE EVENT users_event
    ON SCHEDULE EVERY 1 MINUTE
    STARTS '2023-10-07 00:00:00'
    COMMENT 'Update age of user with id 1 every minute'
    DO
      CALL update_user_age(1, 40);
      
      //1분마다 id가 1인 사용자의 나이를 40으로 업데이트 하는 이벤트 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성된 이벤트 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717223840543&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW EVENTS;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB</category>
      <category>MySQL</category>
      <category>이벤트스케줄러</category>
      <category>프로시저</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/873</guid>
      <comments>https://yeoncoding.tistory.com/873#entry873comment</comments>
      <pubDate>Sat, 1 Jun 2024 15:38:12 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 자바 메모리 구조와 static</title>
      <link>https://yeoncoding.tistory.com/930</link>
      <description>&lt;h1&gt;&lt;b&gt;자바 메모리 구조&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;힙 영역: 객체(인스턴스가 생성되는 영역) (new 키워드)&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;메서드 영역&lt;/b&gt;&lt;/h4&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 정보 - 클래스, 메서드 등의 실행 코드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 영역 - static 변수 보관&lt;/p&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;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;&lt;b&gt;실제 프로그램이 실행되는 영역&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;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;&lt;b&gt;인스턴스가 생성되는 영역&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 클래스에서 생성된 객체여도 인스턴스 내부 변수 값은 다를 수 있지만 메서드는 공통된 영역을 공유한다.&lt;/p&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;멤버 변수(필드)의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인스턴스 변수&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static이 붙지 않은 멤버 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 만들 때마다 새로 만들어진다.&amp;nbsp;&lt;/p&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;클래스 변수&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static이 붙은 멤버 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 변수 = static 변수 = 정적 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 영역의 static 영역에 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스와 무관하게 클래스에 바로 접근해 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 프로그램을 시작할 때 딱 1개 만들어지고 여러 곳에서 공유하는 목적으로 사용된다.&amp;nbsp;&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;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;지역 변수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 영역의 스택 프레임 안에 보관된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 종료되면 스택 프레임이 제거되면서 지역 변수도 함께 제거된다.&lt;/p&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;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;힙 영역을 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션이 발생하기 전까지 생존한다.&amp;nbsp;&lt;/p&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;클래스 변수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 영역의 static 영역에 보관된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 클래스가 JVM에 로딩되는 순간 생성해 종료될 때 제거된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역 변수 &amp;lt; 인스턴스 변수 &amp;lt; 클래스 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 메서드: static이 안붙은 멤버 메서드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 메서드: static이 붙은 멤버 메서드, 인스턴스를 생성하지 않고 바로 호출 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 메서드는 클래스가 로딩되는 시점에 생성되는데, 인스턴스 멤버는 인스턴스를 생성한 후에 접근 가능하므로&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;main() 메서드도 정적 메서드라 객체를 생성하지 않아도 작동 될 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: 인프런 김영한 실전 자바 강의&amp;nbsp;&lt;/p&gt;</description>
      <category>BACK/JAVA</category>
      <category>자바</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/930</guid>
      <comments>https://yeoncoding.tistory.com/930#entry930comment</comments>
      <pubDate>Thu, 16 May 2024 21:58:30 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] AOP를 이용한 Request 로깅</title>
      <link>https://yeoncoding.tistory.com/928</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP 개념에 관한 이전 포스팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yeoncoding.tistory.com/732&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yeoncoding.tistory.com/732&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717225227798&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] AOP란&quot; data-og-description=&quot;Spring AOP 관점 지향 프로그래밍(AOP-Aspect Oriented Programming) AOP는 관점을 기준으로 묶어 개발하는 방식을 말한다. 관점(aspect)이란, 어떤 기능을 구현할 때 그 기능을 핵심 기능과 부가 기능으로 구분&quot; data-og-host=&quot;yeoncoding.tistory.com&quot; data-og-source-url=&quot;https://yeoncoding.tistory.com/732&quot; data-og-url=&quot;https://yeoncoding.tistory.com/732&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbV7gR/hyWdkBrpLl/MPGTEjtoFVwbbru8OdPk70/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500,https://scrap.kakaocdn.net/dn/ctKkdc/hyWg4XZh4S/g7SdmbwS4dURV6l1YDwxPk/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500,https://scrap.kakaocdn.net/dn/Oz9jd/hyWdgy0ln7/YASyVhW1AcPKsEBtec1Rj1/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500&quot;&gt;&lt;a href=&quot;https://yeoncoding.tistory.com/732&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yeoncoding.tistory.com/732&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbV7gR/hyWdkBrpLl/MPGTEjtoFVwbbru8OdPk70/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500,https://scrap.kakaocdn.net/dn/ctKkdc/hyWg4XZh4S/g7SdmbwS4dURV6l1YDwxPk/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500,https://scrap.kakaocdn.net/dn/Oz9jd/hyWdgy0ln7/YASyVhW1AcPKsEBtec1Rj1/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Spring] AOP란&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring AOP 관점 지향 프로그래밍(AOP-Aspect Oriented Programming) AOP는 관점을 기준으로 묶어 개발하는 방식을 말한다. 관점(aspect)이란, 어떤 기능을 구현할 때 그 기능을 핵심 기능과 부가 기능으로 구분&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yeoncoding.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP(Aspect-Oriented Programming)를 이용하여 HTTP 요청과 응답을 로깅했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714894628400&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package contest.collectingbox.global.config;

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Slf4j
@Aspect
@Component
public class LoggingAspect {
    @Pointcut(&quot;within(contest.collectingbox.module..*Controller)&quot;)
    private void cut() {
    }

    @Around(&quot;cut()&quot;)
    public Object doLogging(final ProceedingJoinPoint joinPoint) throws Throwable {
        final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest();
        final String ipAddr = request.getRemoteAddr();
        final String method = request.getMethod();
        final String requestURI = request.getRequestURI();
        final Object[] args = joinPoint.getArgs();

        log.info(&quot;[REQUEST] {} {} {} args={}&quot;, ipAddr, method, requestURI, args);
        try{
            Object result = joinPoint.proceed();
            log.info(&quot;[RESPONSE] {}&quot;, result);
            return result;
        }catch(Exception e){
            log.error(&quot;[RESPONSE] exception message = {}&quot;, e.getMessage());
            throw e;
        }

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Aspect&lt;/b&gt;: 모듈화된 부가기능으로, 위 코드의 경우 LoggingAspect 클래스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JoinPoint&lt;/b&gt;: Aspect가 적용될 수 있는 지점입니다. ProceedingJoinPoint 객체는 around Advice 메소드가 가지고 있는 비즈니스 메소드에 대한 정보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Advice&lt;/b&gt;: 특정 Join Point에서 실행되는 코드입니다. Advice는 언제 실행되는지에 따라 다양한 유형이 있습니다(예: Before, After, Around). 여기서는 doLogging 메서드가 Around Advice입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@Pointcut&lt;/b&gt;: contest.collectingbox.module 패키지 하위에 있는 모든 Controller 클래스의 메서드에 Advice를 적용하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@Around&lt;/b&gt;: 해당 메서드 실행 전 후에 로깅 작업을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;proceed() 메소드&lt;/b&gt;: 비즈니스 메소드를 진행하도록 합니다. proceed()를 기준으로 비즈니스 메소드의 수행 전과 후가 나누어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청 정보를 추출해 로깅하고, 메서드 실행 후 반환된 결과를 로깅했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BACK/SPRING</category>
      <category>AOP</category>
      <category>spring</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/928</guid>
      <comments>https://yeoncoding.tistory.com/928#entry928comment</comments>
      <pubDate>Sun, 5 May 2024 16:43:20 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] @ExceptionHandler를 사용해 예외 처리하기</title>
      <link>https://yeoncoding.tistory.com/927</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler를 사용한 편리한 예외 처리 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 진행하고 있는 프로젝트에 @ExceptionHandler를 적용한 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713424526883&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@AllArgsConstructor
public enum ErrorCode {
    // 400
    NOT_SELECTED_TAG(BAD_REQUEST, &quot;수거함 태그는 반드시 한 개 이상 설정해야 합니다.&quot;);

    // 404

    // 409

    // 500

    private final HttpStatus httpStatus;
    private final String message;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enum 클래스를 만들어 상태 코드와 메세지를 담은 열거형을 정의한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713424110830&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
public class CollectingBoxException extends RuntimeException {
    private final ErrorCode errorCode; // 발생한 오류 코드

    public CollectingBoxException(ErrorCode errorCode) {
        super(errorCode.getMessage()); // 해당 예외의 메시지 설정
        this.errorCode = errorCode;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RuntimeException을 상속받은 클래스를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713423970209&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CollectingBoxException.class)
    public ResponseEntity&amp;lt;ErrorResponse&amp;gt; handleCollectingBoxException(CollectingBoxException e) {
        ErrorResponse errorResponse = ErrorResponse.from(e.getErrorCode());
        log.error(&quot;exception message = {}&quot;, e.getMessage());
        return ResponseEntity.status(errorResponse.getHttpStatus()).body(errorResponse);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ExceptionHandler를 선언하고, 괄호 안에 처리하고 싶은 예외를 지정해주면 된다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;@RestControllerAdvice는 @ControllerAdvice에 @ResponseBody가 추가된 것으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ControllerAdvice는 대상으로 지정한 여러 컨트롤러에 @ExceptionHandler 기능을 부여해주는 역할을 한다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713425317547&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ErrorResponse {

    private HttpStatus httpStatus;
    private String message;

    public static ErrorResponse from(ErrorCode errorCode) {
        return new ErrorResponse(errorCode.getHttpStatus(), errorCode.getMessage());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BACK/SPRING</category>
      <category>spring</category>
      <category>스프링</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/927</guid>
      <comments>https://yeoncoding.tistory.com/927#entry927comment</comments>
      <pubDate>Thu, 18 Apr 2024 16:40:36 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] 객체지향 쿼리 언어 JPQL 기본 문법</title>
      <link>https://yeoncoding.tistory.com/925</link>
      <description>&lt;h1&gt;기본 문법과 쿼리 API&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypedQuery, Query&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Member member = new Member();
member.setUsername(&quot;member1&quot;);
member.setAge(10);
em.persist(member);

TypedQuery&amp;lt;Member&amp;gt; query1 = em.createQuery(&quot;select m from Member m&quot;, Member.class);
TypedQuery&amp;lt;String&amp;gt; query2 = em.createQuery(&quot;select m.username from Member m&quot;, String.class);
Query query3 = em.createQuery(&quot;select m.username, m.age from Member m&quot;); // 타입 정보를 받을 수 없을 때
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 조회 API&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Member singleResult = query.getSingleResult(); // 결과 하나일 때

List&amp;lt;Member&amp;gt; resultList = query.getResultList(); // 결과 하나 이상일 때, 결과 없으면 빈 리스트 반환 
for (Member member1 : resultList) {
       System.out.println(&quot;member1 = &quot; + member1);
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터 바인딩&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Member result = em.createQuery(&quot;select m from Member m where m.username = :username&quot;, Member.class)
        .setParameter(&quot;uersname&quot;, &quot;member1&quot;)
        .getSingleResult();
System.out.println(&quot;result = &quot; + result.getUsername()); // result = member1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;프로젝션&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 절에 조회할 대상을 지정하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔티티 프로젝션을 하면 셀렉트 한 대상이 다 영속성 컨텍스트에서 관리된다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// 엔티티 프로젝션
List&amp;lt;Member&amp;gt; result = em.createQuery(&quot;select m from Member m&quot;, Member.class).getResultList();
Member findMember = result.get(0);
findMember.setAge(20); // 영속성 컨텍스트에서 관리되므로 20으로 변경된다. 

tx.commit();&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// 엔티티 프로젝션
List&amp;lt;Team&amp;gt; result = em.createQuery(&quot;select m.team from Member m&quot;, Team.class).getResultList(); // 팀과 조인하는 쿼리가 나간다.(묵시적 조인)
// select t from Member m join m.team t 와 같다. &amp;lt;- 이렇게 명시적으로 조인을 적어주는게 좋다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;em.createQuery(&quot;select o.address from Order o&quot;, Address.class).getResultList(); // 임베디드 타입 프로젝션
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;em.createQuery(&quot;select distinct m.username, m.age from Member m&quot;).getResultList(); // 스칼라 타입 프로젝션
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝션&amp;nbsp; - 여러 값 조회&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// Object[] 타입으로 조회
List&amp;lt;Object[]&amp;gt; resultList = em.createQuery(&quot;select m.username, m.age from Member m&quot;).getResultList();
Object[] result = resultList.get(0);
System.out.println(&quot;username = &quot; + result[0]);
System.out.println(&quot;age = &quot; + result[1]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// DTO로 바로 조회
List&amp;lt;MemberDTO&amp;gt; result = em.createQuery(&quot;select new hellojpql.jpql.MemberDTO(m.username, m.age) from Member m&quot;, MemberDTO.class)
                    .getResultList();
MemberDTO memberDTO = result.get(0);
System.out.println(&quot;memberDTO = &quot; + memberDTO.getUsername());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;페이징&lt;/h1&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;List&amp;lt;Member&amp;gt; result = em.createQuery(&quot;select m from Member m order by m.age desc&quot;, Member.class)
        .setFirstResult(0) // 조회 시작 위치(0부터 시작)
        .setMaxResults(10) // 조회할 데이터 수 
        .getResultList();
System.out.println(&quot;result.size  = &quot; + result.size());
for (Member member1 : result) {
    System.out.println(&quot;member1 = &quot; + member1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 방언에 맞게 SQL 문이 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;조인&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 조인, 외부 조인&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Team team = new Team();
team.setName(&quot;teamA&quot;);
em.persist(team);

Member member = new Member();
member.setUsername(&quot;member1&quot;);
member.setAge(10);
member.setTeam(team);

em.persist(member);
em.flush();
em.clear();

String query = &quot;select m from Member m inner join m.team t&quot;; // inner는 생략 가능
//String query = &quot;select m from Member m left join m.team t&quot;; // inner는 생략 가능

List&amp;lt;Member&amp;gt; result = em.createQuery(query, Member.class).getResultList();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세타 조인&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;String query = &quot;select m from Member m, Team t where m.username = t.name&quot;;
List&amp;lt;Member&amp;gt; result = em.createQuery(query, Member.class).getResultList();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;JPQL 타입 표현&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;String query = &quot;select m.username, 'HELLO', TRUE From Member m &quot; +
                    &quot;where m.memberType =:userType&quot;; // 하드코딩 하려면 패키지 명 다 넣어야 함
            List&amp;lt;Object[]&amp;gt; result = em.createQuery(query)
                            .setParameter(&quot;userType&quot;, MemberType.ADMIN)
                                    .getResultList();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;em.createQuery(&quot;select i from Item i where type(i) = Book&quot;, Item.class).getResultList(); // type으로 DTYPE을 체크함
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;조건식&lt;/h1&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;String query = &quot;select &quot; +
                    &quot;case when m.age &amp;lt;= 10 then '학생요금'&quot; +
                    &quot; when m.age &amp;gt;= 60 then '경로요금'&quot; +
                    &quot; else '일반요금' &quot;+
                    &quot;end &quot; +
                    &quot;from Member m&quot;;
            List&amp;lt;String&amp;gt; result = em.createQuery(query, String.class).getResultList();
            for (String s : result) {
                System.out.println(&quot;s = &quot; + s);
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;String query = &quot;select coalesce(m.username, '이름 없는 회원') from Member m&quot;;

String query = &quot;select NULLIF(m.username, '관리자') from Member m&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*포스팅 시 기존에 알고있었던 SQL과 비슷한 문법들은 생략하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프런 자바 ORM 표준 JPA 프로그래밍 - 기본편을 수강하고 정리한 글입니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/ORM-JPA-Basic&quot;&gt;https://www.inflearn.com/course/ORM-JPA-Basic&lt;/a&gt;&lt;/p&gt;</description>
      <category>BACK/JPA</category>
      <category>JPA</category>
      <category>인프런</category>
      <author>연듀</author>
      <guid isPermaLink="true">https://yeoncoding.tistory.com/925</guid>
      <comments>https://yeoncoding.tistory.com/925#entry925comment</comments>
      <pubDate>Mon, 8 Apr 2024 19:44:57 +0900</pubDate>
    </item>
  </channel>
</rss>