---
title: Post Mortem 23.08.25
---
# 사후분석 : 포스 컨트롤 사용 안하는 부품 저장시 저장 안되는 문제
## 사후 분석 진행 순서
### 1. 결함 식별
- 결함이 발견된 시기와 장소:
- 결함 현상 :
- NPE에서 부품 편집후 저장 버튼 누르면 'Force Control 값이 범위에 벗어남' 에러가 발생하며 저장안되는데 포스관련UI는 보이지 않아서 수정이 불가.
- 임시조치방안 : 장비타입을 포스 지원하는 장비로 바꾼뒤에 포스 값 수정하고 저장해야 함.
- 결함 생성 :
- 7/10 NPE 트렁크 [artf120406]
- r62205 - XM520에서 Force Control 값 10000 넣고 SM411로 바꿔서 저장하면 저장되는 문제 수정. 하면서 발생.
- 결함 배포 :
- 7/14 4.6 브랜치 r62265 머지.
- 7/25 4.600.000.020 발행
- 결함 발견 :
- 7/24 통합검증시 김률 책임이 발견
- https://trello.com/c/L15dpUWq
- 결함이 발견된 시스템/모듈/기능:
- NPE
- 결함의 유형:
- 해당경우에는 부품저장이 안되는 A급 결함
### 2. 결함 분석
- 결함 발생 원인:
- 박현제연구원이 통합검증시 발견한 문제점 'XM520에서 Force Control 값 10000 넣고 SM411로 바꿔서 저장하면 저장되는 문제'를 해결하기 위해 수정했는데, 사실 이게 문제가 아니라 원래 이렇게 동작해야 하는 것이었음.
- 사양을 몰랐음.
- 포스컨트롤 안되는 장비에서는 체크안해야 한다는 점을 몰랐음.
- 오히려 체크안하던 코드를 체크하도록 수정하여 결함 발생.
```Csharp
// if (UPEUtility.IsCurrentMachineCheckPickPlaceDelayWhenForceControlInUse() == true)
// {
if (!new PickPlaceDelayRangeValidataionRule().Validate(null, null).IsValid)
{
UPEUtility.LogMethodFail("TitleAndNavigationviewModel", "ExecuteSaveCommand", "PickPlaceDelayRangeValidataionRule.Validate");
}
// }
```
- 결함이 발견되지 않았던 이유:
- 검증시에도 틀린 사양에 맞춰서 검증하여서 발견 안됨.
- 유닛테스트도 틀린 사양에 맞춰서 작성되어서 발견 안됨.
- 리뷰는 했는가?
- 했음
- 결함이 야기한 영향:
- 해당 버전 고객사 적용 중지되어 손실.
- 내부통합검증에서 검출되어 고객사에는 문제 안됨.
- XM520, HM520W에는 적용되었으며 포스컨트롤 지원 장비여서 문제안됨
- HM520에는 미적용으로 영향 없음
- 결함 수정에 필요한 자원:
- 박형근
### 3. 결함 수정
- 수정된 코드/패치:
- 7/26 r62391 PickPlaceDelayRangeValidationRule.cs
```C#
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
// ...
+// ForceControl 사용안하는 장비는 체크하지 않는다.
+if (UPEUtility.IsCurrentMachineSupportForceControl() == false)
+ return new ValidationResult(true, "Valid");
```
- 수정된 코드/패치의 효과:
- 검증 완료.
- 유닛테스트도 수정하여 검증 완료
- 수정 작업에 사용된 자원:
- 박형근
- 수정 작업의 기간:
- 8시간
### 4. 결함 예방
- 이러한 결함이 다시 발생하지 않도록 하는 방법:
- 사양 확인. 수정전에 미리 최수석에게 한번 확인받자?
- 유닛테스트에 케이스 추가.
- 결함 예방을 위해 변경된 프로세스/절차:
- 추가적인 QA/QC 검증:
### 5. 결함 관리
- 결함 추적/관리 도구:
- 결함이 발생한 이유와 원인을 분석하여 개선할 점:
- 결함을 예방하기 위한 계획:
## 5 Whys
| 왜? | 원인 | 할 일 |
| ---- | ---- | ----- |
| Text | Text | Text |
| Text | Text | Text |
| Text | Text | Text |
| Text | Text | Text |
| Text | Text | Text |
## PokaYoke
- 에러를 만들지 않는 방법
- 에러가 만들어지면 알람을 주는 방법 (지도카, 안돈)
## KPTA
- Keep (잘한점)
- 김률책임이 잘했다. 그래서 고객사는 문제없었다.
- 리드타임내에 고쳤다. 8시간소요.
- Problem (개선할점)
- 코드수정시 코드위에 아티팩트와 내용이 적혔있었다면 찾아봤을텐데
- 이런 경우가 많아서 장비/OLP/Elite에 따라 고려를 많이 해야한다. 잊지말고. 특히 NPE는 다 같이 쓰니까.
- 장비별로 다른 사양의 파라미터에 대한 절차서는 없을까? 체크리스트?
- 딜레마인것들이 많아서 ...
- 보수적으로 받아들이고 많이 방어를 해주고 신중을 기하도록 체크리스트도 만들자.
- 파라미터 추가도 여기저기 다발로 들어온다.
- 부품 타입을 고려해야 하는 파라미터도 있다.
- 비전이 많이 요청한다.
- 고객 신경안쓰고 구현위주로 요청되는 경우 많다.
- 피더팀이 외부에서 요구사항이 많은데 되게 보수적으로 접근한다. 잘 안들어준다. 그게 맞는것 같다.
- Show/Hide 되는 파라미터 많은가? => 많다.
- 파라미터가 많다는 VOC때문에 일부러 안보이게 한다.
- TC 테스트를 기능구현에 반대되는 것에 대한 테스트를, 기능구현과 상반되는 테스트를 만들어서 테스트하자
- 이 이전에 딜레이 값 자체도 문제다. 현재 절대값인데 %또는 레벨값으로 하면 어떨까?
- Try (시도할것)
- 개인적으로는
- 사양 다시 한번 확인
- 보수적으로 접근, 최대한 원래 동작 유지하면서 수정
- 특히 NPE는 여러군데에서 쓰이니까 두번 생각하기
- 기능구현과 상반되는 테스트 하기
- 이미 DB,PCB에 들어있는 이상값도 고려하기.
- 사전에 보정하는 함수 DoCorrection()에서 체크.
- 개인 체크리스트를 만들어서 체크하겠음.
- 이미 누군가가 수정한 것을 다시 수정할때는 일단 물어보자. 일단 짚고 넘어가자.3
- 좀 덩어리 큰 기능테스트는 통합 검증 환경을 사용하자.2
- 코드수정할때 수정한사람. 이름, 아티팩트, 고려사항 꼭 적자.4
- 주석을 아끼지 말자. 일기는 쓰지 말자. 특히 사양과 관련된것.1
- ASSERT도 아끼지 말자.1
- Action (할일)
- 개인적으로는
- 사양 다시 한번 확인
- 보수적으로 접근, 최대한 원래 동작 유지하면서 수정
- 특히 NPE는 여러군데에서 쓰이니까 두번 생각하기
- 기능구현과 상반되는 테스트 하기
- 이미 DB,PCB에 들어있는 이상값도 고려하기.
- 사전에 보정하는 함수 DoCorrection()에서 체크.
- 개인 체크리스트를 만들어서 체크하겠음.
- 이미 누군가가 수정한 것을 다시 수정할때는 일단 물어보자. 일단 짚고 넘어가자.3점
- 코드수정할때 수정한사람. 이름, 아티팩트, 고려사항 꼭 적자.4점