{"schemaVersion":"gettalk-public-regular/1","id":"IPE-2027-course-r1","subjectId":"information-processing-engineer","title":"정보처리기사 필기2027 대비","courseVersion":"information-processing-engineer-regular-2027-59-r1","releaseId":"information-processing-engineer-regular-2027-59-r1","edition":"2027-2029","exam":{"format":"four-choice-single-answer","totalQuestions":80,"durationMinutes":120,"subjects":[{"id":"IPE-2027-S1","title":"소프트웨어 개발","questions":20,"sourcePages":[1,2,3,4]},{"id":"IPE-2027-S2","title":"데이터베이스 구축","questions":20,"sourcePages":[4,5,6]},{"id":"IPE-2027-S3","title":"프로그래밍 언어 활용","questions":20,"sourcePages":[6,7,8]},{"id":"IPE-2027-S4","title":"정보시스템 구축관리","questions":20,"sourcePages":[8,9]}],"subjectPassingScore":40,"averagePassingScore":60,"scorePerCorrectWithinSubject":5,"minimumCorrectEachSubject":8,"minimumCorrectTotal":48,"passingCondition":"모든 과목 8문항 이상 정답 AND 전체 48문항 이상 정답","passingSourceUrl":"https://www.law.go.kr/lsLinkCommonInfo.do?lsJoLnkSeq=1031472007","passingSource":"국가기술자격법 시행령 제20조 제2항, 시행2026.1.2 확인","passingSourceSnapshot":"research/official/law-passing-article20-20261030-r1.html"},"lessons":[{"id":"IPE-2027-L001","order":1,"title":"요구사항을 확인 가능한 약속으로 바꾸기","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":[],"goals":["기능과 품질 조건의 뜻과 조건을 설명한다.","주문 취소 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["기능은 '무엇을', 비기능은 '어떤 수준·제약으로'이다. 요구사항 확인은 시험 결과와 연결할 수 있어야 한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q001"],"sections":[{"id":"IPE-2027-L001-S01","order":1,"title":"기능과 품질 조건","blocks":[{"type":"paragraph","text":"요구사항은 시스템이 해야 할 일과 지켜야 할 조건이다. '회원이 주문을 취소한다'는 기능 요구사항이고 '동시 사용자 500명일 때 취소 응답의 95%가 2초 이내'는 성능이라는 비기능 요구사항이다. '빠르게'처럼 사람마다 해석이 다른 말은 부하·측정 구간·목표값으로 바꾼다. 설문·면담·관찰은 요구를 찾는 방법이고, 프로토타입은 화면이나 동작을 보여 주어 숨은 요구를 드러내는 방법이다."}]},{"id":"IPE-2027-L001-S02","order":2,"title":"수집에서 검증까지","blocks":[{"type":"paragraph","text":"도출은 이해관계자의 말을 모으고, 분석은 충돌·중복·실현 가능성을 따지며, 명세는 합의한 요구를 문서화하고, 확인은 빠짐과 모순이 없는지 검증한다. 요구를 바꿀 때는 이유·영향·승인·판본을 남긴다. 사용자 발언을 바로 코드로 만드는 대신 인수 조건을 먼저 적으면 개발자와 사용자가 같은 완료 기준을 보게 된다."}]},{"id":"IPE-2027-L001-S03","order":3,"title":"주문 취소 예제","blocks":[{"type":"paragraph","text":"아래 약속에서는 처리 결과와 품질 조건을 따로 시험한다."},{"type":"table","headers":["요구","분류","확인 방법"],"rows":[["결제 전 주문만 취소할 수 있다","기능·업무 규칙","결제 전/후 각 사례 실행"],["취소 요청의 95%가 2초 이내","성능","정한 부하에서 응답시간 측정"],["취소 실패 시 원래 주문을 유지한다","신뢰성·무결성","실패 주입 후 주문 상태 확인"]]}]}]},{"id":"IPE-2027-L002","order":2,"title":"UML로 구조와 시간의 흐름 읽기","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L001"],"goals":["그림의 목적부터 고르기의 뜻과 조건을 설명한다.","주문 모델 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["타입 구조는 클래스, 메시지 순서는 시퀀스, 상태 변화는 상태도다. 다중성은 선의 반대쪽 객체 수를 읽는다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q002"],"sections":[{"id":"IPE-2027-L002-S01","order":1,"title":"그림의 목적부터 고르기","blocks":[{"type":"paragraph","text":"UML은 시스템을 여러 관점에서 표현하는 모델링 표기다. 유스케이스는 사용자 역할인 액터와 시스템이 제공할 기능을, 클래스는 타입·속성·연산·관계를, 시퀀스는 객체 사이 메시지의 시간 순서를, 상태도는 객체가 사건에 따라 바뀌는 상태를 나타낸다. 클래스 그림에 시간 순서의 의미를 억지로 넣지 않는다."}]},{"id":"IPE-2027-L002-S02","order":2,"title":"관계와 메시지","blocks":[{"type":"paragraph","text":"일반화는 공통 타입을 상위로 묶는 관계이며 하위 타입에서 상위 타입 쪽으로 빈 삼각형 화살표가 향한다. 연관의 다중성 1, 0..*, 1..*는 한 객체에 연결 가능한 상대 객체의 수다. 합성은 전체와 부분의 강한 소유 관계이며 채운 마름모가 전체 쪽에 있다. 시퀀스도의 시간은 보통 위에서 아래로 흐른다. include는 공통으로 포함하는 기능, extend는 조건에 따라 확장되는 기능을 표현한다."}]},{"id":"IPE-2027-L002-S03","order":3,"title":"주문 모델 판독","blocks":[{"type":"paragraph","text":"관계 `고객 1 ── 0..* 주문`은 주문 하나가 고객 한 명에 속하고, 고객 한 명은 주문이 0개 이상일 수 있다는 뜻이다. 메시지가 `화면→주문서비스:취소요청`, `주문서비스→주문:상태검사`, `주문→주문서비스:결제완료` 순이면 서비스는 결제 완료라는 응답을 받은 뒤 취소 허용 여부를 판단한다. 관계의 선만 보고 호출 순서를 알 수는 없다."}]},{"id":"IPE-2027-L002-S04","order":4,"title":"클래스 다중성의 실제 그림","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-UML-MULT","alt":"고객과 주문을 연관선으로 연결. 고객 쪽 끝은1, 주문 쪽 끝은0..*.","caption":"클래스 관계의 다중성"},{"type":"paragraph","text":"고객 쪽1은 주문 하나에 연결되는 고객 수, 주문 쪽0..*는 고객 한 명에 연결되는 주문 수다. 고객은 주문이 없어도 된다. 선에1:1이라고 쓰여 있지 않으므로 고객당 주문을 한 건으로 제한하지 않는다."},{"type":"diagram","assetId":"IPE-2027-FIG-UML-RELATION-SYMBOLS","alt":"일반화: 전기차에서 차량 쪽으로 빈 삼각형. 집합: 팀 쪽에 빈 마름모, 선수와 연결. 합성: 주문 쪽에 채운 마름모, 주문항목과 연결. 삼각형은 상위, 마름모는 전체 쪽이다.","caption":"UML 관계 기호와 붙는 쪽"},{"type":"paragraph","text":"빈 삼각형은 일반화의 상위 클래스 쪽, 빈 마름모는 집합의 전체 쪽, 채운 마름모는 합성의 전체 쪽에 붙는다. 집합에서는 부분이 전체 밖에서도 존재할 수 있고, 합성에서는 부분의 소유·생명주기가 전체에 결속된다. 예시의 전체는 팀·주문이며, 일반화의 상위는 차량이다."}]},{"id":"IPE-2027-L002-S05","order":5,"title":"include와 extend의 실제 방향","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-UML-USECASE","alt":"include 화살표는 주문하기에서 금액계산으로, extend 화살표는 쿠폰적용에서 주문하기로 향한다. 확장 조건은 사용 가능한 쿠폰이 있음이다.","caption":"include와 extend의 화살표"},{"type":"paragraph","text":"include는 기본 유스케이스에서 포함되는 유스케이스로 향한다. extend는 조건부 확장 유스케이스에서 확장받는 기본 유스케이스로 향한다. 위 그림의 금액계산은 주문하기에 포함되고 쿠폰적용은 조건이 맞을 때 주문하기를 확장한다."}]},{"id":"IPE-2027-L002-S06","order":6,"title":"시퀀스의 생명선과 시간축","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-UML-SEQUENCE","alt":"화면과 주문서비스의 생명선. 위쪽 취소요청은 화면에서 서비스로, 아래쪽 취소결과는 서비스에서 화면으로 향한다. 시간축은 아래쪽이다.","caption":"시간축을 가진 시퀀스"},{"type":"paragraph","text":"세로 점선은 참가자의 생명선이다. 위 취소요청 뒤에 아래 취소결과가 온다. 가로 방향은 송수신 대상, 세로 위치는 시간 순서를 나타낸다. 이 그림에서 요청을 보낸 참가자는 화면이다."}]}]},{"id":"IPE-2027-L003","order":3,"title":"생명주기와 애자일을 목적에 맞게 고르기","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L002"],"goals":["개발과 확인을 반복하는 방법의 뜻과 조건을 설명한다.","상황 비교를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["프로토타입은 요구 확인, 나선형은 위험 분석, 애자일은 짧은 전달·피드백을 떠올린다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q003"],"sections":[{"id":"IPE-2027-L003-S01","order":1,"title":"개발과 확인을 반복하는 방법","blocks":[{"type":"paragraph","text":"폭포수 모델은 요구·설계·구현·시험의 단계를 순차적으로 진행하기 좋지만 늦게 발견한 변경의 비용이 커질 수 있다. 프로토타입 모델은 시제품을 통해 요구를 구체화한다. 나선형 모델은 반복마다 위험을 분석하고 줄이는 활동을 강조한다. V모델은 개발 단계별 산출물과 대응하는 테스트 관점을 연결한다. 어떤 모델도 문서나 시험을 없애 주지 않는다."}]},{"id":"IPE-2027-L003-S02","order":2,"title":"작은 결과와 피드백","blocks":[{"type":"paragraph","text":"애자일은 짧은 주기로 작동하는 결과를 전달하고 피드백을 반영한다. 스크럼에서 제품 백로그는 해야 할 일을 정렬한 목록, 스프린트 백로그는 해당 스프린트 목표를 위한 계획이다. 데일리 스크럼은 개발자들이 진척과 다음 작업을 조정하는 시간이고, 리뷰는 결과에 대한 피드백, 회고는 일하는 방법의 개선에 초점을 둔다. 칸반은 흐름과 진행 중 작업 제한을 시각화한다."}]},{"id":"IPE-2027-L003-S03","order":3,"title":"상황 비교","blocks":[{"type":"paragraph","text":"요구가 안정된 법정 보고서와 고객 반응을 자주 확인해야 하는 신규 화면은 변경 양상이 다르다. 후자는 작은 화면을 먼저 만들어 검증하는 반복이 유용하다. 위험한 결제 모듈은 반복 개발을 하더라도 거래 무결성·검증·추적 기록을 남긴다. '애자일이므로 계획하지 않는다'는 해석은 잘못이다."}]}]},{"id":"IPE-2027-L004","order":4,"title":"분석모델과 요구사항 추적표","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L003"],"goals":["모델은 필요한 관점의 단순화의 뜻과 조건을 설명한다.","추적표 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["추적성은 요구부터 시험까지의 연결이고, 도구의 검사와 업무 의미 검토를 함께 한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q004"],"sections":[{"id":"IPE-2027-L004-S01","order":1,"title":"모델은 필요한 관점의 단순화","blocks":[{"type":"paragraph","text":"데이터 모델은 무엇을 저장하고 연결하는지, 기능 모델은 어떤 처리를 하는지, 동적 모델은 사건과 상태가 어떻게 변하는지를 설명한다. 모델끼리 용어와 제약이 일치해야 한다. 화면에 '탈퇴 회원은 주문 불가'라고 쓰고 상태 모델에서는 탈퇴 상태에서 주문으로 이동할 수 있게 하면 모순이다. 분석자동화 도구는 모델 작성·일관성 검사 등을 돕지만 업무 의미의 정답을 자동 보장하지 않는다."}]},{"id":"IPE-2027-L004-S02","order":2,"title":"연결이 있어야 변경을 추적한다","blocks":[{"type":"paragraph","text":"추적표는 요구사항 ID를 설계·구현·시험에 연결한다. 요구가 바뀌면 영향을 받는 산출물과 누락된 시험을 찾는다. 변경 이력과 기준선은 '누가 어떤 버전을 보고 개발했는지'를 확인하는 데 필요하다. 요구사항 관리 도구는 이 관계와 판본을 관리하며 단순 문서 저장소와 목적이 다르다."}]},{"id":"IPE-2027-L004-S03","order":3,"title":"추적표 예제","blocks":[{"type":"table","headers":["요구","설계","구현","시험"],"rows":[["R1 미결제 주문 취소","D1 상태전이","M1 cancel","T1 미결제 허용/T2 결제후 거절"],["R2 2초 내 응답","D2 캐시·연계","M2 query","미지정"]]},{"type":"paragraph","text":"R2는 성능 시험 연결이 빠졌다. M2가 존재한다는 이유만으로 요구가 검증됐다고 할 수 없다. 시험을 추가하고 정한 부하와 측정 결과를 연결해야 한다."}]}]},{"id":"IPE-2027-L005","order":5,"title":"UI 표준·지침·스토리보드","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L004"],"goals":["사용자가 다음 행동을 찾게 하기의 뜻과 조건을 설명한다.","주문 취소 화면를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["화면 설계는 예쁜 정상 화면에 더해 입력·실패·복귀까지 포함한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q005"],"sections":[{"id":"IPE-2027-L005-S01","order":1,"title":"사용자가 다음 행동을 찾게 하기","blocks":[{"type":"paragraph","text":"UI는 사용자가 시스템과 상호작용하는 접점이고 UX는 사용 전후를 포함한 경험이다. 직관성은 의미를 쉽게 알게 하고, 유효성은 목적을 달성하게 하며, 학습성은 배우기 쉽게 하고, 유연성은 여러 사용 상황을 수용한다. 오류를 색만으로 구분하면 색을 구별하기 어려운 사용자가 놓칠 수 있으므로 문구·아이콘도 함께 둔다."}]},{"id":"IPE-2027-L005-S02","order":2,"title":"규칙과 화면 설계","blocks":[{"type":"paragraph","text":"UI 표준은 버튼·입력·용어 등 공통 규칙, 지침은 적용 원칙과 안내다. 스토리보드는 화면 구성뿐 아니라 입력·분기·이동·오류 상태를 함께 설명한다. 와이어프레임은 구조를 간단히 보여 주고 프로토타입은 상호작용 검증에 쓴다. 감성공학은 사용자의 느낌과 반응을 설계 특성에 연결하는 접근이며 조작 가능성과 정보 전달을 대신하지 않는다."}]},{"id":"IPE-2027-L005-S03","order":3,"title":"주문 취소 화면","blocks":[{"type":"paragraph","text":"버튼을 누른 뒤 '취소 처리 중'을 표시하고 중복 요청을 제어하며, 실패하면 입력과 주문 위치를 유지한다. 스토리보드에는 정상 취소·이미 결제됨·연결 실패의 세 경로를 그린다. 성공 화면 하나만 그리면 실패 시 사용자가 무엇을 해야 하는지 구현자가 추측하게 된다."}]}]},{"id":"IPE-2027-L006","order":6,"title":"아키텍처·모듈화·결합도·응집도","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L005"],"goals":["큰 구조와 작은 책임의 뜻과 조건을 설명한다.","변경의 파급를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["내부 목적은 응집도, 외부 의존은 결합도다. 둘을 같은 방향의 수치로 외우지 않는다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q006"],"sections":[{"id":"IPE-2027-L006-S01","order":1,"title":"큰 구조와 작은 책임","blocks":[{"type":"paragraph","text":"아키텍처는 구성요소의 책임과 관계, 배치와 주요 결정의 구조다. 계층형 구조에서는 화면·업무·데이터 접근을 나누고 각 계층이 정한 경계로 통신한다. MVC는 모델·뷰·컨트롤러의 책임을 나누는 방식이다. 모듈화는 일을 나누어 이해·시험·변경 범위를 줄이고 재사용은 검증된 부분을 적절한 조건에서 다시 쓰는 것이다."}]},{"id":"IPE-2027-L006-S02","order":2,"title":"바람직한 의존 관계","blocks":[{"type":"paragraph","text":"응집도는 한 모듈 내부 요소가 같은 목적에 모인 정도, 결합도는 모듈 사이 의존 정도다. 일반적으로 높은 응집도와 낮은 결합도를 지향한다. 자료 결합은 필요한 값만 전달하고, 제어 결합은 상대 행동을 지시하는 제어값을 전달하며, 공통 결합은 전역 데이터를 공유한다. 내용 결합은 상대 내부에 직접 의존해 변경 영향을 키운다. 기능적 응집은 한 기능을 위해 요소들이 모인 경우다."}]},{"id":"IPE-2027-L006-S03","order":3,"title":"변경의 파급","blocks":[{"type":"paragraph","text":"`할인계산(가격, 등급)`처럼 필요한 값만 받아 결과를 돌려주는 모듈은 시험이 쉽다. 모든 화면이 전역 할인율을 바꾸고 서로의 내부 변수를 수정하면 어느 변경이 결과를 바꾸는지 찾기 어렵다. 인터페이스를 좁히고 한 모듈에 한 책임을 모으면 같은 버그가 여러 화면으로 번지는 위험을 줄인다."}]}]},{"id":"IPE-2027-L007","order":7,"title":"객체·클래스·상속·다형성","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L006"],"goals":["데이터와 행동을 묶기의 뜻과 조건을 설명한다.","결제 객체 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["클래스는 타입, 객체는 인스턴스, 오버라이딩은 상속 관계에서 동작 재정의다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q007"],"sections":[{"id":"IPE-2027-L007-S01","order":1,"title":"데이터와 행동을 묶기","blocks":[{"type":"paragraph","text":"객체는 상태와 행동을 가진 실체이고 클래스는 객체를 만드는 타입의 설계다. 캡슐화는 상태와 연산을 묶고 접근 경계를 정하는 일이다. 정보 은닉은 내부 표현을 숨겨 외부가 정한 인터페이스를 이용하게 한다. 추상화는 필요한 공통 특성에 집중한다. 상속은 타입의 공통 성질을 이어받지만 무조건 재사용을 위해 늘리는 것은 바람직하지 않다."}]},{"id":"IPE-2027-L007-S02","order":2,"title":"같은 요청에 다른 구현","blocks":[{"type":"paragraph","text":"다형성은 같은 인터페이스의 호출이 실제 객체에 따라 다른 구현으로 수행되는 성질이다. 오버라이딩은 하위 타입이 상위 타입의 메서드 동작을 재정의하는 것, 오버로딩은 같은 이름에 서로 다른 매개변수 목록을 제공하는 것이다. '인자 수가 다르다'는 이유만으로 오버라이딩이라고 하지 않는다."}]},{"id":"IPE-2027-L007-S03","order":3,"title":"결제 객체 예제","blocks":[{"type":"paragraph","text":"`결제수단.승인(금액)`이라는 공통 인터페이스를 카드결제와 계좌결제가 구현한다. 주문 서비스는 구체적인 카드사의 내부 변수를 몰라도 승인 요청을 보낼 수 있다. 새 수단을 추가할 때 모든 주문 분기를 고치는 설계보다 구현 교체가 쉽다. 다만 승인 실패·취소·중복 처리 규칙도 인터페이스 계약에 들어가야 한다."}]}]},{"id":"IPE-2027-L008","order":8,"title":"디자인패턴을 문제와 연결하기","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L007"],"goals":["생성·구조·행동의 관점의 뜻과 조건을 설명한다.","사례 분류를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["Adapter는 연결 방식, Strategy는 알고리즘 교체, Observer는 변화 통지다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q008"],"sections":[{"id":"IPE-2027-L008-S01","order":1,"title":"생성·구조·행동의 관점","blocks":[{"type":"paragraph","text":"패턴은 자주 생기는 설계 문제와 해결 구조를 이름 붙인 것이다. 생성 패턴은 객체 생성, 구조 패턴은 객체·클래스의 구성, 행동 패턴은 책임과 상호작용에 초점을 둔다. Singleton은 인스턴스 수를 관리하고 Factory Method는 생성 책임을 하위 구현에 위임한다. Adapter는 맞지 않는 인터페이스를 연결하고 Facade는 복잡한 하위 기능에 단순한 진입을 제공한다."}]},{"id":"IPE-2027-L008-S02","order":2,"title":"동작을 바꾸거나 알리기","blocks":[{"type":"paragraph","text":"Strategy는 교체 가능한 알고리즘을 별도 객체로 묶는다. Observer는 관찰 대상의 변화가 구독자에게 전달되는 관계다. Iterator는 내부 구조를 드러내지 않고 요소를 순회한다. Decorator는 객체를 감싸 기능을 덧붙이고 Composite는 부분과 전체를 공통 인터페이스로 다룬다. 패턴 이름을 외우기 전에 어떤 변화가 어려운지 찾는다."}]},{"id":"IPE-2027-L008-S03","order":3,"title":"사례 분류","blocks":[{"type":"table","headers":["사례","패턴","이유"],"rows":[["구형 결제API를 새 승인 인터페이스에 맞춤","Adapter","인터페이스 변환"],["배송비 알고리즘을 지역별로 교체","Strategy","행동의 교체"],["재고 변경을 여러 화면에 통지","Observer","변화의 통지"]]}]}]},{"id":"IPE-2027-L009","order":9,"title":"인터페이스 명세와 미들웨어","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L008"],"goals":["경계에서 합의할 것의 뜻과 조건을 설명한다.","명세 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["경계의 타입·단위·오류·재시도까지가 인터페이스 계약이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q009"],"sections":[{"id":"IPE-2027-L009-S01","order":1,"title":"경계에서 합의할 것","blocks":[{"type":"paragraph","text":"인터페이스는 시스템이나 모듈이 서로 주고받는 경계다. 송신자·수신자·호출 시점·데이터 항목·타입·단위·필수 여부·오류와 재시도 규칙을 명세한다. 금액 1000이 원인지 센트인지, 날짜가 어느 시간대인지 빠지면 타입이 맞아도 의미가 어긋난다. 내외부 연계의 대상과 실제 데이터 흐름을 먼저 그려야 한다."}]},{"id":"IPE-2027-L009-S02","order":2,"title":"동기·비동기·연계 계층","blocks":[{"type":"paragraph","text":"동기 호출은 응답을 기다리고 비동기 메시징은 요청과 처리를 시간적으로 분리한다. 미들웨어는 시스템 사이 통신·메시지·트랜잭션 등을 중개한다. RPC는 원격 함수 호출, 메시지 큐는 메시지 적재와 소비, WAS는 웹 업무 실행 환경과 관련된다. 비동기라는 말이 즉시 처리나 중복 없음의 보장은 아니다. 재전송을 고려해 요청 식별자와 멱등성을 설계한다."}]},{"id":"IPE-2027-L009-S03","order":3,"title":"명세 판독","blocks":[{"type":"paragraph","text":"`requestId:문자열/필수`, `amount:정수/원/0초과`, `status:APPROVED 또는 REJECTED`로 정한다. 응답이 유실돼 같은 requestId로 재시도할 때 새 결제를 만들지 않고 기존 결과를 조회하도록 하면 중복 승인을 피할 수 있다. 단순히 타임아웃을 길게 설정하는 것만으로 중복 문제는 해결되지 않는다."}]}]},{"id":"IPE-2027-L010","order":10,"title":"비용산정과 일정의 계산","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L009"],"goals":["규모와 노력을 구별하기의 뜻과 조건을 설명한다.","경로와 여유시간를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["인월은 노력, 월은 기간이다. 선후관계가 있는 일정은 경로별 합의 최댓값을 본다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q010"],"sections":[{"id":"IPE-2027-L010-S01","order":1,"title":"규모와 노력을 구별하기","blocks":[{"type":"paragraph","text":"규모는 만들어야 할 소프트웨어의 크기, 노력은 사람이 들이는 작업량, 기간은 달력상의 시간이다. LOC는 소스코드 줄 수에 기초하고 기능점수는 입력·출력·조회·논리파일·외부연계 등 사용자 기능을 평가한다. 전문가 판단·델파이·상향식 산정은 근거를 모으는 방식이 다르다. COCOMO는 규모와 계수 등을 이용해 노력을 추정하는 모형이다."}]},{"id":"IPE-2027-L010-S02","order":2,"title":"조건이 주어지면 단위를 맞춘다","blocks":[{"type":"paragraph","text":"작업량이 24인월이고 4명이 같은 생산성으로 완전히 나누어 일한다는 단순 가정에서는 기간이 24÷4=6개월이다. 실제로는 의존작업·의사소통·숙련도 때문에 인원을 늘린 만큼 기간이 줄지 않는다. 기능점수나 COCOMO 문제는 주어진 가중치·상수·보정 조건을 확인하고 다른 판본의 계수를 섞지 않는다."}]},{"id":"IPE-2027-L010-S03","order":3,"title":"경로와 여유시간","blocks":[{"type":"paragraph","text":"작업 A 2일 뒤 B 4일과 C 3일이 병렬이고, 둘 다 끝난 뒤 D 2일을 수행한다면 경로 A-B-D는8일, A-C-D는7일이다. 최장 경로인 A-B-D가 주공정이고 C 경로에는1일의 차이가 있다. 병렬작업 시간을 모두 더해11일이라고 계산하면 잘못이다."}]}]},{"id":"IPE-2027-L011","order":11,"title":"표준·테일러링·개발 프레임워크","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L010"],"goals":["기준을 상황에 맞게 적용하기의 뜻과 조건을 설명한다.","조정 기록 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["테일러링은 근거 있는 절차 조정이며 프레임워크 도입 자체가 품질 보장은 아니다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q011"],"sections":[{"id":"IPE-2027-L011-S01","order":1,"title":"기준을 상황에 맞게 적용하기","blocks":[{"type":"paragraph","text":"테일러링은 조직의 표준 개발 절차와 산출물을 프로젝트 특성에 맞게 조정하는 일이다. 규모·위험·납기·기술·인력·계약 조건을 근거로 필요한 활동과 상세도를 정한다. 위험한 인증 변경에서는 시험·승인 단계를 강화하고, 작은 내부 도구에서는 문서 양식을 간소화할 수 있다. 필수 검증을 없앤 뒤 '맞춤'이라고 부르는 것은 정당한 조정이 아니다."}]},{"id":"IPE-2027-L011-S02","order":2,"title":"프레임워크와 라이브러리","blocks":[{"type":"paragraph","text":"라이브러리는 프로그램이 필요한 함수를 호출해 사용하는 코드 묶음이다. 프레임워크는 실행 구조와 확장 지점을 제공하고 개발자가 작성한 코드를 그 흐름에서 호출하는 경우가 많다. 제어의 역전은 이 실행 주도권의 변화와 관련된다. 공통 프레임워크를 써도 설정·버전·권한·업무 규칙을 따로 검증해야 한다."}]},{"id":"IPE-2027-L011-S03","order":3,"title":"조정 기록 예제","blocks":[{"type":"paragraph","text":"모바일 예약 서비스의 출시 주기가 짧아 반복 개발을 택하되, 예약 중복 방지 시험은 매 빌드에 남긴다. 산출물은 위험 목록·요구 추적·자동 시험·릴리스 기록으로 구성한다. 선택 이유와 제외한 절차의 대책을 기록하면 나중에 품질 문제가 발생했을 때 판단 근거를 찾을 수 있다."}]}]},{"id":"IPE-2027-L012","order":12,"title":"단위모듈·협업·형상관리","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L011"],"goals":["작게 만들고 계약으로 연결하기의 뜻과 조건을 설명한다.","통합 전 확인를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["버전관리는 이력, 형상관리는 식별·변경통제·상태기록·감사까지 포함한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q012"],"sections":[{"id":"IPE-2027-L012-S01","order":1,"title":"작게 만들고 계약으로 연결하기","blocks":[{"type":"paragraph","text":"단위모듈은 입력·출력·예외를 정한 뒤 구현하고 단위 테스트한다. IDE는 편집·빌드·디버깅을 묶어 제공한다. 협업도구는 일감·의사소통·리뷰를 돕는다. 형상관리는 소스뿐 아니라 설정·문서·산출물의 변경을 식별하고 통제하며 상태를 기록하는 활동이다. 버전관리 도구는 그 일부를 지원한다."}]},{"id":"IPE-2027-L012-S02","order":2,"title":"커밋·분기·병합","blocks":[{"type":"paragraph","text":"커밋은 변경을 식별 가능한 이력으로 남기고, 브랜치는 작업 흐름을 분리한다. 병합 충돌은 같은 부분의 변경이 자동 결합되지 않는 상황이다. 충돌 기호만 지우는 대신 두 의도가 함께 성립하는지 시험해야 한다. 기준선은 공식적으로 합의한 특정 구성의 상태이며 가장 최근 파일이라는 뜻과 다르다."}]},{"id":"IPE-2027-L012-S03","order":3,"title":"통합 전 확인","blocks":[{"type":"paragraph","text":"A가 할인 계산을 바꾸고 B가 세금 계산을 바꿨다면 각 단위 시험 통과 후에도 할인 후 세금이라는 연결 순서를 시험한다. 저장소에 소스가 있다는 사실과 그 소스로 만들어진 배포물이 실제 실행된다는 사실은 다르다. 소스 버전·의존성·빌드 결과를 연결하면 재현과 복구가 쉬워진다."}]}]},{"id":"IPE-2027-L013","order":13,"title":"빌드·패키징·배포·모니터링","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L012"],"goals":["소스에서 실행 가능한 제품으로의 뜻과 조건을 설명한다.","배포 실패의 범위를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["빌드·포장·설치·활성화·실행 검증은 서로 다른 확인점이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q013"],"sections":[{"id":"IPE-2027-L013-S01","order":1,"title":"소스에서 실행 가능한 제품으로","blocks":[{"type":"paragraph","text":"빌드는 소스를 변환하고 의존성을 결합해 실행 산출물을 만드는 과정이다. 패키징은 실행파일·라이브러리·설정·메타데이터 등을 전달 가능한 형태로 묶는다. 배포는 이를 목표 환경에 설치·활성화하는 과정이다. 컴파일 성공은 운영 환경의 접속·권한·실행 성공까지 증명하지 않는다."}]},{"id":"IPE-2027-L013-S02","order":2,"title":"자동화와 관측","blocks":[{"type":"paragraph","text":"지속적 통합은 변경을 자주 통합하며 자동 빌드·시험으로 문제를 빨리 찾는다. 배포 자동화에서도 실패 시 중단·되돌리기·환경별 설정 보호가 필요하다. 로그는 사건 기록, 메트릭은 지연·오류율 같은 수치, 트레이스는 분산 요청의 흐름을 추적한다. 모니터링은 배포 뒤 정상 작동과 성능 저하를 확인하는 데 사용한다."}]},{"id":"IPE-2027-L013-S03","order":3,"title":"배포 실패의 범위","blocks":[{"type":"paragraph","text":"새 버전의 실행파일은 정상인데 DB 접속 권한이 빠졌다면 빌드는 성공하고 배포 후 기능 확인은 실패할 수 있다. 잘못된 설정을 바로잡거나 검증된 이전 산출물로 돌아간다. 어떤 버전·환경·시각에서 실패했는지 기록해야 다른 환경의 성공 로그와 혼동하지 않는다."}]}]},{"id":"IPE-2027-L014","order":14,"title":"매뉴얼·품질 특성·DRM","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L013"],"goals":["누구에게 무엇을 설명하는가의 뜻과 조건을 설명한다.","보호와 사용 가능성를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["매뉴얼은 독자의 행동을, 품질 특성은 평가 관점을, DRM은 콘텐츠 권한을 설명한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q014"],"sections":[{"id":"IPE-2027-L014-S01","order":1,"title":"누구에게 무엇을 설명하는가","blocks":[{"type":"paragraph","text":"설치 매뉴얼은 요구 환경·설치·설정·복구를, 사용자 매뉴얼은 기능 수행과 오류 대처를 설명한다. 대상 독자가 할 일을 기준으로 쓰고 실제 화면과 용어를 맞춘다. 릴리스 노트는 변경·수정·알려진 제약을 정리한다. 실행 순서와 정상·실패 결과가 있어야 사용자가 다음 행동을 알 수 있다."}]},{"id":"IPE-2027-L014-S02","order":2,"title":"품질을 판단하는 관점","blocks":[{"type":"paragraph","text":"기능 적합성은 필요한 기능을 정확히 제공하는지, 성능 효율성은 자원과 시간, 호환성은 함께 작동하거나 정보를 교환하는지, 신뢰성은 필요한 조건에서 지속하는지, 보안성은 정보와 권한을 보호하는지, 유지보수성은 변경하기 쉬운지에 관련된다. 제품 품질 모형은 표준 판본에 따라 명칭·구성이 달라질 수 있으므로 문제에서 지정한 판본을 따른다."}]},{"id":"IPE-2027-L014-S03","order":3,"title":"보호와 사용 가능성","blocks":[{"type":"paragraph","text":"DRM은 디지털 콘텐츠의 이용 권한을 관리한다. 암호화·권한정책·라이선스 발급 등이 연계되며 단순 압축과 다르다. 유효한 사용자가 서버 장애 때문에 열지 못하는 사례는 보안 통제와 서비스 가용성을 함께 검토해야 함을 보여 준다. 매뉴얼에는 라이선스 오류와 복구 경로도 필요하다."}]}]},{"id":"IPE-2027-L015","order":15,"title":"테스트 수준·목적·결함 기록","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L014"],"goals":["어느 범위를 확인하는가의 뜻과 조건을 설명한다.","연결 시험 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["테스트 수준은 범위, 회귀는 변경 영향이다. 시험은 결함을 찾는 데 도움을 주지만 결함 없음의 증명은 아니다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q015"],"sections":[{"id":"IPE-2027-L015-S01","order":1,"title":"어느 범위를 확인하는가","blocks":[{"type":"paragraph","text":"단위 테스트는 작은 모듈, 통합 테스트는 모듈 사이 연결, 시스템 테스트는 전체 시스템, 인수 테스트는 사용 요구와 인수 기준을 확인한다. 확인 대상의 크기와 수행 주체는 별개이므로 개발자가 수행하면 모두 단위 시험이라는 해석은 틀리다. 정적 테스트는 실행하지 않고 문서·코드를 검토하고 동적 테스트는 실행 결과를 확인한다."}]},{"id":"IPE-2027-L015-S02","order":2,"title":"재시험과 회귀시험","blocks":[{"type":"paragraph","text":"확인 테스트는 수정한 결함이 해결됐는지, 회귀 테스트는 변경이 다른 정상 기능을 깨뜨리지 않았는지 확인한다. 오류는 사람이 저지른 잘못, 결함은 산출물의 문제, 장애는 실행 중 요구 동작을 하지 못하는 현상으로 구별한다. 결함 보고에는 환경·버전·재현 단계·입력·예상/실제 결과와 증거가 필요하다."}]},{"id":"IPE-2027-L015-S03","order":3,"title":"연결 시험 예제","blocks":[{"type":"paragraph","text":"할인 모듈과 결제 모듈이 각각 통과했어도 0원 주문을 결제사가 거절할 수 있다. 두 모듈 사이 금액 단위·허용 범위·실패 전달을 확인하는 것은 통합 테스트다. 카드 결제의 수정 뒤 계좌 결제가 계속 작동하는지 보는 것은 회귀 테스트다."}]}]},{"id":"IPE-2027-L016","order":16,"title":"동등분할·경계값·결정표","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L015"],"goals":["입력 공간을 나누기의 뜻과 조건을 설명한다.","결정표 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["분할은 입력 집합, 경계는 값의 주변, 결정표는 조건 조합이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q016"],"sections":[{"id":"IPE-2027-L016-S01","order":1,"title":"입력 공간을 나누기","blocks":[{"type":"paragraph","text":"동등분할은 비슷하게 처리될 입력을 집합으로 나누어 대표값을 고르는 방법이다. 나이가 정수이고 허용 범위가18~65라면 18미만·18~65·65초과로 나눌 수 있다. 경계값 분석은 경계와 그 주변을 시험한다. 문자·빈값·잘못된 형식이 가능한 입력이면 그것도 별도 조건으로 정한다."}]},{"id":"IPE-2027-L016-S02","order":2,"title":"조건이 함께 작용할 때","blocks":[{"type":"paragraph","text":"결정표는 여러 조건의 조합과 그에 따른 행동을 표로 나타낸다. 상태전이 시험은 현재 상태와 사건에 따른 다음 상태·출력을 본다. 테스트 케이스에는 사전조건·입력·실행·예상 결과를 적고, 시나리오는 관련 케이스의 흐름을 연결한다. 서로 다른 조건을 한 문장으로 뭉치면 누락을 찾기 어렵다."}]},{"id":"IPE-2027-L016-S03","order":3,"title":"결정표 판독","blocks":[{"type":"table","headers":["회원","재고 있음","결과"],"rows":[["예","예","주문 허용"],["예","아니오","품절 안내"],["아니오","예","로그인 안내"],["아니오","아니오","로그인 안내"]]},{"type":"paragraph","text":"재고만 바꾼 두 케이스로는 비회원 경로를 시험하지 못한다. 회원 여부와 재고 여부 네 조합을 기준으로 누락을 확인한다."}]}]},{"id":"IPE-2027-L017","order":17,"title":"코드 커버리지와 통합 순서","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L016"],"goals":["실행한 부분을 수치로 보기의 뜻과 조건을 설명한다.","복합 조건 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["커버리지 이름보다 무엇을 세는지 보며, 스텁은 하위·드라이버는 상위를 대신한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q017"],"sections":[{"id":"IPE-2027-L017-S01","order":1,"title":"실행한 부분을 수치로 보기","blocks":[{"type":"paragraph","text":"구문 커버리지는 실행한 문장의 비율, 결정 커버리지는 각 결정의 참·거짓 결과를 실행한 비율이다. 조건 커버리지는 복합 결정 안의 개별 조건이 참·거짓을 취하는지를 본다. 조건 커버리지를 만족해도 전체 결정 결과를 모두 시험하지 못할 수 있다. 분모가 문장인지 분기인지 조건인지 먼저 확인한다."}]},{"id":"IPE-2027-L017-S02","order":2,"title":"연결 방향과 대역","blocks":[{"type":"paragraph","text":"상향식 통합은 하위 모듈에서 위로 올라가며 아직 없는 상위 호출자를 드라이버로 대신할 수 있다. 하향식은 상위에서 내려오며 없는 하위 모듈을 스텁으로 대신할 수 있다. 빅뱅 통합은 모듈을 한꺼번에 연결해 문제 위치를 찾기 어려울 수 있다. 대역으로 통과한 뒤 실제 외부 연계 조건도 별도로 확인해야 한다."}]},{"id":"IPE-2027-L017-S03","order":3,"title":"복합 조건 예제","blocks":[{"type":"paragraph","text":"다음 표는 모든 조건을 평가하는 추상 논리식 A OR B의 판정표다. Java17의 boolean `A | B`처럼 양쪽을 모두 평가하는 상황을 생각할 수 있다."},{"type":"table","headers":["검사","A 평가","B 평가","전체결과"],"rows":[["1","참","거짓","참"],["2","거짓","참","참"]]},{"type":"paragraph","text":"A와B는 각각 참·거짓을 모두 경험하지만 전체결과는 참만 나와, 조건 커버리지를 만족해도 결정 커버리지는 부족할 수 있다. 전체거짓을 보려면(거짓,거짓)이 필요하다."},{"type":"paragraph","text":"C/Java의 단락 논리 OR `A || B`를 실행한다면 평가 기록이 다르다."},{"type":"table","headers":["입력(A,B)","A 실제평가","B 실제평가","전체결과"],"rows":[["(참,거짓)","참","미평가","참"],["(거짓,참)","거짓","참","참"]]},{"type":"paragraph","text":"이 실행에서는 B의 거짓 평가가 없으므로 위 두 입력만으로 조건 커버리지도 만족했다고 말할 수 없다. 입력값이 거짓인 것과 실제 실행에서 그 조건이 평가된 것은 다르다. 커버리지 문제는 언어의 연산자·단락평가·계측 기준을 명시해야 한다."}]}]},{"id":"IPE-2027-L018","order":18,"title":"성능 자료와 알고리즘 개선","groupId":"IPE-2027-S1","groupTitle":"소프트웨어 개발","examSubject":"소프트웨어 개발","prerequisites":["IPE-2027-L017"],"goals":["병목을 측정해 찾기의 뜻과 조건을 설명한다.","측정표 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["병목은 측정으로 찾고, 개선율은 비교 대상의 변경 전 값을 분모로 계산한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q018"],"sections":[{"id":"IPE-2027-L018-S01","order":1,"title":"병목을 측정해 찾기","blocks":[{"type":"paragraph","text":"응답시간은 요청부터 결과까지의 시간, 처리량은 단위 시간에 처리한 작업 수다. 지연의 평균만 보면 일부 느린 요청을 놓칠 수 있어 분위수도 본다. CPU·메모리·디스크·네트워크·DB 대기를 함께 관찰한다. 프로파일러는 실행시간 분포를, 정적 분석은 실행하지 않고 코드의 문제 가능성을 찾는 데 도움을 준다."}]},{"id":"IPE-2027-L018-S02","order":2,"title":"계산량과 결과 보존","blocks":[{"type":"paragraph","text":"선형 탐색은 최대 n개의 비교, 정렬된 배열의 이진 탐색은 탐색 범위를 반복해서 절반으로 줄인다. 중첩 반복문에서 각 반복이 n번이면 보통 n² 수준의 작업이 생긴다. O표기는 입력 증가에 따른 성장률이며 작은 입력에서의 실제 시간을 단독 결정하지 않는다. 최적화 뒤에는 정확성·예외·경계 조건을 다시 확인한다."}]},{"id":"IPE-2027-L018-S03","order":3,"title":"측정표 판독","blocks":[{"type":"table","headers":["구간","변경 전(ms)","변경 후(ms)"],"rows":[["DB조회","800","120"],["계산","50","45"],["출력","150","135"],["합계","1000","300"]]},{"type":"paragraph","text":"같은 부하·입력이라는 조건에서 총시간은700ms 줄어70% 감소했다. 가장 큰 기여는 DB조회680ms 감소다. 계산 구간의10% 개선만 보고 총시간이10% 줄었다고 말하면 틀린다."}]}]},{"id":"IPE-2027-L019","order":19,"title":"관계·키·무결성·관계대수","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L001"],"goals":["표를 데이터 모델로 읽기의 뜻과 조건을 설명한다.","표에서 연산하기를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["행 제한은 선택, 열 제한은 투영이며 SQL의 SELECT라는 단어와 혼동하지 않는다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q019"],"sections":[{"id":"IPE-2027-L019-S01","order":1,"title":"표를 데이터 모델로 읽기","blocks":[{"type":"paragraph","text":"관계형 모델의 릴레이션은 속성과 튜플로 데이터를 표현한다. 속성은 열의 의미, 튜플은 한 행, 도메인은 속성이 가질 수 있는 값의 집합이다. 차수는 속성 수, 카디널리티는 튜플 수다. 관계 이론에서 튜플은 집합의 원소이므로 중복과 순서가 없지만 실제 SQL 조회는 DISTINCT를 쓰지 않으면 중복을 포함할 수 있다."}]},{"id":"IPE-2027-L019-S02","order":2,"title":"식별과 제약","blocks":[{"type":"paragraph","text":"후보키는 모든 튜플을 유일하게 식별하는 최소 속성 집합이다. 후보키 하나를 기본키로 고르고 나머지를 대체키라 한다. 슈퍼키는 유일성을 만족하되 불필요한 속성이 들어갈 수 있다. 외래키는 참조 관계를 만들며 참조 무결성은 참조값이 정한 규칙에 맞게 존재하도록 한다. 기본키는 NULL일 수 없고 유일해야 한다. 외래키의 NULL 허용 여부는 별도 제약에 따른다."}]},{"id":"IPE-2027-L019-S03","order":3,"title":"표에서 연산하기","blocks":[{"type":"paragraph","text":"`학생(학번,이름,학과)`가3속성·4행이면 차수3, 카디널리티4다. `학과='컴퓨터'`인 행을 고르는 것은 선택(σ), 이름 열만 고르는 것은 투영(π)이다. 관계대수의 투영은 중복을 제거한다. 학번이 유일하면 {학번}은 후보키이고 {학번,이름}은 최소성이 없어 후보키가 아니다. 관계해석은 원하는 결과의 조건을 논리적으로 표현한다."}]}]},{"id":"IPE-2027-L020","order":20,"title":"E-R 모델과 관계 스키마","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L019"],"goals":["저장할 대상과 관계의 뜻과 조건을 설명한다.","수강 관계 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["N:M은 연결 테이블로, 키는 실제 중복 허용 규칙에 맞게 정한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q020"],"sections":[{"id":"IPE-2027-L020-S01","order":1,"title":"저장할 대상과 관계","blocks":[{"type":"paragraph","text":"개체는 독립적으로 구별할 대상, 속성은 그 특성, 관계는 개체 사이의 연결이다. 개념 모델은 업무의 의미를, 논리 모델은 선택한 데이터 모델의 구조를, 물리 모델은 DBMS의 저장·성능·제약 등을 구체화한다. E-R 모델에서는 관계의 최대 수뿐 아니라 선택 참여인지 필수 참여인지도 확인한다."}]},{"id":"IPE-2027-L020-S02","order":2,"title":"관계형 표로 바꾸기","blocks":[{"type":"paragraph","text":"1:N 관계에서는 보통 N쪽 테이블에1쪽의 키를 외래키로 둔다. N:M 관계는 연결 테이블을 만들고 양쪽 키를 외래키로 둔다. 연결 자체에 날짜·수량 같은 속성이 있으면 연결 테이블에 저장한다. 1:1 관계의 외래키 위치는 필수성·접근 패턴 등을 고려하며 유일성 제약으로 최대1개를 표현한다."}]},{"id":"IPE-2027-L020-S03","order":3,"title":"수강 관계 예제","blocks":[{"type":"paragraph","text":"학생은 여러 강좌를 듣고 강좌에는 여러 학생이 속한다. `학생(학번PK,이름)`, `강좌(강좌번호PK,제목)`, `수강(학번FK,강좌번호FK,성적)`으로 나눈다. 동일 강좌를 같은 학생이 한 번만 등록한다는 조건이면 수강의 기본키는 (학번,강좌번호)다. 학기별 재수강을 허용한다면 학기도 식별 규칙에 포함해야 한다."}]},{"id":"IPE-2027-L020-S04","order":4,"title":"단일 수강 연결 테이블의 ERD","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-ER-ENROLL","alt":"학생과 강좌 아래에 단일 수강 연결 테이블이 있다. 학생 기본키 학번, 강좌 기본키 강좌번호. 수강의 복합 기본키는 학번과 강좌번호이며 각각 외래키다. 양쪽 부모1개에 수강0개 이상이 연결된다.","caption":"N:M을 수강 연결 테이블로 바꾸기"},{"type":"paragraph","text":"동일 학생의 동일 강좌 등록은 한 번만 허용한다고 가정한다. 수강 한 행은 학생 한 명과 강좌 하나를 참조하며 두 외래키를 합쳐 복합 기본키를 이룬다. 학생과 강좌 사이에 연결 테이블을 두 개 중복 생성하지 않는다. 학기별 재수강을 허용하면 학기 식별이 추가로 필요하다."}]}]},{"id":"IPE-2027-L021","order":21,"title":"함수 종속과 정규화","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L020"],"goals":["중복이 만드는 이상의 뜻과 조건을 설명한다.","종속도 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["정규화는 표를 무작정 많이 나누는 일이 아니라 종속과 이상을 근거로 분해하는 일이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q021"],"sections":[{"id":"IPE-2027-L021-S01","order":1,"title":"중복이 만드는 이상","blocks":[{"type":"paragraph","text":"함수 종속 X→Y는 같은 X값이면 Y값도 같다는 제약이다. 데이터 몇 행에서 우연히 같다고 업무 전체의 종속으로 단정하지 않는다. 한 표에 학생과 학과 사무실을 반복 저장하면 사무실 변경을 여러 행에 반영해야 하는 갱신 이상, 학생 없이 학과를 넣기 어려운 삽입 이상, 마지막 학생 삭제로 학과 정보도 없어지는 삭제 이상이 생길 수 있다."}]},{"id":"IPE-2027-L021-S02","order":2,"title":"분해 기준","blocks":[{"type":"paragraph","text":"제1정규형은 속성값을 원자값으로 표현한다. 제2정규형은 제1정규형에서 후보키의 일부에만 종속하는 비주요 속성을 제거하고, 제3정규형은 이행적 종속에 따른 문제를 줄인다. BCNF는 모든 비자명 함수 종속의 결정자가 슈퍼키인 형태다. 분해할 때는 원래 정보를 손실 없이 복원하는지와 제약을 보존할 수 있는지 확인한다."}]},{"id":"IPE-2027-L021-S03","order":3,"title":"종속도 판독","blocks":[{"type":"paragraph","text":"`수강(학번,강좌번호,학생명,강좌명,성적)`의 키가(학번,강좌번호)이고 학번→학생명, 강좌번호→강좌명이라고 하자. 학생명과 강좌명은 복합키 일부에 종속한다. 학생·강좌·수강으로 분해하면 제2정규형의 부분 종속 문제를 줄인다. 성적은 이 학생의 이 강좌 결과이므로 수강 표에 남긴다."}]},{"id":"IPE-2027-L021-S04","order":4,"title":"제3정규형의 이행 종속을 표로 분해하기","blocks":[{"type":"paragraph","text":"업무 규칙은 학번→학과코드, 학과코드→학과명이며 학생의 키는 학번이다."},{"type":"table","headers":["학번(PK)","학생명","학과코드","학과명"],"rows":[["101","민","D1","전산"],["102","수","D1","전산"],["103","진","D2","전자"]]},{"type":"paragraph","text":"학과명을 바꾸면 D1에 속한 여러 학생 행을 고쳐야 한다. 학번→학과코드→학과명의 이행 종속을 분리한다."},{"type":"table","headers":["학생:학번(PK)","학생명","학과코드(FK)"],"rows":[["101","민","D1"],["102","수","D1"],["103","진","D2"]]},{"type":"table","headers":["학과:학과코드(PK)","학과명"],"rows":[["D1","전산"],["D2","전자"]]},{"type":"paragraph","text":"이제 학과명은 학과 표의 한 행에서 관리한다. 두 표는 학과코드로 조인해 학생의 학과명을 복원한다. 분해 후 참조키와 손실 없는 복원도 확인한다."}]},{"id":"IPE-2027-L021-S05","order":5,"title":"후보키를 계산하고 BCNF 판독하기","blocks":[{"type":"paragraph","text":"관계R(A,B,C)의 함수 종속 집합 F={AB→C,C→B}를 가정한다. A,B,C는 각각 별개 속성이다."},{"type":"table","headers":["출발 속성","폐포","슈퍼키 여부"],"rows":[["A","A","아니오"],["B","B","아니오"],["C","BC","아니오"],["AB","ABC","예"],["AC","ABC","예"]]},{"type":"paragraph","text":"AB와 AC는 어느 한 속성을 빼면 전체를 결정하지 못하므로 후보키다. A,B,C는 모두 어떤 후보키에 포함되는 주요 속성이다. C→B에서 C는 슈퍼키가 아니므로 BCNF를 만족하지 않는다. 제3정규형은 각 비자명 종속X→Y에서 X가슈퍼키이거나 Y가주요속성인 조건으로 판단하므로 이 관계는3NF이지만 BCNF는아니다. 여기서 BCNF의 위반 결정자는C다."}]}]},{"id":"IPE-2027-L022","order":22,"title":"DDL·DML·DCL과 데이터 사전","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L021"],"goals":["구조·내용·권한을 구별하기의 뜻과 조건을 설명한다.","생성문 읽기를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["타입은 값의 종류, 제약은 데이터가 지켜야 할 규칙이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q022"],"sections":[{"id":"IPE-2027-L022-S01","order":1,"title":"구조·내용·권한을 구별하기","blocks":[{"type":"paragraph","text":"DDL은 CREATE·ALTER·DROP처럼 구조를 정의한다. DML은 SELECT·INSERT·UPDATE·DELETE처럼 데이터를 조회·변경한다. DCL의 GRANT·REVOKE는 권한을 부여·회수한다. COMMIT·ROLLBACK은 트랜잭션 제어에 쓰인다. 분류의 세부 묶음은 교재마다 다를 수 있지만 실제 명령의 역할을 먼저 이해한다. DROP은 테이블 구조를 없애는 명령이고 DELETE는 조건에 맞는 행을 지운다."}]},{"id":"IPE-2027-L022-S02","order":2,"title":"제약을 구조에 넣기","blocks":[{"type":"paragraph","text":"PRIMARY KEY는 식별, FOREIGN KEY는 참조, UNIQUE는 유일성, NOT NULL은 필수값, CHECK는 값 조건을 표현한다. UNIQUE에서 NULL을 다루는 규칙 등은 DBMS마다 다를 수 있어 실행 환경을 명시한다. 시스템 카탈로그·데이터 사전은 테이블·열·권한·제약 등 메타데이터를 담는다. 일반 사용자의 업무 데이터 표와 목적이 다르다."}]},{"id":"IPE-2027-L022-S03","order":3,"title":"생성문 읽기","blocks":[{"type":"code","text":"CREATE TABLE Product (\n  id INTEGER PRIMARY KEY,\n  name VARCHAR(40) NOT NULL,\n  price INTEGER NOT NULL CHECK(price >= 0)\n);","language":"sql"},{"type":"paragraph","text":"id 중복, name의 NULL, 음수 price를 막는다. 이름 중복은 이 정의에서 금지하지 않았다. '가격이 정수'라는 타입 조건과 '가격이0이상'이라는 업무 조건을 각각 읽는다."}]}]},{"id":"IPE-2027-L023","order":23,"title":"SELECT·WHERE·NULL·정렬","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L022"],"goals":["행과 열을 고르는 순서의 뜻과 조건을 설명한다.","결과 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["NULL은 IS NULL로, 순서는 ORDER BY로, 동점은 추가 키로 정한다."],"sourceIds":["qnet-2027-1453","postgresql16-table"],"questionIds":["IPE-2027-R-Q023"],"sections":[{"id":"IPE-2027-L023-S01","order":1,"title":"행과 열을 고르는 순서","blocks":[{"type":"paragraph","text":"FROM은 원본, WHERE는 행 조건, SELECT는 출력할 열과 식, ORDER BY는 결과 정렬을 지정한다. 논리적 처리 순서와 SQL의 작성 순서는 다르다. 정렬 조건이 없으면 출력 행 순서를 보장하지 않는다. 같은 정렬값이 여러 개면 고유한 두 번째 정렬 기준을 주어야 순서가 완전히 정해진다."}]},{"id":"IPE-2027-L023-S02","order":2,"title":"NULL은0이나 빈 문자열이 아니다","blocks":[{"type":"paragraph","text":"NULL은 값이 없거나 알려지지 않았음을 표현한다. `= NULL` 비교는 참이 되지 않으며 `IS NULL`로 검사한다. NULL을 포함한 비교는 UNKNOWN일 수 있고 WHERE는 참인 행만 남긴다. `NOT IN`의 비교 집합에 NULL이 있으면 예상과 다른 결과가 생길 수 있어 NULL 조건이나 NOT EXISTS를 고려한다. SQL의 AND·OR·NOT은 이 세 값 논리에 따라 해석한다."}]},{"id":"IPE-2027-L023-S03","order":3,"title":"결과 판독","blocks":[{"type":"table","headers":["id","score"],"rows":[["1","70"],["2","NULL"],["3","50"],["4","70"]]},{"type":"paragraph","text":"`SELECT id FROM T WHERE score>=60 ORDER BY score DESC,id ASC;`의 결과는1,4다. id2는 UNKNOWN이라 제외된다. `score IS NULL`은 id2를 고른다. score만 정렬하면 id1과4의 상대 순서는 확정되지 않는다."}]}]},{"id":"IPE-2027-L024","order":24,"title":"집계·GROUP BY·HAVING","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L023"],"goals":["여러 행을 요약하기의 뜻과 조건을 설명한다.","직접 계산하기를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["WHERE는 행, HAVING은 그룹이며 COUNT(*)와 COUNT(열)의 분모 차이를 본다."],"sourceIds":["qnet-2027-1453","postgresql16-table"],"questionIds":["IPE-2027-R-Q024"],"sections":[{"id":"IPE-2027-L024-S01","order":1,"title":"여러 행을 요약하기","blocks":[{"type":"paragraph","text":"COUNT(*)는 행 수를, COUNT(열)는 해당 열이 NULL이 아닌 행 수를 센다. SUM·AVG 등 일반적인 집계는 NULL을 제외한다. GROUP BY는 지정한 값이 같은 행을 묶고 HAVING은 집계한 그룹에 조건을 건다. WHERE는 그룹을 만들기 전에 개별 행을 거른다. 결과에 일반 열을 함께 출력할 때는 그룹 기준과 맞아야 한다."}]},{"id":"IPE-2027-L024-S02","order":2,"title":"조건의 위치가 결과를 바꾼다","blocks":[{"type":"paragraph","text":"판매금액100이상인 행만 먼저 남기고 합계를 구하는 것과, 모든 행의 합계가100이상인 부서를 남기는 것은 다르다. NULL이 있는 평균은 전체 행 수로 나누지 않는다. 모든 값이 NULL인 그룹의 SUM과 행이 없는 조회 등 경계조건도 집계 함수별로 확인한다."}]},{"id":"IPE-2027-L024-S03","order":3,"title":"직접 계산하기","blocks":[{"type":"table","headers":["dept","amount"],"rows":[["A","10"],["A","NULL"],["A","30"],["B","15"]]},{"type":"paragraph","text":"A의 COUNT(*)=3, COUNT(amount)=2, SUM=40, AVG=20이다. `GROUP BY dept HAVING SUM(amount)>=30`은 A만 남긴다. `WHERE amount>=20`을 먼저 적용하면 A의30 한 행만 남아 집계가 달라진다."}]}]},{"id":"IPE-2027-L025","order":25,"title":"조인·서브쿼리·EXISTS","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L024"],"goals":["조건으로 표를 연결하기의 뜻과 조건을 설명한다.","조인 결과 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["조인은 일치하는 '행 조합'을 만들고, 외부조인은 보존하는 쪽이 정해져 있다."],"sourceIds":["qnet-2027-1453","postgresql16-table"],"questionIds":["IPE-2027-R-Q025"],"sections":[{"id":"IPE-2027-L025-S01","order":1,"title":"조건으로 표를 연결하기","blocks":[{"type":"paragraph","text":"INNER JOIN은 연결 조건에 맞는 행 조합을, LEFT JOIN은 왼쪽 모든 행과 맞는 오른쪽 행을 돌려주며 없으면 오른쪽 열을 NULL로 채운다. 연결키가 양쪽에서 중복되면 조합 수가 늘어난다. 카티션곱은 조건 없이 가능한 행 조합을 만든다. 조인을 이름만 보고 유일한1:1로 생각하면 결과 수를 틀린다."}]},{"id":"IPE-2027-L025-S02","order":2,"title":"부분 질의를 사용하는 방식","blocks":[{"type":"paragraph","text":"서브쿼리는 질의 안의 질의다. 스칼라 서브쿼리는 단일값 조건을 만족해야 한다. EXISTS는 부분 질의가 적어도 한 행을 만드는지를 검사하고, 상관 서브쿼리는 바깥 행의 값을 참조한다. LEFT JOIN 뒤 WHERE에서 오른쪽 열의 일반 비교를 요구하면 미연결 행의 NULL이 제외될 수 있다."}]},{"id":"IPE-2027-L025-S03","order":3,"title":"조인 결과 예제","blocks":[{"type":"paragraph","text":"고객이 (1,가),(2,나)이고 주문의 고객번호가1,1,3이라 하자. 고객에서 주문으로 LEFT JOIN하면 고객1에 두 행, 고객2에 NULL확장 한 행으로 총3행이다. INNER JOIN이면 고객1의 두 행만 남는다. 주문 고객번호3은 왼쪽 고객에 없으므로 이 LEFT JOIN 결과에 나오지 않는다."}]}]},{"id":"IPE-2027-L026","order":26,"title":"집합연산·뷰·인덱스","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L025"],"goals":["결과를 합치거나 겹치기의 뜻과 조건을 설명한다.","중복 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["UNION ALL은 중복 보존, 일반 뷰는 정의된 질의, 인덱스는 이득과 유지 비용을 함께 본다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q026"],"sections":[{"id":"IPE-2027-L026-S01","order":1,"title":"결과를 합치거나 겹치기","blocks":[{"type":"paragraph","text":"UNION은 양쪽 결과를 합치며 중복을 제거하고 UNION ALL은 중복을 유지한다. INTERSECT는 공통 행, EXCEPT는 앞쪽에만 있는 행을 구한다. 대응 열 수와 타입이 호환되어야 한다. 결과 정렬은 최종 ORDER BY로 명시하며 각 부분 질의의 행 순서가 그대로 유지된다고 가정하지 않는다."}]},{"id":"IPE-2027-L026-S02","order":2,"title":"논리적 창과 탐색 경로","blocks":[{"type":"paragraph","text":"뷰는 질의로 정의한 논리적 표로, 복잡한 질의를 감추거나 허용된 열을 제공하는 데 쓴다. 일반 뷰 자체가 항상 데이터를 별도로 저장하는 것은 아니다. 인덱스는 탐색을 돕는 구조다. 읽기는 빨라질 수 있지만 공간과 INSERT·UPDATE·DELETE 유지 비용이 생긴다. 낮은 선택도·작은 표·함수 적용 등에서는 인덱스가 있어도 쓰이지 않을 수 있다."}]},{"id":"IPE-2027-L026-S03","order":3,"title":"중복 판독","blocks":[{"type":"paragraph","text":"A결과가[1,1,2], B결과가[2,3]이면 UNION은1,2,3의 세 값이고 UNION ALL은 다섯 행이다. 두 결과의 실제 표시 순서는 ORDER BY가 없으면 확정하지 않는다. 주문번호 검색 인덱스가 조회를 도와도, 같은 열을 자주 수정하면 인덱스 갱신 비용이 든다."}]}]},{"id":"IPE-2027-L027","order":27,"title":"트랜잭션·격리·회복","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L026"],"goals":["함께 성공해야 하는 작업의 뜻과 조건을 설명한다.","이체 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["원자성은 전부/전무, 격리는 동시성, 지속성은 확정 뒤 보존이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q027"],"sections":[{"id":"IPE-2027-L027-S01","order":1,"title":"함께 성공해야 하는 작업","blocks":[{"type":"paragraph","text":"트랜잭션은 하나의 논리적 작업 단위다. 원자성은 전부 반영하거나 전부 취소, 일관성은 정한 제약을 유지, 격리성은 동시 수행의 간섭을 제어, 지속성은 완료 결과를 장애 뒤에도 보존하는 성질이다. COMMIT은 확정, ROLLBACK은 취소다. 동시 실행을 다루려면 잠금·다중버전 등의 제어가 필요하다."}]},{"id":"IPE-2027-L027-S02","order":2,"title":"동시성 문제","blocks":[{"type":"paragraph","text":"다른 거래의 미확정 값을 읽으면 오손 읽기, 같은 행을 다시 읽어 값이 바뀌면 반복 불가능 읽기, 같은 조건의 결과 집합에 행이 나타나거나 사라지면 팬텀 읽기다. 갱신분실은 서로의 변경을 덮는 상황이다. 격리 수준의 세부 효과는 DBMS에 따라 추가 차이가 있어 문제의 환경을 따른다. WAL은 데이터 페이지보다 복구용 로그를 먼저 안정 저장하는 원칙이다."}]},{"id":"IPE-2027-L027-S03","order":3,"title":"이체 예제","blocks":[{"type":"paragraph","text":"A잔액100에서 B로30을 옮길 때 A차감과 B증가를 하나의 거래로 묶는다. 차감 뒤 장애가 나고 COMMIT하지 않았다면 회복 시 미완료 거래를 취소해 원자성을 지킨다. 백업만으로 최신 거래까지 복원할 수 있는 것은 아니며 로그와 복구 목표를 함께 설계한다."}]}]},{"id":"IPE-2027-L028","order":28,"title":"윈도우 함수로 행을 유지하며 계산하기","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L027"],"goals":["그룹 집계와 다른 점의 뜻과 조건을 설명한다.","순위 표를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["윈도우 함수는 행을 유지하고, 순위 동점과 누계 프레임을 따로 읽는다."],"sourceIds":["qnet-2027-1453","postgresql16-window"],"questionIds":["IPE-2027-R-Q028"],"sections":[{"id":"IPE-2027-L028-S01","order":1,"title":"그룹 집계와 다른 점","blocks":[{"type":"paragraph","text":"윈도우 함수는 관련 행 집합을 참조해 각 행에 계산 결과를 붙인다. GROUP BY처럼 출력 행을 그룹당 한 행으로 줄이지 않는다. PARTITION BY는 계산 집단, OVER 안의 ORDER BY는 순서, 프레임은 현재 행 주변의 계산 범위다. 윈도우 정렬과 최종 화면 정렬을 구별한다."}]},{"id":"IPE-2027-L028-S02","order":2,"title":"순위와 누계","blocks":[{"type":"paragraph","text":"ROW_NUMBER는 각 행에 순번, RANK는 동점 뒤 순위를 건너뛰는 순위, DENSE_RANK는 건너뛰지 않는 순위다. 순번을 재현하려면 동점 해소 정렬을 주어야 한다. SUM의 누계는 `ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`처럼 프레임을 명확히 적으면 동점값 처리의 혼동을 줄인다."}]},{"id":"IPE-2027-L028-S03","order":3,"title":"순위 표","blocks":[{"type":"paragraph","text":"점수가90,90,70인 세 행을 점수 내림차순으로 계산하면 RANK는1,1,3이고 DENSE_RANK는1,1,2다. `ROW_NUMBER() OVER(ORDER BY score DESC,id ASC)`는id가 작은 동점 행부터1,2,3을 준다. `SUM(score) OVER(...)`를 같은 행 프레임으로 계산하면90,180,250이다."}]}]},{"id":"IPE-2027-L029","order":29,"title":"절차형 SQL·트리거·이벤트·오류","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L028"],"goals":["질의에 실행 흐름을 더하기의 뜻과 조건을 설명한다.","실행횟수 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["트리거는 사건, 스케줄 이벤트는 시점이며 실행 단위를 확인한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q029"],"sections":[{"id":"IPE-2027-L029-S01","order":1,"title":"질의에 실행 흐름을 더하기","blocks":[{"type":"paragraph","text":"절차형 SQL은 변수·조건·반복·예외 처리를 사용해 DB안의 작업 흐름을 표현한다. 저장 프로시저는 호출해 일련의 작업을 수행하고 사용자 정의 함수는 값을 반환하는 계산 등에 사용한다. 허용되는 부수효과·호출 방식은 DBMS별 문법과 규칙을 따른다. 함수 이름만 보고 모든 DBMS에서 같은 실행 의미라고 생각하지 않는다."}]},{"id":"IPE-2027-L029-S02","order":2,"title":"자동 실행의 조건","blocks":[{"type":"paragraph","text":"트리거는 테이블의 INSERT·UPDATE·DELETE 같은 지정 사건에 반응한다. BEFORE/AFTER와 행 단위/문장 단위에 따라 시점·횟수가 다르다. 일정 이벤트는 정한 시각이나 주기에 작업을 실행하는 기능이며 지원 문법은 DBMS마다 다르다. 오류 처리는 실패의 영향과 거래 경계를 정해야 하며 오류를 숨기고 성공처럼 계속하면 데이터가 어긋날 수 있다."}]},{"id":"IPE-2027-L029-S03","order":3,"title":"실행횟수 예제","blocks":[{"type":"paragraph","text":"한 UPDATE문이3개 행을 수정할 때 '행마다1회'인 AFTER UPDATE 트리거는3회 실행된다. '문장마다1회' 트리거는 해당 문장에 대해1회다. 감사 기록을 남기는 목적이라면 변경 전후 값·실행자·거래 식별 등을 설계하되 민감한 값을 무조건 복사하지 않는다. 반복 호출과 재시도도 고려한다."}]}]},{"id":"IPE-2027-L030","order":30,"title":"저장장치·분산DB·이중화·접근제어","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L029"],"goals":["저장과 서비스 배치를 나누어 보기의 뜻과 조건을 설명한다.","복제 지연 사례를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["복제·분할·백업은 목적이 다르며 이중화는 공통 장애점까지 확인한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q030"],"sections":[{"id":"IPE-2027-L030-S01","order":1,"title":"저장과 서비스 배치를 나누어 보기","blocks":[{"type":"paragraph","text":"스토리지는 데이터를 저장하는 자원이다. 분산DB는 여러 위치의 데이터를 논리적으로 다루며, 복제는 같은 데이터 사본을 여러 곳에 두고, 분할은 데이터 일부씩을 나눈다. 이중화는 장애 시 서비스를 이어가기 위한 구성이다. 복제가 있어도 잘못된 삭제가 함께 복제될 수 있어 백업을 대신하지 않는다."}]},{"id":"IPE-2027-L030-S02","order":2,"title":"권한과 암호화","blocks":[{"type":"paragraph","text":"최소권한은 역할에 필요한 작업만 허용하는 원칙이다. DB접속 계정·테이블 권한·행/열 접근을 실제 요구에 맞게 나눈다. 저장 데이터 암호화와 통신 암호화는 보호 구간이 다르며 키 관리도 필요하다. 분산 시스템의 복제 지연은 방금 쓴 값이 모든 읽기 지점에서 즉시 보이지 않을 가능성을 만든다."}]},{"id":"IPE-2027-L030-S03","order":3,"title":"복제 지연 사례","blocks":[{"type":"paragraph","text":"주DB에서 주소를 바꾼 직후1초 늦는 복제DB를 읽으면 이전 주소가 보일 수 있다. 즉시 확인이 필요한 흐름은 주DB읽기 등 적절한 일관성 정책을 사용한다. 서비스 두 대가 같은 하나의 저장장치만 사용하면 저장장치 장애가 공통 장애점이 될 수 있다."}]}]},{"id":"IPE-2027-L031","order":31,"title":"파티션·클러스터·저장 사이징·지역성","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L030"],"goals":["물리 배치의 목적의 뜻과 조건을 설명한다.","사이징 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["사이징은 단위·부가비용·성장 조건을, 파티션은 분할 기준과 조회 조건을 맞춘다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q031"],"sections":[{"id":"IPE-2027-L031-S01","order":1,"title":"물리 배치의 목적","blocks":[{"type":"paragraph","text":"파티셔닝은 큰 표를 범위·목록·해시 등 기준으로 나누어 관리한다. 조회 조건에 맞는 파티션만 읽는 가지치기가 가능할 수 있다. 클러스터링은 관련 데이터를 가깝게 배치해 접근 비용을 줄이는 개념이며 DBMS별 구현이 다르다. 지역성은 최근 접근한 데이터나 인접 데이터에 다시 접근하는 경향이다."}]},{"id":"IPE-2027-L031-S02","order":2,"title":"필요한 공간 계산","blocks":[{"type":"paragraph","text":"행 수×행당 크기는 기본 데이터량의 출발점이다. 실제 저장량에는 행·페이지 헤더, 빈 공간, 인덱스, 로그, 복제, 증가 여유 등이 더해진다. 문제에서 부가비용을 무시한다고 하면 그 조건으로 계산한다. 논리 타입 길이와 실제 저장 바이트를 무조건 같다고 보지 않는다."}]},{"id":"IPE-2027-L031-S03","order":3,"title":"사이징 예제","blocks":[{"type":"paragraph","text":"행당100B,10000행, 순수 데이터만 계산하면1000000B다. 페이지마다8000B를 모두 데이터에 쓸 수 있고 행 분할과 부가비용을 무시하면80행/페이지,125페이지다. 1KB=1024B인지1000B인지 단위를 먼저 확인한다. 월별 범위 파티션이면 한 달 조회가 해당 파티션을 읽도록 설계할 수 있다."}]}]},{"id":"IPE-2027-L032","order":32,"title":"반정규화·CRUD·튜닝·백업","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L031"],"goals":["성능을 위해 중복할 때의 대가의 뜻과 조건을 설명한다.","갱신 이상과 복구를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["반정규화는 조회 이득과 일치 비용, 백업은 복구 목표와 실제 복원 가능성을 함께 본다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q032"],"sections":[{"id":"IPE-2027-L032-S01","order":1,"title":"성능을 위해 중복할 때의 대가","blocks":[{"type":"paragraph","text":"반정규화는 읽기 성능이나 운영 목적을 위해 일부 중복·통합 등을 도입하는 설계다. 정규화가 잘못됐다는 뜻이 아니며 변경 때 여러 값의 일치와 갱신 비용을 관리해야 한다. CRUD 매트릭스는 프로세스별 생성·조회·수정·삭제 관계를 표시해 누락·집중·권한을 검토한다. 물리모델 품질은 제약·타입·저장·접근의 요구 충족으로 판단한다."}]},{"id":"IPE-2027-L032-S02","order":2,"title":"실행계획과 복구 목표","blocks":[{"type":"paragraph","text":"튜닝은 실행계획·실제 읽기량·시간을 측정해 병목을 줄이는 일이다. 적절한 인덱스·조회범위·조인·불필요한 반복을 검토한다. 전체 백업은 전체, 증분은 이전 백업 이후 변화, 차등은 최근 전체 백업 이후 변화를 대상으로 하는 일반적 구분이다. RPO는 허용 데이터 손실 시간, RTO는 복구 목표 시간이다. 복구 시험 없는 백업 파일 존재만으로 복구 성공을 보장하지 않는다."}]},{"id":"IPE-2027-L032-S03","order":3,"title":"갱신 이상과 복구","blocks":[{"type":"paragraph","text":"고객명 사본을 주문100곳에 저장하면 이름 변경 시100곳을 일치시켜야 한다. 조회가 빨라져도 동기화 방법이 없으면 불일치가 생긴다. 어제 자정 전체 백업만 있고 로그가 없다면 오늘 정오의 거래까지 복구할 수 있다고 약속할 수 없다. 요구되는 RPO에 맞춰 로그·증분과 보관 정책을 정한다."}]}]},{"id":"IPE-2027-L033","order":33,"title":"ETL·데이터 전환·정제·품질","groupId":"IPE-2027-S2","groupTitle":"데이터베이스 구축","examSubject":"데이터베이스 구축","prerequisites":["IPE-2027-L032"],"goals":["옮기기 전에 규칙을 합의하기의 뜻과 조건을 설명한다.","전환 검증표를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["전환은 추출·변환·적재 뒤 값과 관계까지 검증하고, 오류율은 분모를 명시한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q033"],"sections":[{"id":"IPE-2027-L033-S01","order":1,"title":"옮기기 전에 규칙을 합의하기","blocks":[{"type":"paragraph","text":"ETL은 추출·변환·적재다. 이전 시스템의 데이터를 꺼내 새 구조와 코드에 맞게 바꾸고 목표 저장소에 넣는다. 전환 계획에는 원본 범위·키 매핑·변환 규칙·일정·검증·실패 시 복구·중복 실행 대책이 필요하다. 파일 인코딩·구분자·날짜·소수점 형식이 다르면 값이 깨지거나 열이 밀릴 수 있다."}]},{"id":"IPE-2027-L033-S02","order":2,"title":"정제와 검증","blocks":[{"type":"paragraph","text":"정제는 잘못된 값·중복·형식 불일치 등을 정한 규칙으로 처리한다. 완전성은 필요한 값이 채워졌는지, 유일성은 불필요한 중복이 없는지, 유효성은 허용 형식·범위인지, 일관성은 관련 값이 맞는지와 관련된다. 오류율은 오류 건수/검사 대상 건수로 계산하되 행 기준인지 항목 기준인지 정한다. 원본 행 수와 목표 행 수가 같다는 사실만으로 값 일치를 증명하지 않는다."}]},{"id":"IPE-2027-L033-S03","order":3,"title":"전환 검증표","blocks":[{"type":"table","headers":["검사","대상","오류"],"rows":[["고객번호 중복","1000행","5행"],["필수 전화번호 누락","1000행","20행"]]},{"type":"paragraph","text":"중복 오류율은0.5%, 전화 누락률은2%다. 두 오류가 같은 행에 겹칠 수 있어 오류 행 합계를25라고 단정하지 않는다. 금액 합계·키 대응·표본 값·참조 무결성을 함께 확인하고 예외 목록을 남긴다."}]}]},{"id":"IPE-2027-L034","order":34,"title":"개발환경·서버·API·배치","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L009"],"goals":["요청을 처리하는 구성의 뜻과 조건을 설명한다.","일매출 집계 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["서버는 역할, API는 사용 계약, 배치는 묶음 처리이며 모두 입력·권한·재실행을 확인한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q034"],"sections":[{"id":"IPE-2027-L034-S01","order":1,"title":"요청을 처리하는 구성","blocks":[{"type":"paragraph","text":"웹서버는 HTTP 요청과 정적 파일 전달 등을 담당하고, 애플리케이션 서버는 업무 로직을 실행하며, DB서버는 데이터 저장과 질의를 처리한다. 작은 구성에서 여러 역할이 같은 컴퓨터에 있을 수 있어 역할과 장치 수를 구별한다. 프레임워크·실행환경·패키지의 버전과 의존성을 맞추어야 개발PC에서 된 코드가 다른 환경에서도 재현될 수 있다."}]},{"id":"IPE-2027-L034-S02","order":2,"title":"API와 배치의 계약","blocks":[{"type":"paragraph","text":"API는 프로그램 사이 기능을 사용하는 약속이다. URL·메서드·입력·반환값·오류·인증과 권한을 정한다. 서버는 클라이언트의 입력을 신뢰하지 않고 검증한다. 배치는 여러 자료를 묶어 정해진 시점이나 조건에 처리하는 프로그램이다. 다시 실행하면 자료가 중복 반영될 수 있어 체크포인트·작업 식별·트랜잭션 등을 설계한다."}]},{"id":"IPE-2027-L034-S03","order":3,"title":"일매출 집계 예제","blocks":[{"type":"paragraph","text":"실시간 주문API는 주문 한 건의 허용·재고·결제를 판단한다. 새벽 배치는 전날 확정 주문을 집계한다. 배치가 중간 실패해 재실행될 때 기존 집계에 무조건 더하면 이중 계산이 된다. 날짜별 집계를 교체하거나 처리한 주문의 식별자를 관리하는 등 재실행 계약을 정한다. API키를 코드에 적어 공개하는 것은 환경 구성의 올바른 방법이 아니다."}]}]},{"id":"IPE-2027-L035","order":35,"title":"자료형·변수·연산자","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L034"],"goals":["값의 종류와 이름의 뜻과 조건을 설명한다.","코드 따라가기를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["연산은 피연산자의 타입으로 결정되며 대입 대상 타입만 보고 계산을 바꾸지 않는다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q035"],"sections":[{"id":"IPE-2027-L035-S01","order":1,"title":"값의 종류와 이름","blocks":[{"type":"paragraph","text":"변수는 값을 저장하거나 참조하는 이름이고 자료형은 표현 가능한 값과 연산을 정한다. 정수·실수·문자·논리값은 표현 방식이 다르다. 정수의 범위와 부동소수점의 근사 때문에 수학의 무한 정밀도와 프로그램 결과가 다를 수 있다. 선언 위치와 블록에 따라 이름이 보이는 범위가 달라진다. 초기화하지 않은 값에 의존하는 문제는 피한다."}]},{"id":"IPE-2027-L035-S02","order":2,"title":"언어의 규칙을 적용하기","blocks":[{"type":"paragraph","text":"아래 예제는 C17의 양수 정수 연산이며 int 범위 안의 값만 쓴다. `/`의 양쪽이 정수이면 정수 나눗셈, `%`는 나머지다. `=`는 대입, `==`는 동등 비교다. `&&`와 `||`는 논리 연산이고 `&`와 `|`는 비트 연산이다. 한 식에서 같은 변수를 여러 번 부수효과로 수정하는 정의되지 않은 실행에 의존하지 않는다."}]},{"id":"IPE-2027-L035-S03","order":3,"title":"코드 따라가기","blocks":[{"type":"code","text":"int a = 7, b = 2;\nint q = a / b;\nint r = a % b;\nprintf(\"%d %d\", q, r);","language":"c"},{"type":"paragraph","text":"7=2×3+1이므로 출력은 `3 1`이다. 실수3.5가 필요하면 나누기 전에 적절한 실수형 변환을 한다. 정수 나눗셈을 끝낸 q를 실수 변수에 넣어도 사라진 소수 부분이 돌아오지 않는다."}]}]},{"id":"IPE-2027-L036","order":36,"title":"조건·반복·함수의 실행 순서","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L035"],"goals":["상태를 한 줄씩 갱신하기의 뜻과 조건을 설명한다.","누계 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["반복은 조건·건너뜀·누계를 표로 쓰고, 함수의 값 전달과 포인터를 구별한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q036"],"sections":[{"id":"IPE-2027-L036-S01","order":1,"title":"상태를 한 줄씩 갱신하기","blocks":[{"type":"paragraph","text":"조건문은 조건 결과에 따라 경로를 고르고 반복문은 조건이 유지되는 동안 실행한다. for의 초기화는 처음 한 번, 조건은 각 반복 전에, 증감은 본문 뒤에 수행된다. break는 가장 안쪽 반복 등을 벗어나고 continue는 현재 반복의 남은 부분을 건너뛴다. 반복 횟수와 마지막 변수값은 다를 수 있다."}]},{"id":"IPE-2027-L036-S02","order":2,"title":"함수와 전달 방식","blocks":[{"type":"paragraph","text":"함수는 입력을 받아 결과나 부수효과를 만든다. C의 인자는 값으로 전달된다. 포인터값을 전달해 가리키는 객체를 수정하는 것과 호출자의 일반 변수 복사본만 수정하는 것은 다르다. 재귀는 자신을 호출하므로 종료 조건과 문제 크기가 줄어드는 방향을 확인한다. 함수 호출마다 지역 변수와 복귀 정보가 필요하다."}]},{"id":"IPE-2027-L036-S03","order":3,"title":"누계 예제","blocks":[{"type":"code","text":"int s = 0;\nfor (int i = 1; i <= 4; i++) {\n  if (i == 3) continue;\n  s += i;\n}\nprintf(\"%d\", s);","language":"c"},{"type":"paragraph","text":"C17에서 i=1,2,3,4를 방문하지만3일 때 더하지 않는다. 누계는1→3→3→7, 출력7이다. 조건 `i<=4`를 `i<4`로 읽으면 마지막4를 놓친다."}]}]},{"id":"IPE-2027-L037","order":37,"title":"C 배열·포인터·문자열","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L036"],"goals":["위치와 값의 관계의 뜻과 조건을 설명한다.","포인터 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["포인터 이동은 원소 단위, 문자열 길이와 저장 공간은 널 문자 때문에 다르다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q037"],"sections":[{"id":"IPE-2027-L037-S01","order":1,"title":"위치와 값의 관계","blocks":[{"type":"paragraph","text":"배열은 같은 타입의 원소를 연속 배치하며 인덱스는0부터 시작한다. 포인터는 객체 등의 주소를 나타내는 값이고 `*p`는 가리키는 객체에 접근한다. p+1은 해당 타입 원소 하나 뒤를 가리킨다. 실제 바이트 이동량은 원소 타입 크기에 따른다. 배열 범위 밖을 읽거나 수명이 끝난 객체에 접근하는 실행은 올바른 결과 계산의 근거가 될 수 없다."}]},{"id":"IPE-2027-L037-S02","order":2,"title":"문자 배열의 끝","blocks":[{"type":"paragraph","text":"C 문자열은 널 문자 `'\\0'`으로 끝나는 문자 배열 표현이다. `strlen`은 끝의 널 문자를 제외한 길이를 계산한다. `sizeof`는 객체의 바이트 크기이며 배열이 포인터로 전달된 함수 안에서는 원래 배열 크기를 알려 주지 않는다. ASCII만 포함한 아래 예에서 문자 길이를 계산한다. 한글 UTF-8의 바이트 수와 글자 수는 다를 수 있다."}]},{"id":"IPE-2027-L037-S03","order":3,"title":"포인터 판독","blocks":[{"type":"code","text":"int a[] = {4, 7, 9};\nint *p = a;\nprintf(\"%d\", *(p + 1) + a[2]);","language":"c"},{"type":"paragraph","text":"C17에서 p는 첫 원소를 가리킨다. *(p+1)=7, a[2]=9이므로 출력16이다. p+1을 주소 숫자에1바이트를 더한다고 해석하지 않는다. `char s[]=\"cat\";`의 sizeof(s)는 널 문자까지4이고 strlen(s)는3이다."}]}]},{"id":"IPE-2027-L038","order":38,"title":"Java 객체·오버라이딩·예외","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L037"],"goals":["참조형과 실제 객체의 뜻과 조건을 설명한다.","동적 호출 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["선언 타입과 실제 객체 타입을 적고, 인스턴스 메서드의 오버라이딩인지 확인한다."],"sourceIds":["qnet-2027-1453","java17-jls15"],"questionIds":["IPE-2027-R-Q038"],"sections":[{"id":"IPE-2027-L038-S01","order":1,"title":"참조형과 실제 객체","blocks":[{"type":"paragraph","text":"Java에서 기본형 변수는 값을 담고 참조형 변수는 객체를 참조하는 값을 담는다. `==`는 참조형에서 같은 객체를 참조하는지를 비교하며 내용 비교는 적절한 equals 구현을 사용한다. 상위 타입 참조가 하위 타입 객체를 가리킬 수 있다. 오버라이딩된 인스턴스 메서드는 실제 객체 타입에 따라 선택된다. 필드·static 메서드의 선택은 같은 규칙으로 일반화하지 않는다."},{"type":"paragraph","text":"숨겨진 필드 접근은 참조변수의 선언타입을 기준으로 결정되며, 오버라이딩 인스턴스 메서드의 실행 시 선택과 다르다."}]},{"id":"IPE-2027-L038-S02","order":2,"title":"생성과 예외 처리","blocks":[{"type":"paragraph","text":"생성자는 객체 초기화에 사용한다. 예외는 정상 흐름을 벗어난 상황을 전달하며 try·catch·finally로 처리한다. catch의 타입과 순서를 맞추고 자원을 사용한 뒤 닫아야 한다. finally를 '어떤 상황에서도 반드시 실행'이라고 일반화하면 프로세스 강제 종료 같은 경우를 놓친다. 아래 예제는 Java17의 정상 실행 조건이다."}]},{"id":"IPE-2027-L038-S03","order":3,"title":"동적 호출 예제","blocks":[{"type":"code","text":"class A { int f() { return 2; } }\nclass B extends A { @Override int f() { return 5; } }\n// main 메서드 안\nA x = new B();\nSystem.out.print(x.f());","language":"java"},{"type":"paragraph","text":"x의 선언 타입은 A이고 실제 객체는 B다. f는 오버라이딩된 인스턴스 메서드라 B의 구현을 호출해5를 출력한다. 생성된 객체가 A로 바뀐 것은 아니다. 같은 이름의 필드를 읽는 문제라면 별도의 필드 선택 규칙을 적용해야 한다."}]}]},{"id":"IPE-2027-L039","order":39,"title":"Python 순서열·슬라이스·참조","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L038"],"goals":["이름과 객체를 연결하기의 뜻과 조건을 설명한다.","참조와 슬라이스 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["대입은 이름 연결, 슬라이스의 끝은 제외이며 수정 가능 객체의 공유를 확인한다."],"sourceIds":["qnet-2027-1453","python-3.11-tutorial"],"questionIds":["IPE-2027-R-Q039"],"sections":[{"id":"IPE-2027-L039-S01","order":1,"title":"이름과 객체를 연결하기","blocks":[{"type":"paragraph","text":"Python의 이름은 객체에 결속된다. 리스트는 수정 가능하고 튜플·문자열은 수정할 수 없다. `b=a`는 리스트 복사본을 만드는 명령이 아니라 같은 객체에 다른 이름을 연결한다. 얕은 복사는 바깥 컨테이너를 새로 만들어도 내부의 중첩 객체를 공유할 수 있다. 값의 변경과 이름의 재대입을 구별한다."},{"type":"paragraph","text":"return 식은 그 식의 값을 호출한 곳으로 돌려준다. return 값이 없거나 return 없이 끝나면 None이며, 리스트를 바꾸는 동작과 함수 반환값은 별개다."}]},{"id":"IPE-2027-L039-S02","order":2,"title":"슬라이스와 반복","blocks":[{"type":"paragraph","text":"슬라이스 `[start:stop:step]`은 stop을 포함하지 않는다. 음수 인덱스는 끝에서 센다. range의 끝값도 포함하지 않는다. `//`는 바닥 나눗셈이며 음수에서는0방향 절단과 다르다. 아래 예제는 Python3.11 규칙과 정수·리스트만 사용한다. 집합의 출력 순서를 정답으로 묻지 않는다."}]},{"id":"IPE-2027-L039-S03","order":3,"title":"참조와 슬라이스 예제","blocks":[{"type":"code","text":"a = [2, 4, 6, 8]\nb = a\nc = a[1:3]\nb[0] = 9\nprint(a, c)","language":"python"},{"type":"paragraph","text":"b와 a가 같은 리스트를 가리켜 a는[9,4,6,8]이 된다. c는1,2번 원소를 담은 새 리스트[4,6]이다. 출력은 `[9, 4, 6, 8] [4, 6]`이다. 슬라이스의3은 포함되지 않는다."}]}]},{"id":"IPE-2027-L040","order":40,"title":"언어특성·라이브러리·프로토타입·입출력","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L039"],"goals":["문제를 표현하는 방식의 뜻과 조건을 설명한다.","반환값과 출력를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["라이브러리 사용은 이름 암기보다 입력·출력·오류 계약을 읽는 일이다."],"sourceIds":["qnet-2027-1453","python-3.11-tutorial"],"questionIds":["IPE-2027-R-Q040"],"sections":[{"id":"IPE-2027-L040-S01","order":1,"title":"문제를 표현하는 방식","blocks":[{"type":"paragraph","text":"절차적 언어는 수행 절차를, 객체지향 언어는 객체의 책임과 협력을, 선언형 언어는 원하는 결과나 관계를 중심으로 표현한다. SQL은 선언형 질의의 예다. 스크립트 언어는 실행환경에서 자동화·연결 등에 자주 쓰이지만 한 언어를 무조건 하나의 분류에만 가두지 않는다. 컴파일·인터프리트 방식도 실제 구현에 따라 결합될 수 있다."}]},{"id":"IPE-2027-L040-S02","order":2,"title":"계약을 알고 호출하기","blocks":[{"type":"paragraph","text":"라이브러리는 이미 구현된 기능을 제공한다. 함수의 인자·반환 타입·오류·부수효과를 알아야 정확하게 쓴다. C의 함수 프로토타입 `int add(int,int);`는 호출 전에 타입을 알리는 선언이다. 사용자 화면의 프로토타입과 같은 말이지만 문맥이 다르다. 입출력은 형식·버퍼·인코딩·실패를 고려하고 예외를 처리한 뒤에도 자원 정리가 필요하다."}]},{"id":"IPE-2027-L040-S03","order":3,"title":"반환값과 출력","blocks":[{"type":"paragraph","text":"`print(sum([2,3]))`에서 sum은 합5를 반환하고 print는 그것을 표시한다. '화면에 보인 값'과 '함수가 돌려준 값'은 같은 개념이 아니다. 파일에서 정수를 읽는 경우 빈 파일·형식 오류·파일 없음은 서로 다른 실패다. 모든 예외를0으로 바꾸면 실제0과 실패를 구별할 수 없으므로 계약에 맞는 오류를 전달한다."}]}]},{"id":"IPE-2027-L041","order":41,"title":"배열·연결리스트·스택·큐","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L040"],"goals":["저장 구조와 접근 비용의 뜻과 조건을 설명한다.","연산열 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["스택은 마지막 먼저, 큐는 처음 먼저이며 자료가 아니라 연산 규칙을 추적한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q041"],"sections":[{"id":"IPE-2027-L041-S01","order":1,"title":"저장 구조와 접근 비용","blocks":[{"type":"paragraph","text":"배열은 인덱스로 원소에 접근하기 쉽지만 중간 삽입·삭제에는 이동이 필요할 수 있다. 연결리스트는 링크로 노드를 잇고, 이미 위치를 알고 연결을 바꾸는 삽입·삭제는 유리하지만 특정 순번을 찾으려면 따라가야 한다. 자료구조의 연산 비용은 위치를 찾는 단계까지 포함하는지 확인한다."}]},{"id":"IPE-2027-L041-S02","order":2,"title":"꺼내는 규칙","blocks":[{"type":"paragraph","text":"스택은 나중에 넣은 것을 먼저 꺼내는 LIFO, 큐는 먼저 넣은 것을 먼저 꺼내는 FIFO다. 스택은 함수 호출·괄호 검사·DFS 등에, 큐는 대기열·BFS 등에 쓴다. 원형 큐는 끝 다음을 처음으로 연결해 공간을 재사용하며 빈 상태와 가득 찬 상태의 판정 규칙을 정한다. 우선순위 큐는 도착 순서 대신 우선순위로 꺼낸다."}]},{"id":"IPE-2027-L041-S03","order":3,"title":"연산열 판독","blocks":[{"type":"paragraph","text":"빈 스택에 push(A), push(B), pop, push(C), pop을 하면 꺼낸 값은 B,C이고 A가 남는다. 같은 순서의 enqueue(A),enqueue(B),dequeue,enqueue(C),dequeue를 큐에 적용하면 A,B가 꺼내지고 C가 남는다. 그림의 좌우 배치보다 넣고 빼는 끝과 규칙을 먼저 정한다."}]}]},{"id":"IPE-2027-L042","order":42,"title":"트리·그래프·순회","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L041"],"goals":["계층과 연결의 뜻과 조건을 설명한다.","순회 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["순회 이름에서 루트 방문 위치를 기억하고 그래프 동순위 순서는 문제 조건을 따른다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q042"],"sections":[{"id":"IPE-2027-L042-S01","order":1,"title":"계층과 연결","blocks":[{"type":"paragraph","text":"트리는 계층 구조이며 루트·부모·자식·리프를 구별한다. 이진트리는 각 노드가 최대 두 자식을 가진다. 이진탐색트리는 왼쪽·오른쪽 값의 순서 규칙을 이용하지만 삽입 순서에 따라 치우칠 수 있다. 힙은 부모와 자식 사이 우선순위 조건을 만족하는 구조로 전체가 정렬된 배열이라는 뜻은 아니다."}]},{"id":"IPE-2027-L042-S02","order":2,"title":"방문 규칙","blocks":[{"type":"paragraph","text":"전위는 루트-왼쪽-오른쪽, 중위는 왼쪽-루트-오른쪽, 후위는 왼쪽-오른쪽-루트 순서다. 그래프는 정점과 간선으로 연결을 표현한다. DFS는 깊이 우선으로, BFS는 가까운 층부터 탐색한다. 순환이 있는 그래프는 방문 표시를 해야 무한 반복을 피할 수 있다. 같은 깊이의 방문 순서는 인접 정점 처리 순서에 따라 달라져 조건을 명시한다."}]},{"id":"IPE-2027-L042-S03","order":3,"title":"순회 예제","blocks":[{"type":"paragraph","text":"루트A의 왼쪽B·오른쪽C, B의 왼쪽D·오른쪽E인 트리를 생각한다. 전위는 A B D E C, 중위는 D B E A C, 후위는 D E B C A다. 왼쪽부터 처리하는 BFS는 A B C D E다. 후위는 하위 결과를 먼저 만든 뒤 부모를 처리할 때 유용하다."}]},{"id":"IPE-2027-L042-S04","order":4,"title":"순회할 실제 이진트리","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-TREE-ABCDE","alt":"루트A의 왼쪽B, 오른쪽C. B의 왼쪽D, 오른쪽E. 나머지는 자식이 없다.","caption":"A부터 E까지 이진트리"},{"type":"paragraph","text":"A가 루트이고 B는 왼쪽, C는 오른쪽 자식이다. B의 왼쪽D와 오른쪽E를 끝까지 확인한다. 전위A B D E C, 중위D B E A C, 후위D E B C A, 왼쪽우선BFS A B C D E다. 그림을 보면서 루트의 방문 위치를 옮겨 직접 써 본다."}]}]},{"id":"IPE-2027-L043","order":43,"title":"탐색·정렬·시간복잡도","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L042"],"goals":["입력 증가에 따른 작업량의 뜻과 조건을 설명한다.","한 단계 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["정렬의 한 단계는 알고리즘 규칙을, 복잡도는 전체 입력 성장의 최악·평균 조건을 본다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q043"],"sections":[{"id":"IPE-2027-L043-S01","order":1,"title":"입력 증가에 따른 작업량","blocks":[{"type":"paragraph","text":"선형 탐색은 차례로 확인하며 최악 O(n), 이진 탐색은 정렬된 탐색 범위를 절반씩 줄여 O(log n)이다. 이진 탐색에 정렬 선행조건이 없으면 올바른 결과를 기대할 수 없다. 점근 표기의 상수·낮은 차수는 큰 입력의 성장률에서 생략하지만 실제 수행시간은 자료 크기·상수·환경의 영향도 받는다."}]},{"id":"IPE-2027-L043-S02","order":2,"title":"정렬 방법 비교","blocks":[{"type":"paragraph","text":"선택 정렬은 남은 구간의 최솟값을 골라 앞에 놓고, 삽입 정렬은 정렬된 구간에 새 값을 끼워 넣는다. 버블 정렬은 인접 비교·교환을 반복한다. 병합 정렬은 나누고 합치며 일반적으로 O(n log n), 퀵 정렬은 피벗으로 분할하며 평균 O(n log n)이나 최악 O(n²)이 가능하다. 안정성은 같은 키의 원래 상대 순서 보존 여부다."}]},{"id":"IPE-2027-L043-S03","order":3,"title":"한 단계 판독","blocks":[{"type":"paragraph","text":"[5,2,4,1]에서 선택 정렬의 첫 단계는 전체 최솟값1을 첫5와 교환해[1,2,4,5]다. 삽입 정렬의 첫 단계는 두 번째2를 앞의5와 비교해[2,5,4,1]이다. 우연히 첫 교환으로 정렬이 끝난 선택 예제를 일반 수행시간이 O(n)이라는 근거로 삼으면 안 된다."}]}]},{"id":"IPE-2027-L044","order":44,"title":"운영체제·메모리·페이지 교체","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L043"],"goals":["운영체제의 자원 관리의 뜻과 조건을 설명한다.","FIFO 직접 추적를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["페이지 부재 수는 초기 상태·프레임 수·교체 규칙·참조열을 모두 알아야 계산한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q044"],"sections":[{"id":"IPE-2027-L044-S01","order":1,"title":"운영체제의 자원 관리","blocks":[{"type":"paragraph","text":"운영체제는 CPU·메모리·파일·입출력을 관리하고 프로그램에 서비스를 제공한다. 프로세스는 실행 중 프로그램의 자원 단위이고 스레드는 그 안의 실행 흐름이다. 가상메모리는 주소 공간을 관리하며 필요한 부분을 주기억장치에 적재한다. 가상메모리가 디스크를 물리 RAM처럼 같은 속도로 바꾸는 기술은 아니다."}]},{"id":"IPE-2027-L044-S02","order":2,"title":"페이지와 교체","blocks":[{"type":"paragraph","text":"페이징은 고정 크기 페이지와 프레임을 대응시키며 페이지가 메모리에 없으면 페이지 부재가 발생한다. FIFO는 먼저 들어온 페이지, LRU는 가장 오래 사용되지 않은 페이지를 교체한다. 최적 교체는 미래에 가장 늦게 쓸 페이지를 대상으로 하는 비교 기준이다. 페이지 부재가 지나치게 많아 실작업보다 교체에 시간을 쓰는 현상을 스래싱이라 한다."}]},{"id":"IPE-2027-L044-S03","order":3,"title":"FIFO 직접 추적","blocks":[{"type":"paragraph","text":"빈 프레임3개에 참조열1,2,3,1,4를 FIFO로 처리한다. 처음1,2,3은 부재3회, 다시1은 적중,4는 가장 먼저 들어온1을 교체해 부재1회가 추가된다. 총4회다. FIFO에서는 중간의1적중이 입장 순서를 갱신하지 않는다. LRU라면 최근 사용 이력을 기준으로 다른 대상을 고를 수 있다."}]},{"id":"IPE-2027-L044-S04","order":4,"title":"FIFO 프레임 표","blocks":[{"type":"paragraph","text":"프레임3개, 초기빈상태, 참조열1·2·3·1·4이며 교체는FIFO다. 프레임칸의 위치는 저장 슬롯이고, 교체순서는 먼저 적재된 순서로 관리한다."},{"type":"table","headers":["참조","프레임1","프레임2","프레임3","결과"],"rows":[["1","1","-","-","부재"],["2","1","2","-","부재"],["3","1","2","3","부재"],["1","1","2","3","적중"],["4","4","2","3","부재·1교체"]]},{"type":"paragraph","text":"총부재4회다.1이 적중해도FIFO입장순서는바뀌지않는다. 같은참조열의LRU는마지막4에서2를교체하므로최종프레임구성이달라진다."}]}]},{"id":"IPE-2027-L045","order":45,"title":"스케줄링·동기화·교착상태","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L044"],"goals":["CPU를 누구에게 줄 것인가의 뜻과 조건을 설명한다.","FCFS 계산를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["대기와 반환의 출발점은 도착이며 교착 네 조건과 대응 방법을 나눠 본다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q045"],"sections":[{"id":"IPE-2027-L045-S01","order":1,"title":"CPU를 누구에게 줄 것인가","blocks":[{"type":"paragraph","text":"FCFS는 도착 순서, SJF는 예상 실행시간이 짧은 작업, 라운드로빈은 시간 할당량을 돌아가며 준다. 선점형은 실행 중인 작업을 중단해 다른 작업에 CPU를 줄 수 있다. 반환시간은 완료-도착, 대기시간은 준비 큐에서 기다린 시간이며 단순 CPU작업에서는 반환-실행시간으로 계산한다. 문맥교환 비용을 포함하는지 조건을 확인한다."}]},{"id":"IPE-2027-L045-S02","order":2,"title":"함께 쓰는 자원","blocks":[{"type":"paragraph","text":"경쟁상태는 동시 실행의 순서에 따라 결과가 달라지는 상황이다. 임계구역은 공유자원에 접근하는 부분이며 상호배제로 동시에 들어가는 일을 제한한다. 교착상태의 필요조건은 상호배제·점유대기·비선점·환형대기다. 한 조건을 깨는 예방, 안전한 상태를 유지하는 회피, 발생 뒤 탐지·회복을 구별한다."}]},{"id":"IPE-2027-L045-S03","order":3,"title":"FCFS 계산","blocks":[{"type":"paragraph","text":"동시에 도착한 A실행3, B실행2, C실행1을 A→B→C순으로 처리하고 교환 비용을 무시한다. 완료시간은3,5,6이고 대기시간은0,3,5다. 평균 대기는8/3이다. 실행시간 평균2와 대기시간 평균을 혼동하지 않는다. 각 작업이 자원을 하나씩 잡고 상대 자원을 기다리면 환형대기가 생길 수 있다."}]},{"id":"IPE-2027-L045-S04","order":4,"title":"FCFS 간트차트","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-FCFS-GANTT","alt":"FCFS 간트차트: A는0부터3, B는3부터5, C는5부터6까지 실행. 모든 작업은0에 도착했고 교환 비용은0이다.","caption":"FCFS 실행 구간"},{"type":"table","headers":["작업","도착","실행","시작","완료","대기=시작-도착"],"rows":[["A","0","3","0","3","0"],["B","0","2","3","5","3"],["C","0","1","5","6","5"]]},{"type":"paragraph","text":"CPU가 비는 시간과 교환비용이 없다는 조건이다. 평균대기=(0+3+5)/3=8/3, 평균반환=(3+5+6)/3=14/3이다."}]}]},{"id":"IPE-2027-L046","order":46,"title":"환경변수·쉘 스크립트·권한","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L045"],"goals":["실행환경을 전달하기의 뜻과 조건을 설명한다.","쉘과 권한 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["PATH는 찾을 위치, 쉘은 해석기, 권한 숫자는4·2·1의 합이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q046"],"sections":[{"id":"IPE-2027-L046-S01","order":1,"title":"실행환경을 전달하기","blocks":[{"type":"paragraph","text":"환경변수는 프로그램에 실행 설정을 전달하는 이름-값이다. PATH는 실행파일을 찾는 경로 목록에 사용되며 파일 내용이나 네트워크 경로 자체와 다르다. 부모 프로세스의 환경을 자식에게 전달하는 방식과 현재 쉘만의 변수를 구별한다. 비밀값은 코드나 로그에 출력하지 않으며 환경변수 사용만으로 모든 유출이 방지되지는 않는다."}]},{"id":"IPE-2027-L046-S02","order":2,"title":"명령을 순서대로 실행하기","blocks":[{"type":"paragraph","text":"쉘은 명령을 해석하는 인터페이스이고 스크립트는 그 명령을 묶은 파일이다. 아래는 POSIX sh를 가정한다. 공백·와일드카드 확장을 막아야 하는 변수는 큰따옴표로 감싼다. 종료상태0은 일반적으로 성공이고0이 아니면 실패를 나타낸다. 권한은 소유자·그룹·기타의 읽기4/쓰기2/실행1 합으로 나타내는 예가 있다."}]},{"id":"IPE-2027-L046-S03","order":3,"title":"쉘과 권한 예제","blocks":[{"type":"code","text":"count=3\nif [ \"$count\" -gt 2 ]; then\n  printf '%s\\n' \"many\"\nfi","language":"text"},{"type":"paragraph","text":"3>2이므로 many와 줄바꿈을 출력한다. 파일 권한640은 소유자 읽기·쓰기(6), 그룹 읽기(4), 기타 없음(0)이다. 디렉터리 실행권한은 탐색과 관계되어 일반파일 실행과 의미를 똑같이 해석하지 않는다."}]}]},{"id":"IPE-2027-L047","order":47,"title":"인터넷 구성과 OSI 계층","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L046"],"goals":["나눈 책임을 따라 데이터 보내기의 뜻과 조건을 설명한다.","전달 흐름 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["계층은 기능의 구분이며 스위치의 MAC과 라우터의 IP를 구별한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q047"],"sections":[{"id":"IPE-2027-L047-S01","order":1,"title":"나눈 책임을 따라 데이터 보내기","blocks":[{"type":"paragraph","text":"OSI는 물리·데이터링크·네트워크·전송·세션·표현·응용의 계층형 참조 모델이다. 물리는 신호, 링크는 같은 링크의 프레임 전달, 네트워크는 논리주소와 경로, 전송은 종단 사이 전달 기능을 담당한다. 표현은 데이터 표현·변환, 세션은 대화 관리, 응용은 응용 서비스와 관련된다. 실제 인터넷 프로토콜을7계층에 언제나 완벽히 나누는 것은 아니다."}]},{"id":"IPE-2027-L047-S02","order":2,"title":"캡슐화와 장비","blocks":[{"type":"paragraph","text":"보낼 때 상위 데이터에 각 계층의 제어정보가 붙고 받을 때 역으로 해석한다. 스위치는 주로 링크 계층의 MAC주소, 라우터는 네트워크 계층의 IP주소와 경로표를 이용한다. 장비 제품 하나가 여러 계층 기능을 수행할 수 있으므로 이름만으로 모든 기능을 제한하지 않는다. TCP/IP는 인터넷 프로토콜의 실제 묶음이다."}]},{"id":"IPE-2027-L047-S03","order":3,"title":"전달 흐름 예제","blocks":[{"type":"paragraph","text":"브라우저가 웹 요청을 만들고 TCP가 전송 흐름을, IP가 네트워크 간 전달을 담당한다. 같은 LAN에서 다음 홉의 MAC주소가 필요한 경우 ARP가 IPv4주소와 MAC주소의 대응을 알아낸다. IP주소와 MAC주소는 서로 다른 범위의 식별자이며 라우터를 지날 때 링크 프레임은 바뀔 수 있다."}]}]},{"id":"IPE-2027-L048","order":48,"title":"IP·서브넷·라우팅","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L047"],"goals":["주소를 네트워크와 호스트로 나누기의 뜻과 조건을 설명한다.","/26 계산를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["프리픽스는 앞의 네트워크 비트 수이며 블록의 시작·끝·호스트 범위를 나누어 계산한다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q048"],"sections":[{"id":"IPE-2027-L048-S01","order":1,"title":"주소를 네트워크와 호스트로 나누기","blocks":[{"type":"paragraph","text":"IPv4는32비트, IPv6는128비트 주소를 사용한다. 프리픽스 /n은 앞의 n비트가 네트워크 부분임을 뜻한다. 일반적인 IPv4서브넷에서는 네트워크주소와 브로드캐스트주소를 호스트에 배정하지 않아 사용 가능 수를2^(32-n)-2로 계산한다. /31·/32같은 특수 용도는 이 공식을 일률 적용하지 않는다."}]},{"id":"IPE-2027-L048-S02","order":2,"title":"목적지에 맞는 경로","blocks":[{"type":"paragraph","text":"라우터는 경로표에서 목적지와 맞는 경로를 찾고 보통 가장 긴 프리픽스가 일치하는 경로를 선택한다. 기본 경로는 더 구체적인 경로가 없을 때 사용한다. NAT는 주소 변환이며 암호화와 다르다. 사설주소와 공인주소의 사용 범위를 구별한다. 네트워크 경계를 구할 때는 주소와 마스크를 비트 AND한다."}]},{"id":"IPE-2027-L048-S03","order":3,"title":"/26 계산","blocks":[{"type":"paragraph","text":"192.168.1.130/26의 마스크는255.255.255.192이고 마지막 옥텟 블록 크기는64다.130은128~191구간이므로 네트워크128, 브로드캐스트191, 일반 호스트129~190이며62개다. 같은 목적지가/24와/26경로에 모두 맞으면 더 구체적인/26을 고른다."}]},{"id":"IPE-2027-L048-S04","order":4,"title":"비트 마스크로 네트워크 구하기","blocks":[{"type":"paragraph","text":"주소192.168.1.130/26에서 앞의세옥텟은모두네트워크비트다. 마지막옥텟만계산한다."},{"type":"table","headers":["대상","이진수","십진수"],"rows":[["주소의마지막옥텟","10000010","130"],["/26마스크의마지막옥텟","11000000","192"],["비트AND결과","10000000","128"],["호스트비트모두1","10111111","191"]]},{"type":"paragraph","text":"네트워크주소는192.168.1.128,브로드캐스트는192.168.1.191이다. 호스트비트6개이므로전체64주소중일반호스트62개다."}]}]},{"id":"IPE-2027-L049","order":49,"title":"TCP·UDP·DNS·HTTP","groupId":"IPE-2027-S3","groupTitle":"프로그래밍 언어 활용","examSubject":"프로그래밍 언어 활용","prerequisites":["IPE-2027-L048"],"goals":["전송 방식의 차이의 뜻과 조건을 설명한다.","장애 위치 찾기를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["DNS는 이름 조회, TCP/UDP는 전송, HTTP는 응용 계약, TLS는 통신 보호다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q049"],"sections":[{"id":"IPE-2027-L049-S01","order":1,"title":"전송 방식의 차이","blocks":[{"type":"paragraph","text":"TCP는 연결을 설정하고 순서·재전송·흐름제어 등을 제공한다. UDP는 데이터그램 단위로 보내며 TCP와 같은 연결·재전송 기능을 기본 제공하지 않는다. UDP를 쓰는 응용이 별도의 신뢰성 기능을 만들 수 있으므로 '항상 신뢰성 없음'으로 응용 전체를 단정하지 않는다. 포트번호는 종단에서 응용을 구별하는 데 사용된다."}]},{"id":"IPE-2027-L049-S02","order":2,"title":"이름과 웹 요청","blocks":[{"type":"paragraph","text":"DNS는 이름에 대한 주소 등 자원 레코드를 조회하는 분산 시스템이다. HTTP는 요청·응답의 의미와 형식을 정하고 HTTPS는 TLS를 통해 통신 구간을 보호한다. TLS사용이 입력 검증이나 서버 권한 검사를 대신하지 않는다. HTTP 상태2xx는 성공 계열,4xx는 요청 관련 오류,5xx는 서버 오류 계열이지만 실제 업무 성공은 응답 계약과 함께 확인한다."}]},{"id":"IPE-2027-L049-S03","order":3,"title":"장애 위치 찾기","blocks":[{"type":"paragraph","text":"도메인 이름을 못 찾으면 DNS설정을, 연결이 안 되면 경로·방화벽·리스너 등을,401이면 인증 정보를,403이면 허용 여부를 검토한다. 상태200인데 업무 결과가 실패라는 JSON이라면 HTTP전달 성공과 업무 성공을 나누어 읽는다. TCP연결 성공만으로 올바른 사용자 권한이 증명되지 않는다."}]}]},{"id":"IPE-2027-L050","order":50,"title":"네트워크 구축·장비·분리","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L047","IPE-2027-L048","IPE-2027-L049"],"goals":["요구에 맞는 연결 구조의 뜻과 조건을 설명한다.","경계 정책표를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["장비·VLAN·회선 수보다 데이터 경로·정책·공통 장애점을 함께 본다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q050"],"sections":[{"id":"IPE-2027-L050-S01","order":1,"title":"요구에 맞는 연결 구조","blocks":[{"type":"paragraph","text":"네트워크 구축은 사용자 수·대역폭·지연·장애 허용·보안·확장 요구를 먼저 정한다. 라우터는 네트워크 사이 경로를, 스위치는 링크 내부 연결을 담당하며 백본은 주요 구간을 연결하는 중심망이다. VLAN은 논리적으로 브로드캐스트 영역을 나누는 기술이다. VLAN을 나눴다는 사실만으로 모든 통신이 차단되는 것은 아니며 경계의 라우팅·정책을 확인한다."}]},{"id":"IPE-2027-L050-S02","order":2,"title":"신기술은 기능과 제약으로 이해하기","blocks":[{"type":"paragraph","text":"SDN은 제어 기능과 전달 기능을 분리해 제어의 프로그래밍 가능성을 높이는 접근이고 NFV는 네트워크 기능을 소프트웨어로 가상화하는 접근이다. 무선망은 전파 간섭·보안·로밍·채널 계획을 고려한다. 제품 이름이나 유행만 외우지 말고 기존 요구를 어떻게 해결하는지 비교한다. 이중 회선도 같은 통신관로나 전원에 의존하면 공통 장애가 남을 수 있다."}]},{"id":"IPE-2027-L050-S03","order":3,"title":"경계 정책표","blocks":[{"type":"table","headers":["출발","목적","허용"],"rows":[["인터넷","웹서버443","예"],["인터넷","DB서버5432","아니오"],["업무서버","DB서버5432","필요 계정·경로만"]]},{"type":"paragraph","text":"외부 사용자는 웹서버를 통해 서비스를 이용하고 DB에 직접 접속하지 않는다. 실제 정책과 서버 리스너·계정 권한이 함께 맞아야 한다. 표의 기본 거절과 필요한 예외를 실제 구성에 연결한다."}]}]},{"id":"IPE-2027-L051","order":51,"title":"클라우드·가상화·컨테이너·SW정책","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L050"],"goals":["제공받는 관리 범위의 뜻과 조건을 설명한다.","도입 판단를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["클라우드 유형은 제공 범위, 가상화·컨테이너는 격리 방식이며 도입에는 운영 대가가 따른다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q051"],"sections":[{"id":"IPE-2027-L051-S01","order":1,"title":"제공받는 관리 범위","blocks":[{"type":"paragraph","text":"IaaS는 서버·저장·네트워크 같은 기반 자원을, PaaS는 응용 실행·개발 플랫폼을, SaaS는 완성된 응용 서비스를 제공하는 일반적 구분이다. 실제 운영 책임은 서비스 계약에 따라 나뉘며 클라우드 사용이 사용자의 데이터·계정 관리 책임을 없애지 않는다. 공개·사설·하이브리드 배치는 자원 제공과 운영 경계의 방식이다."}]},{"id":"IPE-2027-L051-S02","order":2,"title":"실행 환경과 개발 구조","blocks":[{"type":"paragraph","text":"가상머신은 가상 하드웨어 위에 운영체제를 실행하며 컨테이너는 호스트 커널을 공유하는 격리 방식을 사용한다. 컨테이너 이미지는 실행환경을 포장하는 데 유용하지만 비밀값·취약한 패키지·권한 설정을 검사해야 한다. 마이크로서비스는 서비스를 작은 책임으로 나누어 독립 배포할 수 있지만 네트워크 실패·관측·데이터 일관성의 복잡성이 생긴다."}]},{"id":"IPE-2027-L051-S03","order":3,"title":"도입 판단","blocks":[{"type":"paragraph","text":"규모가 작은 내부 시스템을 무조건 여러 서비스로 쪼개면 운영비용과 장애지점이 늘 수 있다. 요구·팀 역량·관측·복구 능력을 기준으로 결정한다. 개발보안 정책에는 허용 패키지·업데이트·코드 검토·비밀값 처리·취약점 대응·릴리스 검증을 포함하고 빌드와 배포 단계에도 적용한다."}]}]},{"id":"IPE-2027-L052","order":52,"title":"DAS·NAS·SAN·가용성과 복구","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L051"],"goals":["저장 접근 방식의 뜻과 조건을 설명한다.","용량과 가용성 계산를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["RAID는 저장 중복, HA는 서비스 지속, 백업은 복구용 별도 사본의 목적이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q052"],"sections":[{"id":"IPE-2027-L052-S01","order":1,"title":"저장 접근 방식","blocks":[{"type":"paragraph","text":"DAS는 서버에 직접 연결하는 저장장치, NAS는 네트워크를 통한 파일 단위 공유, SAN은 저장 전용 네트워크를 통한 블록 단위 접근과 관련된다. RAID0은 스트라이핑으로 분산하지만 중복 보호가 없고, RAID1은 미러링, RAID5는 분산 패리티를 사용한다. RAID구성은 백업이나 삭제 복구와 같은 개념이 아니다."}]},{"id":"IPE-2027-L052-S02","order":2,"title":"멈추지 않기와 되살리기","blocks":[{"type":"paragraph","text":"고가용성은 장애에도 서비스를 이어가도록 구성하는 목표다. 장애감지·전환·중복 자원·상태 동기화와 분할 시 처리 규칙이 필요하다. 가용성은 정한 관측 기간의 정상 서비스 시간 비율로 볼 수 있다. RTO는 복구까지 허용한 목표 시간, RPO는 허용 데이터 손실 시점의 차이다. Secure-OS는 강화된 접근통제 등 보안 기능을 제공하는 운영체제와 관련된다."}]},{"id":"IPE-2027-L052-S03","order":3,"title":"용량과 가용성 계산","blocks":[{"type":"paragraph","text":"동일1TB디스크4개에서 RAID1을 두 개의 미러 쌍으로 구성해 각 쌍을 독립 사용하면 사용자 데이터 총용량은2TB다. 패리티 등 다른 구성을 섞어 계산하지 않는다. 관측1000분 중 장애10분이면 가용성은(1000-10)/1000=99%다. 정기점검 포함 여부와 서비스 정상 판정 기준을 먼저 정한다."}]}]},{"id":"IPE-2027-L053","order":53,"title":"DB구축 표준화와 데이터 관리","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L052"],"goals":["같은 말이 같은 뜻을 갖게 하기의 뜻과 조건을 설명한다.","표준 불일치 사례를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["표준화는 철자 통일을 넘어 의미·단위·허용값·책임을 맞추는 일이다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q053"],"sections":[{"id":"IPE-2027-L053-S01","order":1,"title":"같은 말이 같은 뜻을 갖게 하기","blocks":[{"type":"paragraph","text":"데이터 표준화는 용어·도메인·코드·명명·형식 등을 통일해 의미 혼동을 줄이는 일이다. 고객번호와 주문번호의 타입이 같아도 의미가 다르다. 표준사전에는 정의·소유·허용값·단위·변경 규칙을 남긴다. 메타데이터는 데이터의 구조와 의미를 설명하는 데이터이고 거버넌스는 책임·정책·의사결정 체계를 포함한다."}]},{"id":"IPE-2027-L053-S02","order":2,"title":"저장 모델의 선택","blocks":[{"type":"paragraph","text":"관계형DB는 관계·제약·트랜잭션을 중심으로, 키-값·문서·그래프 등 저장 방식은 필요한 접근 패턴에 맞춰 선택한다. NoSQL을 'SQL이 없고 일관성도 없는 모든DB'로 단정하지 않는다. 가용성·확장성·일관성의 선택은 실제 분산 조건과 제품 보장을 확인한다. 관리 기능에는 사용자·권한·성능·백업·장애·변경 이력이 포함된다."}]},{"id":"IPE-2027-L053-S03","order":3,"title":"표준 불일치 사례","blocks":[{"type":"paragraph","text":"한 시스템의 status=1은 정상, 다른 시스템의1은 탈퇴라면 숫자 타입을 맞춰 옮겨도 의미가 뒤집힌다. 공통 코드 매핑과 유효기간·예외를 정해야 한다. 전화번호의 하이픈 제거는 표시 변화일 수 있지만 앞자리0을 정수 변환으로 잃는 것은 값 훼손이다."}]}]},{"id":"IPE-2027-L054","order":54,"title":"Secure SDLC·위협 모델링·인증과 인가","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L053"],"goals":["개발 전 과정에 보안 넣기의 뜻과 조건을 설명한다.","소유권 검사 사례를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["인증은 신원, 인가는 행동 허용이며 신뢰 경계를 넘는 입력은 서버에서 다시 확인한다."],"sourceIds":["qnet-2027-1453","owasp-topten"],"questionIds":["IPE-2027-R-Q054"],"sections":[{"id":"IPE-2027-L054-S01","order":1,"title":"개발 전 과정에 보안 넣기","blocks":[{"type":"paragraph","text":"Secure SDLC는 요구·설계·구현·시험·배포·운영에 보안 활동을 포함한다. 요구 단계에서는 보호 자산과 보안 요구, 설계에서는 신뢰 경계와 위협, 구현에서는 안전한 코딩, 시험에서는 취약점과 악용 경로, 운영에서는 관측과 대응을 확인한다. 개발 마지막에 스캐너 한 번 돌리는 것만으로 전 과정을 대신하지 않는다."}]},{"id":"IPE-2027-L054-S02","order":2,"title":"신원과 허용은 다른 질문","blocks":[{"type":"paragraph","text":"인증은 누구인지 확인하는 것, 인가는 그 사람이 해당 자원에 무엇을 할 수 있는지 결정하는 것이다. 최소권한·기본 거절·매 요청 서버 검사 원칙을 적용한다. 클라이언트 화면에서 버튼을 숨겨도 공격자는 요청을 직접 만들 수 있다. 위협 모델링은 자산·진입점·신뢰경계·공격 경로·대응을 연결한다."}]},{"id":"IPE-2027-L054-S03","order":3,"title":"소유권 검사 사례","blocks":[{"type":"paragraph","text":"사용자A가 로그인한 뒤 주문번호를 B의 번호로 바꿔 조회한다. 로그인 성공은 인증 증거일 뿐 B주문 조회 허용 증거가 아니다. 서버는 현재 사용자와 주문 소유자·관리 권한·주문 상태를 실제로 비교해야 한다. URL이 복잡하거나 번호를 추측하기 어렵다는 점으로 권한 검사를 대체하지 않는다."}]}]},{"id":"IPE-2027-L055","order":55,"title":"입력검증·SQL삽입·XSS·안전한 API","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L054"],"goals":["입력을 데이터로 다루기의 뜻과 조건을 설명한다.","질의 구조 비교를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["검증은 허용값, 매개변수화는 SQL구조 분리, 출력 인코딩은 표시 맥락의 문제다."],"sourceIds":["qnet-2027-1453","owasp-topten"],"questionIds":["IPE-2027-R-Q055"],"sections":[{"id":"IPE-2027-L055-S01","order":1,"title":"입력을 데이터로 다루기","blocks":[{"type":"paragraph","text":"입력 검증은 타입·길이·범위·형식·업무 규칙을 확인한다. 허용목록은 필요한 값을 명확히 허용하는 방식이고 차단목록만으로 모든 우회 표현을 막기는 어렵다. 정규화된 표현으로 검증한 뒤 사용 단계에서도 맥락에 맞게 다룬다. 파일 경로·명령·URL·SQL에 문자열을 그대로 끼워 넣으면 데이터가 제어 명령으로 해석될 수 있다."}]},{"id":"IPE-2027-L055-S02","order":2,"title":"위험에 맞는 대책","blocks":[{"type":"paragraph","text":"SQL삽입은 입력을 SQL구문에 결합하면서 발생할 수 있으며 매개변수화 질의로 값과 명령 구조를 구분한다. XSS는 신뢰하지 않은 내용이 브라우저에서 스크립트 등으로 실행되는 문제이며 출력 위치에 맞는 인코딩·안전한 DOM API 등이 필요하다. 입력 문자 몇 개를 지우는 대책과 출력 맥락의 안전성은 같지 않다. 안전한 API도 권한·크기·오류·시간 제한 계약을 지켜 써야 한다."}]},{"id":"IPE-2027-L055-S03","order":3,"title":"질의 구조 비교","blocks":[{"type":"code","text":"위험한 구조: \"SELECT * FROM users WHERE name='\" + input + \"'\"\n안전한 구조: \"SELECT * FROM users WHERE name = ?\" + 별도 매개변수","language":"text"},{"type":"paragraph","text":"두 번째는 물음표에 대응하는 값을 DB드라이버로 전달한다. 물음표를 문자열 안에 따옴표로 감싸거나 직접 치환하면 목적이 달라진다. 출력할 사용자 이름은 HTML본문·속성·URL 등 위치에 맞게 안전하게 표시한다."}]}]},{"id":"IPE-2027-L056","order":56,"title":"세션·CSRF·오류·로그","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L055"],"goals":["로그인 상태를 안전하게 연결하기의 뜻과 조건을 설명한다.","로그 설계를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["세션은 상태 연결, CSRF는 요청 위조, 로그는 추적 근거이며 비밀값을 기록하지 않는다."],"sourceIds":["qnet-2027-1453","owasp-topten"],"questionIds":["IPE-2027-R-Q056"],"sections":[{"id":"IPE-2027-L056-S01","order":1,"title":"로그인 상태를 안전하게 연결하기","blocks":[{"type":"paragraph","text":"세션은 여러 요청을 같은 로그인 상태와 연결한다. 식별자는 충분히 예측하기 어려워야 하고 로그인·권한 변화 때 적절히 교체하며 만료·로그아웃을 서버에서 처리한다. 쿠키의 Secure는 HTTPS전송 제한, HttpOnly는 스크립트 접근 제한, SameSite는 사이트 간 전송 조건에 관여한다. 각 속성 하나가 모든 세션 공격을 막는 것은 아니다."}]},{"id":"IPE-2027-L056-S02","order":2,"title":"요청 의도와 오류 전달","blocks":[{"type":"paragraph","text":"CSRF는 로그인된 브라우저가 원치 않는 상태 변경 요청을 보내도록 유도하는 공격이다. CSRF토큰·SameSite·출처 검사 등을 적절히 사용하고 GET으로 상태 변경을 수행하지 않는다. XSS와 CSRF는 실행 위치와 악용 조건이 다르다. 오류 응답은 사용자가 다음 행동을 알게 하되 스택·키·내부 경로 등 민감 정보를 노출하지 않는다."}]},{"id":"IPE-2027-L056-S03","order":3,"title":"로그 설계","blocks":[{"type":"paragraph","text":"로그에는 요청 식별·시각·사건·결과 등 문제를 추적할 정보를 남긴다. 비밀번호·세션토큰을 원문으로 남기지 않는다. 로그인 실패가 반복되는 계정·출발지·시간대를 분석할 수 있어야 하지만 출발지 하나만으로 사람의 신원을 확정하지 않는다. 로그 보존·권한·무결성과 개인정보 최소화를 함께 고려한다."}]}]},{"id":"IPE-2027-L057","order":57,"title":"암호화·해시·전자서명","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L056"],"goals":["목적에 맞는 도구의 뜻과 조건을 설명한다.","키 방향 예제를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["비밀 전달은 수신자 키, 서명 검증은 서명자 공개키이며 해시는 암호화와 다르다."],"sourceIds":["qnet-2027-1453"],"questionIds":["IPE-2027-R-Q057"],"sections":[{"id":"IPE-2027-L057-S01","order":1,"title":"목적에 맞는 도구","blocks":[{"type":"paragraph","text":"대칭키 암호는 암복호화에 비밀키를 사용하며 대량 데이터 처리에 적합하다. 공개키 암호는 공개키·개인키 쌍을 사용한다. 해시는 임의 길이 입력을 고정 길이 요약값에 대응시키는 함수이며 일반 암호화처럼 복호화해 원문을 얻는 수단이 아니다. 암호학적 해시는 충돌·역상 저항 같은 성질이 요구된다. 단순 체크섬과 보안 목적의 해시를 혼동하지 않는다."}]},{"id":"IPE-2027-L057-S02","order":2,"title":"기밀성과 진위 확인","blocks":[{"type":"paragraph","text":"수신자만 읽게 하려면 수신자의 공개키로 보호한 키 등을 이용하고 수신자가 개인키로 복호화한다. 전자서명은 서명자의 개인키로 서명하고 공개키로 검증해 무결성과 서명자 확인을 돕는다. 비밀번호는 복호화 가능한 형태로 단순 저장하지 않고 salt와 적절한 비밀번호 전용 키 유도 함수를 사용한다. HTTPS는 보통 공개키 기술과 대칭키 기술을 함께 활용한다."}]},{"id":"IPE-2027-L057-S03","order":3,"title":"키 방향 예제","blocks":[{"type":"paragraph","text":"A가 B에게 비밀 메시지를 보내면 B만 가진 개인키로 열 수 있도록 B의 공개키를 활용한다. A가 서명한 메시지의 서명 검증에는 A의 공개키를 쓴다. '공개키로 암호화하면 공개키로도 열 수 있다'는 이해는 잘못이다. 전자서명 자체는 본문을 숨기는 기능이 아니므로 기밀성이 필요하면 별도 보호를 결합한다."}]},{"id":"IPE-2027-L057-S04","order":4,"title":"두 가지 키 방향을 그림으로 읽기","blocks":[{"type":"diagram","assetId":"IPE-2027-FIG-KEY-DIRECTIONS","alt":"기밀 전달은 A가 B의 공개키를 활용해 보호하고 B가 자신의 개인키로 복호화. 서명은 A의 개인키로 생성하고 B가 A의 공개키로 검증. 서명만으로 본문은 숨겨지지 않는다.","caption":"기밀 전달과 서명 검증의 키 방향"},{"type":"paragraph","text":"기밀전달에서는수신자B만풀도록B의키쌍을이용한다. 서명에서는A가만들었다는것을검증하도록A의키쌍을이용한다. 실제시스템은대칭키·공개키·해시등을결합하며이그림은각목적에서누구의키가쓰이는지를단순화한것이다."}]}]},{"id":"IPE-2027-L058","order":58,"title":"접근통제·보안 아키텍처·솔루션","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L057"],"goals":["정책을 집행하는 구조의 뜻과 조건을 설명한다.","역할표 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["솔루션은 특정 기능을 돕고 실제 권한은 서버의 최신 정책으로 집행한다."],"sourceIds":["qnet-2027-1453","owasp-topten"],"questionIds":["IPE-2027-R-Q058"],"sections":[{"id":"IPE-2027-L058-S01","order":1,"title":"정책을 집행하는 구조","blocks":[{"type":"paragraph","text":"DAC는 소유자 등의 재량, MAC는 보안등급과 강제 정책, RBAC는 역할, ABAC는 속성과 조건에 기초한 접근통제다. 실제 허용은 자원·행동·사용자·상태에 맞는 서버 정책으로 집행해야 한다. 보안 아키텍처는 신뢰 경계·인증·권한·감사·네트워크·키 관리 등이 서로 맞게 구성되도록 설계한다."}]},{"id":"IPE-2027-L058-S02","order":2,"title":"탐지와 차단의 도구","blocks":[{"type":"paragraph","text":"방화벽은 정한 통신 정책을, IDS는 침입 징후 탐지를, IPS는 탐지와 차단을, WAF는 웹 요청의 공격 패턴 등을 다룬다. 백신·EDR·취약점 점검·로그 통합 분석은 관측 대상과 대응 범위가 다르다. 보안 프레임워크는 위험 식별·보호·탐지·대응·복구 등 활동의 구조를 제공하지만 이름을 적용했다고 구현과 검증이 끝나지 않는다."}]},{"id":"IPE-2027-L058-S03","order":3,"title":"역할표 판독","blocks":[{"type":"table","headers":["역할","일반글 읽기","숨김글 복원","관리자 지정"],"rows":[["회원","허용","거절","거절"],["운영자","허용","허용","거절"],["최고관리자","허용","허용","허용"]]},{"type":"paragraph","text":"운영자라는 표시명이 아니라 서버의 실제 역할과 정책으로 판단한다. 역할 회수 뒤 오래된 화면을 열어 놓았더라도 다음 변경 요청은 다시 검사해야 한다."}]}]},{"id":"IPE-2027-L059","order":59,"title":"공격·취약점·로그 분석·대응","groupId":"IPE-2027-S4","groupTitle":"정보시스템 구축관리","examSubject":"정보시스템 구축관리","prerequisites":["IPE-2027-L058"],"goals":["자산에 주는 영향을 구별하기의 뜻과 조건을 설명한다.","로그 판독를 자료와 함께 따라간다."],"intro":[],"memoryPoints":["징후는 조사 출발점이며 보안 판단은 여러 증거·시간·영향을 연결한다."],"sourceIds":["qnet-2027-1453","owasp-topten"],"questionIds":["IPE-2027-R-Q059"],"sections":[{"id":"IPE-2027-L059-S01","order":1,"title":"자산에 주는 영향을 구별하기","blocks":[{"type":"paragraph","text":"기밀성은 허용되지 않은 공개 방지, 무결성은 부당한 변경 방지, 가용성은 필요한 때 사용 가능함이다. 서비스 거부 공격은 자원을 소진시켜 가용성을 해치고, 스니핑은 통신 내용을 엿보고, 스푸핑은 신원을 속이며, 중간자 공격은 통신 사이에 개입한다. 랜섬웨어는 데이터 접근을 막거나 유출을 협박할 수 있다. 공격 이름만으로 피해 범위를 하나로 제한하지 않는다."}]},{"id":"IPE-2027-L059-S02","order":2,"title":"증거를 연결해 판단하기","blocks":[{"type":"paragraph","text":"취약점은 악용될 수 있는 약점이고 위험은 발생 가능성과 영향 등을 종합해 판단한다. 점검은 정적·동적·설정·의존성 분석 등을 조합하며 오탐·미탐을 고려한다. 로그의 시간대·요청ID·출발지·계정·결과를 연결하고 징후와 확정 사실을 구분한다. 대응은 준비·탐지/분석·격리/제거/복구·사후 개선의 흐름으로 진행하되 증거와 업무 영향을 보존한다."}]},{"id":"IPE-2027-L059-S03","order":3,"title":"로그 판독","blocks":[{"type":"table","headers":["시각","계정","실패횟수","성공"],"rows":[["10:00~10:01","u1","40","아니오"],["10:02","u1","0","예"]]},{"type":"paragraph","text":"짧은 시간의 반복 실패 뒤 성공은 계정 탈취 가능성을 조사할 단서다. 합법 사용자의 입력 실수나 자동화 오류 가능성도 있으므로 추가 접속정보·세션·변경 이력을 확인한다. 단서만으로 공격자 신원을 확정하거나 정상 사용자의 데이터를 임의 삭제하지 않는다."}]}]}],"questions":[{"id":"IPE-2027-R-Q001","lessonId":"IPE-2027-L001","prompt":"표의 성능 요구사항은?","correctOptionId":"IPE-2027-R-Q001-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q001-A","text":"R1"},{"id":"IPE-2027-R-Q001-B","text":"R2"},{"id":"IPE-2027-R-Q001-C","text":"R3"},{"id":"IPE-2027-R-Q001-D","text":"모두 기능"}],"optionReasons":[{"optionId":"IPE-2027-R-Q001-A","text":"R1은 업무 동작이다.","returnTo":{"lessonId":"IPE-2027-L001","sectionId":"IPE-2027-L001-S03"}},{"optionId":"IPE-2027-R-Q001-B","text":"R2는 부하와 응답시간 수준을 정한 성능 요구다.","returnTo":{"lessonId":"IPE-2027-L001","sectionId":"IPE-2027-L001-S03"}},{"optionId":"IPE-2027-R-Q001-C","text":"R3은 결과 조회 기능이다.","returnTo":{"lessonId":"IPE-2027-L001","sectionId":"IPE-2027-L001-S03"}},{"optionId":"IPE-2027-R-Q001-D","text":"R2는 무엇을 하는지에 더해 어느 수준으로 수행하는지를 정한다.","returnTo":{"lessonId":"IPE-2027-L001","sectionId":"IPE-2027-L001-S03"}}],"inputBlocks":[{"type":"table","headers":["ID","요구"],"rows":[["R1","결제전 주문 취소"],["R2","동시500명에서 응답95%가2초 이내"],["R3","취소결과 조회"]],"caption":"요구 목록"}]},{"id":"IPE-2027-R-Q002","lessonId":"IPE-2027-L002","prompt":"그림에서 허용되는 상황은?","correctOptionId":"IPE-2027-R-Q002-B","assetIds":["IPE-2027-FIG-UML-MULT"],"options":[{"id":"IPE-2027-R-Q002-A","text":"주문 한 건의 고객 두 명"},{"id":"IPE-2027-R-Q002-B","text":"주문 없는 고객"},{"id":"IPE-2027-R-Q002-C","text":"고객당 주문을 최대1건으로 제한해야 한다"},{"id":"IPE-2027-R-Q002-D","text":"고객당 주문이 정확히1건이어야 한다"}],"optionReasons":[{"optionId":"IPE-2027-R-Q002-A","text":"고객 쪽1이므로 한 주문의 고객은 한 명이다.","returnTo":{"lessonId":"IPE-2027-L002","sectionId":"IPE-2027-L002-S04"}},{"optionId":"IPE-2027-R-Q002-B","text":"주문 쪽0..*의 최소0이므로 허용된다.","returnTo":{"lessonId":"IPE-2027-L002","sectionId":"IPE-2027-L002-S04"}},{"optionId":"IPE-2027-R-Q002-C","text":"0..*는여러주문을허용하므로최대1건으로제한해야한다는규칙은도식에서나오지않는다.","returnTo":{"lessonId":"IPE-2027-L002","sectionId":"IPE-2027-L002-S04"}},{"optionId":"IPE-2027-R-Q002-D","text":"최소0이므로주문없는고객도허용된다. 정확히1건이어야한다는강제규칙은아니다.","returnTo":{"lessonId":"IPE-2027-L002","sectionId":"IPE-2027-L002-S04"}}],"inputBlocks":[{"type":"diagram","assetId":"IPE-2027-FIG-UML-MULT"}]},{"id":"IPE-2027-R-Q003","lessonId":"IPE-2027-L003","prompt":"반복마다 기술 위험을 분석하고 줄이는 생명주기 모델은?","correctOptionId":"IPE-2027-R-Q003-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q003-A","text":"폭포수"},{"id":"IPE-2027-R-Q003-B","text":"나선형"},{"id":"IPE-2027-R-Q003-C","text":"단순 컴파일"},{"id":"IPE-2027-R-Q003-D","text":"일괄 배포"}],"optionReasons":[{"optionId":"IPE-2027-R-Q003-A","text":"폭포수는 단계의 순차 진행이 핵심이다.","returnTo":{"lessonId":"IPE-2027-L003","sectionId":"IPE-2027-L003-S01"}},{"optionId":"IPE-2027-R-Q003-B","text":"나선형은 반복 과정의 위험 분석을 강조한다.","returnTo":{"lessonId":"IPE-2027-L003","sectionId":"IPE-2027-L003-S01"}},{"optionId":"IPE-2027-R-Q003-C","text":"컴파일은 코드 변환 활동이다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S01"}},{"optionId":"IPE-2027-R-Q003-D","text":"배포 방식은 위험 중심 개발 생명주기 모형이 아니다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q004","lessonId":"IPE-2027-L004","prompt":"표에서 보완할 시험 연결은?","correctOptionId":"IPE-2027-R-Q004-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q004-A","text":"R1→시험"},{"id":"IPE-2027-R-Q004-B","text":"R2→시험"},{"id":"IPE-2027-R-Q004-C","text":"R1→설계"},{"id":"IPE-2027-R-Q004-D","text":"R2→구현"}],"optionReasons":[{"optionId":"IPE-2027-R-Q004-A","text":"R1에는 T1이 연결돼 있다.","returnTo":{"lessonId":"IPE-2027-L004","sectionId":"IPE-2027-L004-S03"}},{"optionId":"IPE-2027-R-Q004-B","text":"R2의 시험칸이 비어 검증 연결이 필요하다.","returnTo":{"lessonId":"IPE-2027-L004","sectionId":"IPE-2027-L004-S03"}},{"optionId":"IPE-2027-R-Q004-C","text":"R1에는 D1이 있다.","returnTo":{"lessonId":"IPE-2027-L004","sectionId":"IPE-2027-L004-S03"}},{"optionId":"IPE-2027-R-Q004-D","text":"R2에는 M2가 있다.","returnTo":{"lessonId":"IPE-2027-L004","sectionId":"IPE-2027-L004-S03"}}],"inputBlocks":[{"type":"table","headers":["요구","설계","구현","시험"],"rows":[["R1","D1","M1","T1"],["R2","D2","M2","-"]],"caption":"추적표"}]},{"id":"IPE-2027-R-Q005","lessonId":"IPE-2027-L005","prompt":"화면 스토리보드에 포함할 내용으로 적절한 것은?","correctOptionId":"IPE-2027-R-Q005-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q005-A","text":"성공 배경색만"},{"id":"IPE-2027-R-Q005-B","text":"입력·실패·복귀 분기"},{"id":"IPE-2027-R-Q005-C","text":"직원 취미"},{"id":"IPE-2027-R-Q005-D","text":"운영 비밀번호"}],"optionReasons":[{"optionId":"IPE-2027-R-Q005-A","text":"정상 색만으로 동작 분기를 정의할 수 없다.","returnTo":{"lessonId":"IPE-2027-L005","sectionId":"IPE-2027-L005-S02"}},{"optionId":"IPE-2027-R-Q005-B","text":"화면 구성에 더해 입력·이동·오류·복귀를 명세한다.","returnTo":{"lessonId":"IPE-2027-L005","sectionId":"IPE-2027-L005-S02"}},{"optionId":"IPE-2027-R-Q005-C","text":"화면 사용 계약과 관계없다.","returnTo":{"lessonId":"IPE-2027-L005","sectionId":"IPE-2027-L005-S02"}},{"optionId":"IPE-2027-R-Q005-D","text":"민감 정보를 화면 명세에 공개하지 않는다.","returnTo":{"lessonId":"IPE-2027-L005","sectionId":"IPE-2027-L005-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q006","lessonId":"IPE-2027-L006","prompt":"여러 모듈이 전역 데이터를 공유해 의존하는 결합은?","correctOptionId":"IPE-2027-R-Q006-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q006-A","text":"자료"},{"id":"IPE-2027-R-Q006-B","text":"공통"},{"id":"IPE-2027-R-Q006-C","text":"무결합"},{"id":"IPE-2027-R-Q006-D","text":"독립 실행"}],"optionReasons":[{"optionId":"IPE-2027-R-Q006-A","text":"자료 결합은 필요한 값의 매개변수 전달이다.","returnTo":{"lessonId":"IPE-2027-L006","sectionId":"IPE-2027-L006-S02"}},{"optionId":"IPE-2027-R-Q006-B","text":"공유 전역 데이터에 의존하면 공통 결합이다.","returnTo":{"lessonId":"IPE-2027-L006","sectionId":"IPE-2027-L006-S02"}},{"optionId":"IPE-2027-R-Q006-C","text":"공유 데이터 의존이 존재한다.","returnTo":{"lessonId":"IPE-2027-L006","sectionId":"IPE-2027-L006-S02"}},{"optionId":"IPE-2027-R-Q006-D","text":"실행 여부보다 데이터 의존을 묻고 있다.","returnTo":{"lessonId":"IPE-2027-L006","sectionId":"IPE-2027-L006-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q007","lessonId":"IPE-2027-L007","prompt":"하위 클래스가 상위 인스턴스 메서드 동작을 재정의하는 것은?","correctOptionId":"IPE-2027-R-Q007-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q007-A","text":"오버라이딩"},{"id":"IPE-2027-R-Q007-B","text":"오버로딩"},{"id":"IPE-2027-R-Q007-C","text":"정렬"},{"id":"IPE-2027-R-Q007-D","text":"캡슐화"}],"optionReasons":[{"optionId":"IPE-2027-R-Q007-A","text":"상속 관계에서 메서드 동작을 재정의한다.","returnTo":{"lessonId":"IPE-2027-L007","sectionId":"IPE-2027-L007-S02"}},{"optionId":"IPE-2027-R-Q007-B","text":"오버로딩은 다른 매개변수 목록의 같은 이름이다.","returnTo":{"lessonId":"IPE-2027-L007","sectionId":"IPE-2027-L007-S02"}},{"optionId":"IPE-2027-R-Q007-C","text":"정렬은 순서를 바꾸는 연산이다.","returnTo":{"lessonId":"IPE-2027-L043","sectionId":"IPE-2027-L043-S02"}},{"optionId":"IPE-2027-R-Q007-D","text":"캡슐화는데이터와연산을묶고접근경계를정한다. 상속한메서드의동작재정의는오버라이딩이다.","returnTo":{"lessonId":"IPE-2027-L007","sectionId":"IPE-2027-L007-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q008","lessonId":"IPE-2027-L008","prompt":"배송비 알고리즘을 교체 가능한 객체로 나누는 패턴은?","correctOptionId":"IPE-2027-R-Q008-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q008-A","text":"Observer"},{"id":"IPE-2027-R-Q008-B","text":"Adapter"},{"id":"IPE-2027-R-Q008-C","text":"Strategy"},{"id":"IPE-2027-R-Q008-D","text":"Singleton"}],"optionReasons":[{"optionId":"IPE-2027-R-Q008-A","text":"Observer는 변화 통지다.","returnTo":{"lessonId":"IPE-2027-L008","sectionId":"IPE-2027-L008-S02"}},{"optionId":"IPE-2027-R-Q008-B","text":"Adapter는 인터페이스를 맞춘다.","returnTo":{"lessonId":"IPE-2027-L008","sectionId":"IPE-2027-L008-S01"}},{"optionId":"IPE-2027-R-Q008-C","text":"Strategy는 교체 가능한 알고리즘을 묶는다.","returnTo":{"lessonId":"IPE-2027-L008","sectionId":"IPE-2027-L008-S02"}},{"optionId":"IPE-2027-R-Q008-D","text":"Singleton은 인스턴스 수 관리다.","returnTo":{"lessonId":"IPE-2027-L008","sectionId":"IPE-2027-L008-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q009","lessonId":"IPE-2027-L009","prompt":"명세에서 금액 오해를 막기 위해 보완할 것은?","correctOptionId":"IPE-2027-R-Q009-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q009-A","text":"requestId삭제"},{"id":"IPE-2027-R-Q009-B","text":"amount단위"},{"id":"IPE-2027-R-Q009-C","text":"정수타입삭제"},{"id":"IPE-2027-R-Q009-D","text":"송수신대상삭제"}],"optionReasons":[{"optionId":"IPE-2027-R-Q009-A","text":"요청 구분자는 유지한다.","returnTo":{"lessonId":"IPE-2027-L009","sectionId":"IPE-2027-L009-S01"}},{"optionId":"IPE-2027-R-Q009-B","text":"같은 정수도 원·센트에 따라 의미가 달라 단위를 정한다.","returnTo":{"lessonId":"IPE-2027-L009","sectionId":"IPE-2027-L009-S01"}},{"optionId":"IPE-2027-R-Q009-C","text":"타입과 단위는 함께 명세한다.","returnTo":{"lessonId":"IPE-2027-L009","sectionId":"IPE-2027-L009-S01"}},{"optionId":"IPE-2027-R-Q009-D","text":"대상도 명확해야 한다.","returnTo":{"lessonId":"IPE-2027-L009","sectionId":"IPE-2027-L009-S01"}}],"inputBlocks":[{"type":"table","headers":["항목","타입","단위"],"rows":[["requestId","문자열","해당없음"],["amount","정수","미지정"]],"caption":"데이터명세"}]},{"id":"IPE-2027-R-Q010","lessonId":"IPE-2027-L010","prompt":"A뒤 B·C 병렬, 둘 완료 뒤 D다. 총 최소 기간은?","correctOptionId":"IPE-2027-R-Q010-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q010-A","text":"7일"},{"id":"IPE-2027-R-Q010-B","text":"8일"},{"id":"IPE-2027-R-Q010-C","text":"9일"},{"id":"IPE-2027-R-Q010-D","text":"11일"}],"optionReasons":[{"optionId":"IPE-2027-R-Q010-A","text":"7일 경로가 끝나도 B경로가 남는다.","returnTo":{"lessonId":"IPE-2027-L010","sectionId":"IPE-2027-L010-S03"}},{"optionId":"IPE-2027-R-Q010-B","text":"A-B-D=8, A-C-D=7이므로8일이다.","returnTo":{"lessonId":"IPE-2027-L010","sectionId":"IPE-2027-L010-S03"}},{"optionId":"IPE-2027-R-Q010-C","text":"경로 합과 일치하지 않는다.","returnTo":{"lessonId":"IPE-2027-L010","sectionId":"IPE-2027-L010-S03"}},{"optionId":"IPE-2027-R-Q010-D","text":"병렬 B·C를 직렬로 모두 더했다.","returnTo":{"lessonId":"IPE-2027-L010","sectionId":"IPE-2027-L010-S03"}}],"inputBlocks":[{"type":"table","headers":["작업","일수"],"rows":[["A","2"],["B","4"],["C","3"],["D","2"]],"caption":"작업기간"}]},{"id":"IPE-2027-R-Q011","lessonId":"IPE-2027-L011","prompt":"테일러링의 적절한 예는?","correctOptionId":"IPE-2027-R-Q011-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q011-A","text":"근거 없는 시험 생략"},{"id":"IPE-2027-R-Q011-B","text":"위험에 맞는 절차 조정과 이유 기록"},{"id":"IPE-2027-R-Q011-C","text":"모든 표준 삭제"},{"id":"IPE-2027-R-Q011-D","text":"프레임워크면 검토 완료"}],"optionReasons":[{"optionId":"IPE-2027-R-Q011-A","text":"필수 위험 검증을 없앨 근거가 없다.","returnTo":{"lessonId":"IPE-2027-L011","sectionId":"IPE-2027-L011-S01"}},{"optionId":"IPE-2027-R-Q011-B","text":"특성과 위험에 따라 절차·상세도를 조정한다.","returnTo":{"lessonId":"IPE-2027-L011","sectionId":"IPE-2027-L011-S01"}},{"optionId":"IPE-2027-R-Q011-C","text":"무차별 삭제는 맞춤이 아니다.","returnTo":{"lessonId":"IPE-2027-L011","sectionId":"IPE-2027-L011-S01"}},{"optionId":"IPE-2027-R-Q011-D","text":"도구가 업무 검증을 대신하지 않는다.","returnTo":{"lessonId":"IPE-2027-L011","sectionId":"IPE-2027-L011-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q012","lessonId":"IPE-2027-L012","prompt":"형상관리에 포함되는 활동은?","correctOptionId":"IPE-2027-R-Q012-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q012-A","text":"최신 파일 하나만 남김"},{"id":"IPE-2027-R-Q012-B","text":"변경 식별·통제·상태기록"},{"id":"IPE-2027-R-Q012-C","text":"컴파일만"},{"id":"IPE-2027-R-Q012-D","text":"브랜치 일괄 삭제"}],"optionReasons":[{"optionId":"IPE-2027-R-Q012-A","text":"이력·기준선·변경통제가 빠진다.","returnTo":{"lessonId":"IPE-2027-L012","sectionId":"IPE-2027-L012-S01"}},{"optionId":"IPE-2027-R-Q012-B","text":"구성항목과 변경의 식별·통제·기록·감사를 다룬다.","returnTo":{"lessonId":"IPE-2027-L012","sectionId":"IPE-2027-L012-S01"}},{"optionId":"IPE-2027-R-Q012-C","text":"컴파일보다 넓은 관리 활동이다.","returnTo":{"lessonId":"IPE-2027-L012","sectionId":"IPE-2027-L012-S01"},"additionalReturnTo":[{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S01"}]},{"optionId":"IPE-2027-R-Q012-D","text":"삭제가 형상관리의 목적이 아니다.","returnTo":{"lessonId":"IPE-2027-L012","sectionId":"IPE-2027-L012-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q013","lessonId":"IPE-2027-L013","prompt":"빌드 성공 뒤 목표 환경 DB권한 때문에 기능이 실패했다. 옳은 판단은?","correctOptionId":"IPE-2027-R-Q013-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q013-A","text":"빌드면 운영도 성공"},{"id":"IPE-2027-R-Q013-B","text":"소스 존재면 실행 검증 완료"},{"id":"IPE-2027-R-Q013-C","text":"빌드와 환경 기능검증 구별"},{"id":"IPE-2027-R-Q013-D","text":"항상 컴파일오류"}],"optionReasons":[{"optionId":"IPE-2027-R-Q013-A","text":"실행 권한은 별도다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S03"}},{"optionId":"IPE-2027-R-Q013-B","text":"소스는 실제 실행 증거가 아니다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S03"}},{"optionId":"IPE-2027-R-Q013-C","text":"빌드·배포·목표 환경 기능 성공을 각각 확인한다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S03"}},{"optionId":"IPE-2027-R-Q013-D","text":"컴파일 후 실행 권한 오류가 날 수 있다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q014","lessonId":"IPE-2027-L014","prompt":"설치 매뉴얼의 주요 내용은?","correctOptionId":"IPE-2027-R-Q014-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q014-A","text":"환경·설치·설정·복구"},{"id":"IPE-2027-R-Q014-B","text":"직원 취미"},{"id":"IPE-2027-R-Q014-C","text":"미확인 인기순위"},{"id":"IPE-2027-R-Q014-D","text":"비밀번호 목록"}],"optionReasons":[{"optionId":"IPE-2027-R-Q014-A","text":"독자가 환경을 맞추고 설치·복구할 절차다.","returnTo":{"lessonId":"IPE-2027-L014","sectionId":"IPE-2027-L014-S01"}},{"optionId":"IPE-2027-R-Q014-B","text":"설치 목적과 무관하다.","returnTo":{"lessonId":"IPE-2027-L014","sectionId":"IPE-2027-L014-S01"}},{"optionId":"IPE-2027-R-Q014-C","text":"미확인 순위는 설치 절차가 아니다.","returnTo":{"lessonId":"IPE-2027-L014","sectionId":"IPE-2027-L014-S01"}},{"optionId":"IPE-2027-R-Q014-D","text":"비밀번호를 공개하지 않는다.","returnTo":{"lessonId":"IPE-2027-L014","sectionId":"IPE-2027-L014-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q015","lessonId":"IPE-2027-L015","prompt":"카드결제 수정 뒤 계좌결제가 여전히 정상인지 확인한다. 시험 목적에 따른 종류는?","correctOptionId":"IPE-2027-R-Q015-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q015-A","text":"회귀 테스트"},{"id":"IPE-2027-R-Q015-B","text":"요구 도출"},{"id":"IPE-2027-R-Q015-C","text":"단위 테스트"},{"id":"IPE-2027-R-Q015-D","text":"패키징"}],"optionReasons":[{"optionId":"IPE-2027-R-Q015-A","text":"변경이 다른 정상 기능을 깨지 않았는지 본다.","returnTo":{"lessonId":"IPE-2027-L015","sectionId":"IPE-2027-L015-S02"}},{"optionId":"IPE-2027-R-Q015-B","text":"요구 도출은 수집 활동이다.","returnTo":{"lessonId":"IPE-2027-L001","sectionId":"IPE-2027-L001-S02"}},{"optionId":"IPE-2027-R-Q015-C","text":"단위테스트는작은모듈을확인하는수준이다. 이문제는변경이다른정상기능을깨지않았는지보는회귀목적을묻는다.","returnTo":{"lessonId":"IPE-2027-L015","sectionId":"IPE-2027-L015-S01"}},{"optionId":"IPE-2027-R-Q015-D","text":"패키징은 전달 형태로 묶는 활동이다.","returnTo":{"lessonId":"IPE-2027-L013","sectionId":"IPE-2027-L013-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q016","lessonId":"IPE-2027-L016","prompt":"허용구간의 양쪽 경계와 바로 바깥을 고르면?","correctOptionId":"IPE-2027-R-Q016-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q016-A","text":"18,30,50,65"},{"id":"IPE-2027-R-Q016-B","text":"17,18,65,66"},{"id":"IPE-2027-R-Q016-C","text":"0,20,40,100"},{"id":"IPE-2027-R-Q016-D","text":"19,20,63,64"}],"optionReasons":[{"optionId":"IPE-2027-R-Q016-A","text":"바로 바깥17·66이 없다.","returnTo":{"lessonId":"IPE-2027-L016","sectionId":"IPE-2027-L016-S01"}},{"optionId":"IPE-2027-R-Q016-B","text":"최소18·최대65와 인접 외부17·66이다.","returnTo":{"lessonId":"IPE-2027-L016","sectionId":"IPE-2027-L016-S01"}},{"optionId":"IPE-2027-R-Q016-C","text":"경계의 바로 인접값 집합이 아니다.","returnTo":{"lessonId":"IPE-2027-L016","sectionId":"IPE-2027-L016-S01"}},{"optionId":"IPE-2027-R-Q016-D","text":"허용 내부만 있다.","returnTo":{"lessonId":"IPE-2027-L016","sectionId":"IPE-2027-L016-S01"}}],"inputBlocks":[{"type":"table","headers":["타입","최소","최대"],"rows":[["정수나이","18","65"]],"caption":"입력범위"}]},{"id":"IPE-2027-R-Q017","lessonId":"IPE-2027-L017","prompt":"Java17 단락OR의 두 검사에 대한 설명은?","correctOptionId":"IPE-2027-R-Q017-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q017-A","text":"B거짓도 평가됨"},{"id":"IPE-2027-R-Q017-B","text":"결정참거짓 모두 평가됨"},{"id":"IPE-2027-R-Q017-C","text":"B거짓 평가가 없음"},{"id":"IPE-2027-R-Q017-D","text":"첫검사도 B평가"}],"optionReasons":[{"optionId":"IPE-2027-R-Q017-A","text":"첫검사는 A참으로 B미평가다.","returnTo":{"lessonId":"IPE-2027-L017","sectionId":"IPE-2027-L017-S03"}},{"optionId":"IPE-2027-R-Q017-B","text":"결정은 두 번 모두 참이다.","returnTo":{"lessonId":"IPE-2027-L017","sectionId":"IPE-2027-L017-S03"}},{"optionId":"IPE-2027-R-Q017-C","text":"입력B=false와 실제B거짓평가는 다르다.","returnTo":{"lessonId":"IPE-2027-L017","sectionId":"IPE-2027-L017-S03"}},{"optionId":"IPE-2027-R-Q017-D","text":"단락||는 A참이면 B를 평가하지 않는다.","returnTo":{"lessonId":"IPE-2027-L017","sectionId":"IPE-2027-L017-S03"}}],"inputBlocks":[{"type":"code","text":"// 독립된 두 검사\n// 1: A=true, B=false\n// 2: A=false,B=true\nboolean r=A || B;","language":"java"}]},{"id":"IPE-2027-R-Q018","lessonId":"IPE-2027-L018","prompt":"같은 부하의 총 응답시간 감소율은?","correctOptionId":"IPE-2027-R-Q018-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q018-A","text":"30%"},{"id":"IPE-2027-R-Q018-B","text":"50%"},{"id":"IPE-2027-R-Q018-C","text":"70%"},{"id":"IPE-2027-R-Q018-D","text":"90%"}],"optionReasons":[{"optionId":"IPE-2027-R-Q018-A","text":"30%는 남은 비율이다.","returnTo":{"lessonId":"IPE-2027-L018","sectionId":"IPE-2027-L018-S03"}},{"optionId":"IPE-2027-R-Q018-B","text":"700/1000은0.7이다.","returnTo":{"lessonId":"IPE-2027-L018","sectionId":"IPE-2027-L018-S03"}},{"optionId":"IPE-2027-R-Q018-C","text":"총1000→300, 감소700/1000=70%다.","returnTo":{"lessonId":"IPE-2027-L018","sectionId":"IPE-2027-L018-S03"}},{"optionId":"IPE-2027-R-Q018-D","text":"90%면100ms가 남아야 한다.","returnTo":{"lessonId":"IPE-2027-L018","sectionId":"IPE-2027-L018-S03"}}],"inputBlocks":[{"type":"table","headers":["구간","전ms","후ms"],"rows":[["DB","800","120"],["계산","50","45"],["출력","150","135"]],"caption":"측정표"}]},{"id":"IPE-2027-R-Q019","lessonId":"IPE-2027-L019","prompt":"학번만으로 유일하다면 {학번,이름}이 후보키가 아닌 이유는?","correctOptionId":"IPE-2027-R-Q019-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q019-A","text":"유일성 없음"},{"id":"IPE-2027-R-Q019-B","text":"최소성 없음"},{"id":"IPE-2027-R-Q019-C","text":"NULL필수"},{"id":"IPE-2027-R-Q019-D","text":"이름은 숫자"}],"optionReasons":[{"optionId":"IPE-2027-R-Q019-A","text":"학번을 포함해 유일성은 있다.","returnTo":{"lessonId":"IPE-2027-L019","sectionId":"IPE-2027-L019-S02"}},{"optionId":"IPE-2027-R-Q019-B","text":"이름을 빼도 식별돼 최소성이 없다.","returnTo":{"lessonId":"IPE-2027-L019","sectionId":"IPE-2027-L019-S02"}},{"optionId":"IPE-2027-R-Q019-C","text":"키 조건과 반대다.","returnTo":{"lessonId":"IPE-2027-L019","sectionId":"IPE-2027-L019-S02"}},{"optionId":"IPE-2027-R-Q019-D","text":"이름 타입이 최소성의 이유가 아니다.","returnTo":{"lessonId":"IPE-2027-L019","sectionId":"IPE-2027-L019-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q020","lessonId":"IPE-2027-L020","prompt":"같은 학생의 같은 강좌 등록은1회다. 수강 기본키는?","correctOptionId":"IPE-2027-R-Q020-D","assetIds":["IPE-2027-FIG-ER-ENROLL"],"options":[{"id":"IPE-2027-R-Q020-A","text":"학번만"},{"id":"IPE-2027-R-Q020-B","text":"강좌번호만"},{"id":"IPE-2027-R-Q020-C","text":"성적"},{"id":"IPE-2027-R-Q020-D","text":"학번+강좌번호"}],"optionReasons":[{"optionId":"IPE-2027-R-Q020-A","text":"한 학생이 여러 강좌를 듣는다.","returnTo":{"lessonId":"IPE-2027-L020","sectionId":"IPE-2027-L020-S04"}},{"optionId":"IPE-2027-R-Q020-B","text":"한 강좌에 여러 학생이 속한다.","returnTo":{"lessonId":"IPE-2027-L020","sectionId":"IPE-2027-L020-S04"}},{"optionId":"IPE-2027-R-Q020-C","text":"성적은 중복될 수 있다.","returnTo":{"lessonId":"IPE-2027-L020","sectionId":"IPE-2027-L020-S04"}},{"optionId":"IPE-2027-R-Q020-D","text":"학생-강좌쌍을 유일하게 식별한다.","returnTo":{"lessonId":"IPE-2027-L020","sectionId":"IPE-2027-L020-S04"}}],"inputBlocks":[{"type":"diagram","assetId":"IPE-2027-FIG-ER-ENROLL"}]},{"id":"IPE-2027-R-Q021","lessonId":"IPE-2027-L021","prompt":"표의 종속만 있을 때 BCNF 위반 종속은?","correctOptionId":"IPE-2027-R-Q021-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q021-A","text":"AB→C"},{"id":"IPE-2027-R-Q021-B","text":"C→B"},{"id":"IPE-2027-R-Q021-C","text":"후보키 AB·AC 존재 자체"},{"id":"IPE-2027-R-Q021-D","text":"위반 없음"}],"optionReasons":[{"optionId":"IPE-2027-R-Q021-A","text":"AB는 후보키다.","returnTo":{"lessonId":"IPE-2027-L021","sectionId":"IPE-2027-L021-S05"}},{"optionId":"IPE-2027-R-Q021-B","text":"C폐포BC는 A가 없어 슈퍼키가 아니다.","returnTo":{"lessonId":"IPE-2027-L021","sectionId":"IPE-2027-L021-S05"}},{"optionId":"IPE-2027-R-Q021-C","text":"복수 후보키 자체가 위반은 아니다.","returnTo":{"lessonId":"IPE-2027-L021","sectionId":"IPE-2027-L021-S05"}},{"optionId":"IPE-2027-R-Q021-D","text":"비슈퍼키 결정자C의 종속이 있다.","returnTo":{"lessonId":"IPE-2027-L021","sectionId":"IPE-2027-L021-S05"}}],"inputBlocks":[{"type":"table","headers":["관계","종속"],"rows":[["R(A,B,C)","AB→C, C→B"]],"caption":"함수 종속 집합 F"}]},{"id":"IPE-2027-R-Q022","lessonId":"IPE-2027-L022","prompt":"새 id를 넣는다. 거절할 입력은?","correctOptionId":"IPE-2027-R-Q022-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q022-A","text":"펜,0"},{"id":"IPE-2027-R-Q022-B","text":"책,100"},{"id":"IPE-2027-R-Q022-C","text":"지우개,-1"},{"id":"IPE-2027-R-Q022-D","text":"공책,200"}],"optionReasons":[{"optionId":"IPE-2027-R-Q022-A","text":"0은 조건을 만족한다.","returnTo":{"lessonId":"IPE-2027-L022","sectionId":"IPE-2027-L022-S03"}},{"optionId":"IPE-2027-R-Q022-B","text":"양수는 허용된다.","returnTo":{"lessonId":"IPE-2027-L022","sectionId":"IPE-2027-L022-S03"}},{"optionId":"IPE-2027-R-Q022-C","text":"-1은price>=0을 위반한다.","returnTo":{"lessonId":"IPE-2027-L022","sectionId":"IPE-2027-L022-S03"}},{"optionId":"IPE-2027-R-Q022-D","text":"양수는 허용된다.","returnTo":{"lessonId":"IPE-2027-L022","sectionId":"IPE-2027-L022-S03"}}],"inputBlocks":[{"type":"code","text":"CREATE TABLE Product(id INTEGER PRIMARY KEY,\nname VARCHAR(40) NOT NULL,\nprice INTEGER NOT NULL CHECK(price>=0));","language":"sql"}]},{"id":"IPE-2027-R-Q023","lessonId":"IPE-2027-L023","prompt":"질의 결과 id의 순서는?","correctOptionId":"IPE-2027-R-Q023-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q023-A","text":"1,4"},{"id":"IPE-2027-R-Q023-B","text":"1,2,4"},{"id":"IPE-2027-R-Q023-C","text":"2"},{"id":"IPE-2027-R-Q023-D","text":"4,1"}],"optionReasons":[{"optionId":"IPE-2027-R-Q023-A","text":"70점 두 행을 id오름차순으로 출력한다.","returnTo":{"lessonId":"IPE-2027-L023","sectionId":"IPE-2027-L023-S03"}},{"optionId":"IPE-2027-R-Q023-B","text":"NULL비교는UNKNOWN이라 제외한다.","returnTo":{"lessonId":"IPE-2027-L023","sectionId":"IPE-2027-L023-S03"}},{"optionId":"IPE-2027-R-Q023-C","text":"IS NULL질의가 아니다.","returnTo":{"lessonId":"IPE-2027-L023","sectionId":"IPE-2027-L023-S03"}},{"optionId":"IPE-2027-R-Q023-D","text":"동점의id ASC를 거꾸로 읽었다.","returnTo":{"lessonId":"IPE-2027-L023","sectionId":"IPE-2027-L023-S03"}}],"inputBlocks":[{"type":"table","headers":["id","score"],"rows":[["1","70"],["2","NULL"],["3","50"],["4","70"]],"caption":"T"},{"type":"code","text":"SELECT id FROM T WHERE score>=60\nORDER BY score DESC,id ASC;","language":"sql"}]},{"id":"IPE-2027-R-Q024","lessonId":"IPE-2027-L024","prompt":"A의 COUNT(*),COUNT(amount),AVG(amount)는?","correctOptionId":"IPE-2027-R-Q024-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q024-A","text":"3,3,40/3"},{"id":"IPE-2027-R-Q024-B","text":"3,2,20"},{"id":"IPE-2027-R-Q024-C","text":"2,2,20"},{"id":"IPE-2027-R-Q024-D","text":"3,2,40/3"}],"optionReasons":[{"optionId":"IPE-2027-R-Q024-A","text":"열집계는NULL을 제외한다.","returnTo":{"lessonId":"IPE-2027-L024","sectionId":"IPE-2027-L024-S03"}},{"optionId":"IPE-2027-R-Q024-B","text":"행3·비NULL2·합40/2=20이다.","returnTo":{"lessonId":"IPE-2027-L024","sectionId":"IPE-2027-L024-S03"}},{"optionId":"IPE-2027-R-Q024-C","text":"COUNT(*)는NULL행도 센다.","returnTo":{"lessonId":"IPE-2027-L024","sectionId":"IPE-2027-L024-S03"}},{"optionId":"IPE-2027-R-Q024-D","text":"평균의 분모는2다.","returnTo":{"lessonId":"IPE-2027-L024","sectionId":"IPE-2027-L024-S03"}}],"inputBlocks":[{"type":"table","headers":["dept","amount"],"rows":[["A","10"],["A","NULL"],["A","30"],["B","15"]],"caption":"Sale"}]},{"id":"IPE-2027-R-Q025","lessonId":"IPE-2027-L025","prompt":"Customers c LEFT JOIN Orders o ON c.id=o.cid의 행 수는?","correctOptionId":"IPE-2027-R-Q025-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q025-A","text":"1"},{"id":"IPE-2027-R-Q025-B","text":"2"},{"id":"IPE-2027-R-Q025-C","text":"3"},{"id":"IPE-2027-R-Q025-D","text":"4"}],"optionReasons":[{"optionId":"IPE-2027-R-Q025-A","text":"고객1은두조합이고 고객2도 남는다.","returnTo":{"lessonId":"IPE-2027-L025","sectionId":"IPE-2027-L025-S03"}},{"optionId":"IPE-2027-R-Q025-B","text":"2는 내부조인의 일치행 수다.","returnTo":{"lessonId":"IPE-2027-L025","sectionId":"IPE-2027-L025-S03"}},{"optionId":"IPE-2027-R-Q025-C","text":"고객1두행+고객2NULL확장1행이다.","returnTo":{"lessonId":"IPE-2027-L025","sectionId":"IPE-2027-L025-S03"}},{"optionId":"IPE-2027-R-Q025-D","text":"주문cid3은왼쪽에고객이없어추가되지않는다.","returnTo":{"lessonId":"IPE-2027-L025","sectionId":"IPE-2027-L025-S03"}}],"inputBlocks":[{"type":"table","headers":["Customers.id"],"rows":[["1"],["2"]],"caption":"고객"},{"type":"table","headers":["Orders.cid"],"rows":[["1"],["1"],["3"]],"caption":"주문"}]},{"id":"IPE-2027-R-Q026","lessonId":"IPE-2027-L026","prompt":"UNION ALL 결과 행 수는?","correctOptionId":"IPE-2027-R-Q026-D","assetIds":[],"options":[{"id":"IPE-2027-R-Q026-A","text":"2"},{"id":"IPE-2027-R-Q026-B","text":"3"},{"id":"IPE-2027-R-Q026-C","text":"4"},{"id":"IPE-2027-R-Q026-D","text":"5"}],"optionReasons":[{"optionId":"IPE-2027-R-Q026-A","text":"공통값만 세지 않는다.","returnTo":{"lessonId":"IPE-2027-L026","sectionId":"IPE-2027-L026-S03"}},{"optionId":"IPE-2027-R-Q026-B","text":"3은 중복제거UNION의 값 수다.","returnTo":{"lessonId":"IPE-2027-L026","sectionId":"IPE-2027-L026-S03"}},{"optionId":"IPE-2027-R-Q026-C","text":"A의 중복1도 보존한다.","returnTo":{"lessonId":"IPE-2027-L026","sectionId":"IPE-2027-L026-S03"}},{"optionId":"IPE-2027-R-Q026-D","text":"3행+2행=5행이다.","returnTo":{"lessonId":"IPE-2027-L026","sectionId":"IPE-2027-L026-S03"}}],"inputBlocks":[{"type":"table","headers":["A"],"rows":[["1"],["1"],["2"]],"caption":"첫 결과"},{"type":"table","headers":["B"],"rows":[["2"],["3"]],"caption":"둘째 결과"}]},{"id":"IPE-2027-R-Q027","lessonId":"IPE-2027-L027","prompt":"이체의 차감·증가를 모두 반영하거나 모두 취소하는 성질은?","correctOptionId":"IPE-2027-R-Q027-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q027-A","text":"원자성"},{"id":"IPE-2027-R-Q027-B","text":"격리성"},{"id":"IPE-2027-R-Q027-C","text":"정렬성"},{"id":"IPE-2027-R-Q027-D","text":"최소성"}],"optionReasons":[{"optionId":"IPE-2027-R-Q027-A","text":"논리적 작업의 전부/전무다.","returnTo":{"lessonId":"IPE-2027-L027","sectionId":"IPE-2027-L027-S01"}},{"optionId":"IPE-2027-R-Q027-B","text":"동시 실행 간섭을 제어한다.","returnTo":{"lessonId":"IPE-2027-L027","sectionId":"IPE-2027-L027-S01"}},{"optionId":"IPE-2027-R-Q027-C","text":"ACID의 해당 성질이 아니다.","returnTo":{"lessonId":"IPE-2027-L027","sectionId":"IPE-2027-L027-S01"}},{"optionId":"IPE-2027-R-Q027-D","text":"후보키 조건의 개념이다.","returnTo":{"lessonId":"IPE-2027-L019","sectionId":"IPE-2027-L019-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q028","lessonId":"IPE-2027-L028","prompt":"score내림차순 RANK와 DENSE_RANK는?","correctOptionId":"IPE-2027-R-Q028-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q028-A","text":"둘다1,2,3"},{"id":"IPE-2027-R-Q028-B","text":"RANK1,1,2/DENSE1,1,3"},{"id":"IPE-2027-R-Q028-C","text":"RANK1,1,3/DENSE1,1,2"},{"id":"IPE-2027-R-Q028-D","text":"둘다1,1,1"}],"optionReasons":[{"optionId":"IPE-2027-R-Q028-A","text":"동점90은 같은 순위다.","returnTo":{"lessonId":"IPE-2027-L028","sectionId":"IPE-2027-L028-S03"}},{"optionId":"IPE-2027-R-Q028-B","text":"두 함수의 건너뛰기를 바꿨다.","returnTo":{"lessonId":"IPE-2027-L028","sectionId":"IPE-2027-L028-S03"}},{"optionId":"IPE-2027-R-Q028-C","text":"RANK는동점뒤3, DENSE는다음값2다.","returnTo":{"lessonId":"IPE-2027-L028","sectionId":"IPE-2027-L028-S03"}},{"optionId":"IPE-2027-R-Q028-D","text":"70은 다른 점수다.","returnTo":{"lessonId":"IPE-2027-L028","sectionId":"IPE-2027-L028-S03"}}],"inputBlocks":[{"type":"table","headers":["id","score"],"rows":[["1","90"],["2","90"],["3","70"]],"caption":"순위입력"}]},{"id":"IPE-2027-R-Q029","lessonId":"IPE-2027-L029","prompt":"행 단위 AFTER UPDATE트리거다. 한 UPDATE가3행을 실제 수정하면 몇 회 실행되는가?","correctOptionId":"IPE-2027-R-Q029-D","assetIds":[],"options":[{"id":"IPE-2027-R-Q029-A","text":"0"},{"id":"IPE-2027-R-Q029-B","text":"1"},{"id":"IPE-2027-R-Q029-C","text":"2"},{"id":"IPE-2027-R-Q029-D","text":"3"}],"optionReasons":[{"optionId":"IPE-2027-R-Q029-A","text":"수정 사건이 발생한다.","returnTo":{"lessonId":"IPE-2027-L029","sectionId":"IPE-2027-L029-S03"}},{"optionId":"IPE-2027-R-Q029-B","text":"문장단위와 다르다.","returnTo":{"lessonId":"IPE-2027-L029","sectionId":"IPE-2027-L029-S03"}},{"optionId":"IPE-2027-R-Q029-C","text":"수정행 수와 맞지 않는다.","returnTo":{"lessonId":"IPE-2027-L029","sectionId":"IPE-2027-L029-S03"}},{"optionId":"IPE-2027-R-Q029-D","text":"행마다1회씩3회다.","returnTo":{"lessonId":"IPE-2027-L029","sectionId":"IPE-2027-L029-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q030","lessonId":"IPE-2027-L030","prompt":"주소 변경 직후1초 늦는 복제DB에서 이전 주소가 보이는 이유는?","correctOptionId":"IPE-2027-R-Q030-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q030-A","text":"정수오버플로"},{"id":"IPE-2027-R-Q030-B","text":"복제지연"},{"id":"IPE-2027-R-Q030-C","text":"키최소성"},{"id":"IPE-2027-R-Q030-D","text":"암호화만의 문제"}],"optionReasons":[{"optionId":"IPE-2027-R-Q030-A","text":"정수 계산 문제가 아니다.","returnTo":{"lessonId":"IPE-2027-L035","sectionId":"IPE-2027-L035-S01"}},{"optionId":"IPE-2027-R-Q030-B","text":"주DB변경이 복제에 아직 전파되지 않았을 수 있다.","returnTo":{"lessonId":"IPE-2027-L030","sectionId":"IPE-2027-L030-S03"}},{"optionId":"IPE-2027-R-Q030-C","text":"키 식별 조건과 다르다.","returnTo":{"lessonId":"IPE-2027-L019","sectionId":"IPE-2027-L019-S02"}},{"optionId":"IPE-2027-R-Q030-D","text":"복호화 실패 조건이 주어지지 않았다.","returnTo":{"lessonId":"IPE-2027-L030","sectionId":"IPE-2027-L030-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q031","lessonId":"IPE-2027-L031","prompt":"부가비용·빈공간을 무시할 때 페이지 수는?","correctOptionId":"IPE-2027-R-Q031-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q031-A","text":"80"},{"id":"IPE-2027-R-Q031-B","text":"100"},{"id":"IPE-2027-R-Q031-C","text":"125"},{"id":"IPE-2027-R-Q031-D","text":"1000"}],"optionReasons":[{"optionId":"IPE-2027-R-Q031-A","text":"80은페이지당행수다.","returnTo":{"lessonId":"IPE-2027-L031","sectionId":"IPE-2027-L031-S03"}},{"optionId":"IPE-2027-R-Q031-B","text":"100페이지는8000행이다.","returnTo":{"lessonId":"IPE-2027-L031","sectionId":"IPE-2027-L031-S03"}},{"optionId":"IPE-2027-R-Q031-C","text":"8000/100=80행씩10000/80=125페이지다.","returnTo":{"lessonId":"IPE-2027-L031","sectionId":"IPE-2027-L031-S03"}},{"optionId":"IPE-2027-R-Q031-D","text":"단위와 계산을 잘못 섞었다.","returnTo":{"lessonId":"IPE-2027-L031","sectionId":"IPE-2027-L031-S03"}}],"inputBlocks":[{"type":"table","headers":["행수","행당크기","페이지용량"],"rows":[["10000","100B","8000B"]],"caption":"저장조건"}]},{"id":"IPE-2027-R-Q032","lessonId":"IPE-2027-L032","prompt":"허용 데이터 손실 시점의 차이를 나타내는 것은?","correctOptionId":"IPE-2027-R-Q032-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q032-A","text":"RPO"},{"id":"IPE-2027-R-Q032-B","text":"RTO"},{"id":"IPE-2027-R-Q032-C","text":"인덱스"},{"id":"IPE-2027-R-Q032-D","text":"UML"}],"optionReasons":[{"optionId":"IPE-2027-R-Q032-A","text":"RPO는 허용 데이터 손실 목표다.","returnTo":{"lessonId":"IPE-2027-L032","sectionId":"IPE-2027-L032-S02"}},{"optionId":"IPE-2027-R-Q032-B","text":"RTO는 복구까지 허용시간이다.","returnTo":{"lessonId":"IPE-2027-L032","sectionId":"IPE-2027-L032-S02"}},{"optionId":"IPE-2027-R-Q032-C","text":"인덱스는데이터탐색을돕는구조이며복구시점목표가아니다.","returnTo":{"lessonId":"IPE-2027-L026","sectionId":"IPE-2027-L026-S02"}},{"optionId":"IPE-2027-R-Q032-D","text":"모델링 표기다.","returnTo":{"lessonId":"IPE-2027-L002","sectionId":"IPE-2027-L002-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q033","lessonId":"IPE-2027-L033","prompt":"검사 고객 행수를 분모로 한 중복 오류율은?","correctOptionId":"IPE-2027-R-Q033-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q033-A","text":"0.05%"},{"id":"IPE-2027-R-Q033-B","text":"0.5%"},{"id":"IPE-2027-R-Q033-C","text":"2%"},{"id":"IPE-2027-R-Q033-D","text":"5%"}],"optionReasons":[{"optionId":"IPE-2027-R-Q033-A","text":"5/1000×100은0.5다.","returnTo":{"lessonId":"IPE-2027-L033","sectionId":"IPE-2027-L033-S03"}},{"optionId":"IPE-2027-R-Q033-B","text":"5/1000×100=0.5%다.","returnTo":{"lessonId":"IPE-2027-L033","sectionId":"IPE-2027-L033-S03"}},{"optionId":"IPE-2027-R-Q033-C","text":"2%는 전화누락률이다.","returnTo":{"lessonId":"IPE-2027-L033","sectionId":"IPE-2027-L033-S03"}},{"optionId":"IPE-2027-R-Q033-D","text":"5%는50행이어야한다.","returnTo":{"lessonId":"IPE-2027-L033","sectionId":"IPE-2027-L033-S03"}}],"inputBlocks":[{"type":"table","headers":["검사행","중복","전화누락"],"rows":[["1000","5","20"]],"caption":"품질검사"}]},{"id":"IPE-2027-R-Q034","lessonId":"IPE-2027-L034","prompt":"실패한 집계 배치의 재실행 설계로 적절한 것은?","correctOptionId":"IPE-2027-R-Q034-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q034-A","text":"항상 다시 더함"},{"id":"IPE-2027-R-Q034-B","text":"작업식별과 중복반영방지"},{"id":"IPE-2027-R-Q034-C","text":"실패를 성공 표시"},{"id":"IPE-2027-R-Q034-D","text":"검증제거"}],"optionReasons":[{"optionId":"IPE-2027-R-Q034-A","text":"이중 집계될 수 있다.","returnTo":{"lessonId":"IPE-2027-L034","sectionId":"IPE-2027-L034-S02"}},{"optionId":"IPE-2027-R-Q034-B","text":"체크포인트·집계교체 등 재실행 효과를 정한다.","returnTo":{"lessonId":"IPE-2027-L034","sectionId":"IPE-2027-L034-S02"}},{"optionId":"IPE-2027-R-Q034-C","text":"복구 판단을 숨긴다.","returnTo":{"lessonId":"IPE-2027-L034","sectionId":"IPE-2027-L034-S02"}},{"optionId":"IPE-2027-R-Q034-D","text":"배치도 입력 검증이 필요하다.","returnTo":{"lessonId":"IPE-2027-L034","sectionId":"IPE-2027-L034-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q035","lessonId":"IPE-2027-L035","prompt":"C17의 출력은? int범위 안의 양수만 사용한다.","correctOptionId":"IPE-2027-R-Q035-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q035-A","text":"3 1"},{"id":"IPE-2027-R-Q035-B","text":"3.5 0"},{"id":"IPE-2027-R-Q035-C","text":"4 1"},{"id":"IPE-2027-R-Q035-D","text":"3 0"}],"optionReasons":[{"optionId":"IPE-2027-R-Q035-A","text":"7/2=3,7%2=1이다.","returnTo":{"lessonId":"IPE-2027-L035","sectionId":"IPE-2027-L035-S03"}},{"optionId":"IPE-2027-R-Q035-B","text":"정수 나눗셈이다.","returnTo":{"lessonId":"IPE-2027-L035","sectionId":"IPE-2027-L035-S03"}},{"optionId":"IPE-2027-R-Q035-C","text":"반올림해4가 되지 않는다.","returnTo":{"lessonId":"IPE-2027-L035","sectionId":"IPE-2027-L035-S03"}},{"optionId":"IPE-2027-R-Q035-D","text":"나머지는1이다.","returnTo":{"lessonId":"IPE-2027-L035","sectionId":"IPE-2027-L035-S03"}}],"inputBlocks":[{"type":"code","text":"int a=7,b=2;\nprintf(\"%d %d\",a/b,a%b);","language":"c"}]},{"id":"IPE-2027-R-Q036","lessonId":"IPE-2027-L036","prompt":"C17 코드의 출력은?","correctOptionId":"IPE-2027-R-Q036-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q036-A","text":"3"},{"id":"IPE-2027-R-Q036-B","text":"6"},{"id":"IPE-2027-R-Q036-C","text":"7"},{"id":"IPE-2027-R-Q036-D","text":"10"}],"optionReasons":[{"optionId":"IPE-2027-R-Q036-A","text":"1+2의중간값이다.","returnTo":{"lessonId":"IPE-2027-L036","sectionId":"IPE-2027-L036-S03"}},{"optionId":"IPE-2027-R-Q036-B","text":"마지막4까지포함한다.","returnTo":{"lessonId":"IPE-2027-L036","sectionId":"IPE-2027-L036-S03"}},{"optionId":"IPE-2027-R-Q036-C","text":"i3을건너뛰어1+2+4=7이다.","returnTo":{"lessonId":"IPE-2027-L036","sectionId":"IPE-2027-L036-S03"}},{"optionId":"IPE-2027-R-Q036-D","text":"continue를무시한합이다.","returnTo":{"lessonId":"IPE-2027-L036","sectionId":"IPE-2027-L036-S03"}}],"inputBlocks":[{"type":"code","text":"int s=0;\nfor(int i=1;i<=4;i++){\n if(i==3) continue;\n s+=i;\n}\nprintf(\"%d\",s);","language":"c"}]},{"id":"IPE-2027-R-Q037","lessonId":"IPE-2027-L037","prompt":"C17 코드의 출력은?","correctOptionId":"IPE-2027-R-Q037-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q037-A","text":"11"},{"id":"IPE-2027-R-Q037-B","text":"13"},{"id":"IPE-2027-R-Q037-C","text":"16"},{"id":"IPE-2027-R-Q037-D","text":"20"}],"optionReasons":[{"optionId":"IPE-2027-R-Q037-A","text":"4+7을 잘못 선택했다.","returnTo":{"lessonId":"IPE-2027-L037","sectionId":"IPE-2027-L037-S03"}},{"optionId":"IPE-2027-R-Q037-B","text":"4+9를 잘못 선택했다.","returnTo":{"lessonId":"IPE-2027-L037","sectionId":"IPE-2027-L037-S03"}},{"optionId":"IPE-2027-R-Q037-C","text":"p+1은두번째7,a[2]는9라16이다.","returnTo":{"lessonId":"IPE-2027-L037","sectionId":"IPE-2027-L037-S03"}},{"optionId":"IPE-2027-R-Q037-D","text":"모든원소를더하는코드가아니다.","returnTo":{"lessonId":"IPE-2027-L037","sectionId":"IPE-2027-L037-S03"}}],"inputBlocks":[{"type":"code","text":"int a[]={4,7,9};\nint *p=a;\nprintf(\"%d\",*(p+1)+a[2]);","language":"c"}]},{"id":"IPE-2027-R-Q038","lessonId":"IPE-2027-L038","prompt":"Java17의 main 내부 코드가 출력하는 값은?","correctOptionId":"IPE-2027-R-Q038-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q038-A","text":"2"},{"id":"IPE-2027-R-Q038-B","text":"5"},{"id":"IPE-2027-R-Q038-C","text":"7"},{"id":"IPE-2027-R-Q038-D","text":"컴파일오류"}],"optionReasons":[{"optionId":"IPE-2027-R-Q038-A","text":"선언타입만보고계산한값이다.","returnTo":{"lessonId":"IPE-2027-L038","sectionId":"IPE-2027-L038-S03"}},{"optionId":"IPE-2027-R-Q038-B","text":"실제객체B의인스턴스f가선택돼5다.","returnTo":{"lessonId":"IPE-2027-L038","sectionId":"IPE-2027-L038-S03"}},{"optionId":"IPE-2027-R-Q038-C","text":"두메서드를더하지않는다.","returnTo":{"lessonId":"IPE-2027-L038","sectionId":"IPE-2027-L038-S03"}},{"optionId":"IPE-2027-R-Q038-D","text":"상위타입참조가하위객체를가리킬수있다.","returnTo":{"lessonId":"IPE-2027-L038","sectionId":"IPE-2027-L038-S03"}}],"inputBlocks":[{"type":"code","text":"class A { int f(){return 2;} }\nclass B extends A { @Override int f(){return 5;} }\n// main 내부\nA x=new B();\nSystem.out.print(x.f());","language":"java"}]},{"id":"IPE-2027-R-Q039","lessonId":"IPE-2027-L039","prompt":"Python3.11 실행 뒤 a,c는?","correctOptionId":"IPE-2027-R-Q039-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q039-A","text":"[2,4,6,8] / [4,6]"},{"id":"IPE-2027-R-Q039-B","text":"[9,4,6,8] / [4,6]"},{"id":"IPE-2027-R-Q039-C","text":"[9,4,6,8] / [4,6,8]"},{"id":"IPE-2027-R-Q039-D","text":"[9,4,6,8] / [9,4]"}],"optionReasons":[{"optionId":"IPE-2027-R-Q039-A","text":"b=a이므로a도수정된다.","returnTo":{"lessonId":"IPE-2027-L039","sectionId":"IPE-2027-L039-S03"}},{"optionId":"IPE-2027-R-Q039-B","text":"같은객체를통해a가바뀌고c는1~2번의새리스트다.","returnTo":{"lessonId":"IPE-2027-L039","sectionId":"IPE-2027-L039-S03"}},{"optionId":"IPE-2027-R-Q039-C","text":"슬라이스끝3은제외다.","returnTo":{"lessonId":"IPE-2027-L039","sectionId":"IPE-2027-L039-S03"}},{"optionId":"IPE-2027-R-Q039-D","text":"슬라이스시작1에서4를읽는다.","returnTo":{"lessonId":"IPE-2027-L039","sectionId":"IPE-2027-L039-S03"}}],"inputBlocks":[{"type":"code","text":"a=[2,4,6,8]\nb=a\nc=a[1:3]\nb[0]=9","language":"python"}]},{"id":"IPE-2027-R-Q040","lessonId":"IPE-2027-L040","prompt":"C의 int add(int,int);가 알리는 것은?","correctOptionId":"IPE-2027-R-Q040-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q040-A","text":"인자·반환타입"},{"id":"IPE-2027-R-Q040-B","text":"화면색상"},{"id":"IPE-2027-R-Q040-C","text":"함수의 실제 구현 본문"},{"id":"IPE-2027-R-Q040-D","text":"실제반환숫자"}],"optionReasons":[{"optionId":"IPE-2027-R-Q040-A","text":"int반환·int인자둘이라는함수선언이다.","returnTo":{"lessonId":"IPE-2027-L040","sectionId":"IPE-2027-L040-S02"}},{"optionId":"IPE-2027-R-Q040-B","text":"화면시제품문맥이아니다.","returnTo":{"lessonId":"IPE-2027-L040","sectionId":"IPE-2027-L040-S02"}},{"optionId":"IPE-2027-R-Q040-C","text":"함수프로토타입은반환타입·인자타입같은호출정보를알리는선언이며실제연산을수행하는구현본문이아니다.","returnTo":{"lessonId":"IPE-2027-L040","sectionId":"IPE-2027-L040-S02"}},{"optionId":"IPE-2027-R-Q040-D","text":"입력과구현없이어떤숫자인지알수없다.","returnTo":{"lessonId":"IPE-2027-L040","sectionId":"IPE-2027-L040-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q041","lessonId":"IPE-2027-L041","prompt":"빈 스택에서 두 pop의 반환값은?","correctOptionId":"IPE-2027-R-Q041-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q041-A","text":"A,B"},{"id":"IPE-2027-R-Q041-B","text":"B,C"},{"id":"IPE-2027-R-Q041-C","text":"C,B"},{"id":"IPE-2027-R-Q041-D","text":"A,C"}],"optionReasons":[{"optionId":"IPE-2027-R-Q041-A","text":"FIFO처럼읽었다.","returnTo":{"lessonId":"IPE-2027-L041","sectionId":"IPE-2027-L041-S03"}},{"optionId":"IPE-2027-R-Q041-B","text":"최근B를먼저꺼내고다음에넣은C를꺼낸다.","returnTo":{"lessonId":"IPE-2027-L041","sectionId":"IPE-2027-L041-S03"}},{"optionId":"IPE-2027-R-Q041-C","text":"첫pop때C는아직없다.","returnTo":{"lessonId":"IPE-2027-L041","sectionId":"IPE-2027-L041-S03"}},{"optionId":"IPE-2027-R-Q041-D","text":"첫pop은B다.","returnTo":{"lessonId":"IPE-2027-L041","sectionId":"IPE-2027-L041-S03"}}],"inputBlocks":[{"type":"table","headers":["순서","연산"],"rows":[["1","push(A)"],["2","push(B)"],["3","pop"],["4","push(C)"],["5","pop"]],"caption":"LIFO연산"}]},{"id":"IPE-2027-R-Q042","lessonId":"IPE-2027-L042","prompt":"그림을 중위 순회한 결과는?","correctOptionId":"IPE-2027-R-Q042-B","assetIds":["IPE-2027-FIG-TREE-ABCDE"],"options":[{"id":"IPE-2027-R-Q042-A","text":"A B D E C"},{"id":"IPE-2027-R-Q042-B","text":"D B E A C"},{"id":"IPE-2027-R-Q042-C","text":"D E B C A"},{"id":"IPE-2027-R-Q042-D","text":"A B C D E"}],"optionReasons":[{"optionId":"IPE-2027-R-Q042-A","text":"전위다.","returnTo":{"lessonId":"IPE-2027-L042","sectionId":"IPE-2027-L042-S04"}},{"optionId":"IPE-2027-R-Q042-B","text":"왼쪽D B E→루트A→오른쪽C다.","returnTo":{"lessonId":"IPE-2027-L042","sectionId":"IPE-2027-L042-S04"}},{"optionId":"IPE-2027-R-Q042-C","text":"후위다.","returnTo":{"lessonId":"IPE-2027-L042","sectionId":"IPE-2027-L042-S04"}},{"optionId":"IPE-2027-R-Q042-D","text":"층별BFS다.","returnTo":{"lessonId":"IPE-2027-L042","sectionId":"IPE-2027-L042-S04"}}],"inputBlocks":[{"type":"diagram","assetId":"IPE-2027-FIG-TREE-ABCDE"}]},{"id":"IPE-2027-R-Q043","lessonId":"IPE-2027-L043","prompt":"선택정렬 첫 단계는 전체 최솟값과 첫 원소 교환이다. 결과는?","correctOptionId":"IPE-2027-R-Q043-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q043-A","text":"2,5,4,1"},{"id":"IPE-2027-R-Q043-B","text":"1,2,4,5"},{"id":"IPE-2027-R-Q043-C","text":"5,2,1,4"},{"id":"IPE-2027-R-Q043-D","text":"1,4,2,5"}],"optionReasons":[{"optionId":"IPE-2027-R-Q043-A","text":"삽입정렬첫단계와가깝다.","returnTo":{"lessonId":"IPE-2027-L043","sectionId":"IPE-2027-L043-S03"}},{"optionId":"IPE-2027-R-Q043-B","text":"최소1과처음5를교환한다.","returnTo":{"lessonId":"IPE-2027-L043","sectionId":"IPE-2027-L043-S03"}},{"optionId":"IPE-2027-R-Q043-C","text":"최소를처음으로옮기지않았다.","returnTo":{"lessonId":"IPE-2027-L043","sectionId":"IPE-2027-L043-S03"}},{"optionId":"IPE-2027-R-Q043-D","text":"2와4를바꿀근거가없다.","returnTo":{"lessonId":"IPE-2027-L043","sectionId":"IPE-2027-L043-S03"}}],"inputBlocks":[{"type":"table","headers":["인덱스","0","1","2","3"],"rows":[["초기배열","5","2","4","1"]],"caption":"정렬입력"}]},{"id":"IPE-2027-R-Q044","lessonId":"IPE-2027-L044","prompt":"FIFO 페이지부재 횟수는?","correctOptionId":"IPE-2027-R-Q044-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q044-A","text":"3"},{"id":"IPE-2027-R-Q044-B","text":"4"},{"id":"IPE-2027-R-Q044-C","text":"5"},{"id":"IPE-2027-R-Q044-D","text":"6"}],"optionReasons":[{"optionId":"IPE-2027-R-Q044-A","text":"마지막4에서도부재다.","returnTo":{"lessonId":"IPE-2027-L044","sectionId":"IPE-2027-L044-S04"}},{"optionId":"IPE-2027-R-Q044-B","text":"1,2,3부재→1적중→4부재로4회다.","returnTo":{"lessonId":"IPE-2027-L044","sectionId":"IPE-2027-L044-S04"}},{"optionId":"IPE-2027-R-Q044-C","text":"두번째1은적중이다.","returnTo":{"lessonId":"IPE-2027-L044","sectionId":"IPE-2027-L044-S04"}},{"optionId":"IPE-2027-R-Q044-D","text":"참조가5회라부재6회일수없다.","returnTo":{"lessonId":"IPE-2027-L044","sectionId":"IPE-2027-L044-S04"}}],"inputBlocks":[{"type":"table","headers":["프레임","초기","참조열"],"rows":[["3","모두빈상태","1,2,3,1,4"]],"caption":"FIFO입력"}]},{"id":"IPE-2027-R-Q045","lessonId":"IPE-2027-L045","prompt":"모두0에 도착했다. 간트차트의 B대기시간은?","correctOptionId":"IPE-2027-R-Q045-C","assetIds":["IPE-2027-FIG-FCFS-GANTT"],"options":[{"id":"IPE-2027-R-Q045-A","text":"0"},{"id":"IPE-2027-R-Q045-B","text":"2"},{"id":"IPE-2027-R-Q045-C","text":"3"},{"id":"IPE-2027-R-Q045-D","text":"5"}],"optionReasons":[{"optionId":"IPE-2027-R-Q045-A","text":"A를기다려야한다.","returnTo":{"lessonId":"IPE-2027-L045","sectionId":"IPE-2027-L045-S04"}},{"optionId":"IPE-2027-R-Q045-B","text":"B실행시간이다.","returnTo":{"lessonId":"IPE-2027-L045","sectionId":"IPE-2027-L045-S04"}},{"optionId":"IPE-2027-R-Q045-C","text":"B시작3-도착0=3이다.","returnTo":{"lessonId":"IPE-2027-L045","sectionId":"IPE-2027-L045-S04"}},{"optionId":"IPE-2027-R-Q045-D","text":"완료시각이다.","returnTo":{"lessonId":"IPE-2027-L045","sectionId":"IPE-2027-L045-S04"}}],"inputBlocks":[{"type":"diagram","assetId":"IPE-2027-FIG-FCFS-GANTT"}]},{"id":"IPE-2027-R-Q046","lessonId":"IPE-2027-L046","prompt":"일반파일 권한640의 그룹 권한은?","correctOptionId":"IPE-2027-R-Q046-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q046-A","text":"읽기만"},{"id":"IPE-2027-R-Q046-B","text":"읽기쓰기"},{"id":"IPE-2027-R-Q046-C","text":"실행만"},{"id":"IPE-2027-R-Q046-D","text":"권한없음"}],"optionReasons":[{"optionId":"IPE-2027-R-Q046-A","text":"가운데4는읽기비트다.","returnTo":{"lessonId":"IPE-2027-L046","sectionId":"IPE-2027-L046-S03"}},{"optionId":"IPE-2027-R-Q046-B","text":"6은소유자권한이다.","returnTo":{"lessonId":"IPE-2027-L046","sectionId":"IPE-2027-L046-S03"}},{"optionId":"IPE-2027-R-Q046-C","text":"실행비트는1이다.","returnTo":{"lessonId":"IPE-2027-L046","sectionId":"IPE-2027-L046-S03"}},{"optionId":"IPE-2027-R-Q046-D","text":"기타의0과혼동했다.","returnTo":{"lessonId":"IPE-2027-L046","sectionId":"IPE-2027-L046-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q047","lessonId":"IPE-2027-L047","prompt":"라우터가 경로 선택에 주로 이용하는 주소는?","correctOptionId":"IPE-2027-R-Q047-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q047-A","text":"MAC주소"},{"id":"IPE-2027-R-Q047-B","text":"IP주소"},{"id":"IPE-2027-R-Q047-C","text":"TCP 포트번호"},{"id":"IPE-2027-R-Q047-D","text":"도메인 이름"}],"optionReasons":[{"optionId":"IPE-2027-R-Q047-A","text":"MAC주소는주로같은링크의전달과스위치에서쓰인다. 라우터의네트워크경로는IP로판단한다.","returnTo":{"lessonId":"IPE-2027-L047","sectionId":"IPE-2027-L047-S02"}},{"optionId":"IPE-2027-R-Q047-B","text":"라우터는목적지IP주소와경로표를이용해네트워크사이경로를선택한다.","returnTo":{"lessonId":"IPE-2027-L047","sectionId":"IPE-2027-L047-S02"}},{"optionId":"IPE-2027-R-Q047-C","text":"TCP포트는종단의응용을구별하는정보다. IP경로선택주소와다르다.","returnTo":{"lessonId":"IPE-2027-L049","sectionId":"IPE-2027-L049-S01"}},{"optionId":"IPE-2027-R-Q047-D","text":"도메인이름은DNS로주소등을조회할때사용하며라우팅표의IP프리픽스를대신하지않는다.","returnTo":{"lessonId":"IPE-2027-L049","sectionId":"IPE-2027-L049-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q048","lessonId":"IPE-2027-L048","prompt":"표의 IPv4주소와 마스크에 대한 네트워크/브로드캐스트주소는? 보기의 앞 세 옥텟은192.168.1로 공통이다.","correctOptionId":"IPE-2027-R-Q048-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q048-A","text":".0/.255"},{"id":"IPE-2027-R-Q048-B","text":".128/.191"},{"id":"IPE-2027-R-Q048-C","text":".129/.190"},{"id":"IPE-2027-R-Q048-D","text":".130/.192"}],"optionReasons":[{"optionId":"IPE-2027-R-Q048-A","text":"/24범위다.","returnTo":{"lessonId":"IPE-2027-L048","sectionId":"IPE-2027-L048-S04"}},{"optionId":"IPE-2027-R-Q048-B","text":"130AND192=128,호스트6비트를1로하면191이다.","returnTo":{"lessonId":"IPE-2027-L048","sectionId":"IPE-2027-L048-S04"}},{"optionId":"IPE-2027-R-Q048-C","text":"호스트범위양끝이다.","returnTo":{"lessonId":"IPE-2027-L048","sectionId":"IPE-2027-L048-S04"}},{"optionId":"IPE-2027-R-Q048-D","text":"현재호스트와다음블록시작을혼동했다.","returnTo":{"lessonId":"IPE-2027-L048","sectionId":"IPE-2027-L048-S04"}}],"inputBlocks":[{"type":"table","headers":["대상","주소/마스크","마지막옥텟비트"],"rows":[["호스트","192.168.1.130","10000010"],["마스크","255.255.255.192 (/26)","11000000"]],"caption":"주소와 마스크"}]},{"id":"IPE-2027-R-Q049","lessonId":"IPE-2027-L049","prompt":"도메인 이름의 IP주소 등 자원레코드를 찾는 서비스는?","correctOptionId":"IPE-2027-R-Q049-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q049-A","text":"DNS"},{"id":"IPE-2027-R-Q049-B","text":"TCP"},{"id":"IPE-2027-R-Q049-C","text":"RAID"},{"id":"IPE-2027-R-Q049-D","text":"UML"}],"optionReasons":[{"optionId":"IPE-2027-R-Q049-A","text":"이름에대한자원정보를조회한다.","returnTo":{"lessonId":"IPE-2027-L049","sectionId":"IPE-2027-L049-S02"}},{"optionId":"IPE-2027-R-Q049-B","text":"전송프로토콜이다.","returnTo":{"lessonId":"IPE-2027-L049","sectionId":"IPE-2027-L049-S01"}},{"optionId":"IPE-2027-R-Q049-C","text":"디스크구성이다.","returnTo":{"lessonId":"IPE-2027-L052","sectionId":"IPE-2027-L052-S01"}},{"optionId":"IPE-2027-R-Q049-D","text":"모델링표기다.","returnTo":{"lessonId":"IPE-2027-L002","sectionId":"IPE-2027-L002-S01"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q050","lessonId":"IPE-2027-L050","prompt":"표에서 인터넷→DB5432 직접 접속은?","correctOptionId":"IPE-2027-R-Q050-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q050-A","text":"허용"},{"id":"IPE-2027-R-Q050-B","text":"거절"},{"id":"IPE-2027-R-Q050-C","text":"회원이면허용"},{"id":"IPE-2027-R-Q050-D","text":"웹443과동일"}],"optionReasons":[{"optionId":"IPE-2027-R-Q050-A","text":"해당행은거절이다.","returnTo":{"lessonId":"IPE-2027-L050","sectionId":"IPE-2027-L050-S03"}},{"optionId":"IPE-2027-R-Q050-B","text":"인터넷출발DB직접접속은아니오다.","returnTo":{"lessonId":"IPE-2027-L050","sectionId":"IPE-2027-L050-S03"}},{"optionId":"IPE-2027-R-Q050-C","text":"회원인증과네트워크정책은별개다.","returnTo":{"lessonId":"IPE-2027-L054","sectionId":"IPE-2027-L054-S02"}},{"optionId":"IPE-2027-R-Q050-D","text":"웹허용을DB로확장하지않는다.","returnTo":{"lessonId":"IPE-2027-L050","sectionId":"IPE-2027-L050-S03"}}],"inputBlocks":[{"type":"table","headers":["출발","목적","허용"],"rows":[["인터넷","웹443","예"],["인터넷","DB5432","아니오"],["업무서버","DB5432","필요경로"]],"caption":"정책표"}]},{"id":"IPE-2027-R-Q051","lessonId":"IPE-2027-L051","prompt":"IaaS의 일반적 제공 범위는?","correctOptionId":"IPE-2027-R-Q051-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q051-A","text":"완성메일만"},{"id":"IPE-2027-R-Q051-B","text":"서버·저장·네트워크"},{"id":"IPE-2027-R-Q051-C","text":"계정책임모두면제"},{"id":"IPE-2027-R-Q051-D","text":"보안검증완료증명"}],"optionReasons":[{"optionId":"IPE-2027-R-Q051-A","text":"SaaS에가깝다.","returnTo":{"lessonId":"IPE-2027-L051","sectionId":"IPE-2027-L051-S01"}},{"optionId":"IPE-2027-R-Q051-B","text":"기반자원을제공한다.","returnTo":{"lessonId":"IPE-2027-L051","sectionId":"IPE-2027-L051-S01"}},{"optionId":"IPE-2027-R-Q051-C","text":"사용자책임이모두사라지지않는다.","returnTo":{"lessonId":"IPE-2027-L051","sectionId":"IPE-2027-L051-S01"}},{"optionId":"IPE-2027-R-Q051-D","text":"자원제공은보안수용증명이아니다.","returnTo":{"lessonId":"IPE-2027-L051","sectionId":"IPE-2027-L051-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q052","lessonId":"IPE-2027-L052","prompt":"1000분 중 장애10분을 포함해 관측했다. 가용성은?","correctOptionId":"IPE-2027-R-Q052-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q052-A","text":"90%"},{"id":"IPE-2027-R-Q052-B","text":"95%"},{"id":"IPE-2027-R-Q052-C","text":"99%"},{"id":"IPE-2027-R-Q052-D","text":"99.9%"}],"optionReasons":[{"optionId":"IPE-2027-R-Q052-A","text":"장애는1%다.","returnTo":{"lessonId":"IPE-2027-L052","sectionId":"IPE-2027-L052-S03"}},{"optionId":"IPE-2027-R-Q052-B","text":"990/1000은0.99다.","returnTo":{"lessonId":"IPE-2027-L052","sectionId":"IPE-2027-L052-S03"}},{"optionId":"IPE-2027-R-Q052-C","text":"정상990/전체1000×100=99%다.","returnTo":{"lessonId":"IPE-2027-L052","sectionId":"IPE-2027-L052-S03"}},{"optionId":"IPE-2027-R-Q052-D","text":"장애1분일때의비율이다.","returnTo":{"lessonId":"IPE-2027-L052","sectionId":"IPE-2027-L052-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q053","lessonId":"IPE-2027-L053","prompt":"두 시스템의 status=1 의미가 정상/탈퇴로 다르다. 필요한 것은?","correctOptionId":"IPE-2027-R-Q053-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q053-A","text":"그대로복사"},{"id":"IPE-2027-R-Q053-B","text":"의미매핑·검증"},{"id":"IPE-2027-R-Q053-C","text":"모두0"},{"id":"IPE-2027-R-Q053-D","text":"이름만통일"}],"optionReasons":[{"optionId":"IPE-2027-R-Q053-A","text":"정수타입일치가의미일치가아니다.","returnTo":{"lessonId":"IPE-2027-L053","sectionId":"IPE-2027-L053-S03"}},{"optionId":"IPE-2027-R-Q053-B","text":"업무뜻을대조하고값변환·예외를검증한다.","returnTo":{"lessonId":"IPE-2027-L053","sectionId":"IPE-2027-L053-S03"}},{"optionId":"IPE-2027-R-Q053-C","text":"정보훼손이다.","returnTo":{"lessonId":"IPE-2027-L053","sectionId":"IPE-2027-L053-S03"}},{"optionId":"IPE-2027-R-Q053-D","text":"표기일치만으로의미가맞지않는다.","returnTo":{"lessonId":"IPE-2027-L053","sectionId":"IPE-2027-L053-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q054","lessonId":"IPE-2027-L054","prompt":"로그인 A가 B주문을 조회하려 한다. 서버가 확인할 것은?","correctOptionId":"IPE-2027-R-Q054-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q054-A","text":"화면색"},{"id":"IPE-2027-R-Q054-B","text":"소유권·허용권한"},{"id":"IPE-2027-R-Q054-C","text":"번호길이만"},{"id":"IPE-2027-R-Q054-D","text":"버튼숨김만"}],"optionReasons":[{"optionId":"IPE-2027-R-Q054-A","text":"인가근거가아니다.","returnTo":{"lessonId":"IPE-2027-L054","sectionId":"IPE-2027-L054-S03"}},{"optionId":"IPE-2027-R-Q054-B","text":"인증뒤에도해당자원인가가필요하다.","returnTo":{"lessonId":"IPE-2027-L054","sectionId":"IPE-2027-L054-S03"}},{"optionId":"IPE-2027-R-Q054-C","text":"난수번호가권한검사를대신하지않는다.","returnTo":{"lessonId":"IPE-2027-L054","sectionId":"IPE-2027-L054-S03"}},{"optionId":"IPE-2027-R-Q054-D","text":"직접요청을막지못한다.","returnTo":{"lessonId":"IPE-2027-L054","sectionId":"IPE-2027-L054-S03"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q055","lessonId":"IPE-2027-L055","prompt":"SQL 값 전달의 올바른 원칙은?","correctOptionId":"IPE-2027-R-Q055-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q055-A","text":"문자열결합"},{"id":"IPE-2027-R-Q055-B","text":"매개변수화"},{"id":"IPE-2027-R-Q055-C","text":"공백만삭제"},{"id":"IPE-2027-R-Q055-D","text":"비밀번호오류출력"}],"optionReasons":[{"optionId":"IPE-2027-R-Q055-A","text":"입력이구문이될위험이있다.","returnTo":{"lessonId":"IPE-2027-L055","sectionId":"IPE-2027-L055-S02"}},{"optionId":"IPE-2027-R-Q055-B","text":"드라이버로값과SQL구조를분리한다.","returnTo":{"lessonId":"IPE-2027-L055","sectionId":"IPE-2027-L055-S02"}},{"optionId":"IPE-2027-R-Q055-C","text":"모든우회를막지못한다.","returnTo":{"lessonId":"IPE-2027-L055","sectionId":"IPE-2027-L055-S01"}},{"optionId":"IPE-2027-R-Q055-D","text":"민감정보를노출한다.","returnTo":{"lessonId":"IPE-2027-L056","sectionId":"IPE-2027-L056-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q056","lessonId":"IPE-2027-L056","prompt":"로그인된 브라우저에 원치 않는 상태변경 요청을 유도하는 공격은?","correctOptionId":"IPE-2027-R-Q056-A","assetIds":[],"options":[{"id":"IPE-2027-R-Q056-A","text":"CSRF"},{"id":"IPE-2027-R-Q056-B","text":"FIFO"},{"id":"IPE-2027-R-Q056-C","text":"BCNF"},{"id":"IPE-2027-R-Q056-D","text":"페이징"}],"optionReasons":[{"optionId":"IPE-2027-R-Q056-A","text":"인증상태를악용한요청위조다.","returnTo":{"lessonId":"IPE-2027-L056","sectionId":"IPE-2027-L056-S02"}},{"optionId":"IPE-2027-R-Q056-B","text":"입출순서규칙이다.","returnTo":{"lessonId":"IPE-2027-L041","sectionId":"IPE-2027-L041-S02"}},{"optionId":"IPE-2027-R-Q056-C","text":"정규형이다.","returnTo":{"lessonId":"IPE-2027-L021","sectionId":"IPE-2027-L021-S02"}},{"optionId":"IPE-2027-R-Q056-D","text":"메모리관리기법이다.","returnTo":{"lessonId":"IPE-2027-L044","sectionId":"IPE-2027-L044-S02"}}],"inputBlocks":[]},{"id":"IPE-2027-R-Q057","lessonId":"IPE-2027-L057","prompt":"A가 만든 전자서명을 검증할 키는?","correctOptionId":"IPE-2027-R-Q057-A","assetIds":["IPE-2027-FIG-KEY-DIRECTIONS"],"options":[{"id":"IPE-2027-R-Q057-A","text":"A공개키"},{"id":"IPE-2027-R-Q057-B","text":"A개인키를B에게제공"},{"id":"IPE-2027-R-Q057-C","text":"B개인키"},{"id":"IPE-2027-R-Q057-D","text":"임의공개키"}],"optionReasons":[{"optionId":"IPE-2027-R-Q057-A","text":"서명자공개키로검증한다.","returnTo":{"lessonId":"IPE-2027-L057","sectionId":"IPE-2027-L057-S03"}},{"optionId":"IPE-2027-R-Q057-B","text":"개인키는비밀로보호한다.","returnTo":{"lessonId":"IPE-2027-L057","sectionId":"IPE-2027-L057-S02"}},{"optionId":"IPE-2027-R-Q057-C","text":"수신자복호키와다르다.","returnTo":{"lessonId":"IPE-2027-L057","sectionId":"IPE-2027-L057-S03"}},{"optionId":"IPE-2027-R-Q057-D","text":"서명자와연결된키여야한다.","returnTo":{"lessonId":"IPE-2027-L057","sectionId":"IPE-2027-L057-S03"}}],"inputBlocks":[{"type":"diagram","assetId":"IPE-2027-FIG-KEY-DIRECTIONS"}]},{"id":"IPE-2027-R-Q058","lessonId":"IPE-2027-L058","prompt":"표의 운영자에게 거절되는 작업은?","correctOptionId":"IPE-2027-R-Q058-C","assetIds":[],"options":[{"id":"IPE-2027-R-Q058-A","text":"읽기"},{"id":"IPE-2027-R-Q058-B","text":"복원"},{"id":"IPE-2027-R-Q058-C","text":"관리자지정"},{"id":"IPE-2027-R-Q058-D","text":"허용복원요청"}],"optionReasons":[{"optionId":"IPE-2027-R-Q058-A","text":"운영자읽기허용이다.","returnTo":{"lessonId":"IPE-2027-L058","sectionId":"IPE-2027-L058-S03"}},{"optionId":"IPE-2027-R-Q058-B","text":"복원허용이다.","returnTo":{"lessonId":"IPE-2027-L058","sectionId":"IPE-2027-L058-S03"}},{"optionId":"IPE-2027-R-Q058-C","text":"최고관리자만허용한다.","returnTo":{"lessonId":"IPE-2027-L058","sectionId":"IPE-2027-L058-S03"}},{"optionId":"IPE-2027-R-Q058-D","text":"복원범위내요청은허용된다.","returnTo":{"lessonId":"IPE-2027-L058","sectionId":"IPE-2027-L058-S03"}}],"inputBlocks":[{"type":"table","headers":["역할","읽기","복원","관리자지정"],"rows":[["회원","허용","거절","거절"],["운영자","허용","허용","거절"],["최고관리자","허용","허용","허용"]],"caption":"역할정책"}]},{"id":"IPE-2027-R-Q059","lessonId":"IPE-2027-L059","prompt":"로그의 반복실패 뒤 성공에 적절한 대응은?","correctOptionId":"IPE-2027-R-Q059-B","assetIds":[],"options":[{"id":"IPE-2027-R-Q059-A","text":"공격자신원확정"},{"id":"IPE-2027-R-Q059-B","text":"추가증거확인·조사"},{"id":"IPE-2027-R-Q059-C","text":"로그삭제"},{"id":"IPE-2027-R-Q059-D","text":"실패무시"}],"optionReasons":[{"optionId":"IPE-2027-R-Q059-A","text":"로그만으로신원을확정하지못한다.","returnTo":{"lessonId":"IPE-2027-L059","sectionId":"IPE-2027-L059-S03"}},{"optionId":"IPE-2027-R-Q059-B","text":"침해가능성단서로세션·접속·변경이력을확인한다.","returnTo":{"lessonId":"IPE-2027-L059","sectionId":"IPE-2027-L059-S03"}},{"optionId":"IPE-2027-R-Q059-C","text":"조사근거를보존한다.","returnTo":{"lessonId":"IPE-2027-L059","sectionId":"IPE-2027-L059-S03"}},{"optionId":"IPE-2027-R-Q059-D","text":"성공이전패턴도중요하다.","returnTo":{"lessonId":"IPE-2027-L059","sectionId":"IPE-2027-L059-S03"}}],"inputBlocks":[{"type":"table","headers":["구간","계정","실패","성공"],"rows":[["10:00~10:01","u1","40","아니오"],["10:02","u1","0","예"]],"caption":"로그집계"}]}],"assets":{"IPE-2027-FIG-UML-MULT":{"id":"IPE-2027-FIG-UML-MULT","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/af27c3904d62d7fe99e8e6247d4c1756ea23970fad8b9e7a890ee3ec636870d1.svg"],"alt":"고객과 주문을 연관선으로 연결. 고객 쪽 끝은1, 주문 쪽 끝은0..*.","caption":"클래스 관계의 다중성","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-UML-USECASE":{"id":"IPE-2027-FIG-UML-USECASE","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/278819bffb7e94aab8ee39acfddcf25dbdb3ea380079789e2670cf97cac6c2ad.svg"],"alt":"include 화살표는 주문하기에서 금액계산으로, extend 화살표는 쿠폰적용에서 주문하기로 향한다. 확장 조건은 사용 가능한 쿠폰이 있음이다.","caption":"include와 extend의 화살표","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-UML-SEQUENCE":{"id":"IPE-2027-FIG-UML-SEQUENCE","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/d93ca943e66ff1e12284b89ce1173e338bd603c3dc35349158b0a2c74fb300b0.svg"],"alt":"화면과 주문서비스의 생명선. 위쪽 취소요청은 화면에서 서비스로, 아래쪽 취소결과는 서비스에서 화면으로 향한다. 시간축은 아래쪽이다.","caption":"시간축을 가진 시퀀스","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-ER-ENROLL":{"id":"IPE-2027-FIG-ER-ENROLL","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/1669ea69758f36427e223ff4f72fbecfbd08f2bded24dbd53529d3fea0962ed2.svg"],"alt":"학생과 강좌 아래에 단일 수강 연결 테이블이 있다. 학생 기본키 학번, 강좌 기본키 강좌번호. 수강의 복합 기본키는 학번과 강좌번호이며 각각 외래키다. 양쪽 부모1개에 수강0개 이상이 연결된다.","caption":"N:M을 수강 연결 테이블로 바꾸기","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-TREE-ABCDE":{"id":"IPE-2027-FIG-TREE-ABCDE","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/cf00279e777e09c7f5b5ba46ea4975040e809ea8fa66b859dde3de61b5706660.svg"],"alt":"루트A의 왼쪽B, 오른쪽C. B의 왼쪽D, 오른쪽E. 나머지는 자식이 없다.","caption":"A부터 E까지 이진트리","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-FCFS-GANTT":{"id":"IPE-2027-FIG-FCFS-GANTT","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/021d0f638e4892e5bdc039092b06b6912235b0c57edca1ebcfb4b6eee347bc2e.svg"],"alt":"FCFS 간트차트: A는0부터3, B는3부터5, C는5부터6까지 실행. 모든 작업은0에 도착했고 교환 비용은0이다.","caption":"FCFS 실행 구간","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-KEY-DIRECTIONS":{"id":"IPE-2027-FIG-KEY-DIRECTIONS","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/99bf3d078736e57dfdfc352ba91548cefd5eb9047676ab4577d70026837b7c9d.svg"],"alt":"기밀 전달은 A가 B의 공개키를 활용해 보호하고 B가 자신의 개인키로 복호화. 서명은 A의 개인키로 생성하고 B가 A의 공개키로 검증. 서명만으로 본문은 숨겨지지 않는다.","caption":"기밀 전달과 서명 검증의 키 방향","states":[],"credit":"Moonlesson"},"IPE-2027-FIG-UML-RELATION-SYMBOLS":{"id":"IPE-2027-FIG-UML-RELATION-SYMBOLS","type":"diagram","mime":"image/svg+xml","files":["/reviews/_packages/information-processing-engineer/regular-20261030-r1/assets/a26470a3ad407614ed99004b620dbd9e153c072e2a05028d69f8655ab490c3e5.svg"],"alt":"일반화: 전기차에서 차량 쪽으로 빈 삼각형. 집합: 팀 쪽에 빈 마름모, 선수와 연결. 합성: 주문 쪽에 채운 마름모, 주문항목과 연결. 삼각형은 상위, 마름모는 전체 쪽이다.","caption":"UML 관계 기호와 붙는 쪽","states":[],"credit":"Moonlesson"}},"sources":{"qnet-2027-1453":{"id":"qnet-2027-1453","title":"정보처리기사 출제기준(2027.1.1~2029.12.31)","url":"https://www.q-net.or.kr/pageLink.do?link=cst/cstReport&jmCd=1320&mcrtrNo=1453","locator":"필기1~9쪽","scope":"공식 범위·적용기간·시험과목·문항수·시간; 본문과 사례는 별도 저작"},"python-3.11-tutorial":{"id":"python-3.11-tutorial","title":"Python3.11 Tutorial: Introduction","url":"https://docs.python.org/3.11/tutorial/introduction.html","scope":"수·슬라이스·리스트; 본문예제는별도저작"},"postgresql16-table":{"id":"postgresql16-table","title":"PostgreSQL16 Table Expressions","url":"https://www.postgresql.org/docs/16/queries-table-expressions.html","scope":"NULL행필터·조인·GROUP BY/HAVING의조건"},"postgresql16-window":{"id":"postgresql16-window","title":"PostgreSQL16 Window Functions","url":"https://www.postgresql.org/docs/16/tutorial-window.html","scope":"행유지·PARTITION·순위·프레임"},"java17-jls15":{"id":"java17-jls15","title":"Java SE17 Language Specification Ch15","url":"https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html","scope":"인스턴스메서드의실행시선택·필드/참조동등성구분"},"owasp-topten":{"id":"owasp-topten","title":"OWASP Top10 official project","url":"https://owasp.org/projects/top-ten","scope":"권한·입력·개발보안의공식기술참고. 문항빈도·공식시험정답의근거로단정하지않음"}}}
