프론트엔드

🧨 우당탕탕 Axios 인터셉터 만들기

-- 토큰 만료와의 혈투 기록 -- 프론트엔드를 하다보면, 그 어떤 api보다도 나를 가장 괴롭히는게 등장한다 바로 토큰 만료(401) 이번 글은 “처음에 대충 회사 코드 ctrl c + ctrl v 했다가 혼나서 결국 프로젝트 갈아엎고 다시 처음부터 axios 인터셉터 설계하게 된 이야기” 시작은 항상 \복붙이었다. 솔직히 말하면 인터셉터 만들 여유보다는 화면 구성하고싶은 맘이 조급했다. 백오피스를 마이그레이션 하라는 지시를 받았고, 인터셉터 그까이거 그냥 사용하던거 쓰면 되는거 아님? 당연히 이렇게 시작했다. 나는 그냥 옛날 코드 가져와 붙였고, 아무 생각 없이 진행하고 있었다. 근데 코드리뷰에서 멘토님이 한 말씀 기존거 가져다쓰지 마시고 처음부터 머리 박아가면서 만들어보시죠. 네..? 다시요..? 그렇게 나는 다시 401을 맞았다. 그래서 진짜로 인터셉터가 어떤 구조로 작동해야 하는지, 토큰 로직은 어떻게 구성해야 하는지 기본부터 다시 뜯어보기로 했다. 사실 이번 인턴 면접에서 토큰 기반 인증에 관한 질문이 있었고, (현 멘토님이 내 면접관이셨다) 한 페이지에서 여러 요청이 동시에 401 에러가 나오면 어떻게 해결하는지에 대해 여쭤보셨다. 나는 그것까지는 생각을 해본 적이 없어서 잘 모르겠다고 답 했었고?? 두고두고 맘에 남았다. 그래서 기존 프로젝트 axios 인터셉터 보고 “오 이렇게 만드는구나. 설계가 잘 되어있구나” 하고 그대로 갖다 썼던 마음이 큰 것 같다. 첫 삽질: 401 해결하려다 403 맞기 나는 빠르게 at 만료 감지를 만들고, refresh api도 붙였다. 그리고 좀 기다려서 만료되었을 때 나의 시나리오 오래된 at로 api 호출 서버가 401 던짐 인터셉터가 refresh 호출 새 토큰으로 요청 재시도 … 되어야 하는데 만료된 at로 api 호출 -> 401 err 자동적으로 refresh api 호출 -> 403 err 아니 왜 재발급 한번도 못했는데 왜 403 나옴? 이 악몽같은 현상으로 하루종일 삽질만 했다. 재발급 시마다 alert도 띄워보고, Authorization 헤더도 다시 붙여보고, 인터셉터 바깥에서 refresh 호출 성공하는것도 확인했는데,, 원인이 걍 퐝당했음. at와 rt의 유효기간이 같았던 것임!!! 아!뿔!싸! 기존 인터셉터도 이거 처리가 안되어있더라! 너무 모르겠어서 jwt.io에서 token 까보고 알았다. at가 만료되었을 때 rt도 만료가되어 refresh를 할 수 있는 시간이 없었던 것이다. accessToken 만료 → refresh 요청 시도 근데 refreshToken도 이미 만료 → 403 그래서 당연히 403이 나는 구조였다. 근데 백엔드를 바꿔달라고 할 수가 없는 상황 이걸 계기로 오랜만에 조금 머리를 굴려보았다. 자동 재발급? 그건 좀 아닌것같아요. 처음에는 이런 식의 자동 로직을 생각했다. 사용자가 뭘 하든 at 만료 5분전에 자동으로 refresh 하자 근데 이 생각을 말씀드렸더니 멘토님이 말씀하셨다. 사용자가 아무 행동도 안하는데 알아서 재발급 하는건 아닌 것 같아요! 맞말임. 아무래도 백오피스다보니까 보안적인 부분도 고려를 했어야했다. 그래서 방향을 바꿨다. 사용자가 실제 api 요청 시 만료 시간이 5분 이하라면 그때 refresh 하자 즉 활성 사용자만 재발급 → 비활성 사용자 세션은 종료 동시 요청 문제 → Pending Queue 도입 다음 문제는 이거였다. 이거는 내가 면접 때 질문을 받고 대답을 못했던 그 문제이기도 한데 A API 요청 시 → 토큰 만료 → refresh 시작 그 사이에 B API 요청 → 또 토큰 만료 → refresh 또 호출 이러면 refresh api가 동시에 여러번 호출되며 경합이 발생한다. 그래서 필수적으로 refresh 중엔 다른 요청을 멈춰서 줄세우는 로직이 필요하였다. 그것이 바로 pending queue ~~내가 자료구조 수업에서 듣고 코테 풀때만 쓰던 큐를 진짜 써보는 날이 오다니~~ 요약하자면 refresh 중이면 → 요청을 queue 에 쌓아둠 refresh 끝나면 → queue에 있던 요청들을 새 토큰으로 재요청 이렇게 하면 동시 재발급 요청 문제는 해결된다. 세션 만료 경고가 여러 번 뜨는 문제 아 근데 산넘어 산이라더니 에베레스트가 나옴 refresh 실패(401/403) → 로그아웃 처리할 때 다음과 같은 코드가 있었다. 근데 api 여러개가 동시에 터지면서 alert이 여러개가 떴던것임! alert 확인 버튼 연타함 그래서 로그아웃이 한 번만 실행되게 하기 위해서 zustand에 isLoggingOut state를 추가하여 해결하였다. 근데 왜 isLoggingOut 초기화가 안돼요? 문제 발생 두번째 세션 만료 로그아웃 때, 401 떴는데 로그아웃이 안되더라 그건 내가 isLoggingOut 상태값을 zustand persist 미들웨어에 넣어놨기 때문이었다. 그래서 persist partialize 설정해서 해결하였다. ㅎㅎ 바보 최종 Axios 인터셉터 코드 삽질 끝에 만들어진 인터셉터 구조는 다음과 같다. 토큰 만료 5분 이하 → refresh refresh 동안 다른 요청은 pending queue refresh 실패 → 로그아웃 alert 중복 방지 → isLoggingOut accessToken, refreshToken 상태는 zustand에서 관리 Authorization 헤더 자동 주입 정리하자면.. 이번에 인터셉터를 처음부터 설계하면서 느낀 점: 토큰 구조를 이해해야 한다 세션 만료 UX까지 고려해야 한다 동시 요청 문제까지 잡아야 한다 상태관리까지 연계해야 한다 인터셉터는 그냥 훅 두 개가 아니라 프로젝트의 전체 인증 흐름을 담당하는 중요한 부분임을 깨달았다. 그리고 무엇보다: 절대… 생각 안하고 코드 복붙부터 시작하지 말자.

2025년 11월 19일 15:33

프론트엔드

피크민 블룸은 어떻게 꽃길🌸을 남길까?



걷기만 했는데 꽃이 심어졌다. 어떻게 작동하는 걸까? 프론트 개발자 입장에서 추정해봤다. 위치 수집과 저장 꽃을 심기 시작하면, 앱은 사용자의 위치를 실시간으로 추적하기 시작한다. 이때 예상되는 기술 흐름은 다음과 같다: CLLocationManager를 통한 실시간 위치 수집 일정 간격으로 좌표를 샘플링하여 배열에 저장 -> 너무 가까운 위치는 무시하여 노이즈 제거 앱을 닫아도 백그라운드에서 계속 추적 (배터리 최적화 필요) 저장 포맷은 아마도? 꽃을 심은 경로는 단순 좌표가 아닌 시간 + 위치 + 심은 꽃 종류 등 메타데이터가 포함되어 있을 가능성이 높다. 지금 5월이라 또 가정의 달이라고, 이달의 꽃은 카네이션, 장미 등등.. 난리났다. 각각 꽃 이름을 다 고유명사로 짓기에는 한계가 있을테니 시즌-꽃-색상 이렇게 짓지 않았을까? 25-5-rose-red (25년 5월 시즌 빨간색 장미꽃) 지도 위 시각화 꽃을 심고 나면, 지도 위에 꽃잎들이 길을 따라 자동 배치된다. 이를 구현하려면 다음과 같은 절차가 필요하다: MKPolyline 또는 커스텀 캔버스를 이용해 라인을 그림 일정 간격으로 꽃 모양 아이콘을 offset에 따라 반복 배치 아이콘은 애니메이션 또는 이미지 뷰로 간단하게 처리 가능 성능 문제는? 꽃이 많아지면 오브젝트 수도 급격히 증가 -> 렌더링 최적화 필수 과거 기록도 남기려면 서버 측에 저장하고, 맵 확대 시에만 불러오는 식의 lazy loading 전략이 유력 그래서 아이폰 12 mini 에서는 꽃을 오래 심으면 앱이 자꾸 꺼진다 ㅜㅜ 실시간 위치 추적과 일반 걸음 기록은 다르다 피크민 블룸은 항상 걸음을 기록하지만, 꽃을 심을 때만 파란 위치 아이콘이 뜨는 것을 보면 두 기능은 서로 다르게 작동한다. 🌱 일반 걸음 기록 아이폰에서 피트니스 API 또는 HealthKit과 연동되어 걸음 수만 수집 이때는 정확한 위치 정보는 사용하지 않음 -> 아이폰 상단에 파란색 위치 아이콘이 뜨지 않음 🌸 꽃을 심을 때는 실시간 GPS 추적 사용자가 ‘꽃 심기’ 버튼을 누르는 순간부터, CLLocationManager가 실시간으로 위치를 추적하며 경로를 저장 -> 아이폰 상단에 파란 위치 추적 아이콘이 표시됨 이후 종료 버튼을 누르면 기록이 서버에 업로드되거나 저장됨 맵 전체가 아닌, 현재 위치 중심 반경 N미터만 렌더링한다 피크민 블룸을 실행하면, 꽃이 원형으로 촤라락 펼쳐지듯 한 번에 맵에 나타난다. 이걸 보면 전체 데이터를 로딩하는 게 아니라, 현재 위치 기준 반경 약 200~300m 정도만 요청하고 시각화하는 것으로 보인다. (더 넓을수도?) 예상되는 흐름 앱 실행 / 맵 이동 감지 현재 위치를 기준으로 일정 반경 (ex. 200m) 설정 서버에 꽃 정보 요청 응답 받은 꽃 데이터 기준으로 렌더링 경로 따라 꽃 아이콘 배치 종류별로 다른 텍스처 사용 일정 간격마다 반복 표시 사용자가 이동할 경우, 일정 거리 이상 벗어나면 새 요청 * 이전에 본 영역은 로컬 캐시로 보여줌 왜 반경 단위로 렌더링할까? 퍼포먼스 때문: 전체 도시 데이터를 한 번에 불러오면 부하가 너무 큼 프라이버시 때문: 다른 유저의 꽃 경로를 멀리까지 보여줄 필요 없음 인터랙션 유도: 근처만 보여줘야 걷고 이동하게 만들 수 있음 결론 피크민 블룸은 단순한 위치 기반 게임이 아니라, 실시간 GPS 추적 + 사용자 입력 이벤트 + 거리 기반 로딩 전략이 모두 섞인 정교한 구조를 갖고 있다. 이런 구조를 보면 ‘걷기’라는 일상적인 활동도 얼마나 다양하게 확장 가능한지 실감하게 된다.

2025년 05월 03일 16:53

CS

[정보처리기사] 정보시스템 구축관리

정보시스템 구축관리 소프트웨어 생명주기 / 개발 모델 소프트웨어 생명주기 모델 비용 산정 / 일정 관리 비용 산정 모델 COCOMO 유형 표준 / 품질 모델 ISO / 국제 표준 품질 특성 (ISO 9126) 프로세스 성숙도 / 평가 모델 SPICE CMMI 테스트 / 품질 보증 테스트 종류 알파 / 베타 테스트 보안 / 접근 제어 접근 제어 모델 네트워크 / 보안 시스템 IPSec 네트워크에서의 안전한 연결을 설정하기 위한 통신 규칙 또는 프로토콜 세트 보안 장비 클라우드 / 신기술 악성코드 / 보안 위협 (Malware) 네트워크 공격 / 서비스 거부 공격 (DoS) 서비스 거부 공격(DoS / DDoS) DoS (Denial of Service) 하나의 공격자가 시스템 자원을 고갈시켜 정상 서비스 불가 상태로 만듦 DDoS (Distributed DoS) 여러 대의 좀비 PC가 동시에 공격 분산 공격, 탐지 및 차단 어려움

2026년 02월 04일 07:26

CS

[정보처리기사] 비트 연산자, 연산자 우선순위

비트 연산자 & 연산자 우선순위 비트 연산자란? 비트 연산자는 정수 값을 2진수(비트) 단위로 변환한 뒤 연산을 수행하는 연산자이다. 즉, 숫자를 그대로 계산하는 게 아니라 0과 1로 바꿔서 한 칸씩 비교한다. 비트 연산자 종류와 의미 2.1 AND 연산자 & 두 비트가 모두 1일 때만 1 그 외는 모두 0 예제 👉 결과: 4 2.2 OR 연산자 | 둘 중 하나라도 1이면 1 예제 👉 결과: 7 2.3 XOR 연산자 ^ 서로 다를 때만 1 같으면 0 예제 👉 결과: 3 2.4 NOT 연산자 ~ 모든 비트를 반전 0 → 1, 1 → 0 예제 4 → 00000100 ~4 → 11111011 👉 결과: -5 (2의 보수 체계) 2.5 시프트 연산자 > 왼쪽 시프트 > 비트를 오른쪽으로 이동 2로 나누는 효과 예제 👉 결과: 2 연산자 우선순위란? 하나의 식에 여러 연산자가 있을 때 어떤 연산을 먼저 계산할지 정해 놓은 규칙이다. 📌 핵심 우선순위가 높을수록 먼저 계산된다. 괄 → 단 → 산 → 시 → 관 → 비 → 논 → 대 ( ) 단항 ++ -- ! ~ 산술 \* / % + - 시프트 > 관계 >= 비트 & ^ | 논리 && 8. 대입 =

2026년 02월 04일 06:27

CS

[정보처리기사] Database

데이터베이스(Database) 데이터베이스란 무엇인가? 데이터베이스(Database)는 여러 사용자가 공동으로 사용하는 데이터의 집합이다. 단순히 데이터를 저장하는 것이 목적이 아니라, 데이터의 중복을 줄이고 데이터 간 일관성을 유지하며 여러 사용자가 동시에 안전하게 접근할 수 있도록 관리하는 것이 핵심이다. 이러한 관리를 담당하는 소프트웨어를 DBMS(Database Management System) 라고 한다. 데이터베이스 설계가 필요한 이유 현실 세계의 데이터를 그대로 저장하면 다음과 같은 문제가 발생한다. 동일한 데이터가 여러 곳에 저장됨 → 중복 발생 한 곳만 수정되어 데이터 불일치 발생 일부 데이터를 삭제했는데, 다른 데이터까지 사라짐 이러한 문제를 방지하기 위해 체계적인 설계 과정을 통해 데이터 구조를 정의해야 한다. 데이터베이스 설계 단계 데이터베이스 설계는 다음과 같은 순서로 진행된다. 요구사항 분석 → 개념 설계 → 논리 설계 → 물리 설계 3.1 요구사항 분석 사용자가 어떤 데이터를 필요로 하고, 어떤 처리가 이루어져야 하는지를 분석하는 단계이다. 어떤 정보가 필요한가? 데이터 간 관계는 무엇인가? 3.2 개념 설계 (Conceptual Design) 현실 세계를 개념적으로 모델링하는 단계이다. 엔터티(Entity) 속성(Attribute) 관계(Relationship) 를 정의하며, 주로 ER 다이어그램(ERD) 을 사용한다. 이 단계에서는 DBMS 종류나 구현 방식은 고려하지 않는다. 3.3 논리 설계 (Logical Design) 개념 설계를 바탕으로 DBMS에서 사용할 논리적 구조를 설계하는 단계이다. 테이블 정의 속성 및 키 정의 정규화 수행 즉, 정규화는 논리 설계 단계에서 수행된다. 3.4 물리 설계 (Physical Design) 논리 설계 결과를 실제 저장 장치에 맞게 구현하는 단계이다. 저장 구조 인덱스 접근 경로 성능(처리량, 응답 시간) 을 고려한다. 👉 물리 설계의 핵심은 성능 최적화이다. 키(Key)의 개념 데이터베이스에서 키는 튜플을 유일하게 식별하기 위한 속성 또는 속성의 집합이다. 주요 키 종류 슈퍼키(Super Key): 유일성은 만족하지만 최소성은 만족하지 않음 후보키(Candidate Key): 유일성과 최소성을 모두 만족 기본키(Primary Key): 후보키 중 선택된 하나 대체키(Alternate Key): 기본키로 선택되지 않은 후보키 외래키(Foreign Key): 다른 테이블의 기본키를 참조 정규화(Normalization) 정규화는 데이터의 중복을 제거하고 이상 현상을 방지하기 위한 과정이다. 정규화를 통해 다음과 같은 이상 현상을 방지할 수 있다. 삽입 이상 삭제 이상 갱신 이상 5.1 제1정규형 (1NF) 모든 속성 값은 원자값(Atomic Value) 을 가져야 한다. 즉, 하나의 속성에 여러 값이 들어가면 안 된다. 5.2 제2정규형 (2NF) 제1정규형을 만족하면서 부분 함수 종속을 제거한 상태이다. 복합 기본키의 일부에만 의존하는 속성이 존재하면 이를 분리해야 한다. 5.3 제3정규형 (3NF) 제2정규형을 만족하면서 이행 함수 종속을 제거한 상태이다. 기본키가 아닌 속성이 다른 속성을 결정하면 안 된다. 5.4 BCNF 제3정규형보다 더 엄격한 정규형으로, 모든 결정자가 후보키여야 한다. 함수 종속(Function Dependency) 속성 X의 값이 결정되면 속성 Y의 값이 항상 하나로 결정될 때, 이를 Y는 X에 함수적으로 종속된다고 하며 다음과 같이 표기한다. X → Y 관계대수와 관계해석 관계대수(Relational Algebra) 절차적 질의 언어 연산의 순서를 명시 관계 연산의 집합 관계해석(Relational Calculus) 비절차적 질의 언어 원하는 결과만 기술

2026년 02월 02일 06:31

CS

[정보처리기사] 결합도, 응집도

결합도, 응집도 결합도(Coupling)란? 모듈과 모듈 사이의 의존 정도 한 모듈의 변경이 다른 모듈에 얼마나 영향을 주는지를 나타냄 낮을수록 좋다 결합도 종류 (내·공·외·제·스·자) 내용 결합도 (Content) 다른 모듈의 내부 데이터나 로직을 직접 참조/수정 공통 결합도 (Common) 여러 모듈이 공통 데이터 영역(전역 변수) 사용 외부 결합도 (External) 외부 파일, 외부 인터페이스, 외부 포맷 공유 제어 결합도 (Control) 제어 신호(flag, mode)를 전달해 동작 제어 스탬프 결합도 (Stamp) 배열, 구조체, 객체 등 자료 구조 전체 전달 자료 결합도 (Data) 필요한 데이터 값만 전달 (가장 이상적) 응집도(Cohesion)란? 모듈 내부 요소들 간의 관련성 하나의 모듈이 얼마나 하나의 목적에 집중되어 있는지 높을수록 좋다 응집도 종류 (기·순·통·절·시·논·우) 기능적 응집도 (Functional) 하나의 명확한 기능만 수행 (최고) 순차적 응집도 (Sequential) 한 기능의 출력이 다음 기능의 입력 통신적 응집도 (Communicational) 동일한 데이터를 사용하는 기능들 묶음 절차적 응집도 (Procedural) 실행 순서 때문에 묶인 기능들 시간적 응집도 (Temporal) 같은 시간대에 실행되는 기능들 (초기화, 종료) 논리적 응집도 (Logical) 논리적으로 유사한 기능들 (입출력 처리 등) 우연적 응집도 (Coincidental) 관련 없는 기능들이 묶임 (최악)

2026년 02월 02일 05:23

CS

[정보처리기사] 소프트웨어 테스트

Software Test 소프트웨어 테스트란? 소프트웨어가 요구사항에 맞게 동작하는지 확인하는 과정 오류(Error) 및 결함(Bug)을 발견하기 위한 활동이며 결함이 없음을 증명하는 활동이 아님 살충제 패러독스: 동일한 테스트 케이스를 반복해서 수행하면 새로운 결함을 더 이상 발견하지 못하는 현상 파레토의 법칙: 소프트웨어 테스트에서는 전체 결함의 대부분이 소수의 모듈에 집중되어 발생 테스트의 목적 오류 및 결함 발견 소프트웨어 품질 향상 신뢰성 확보 생명주기 단계별 테스트 (V-모델 기준) 테스트 단계별 정리 단위 테스트 (Unit Test) 대상: 함수, 클래스, 단일 모듈 수행자: 개발자 목적: 모듈 내부 로직의 정확성 검증 특징 - 내부 구조를 고려한 테스트 - 구현 직후 수행 - 화이트박스 테스트 중심 통합 테스트 (Integration Test) 대상: 여러 모듈의 결합 수행자: 개발자 또는 테스트 담당자 목적: 모듈 간 인터페이스 오류 검출 특징 - 상위·하위 모듈 연동 테스트 - 스텁(Stub)과 드라이버(Driver) 사용 시스템 테스트 (System Test) 대상: 전체 시스템 수행자: 테스트 담당자 목적: 시스템 요구사항 충족 여부 검증 특징 - 실제 환경과 유사한 조건 - 기능 테스트 + 비기능 테스트 포함 - 블랙박스 테스트 중심 인수 테스트 (Acceptance Test) 대상: 완성된 시스템 수행자: 사용자 목적: 요구사항 만족 여부 최종 확인 특징 - 사용자 관점 테스트 - 계약 기준에 따라 수행 - 블랙박스 테스트 - 알파, 베타 테스트 테스트 관점에 따른 분류 블랙박스 테스트 (Black Box Test) 특징 - 내부 구조를 고려하지 않음 - 입력과 출력만을 기준으로 테스트 - 사용자 관점 테스트 적용 단계 - 시스템 테스트 - 인수 테스트 대표 기법 - 동치 분해: 입력 값을 유효한 그룹과 무효한 그룹으로 나누어 각 그룹에서 대표 값을 선택해 테스트 - 경계값 분석: 입력 값의 최소값·최대값 등 경계 부근에서 오류가 발생하기 쉬운 점을 집중 테스트 - 원인–결과 그래프: 입력 조건(원인)과 출력 결과(결과)의 논리적 관계를 그래프로 표현하여 테스트 케이스 도출 화이트박스 테스트 (White Box Test) 특징 - 내부 구조를 고려하여 테스트 - 코드 흐름과 분기 구조 확인 - 개발자 관점 테스트 적용 단계 - 단위 테스트 대표 기법 - 기초 경로 검사: 프로그램의 제어 흐름 그래프를 기반으로 독립적인 모든 실행 경로를 최소 한 번 이상 테스트 - 제어 구조 테스트: 프로그램의 순차, 선택, 반복 구조가 올바르게 동작하는지 검사 스텁과 드라이버 스텁 (Stub) 하위 모듈을 대신하는 가짜 모듈 호출 당하는 모듈 하향식 통합 테스트에서 사용 드라이버 (Driver) 상위 모듈을 대신하는 가짜 모듈 호출 하는 모듈 상향식 통합 테스트에서 사용 테스트 커버리지 (Test Coverage) 테스트가 프로그램을 얼마나 실행했는지를 측정하는 기준 테스트의 충분성을 판단하는 지표 주요 커버리지 종류 구문 커버리지: 모든 문장이 한 번 이상 실행되었는지 분기 커버리지: 모든 조건의 참/거짓이 실행되었는지 조건 커버리지: 조건식 내 각 조건이 실행되었는지 테스트 오라클 (Test Oracle) 테스트 결과가 올바른지 판단하기 위한 기준 테스트 실행 결과를 기대 결과(Expected Result) 와 비교하여 성공 또는 실패를 판정 목적: 테스트 결과의 옳고 그름 판단 특징 - 자동 또는 수동으로 판정 가능 - 모든 테스트에는 오라클이 존재해야 테스트 수행 가능 - 오라클이 없으면 테스트 결과의 정확성 판단 불가 회귀 테스트 (Regression Test) 프로그램 수정 또는 변경 이후 기존 기능이 정상적으로 동작하는지 확인하는 테스트 목적: 수정으로 인해 발생할 수 있는 부작용(Side Effect) 검출 특징 - 기존 테스트 케이스를 재사용 - 변경된 부분 및 영향 범위 중심으로 수행 - 유지보수 단계에서 주로 수행 정적 테스트 / 동적 테스트 정적 테스트 (Static Test) 프로그램을 실행하지 않고 검토 코드 또는 문서 기반 테스트 종류 - 워크스루(Walkthrough): 개발자가 주도하며 설명하면서 검토 - 인스펙션(Inspection): 전문가가 참여하는 공식적인 검토 동적 테스트 (Dynamic Test) 프로그램을 실제로 실행하여 테스트 실행 결과를 기반으로 오류 검출 알파 테스트 / 베타 테스트 알파 테스트 개발자 환경에서 수행 사용자 참여 가능 내부 검증 목적 베타 테스트 실제 사용자 환경에서 수행 배포 전 최종 검증

2026년 01월 30일 07:22