Data Integrity and Protection 디스크 오류 모델 RAID 구현이 어렵지 않았던 것은 디스크의 fail-stop 모델 덕. 현대의 디스크에서는 정상적으로 동작하는 것처럼 보이지만 read 등에 실패하는 경우가 있음. 숨어있는 섹터 에러 (LSE) 디스크 섹터가 손상되었을 때 발생. 디스크 헤드가 표면에 닿아 (헤드 크래시) 표면을 망가뜨려 비트를 읽을 수 없게 만들거나, 강한 방사선;에 의해 비트가 반전되어 내용이 부정확하게 되거나. 에러 정정 코드(ECC)를 이용해 판단, 고칠 수 있음. 블럭 손상 디스크가 손상 여부를 일식할 수 없게 내용이 손상된 경우. 블럭의 내용은 읽어지며 ECC는 내용이 정상이라고 하지만, 추후 해당 블럭을 읽었을 때 잘못된 블럭이 리턴 됨. 전송 버스 상의 오류로 인해 호스트에서 디스크로 전송되는 도중 블럭 손상 가능. 조용한 오류이기 때문에 디스크가 문제를 알지 못함. 이러한 fail-partial 디스크 오류 모델은 전체적으로 보면 불량이지만 일부분만 손상이 있는 경우이기 때문에 디스크가 동작하는 것처럼 보여 위험. 숨어있는 섹터 에러 (LSE) LSE는 쉽게 발견할 수 있기에 해결이 쉬움. 미러링 RAID의 경우, 사본을 보관하며, 패리티 기반 RAID-4/5의 경우 다른 블럭들을 이용해 해당 블럭 재생성이 가능. 이러한 기법을 이용해 복구 가능. 하나의 디스크가 완전히 고장나며, 동시에 다른 디스크에서 LSE가 발생하는 경우. RAID는 패리티 그룹 내의 모든 다른 디스크를 읽어 빠진 값을 다시 계산하여 고장난 디스크에 대한 디스크 재구성을 시도. 재구성하는 도중 LSE를 만나면, 재구성 실패. 위 문제 해결을 위해 추가적인 기법 도입. RAID-DP : 두 개의 패리티 디스크 사용. 추가적인 공간적 비용과 연산 비용 발생. 손상 검출: 체크섬 손상을 발견해내기 위해 체크섬 사용. 체크섬 : 데이터 청크를 입력으로 하여 함수 값을 계산. 이 결과는 데이터에 대한 작은 요약 정보가 됨. 데이터 손상/변경 여부 확인을 위해 계산 값을 확인. 널리 사용되는 체크섬 함수 XOR 기반 체크섬 함수 간단하게 각 데이터 블럭의 청크를 XOR 연산. 각 열에서 두 개의 값이 변하면 XOR 값이 동일하여 손상 검출 불가. 덧셈 기반 빠름. 각 데이터의 청크에 대해 2의 보수 덧셈을 하고, 오버플로우 발생 시 무시. 대부분의 경우에 변경을 검출할 수 있지만, 데이터 시프트의 경우 발견하지 못할 수도 있음. Fletcher Checksum 두 개의 체크 바이트에 mod 255를 하여 계산. CRC와 유사하게 강력. 모든 한 비트, 두 비트, 동시다발적 에러의 경우에 검출 가능. Cyclic Redundancy Check (CRC) 데이터 블럭을 사전에 합의한 값으로 나누고, 나머지 값을 CRC 값으로 함. 이진 나머지 연산은 효율적으로 처리가 가능하기 때문에 네트워크 분야에서도 사용 됨. 어떤 방식에서든 완벽한 체크섬은 없음. 전혀 다른 데이터 블럭이 동일한 체크섬을 가질 수 있음. 이러한 '충돌' 확률을 최소화하며 계산은 간단하게 만드는 것이 효율적인 체크섬 계산. 체크섬의 배치도 디스크는 512 byte일 때, 체크섬을 8 byte, 드라이브의 섹터를 520 byte로 포맷하여 체크섬-데이터-체크섬-데이터 순서로 배치하는 경우. 위와 같은 배치 기능이 없는 디스크의 경우, 파일 시스템이 체크섬을 512 byte 블럭에 저장할 수 있는 방법을 고안해야 함. n개의 체크섬을 모아 한 섹터에 저장하고, 그 뒤에 해당하는 n개의 블럭을 배치하는 방식. 모든 디스크에 적용 가능하지만, 갱신을 위해 체크섬 섹터를 읽고 데이터 블럭과 체크섬을 써야 해서 한 번의 읽기와 두 번의 쓰기가 필요하므로 덜 효율적. 체크섬의 활용 저장된 체크섬과 계산된 체크섬을 비교하여 손상이 있는지 판단. 블럭이 손상되었다면 복사본을 사용하거나 에러 리턴. 새로운 문제: 잘못된 위치에 기록 디스크에 데이터를 올바르게 썼지만, 잘못된 위치에 쓰는 현상. 각 체크섬에 물리적 식별자 정보를 더해 완화. 예를들어 체크섬과 디스크 번호와 섹터 번호를 포함하여 저장해, 해당 블럭에 정확한 정보가 저장되었는지 판단. 마지막 문제: 기록 작업의 손실 상위 계층에는 쓰기가 완료되었다고 알리지만, 실제로는 저장되지 않은 경우. 디스크의 블럭은 새로운 내용으로 갱신되지 않고, 예전의 블럭 내용이 남겨져있는 상황. 저장된 블럭은 정상적인 체크섬과 물리적 ID를 갖고 있을 것이기에 이전의 내용들로는 판단 불가능. 쓰기 검증 또는 쓰기 후 읽기 수행 쓰기 수행 직후에 그 값을 다시 읽어서 데이터가 디스크 표면에 제대로 도착했음을 알 수 있음. But 느린 쓰기 동작에 대해 I/O 수를 두 배로 늘리게 됨. 체크섬을 시스템의 다른 위치에 기록하여 잃어버린 쓰기를 검출 ZFS의 경우. 체크섬을 아이노드와 간접 블럭에 저장. 데이터 블럭에 대한 쓰기는 손실되어도, 아이노드 내의 체크섬은 갱신되었을 것이므로, 이전 데이터와 체크섬이 일치하지 않게 되어 판단 가능. But 아이노드와 데이터 쓰기 둘 다 손실 시 실패. Scrubbing 일반적으로 체크섬은 데이터를 읽을 때 검사. 접근되지 않는 데이터들은 검사가 되지 않은 채 오래 남아있게 됨. 디스크 다시 읽기 기법을 사용. 주기적으로 시스템 모든 블럭들을 읽어 체크섬이 유효한지 검사. 특정 데이터의 모든 사본이 손상되는 것을 방지. 체크섬 오버헤드 공간 오버헤드 (작은 편) 디스크 자체의 오버헤드. 디스크 상에 체크섬을 저장하기 위한 공간이 필요. 시스템 메모리 오버헤드. 데이터 접근 시, 메모리에 데이터와 체크섬을 읽어둘 공간이 필요. 시간 오버헤드 (큰 편) CPU는 데이터를 저장할 때와 접근할 때 체크섬을 연산해야 함. CPU 오버레드를 줄이기 위해 (어차피 데이터 복사는 불가피하기에) 체크섬 연산과 데이터 복사를 하나의 연속적인 작업으로 처리. 체크섬 기법에 따라 추가적인 I/O 유발 가능. Distributed Systems 분산 시스템의 핵심 사안은 실패와 고장 극복, 그리고 시스템 성능, 보안. 통신의 기본 기본적으로 네트워킹은 신뢰 불가능. 패킷 손실, 손상, 유실이 발생하기 때문. 또한, 네트워크 장비나 종단점에서 충분히 버퍼링 하지 못할 수 있음. 신뢰할 수 없는 통신 계층 UDP/IP 네트워크 스택은 기본적으로 신뢰하지 않는 계층. - 소켓 API를 이용해 통신 지점을 생성. - UDP 데이터그램을 전송. - 패킷 유실/손실이 발생하는 경우, 메시지가 목적지에 도착하지 못함. - UDP는 손실에 대해 알 수 없지만, 체크섬 등을 포함해 일부 손상 검출 가능. 신뢰할 수 있는 통신 계층 TCP/IP ack num을 이용하여 메시지 수신 확인이 가능. 발신자가 ack을 못 받으면 timeout을 발생시켜 재전송. ack 메시지가 손실된 경우에는 재전송하여 똑같은 메시지를 두 번 전송할 수 있음. 수신측에서도 메시지를 딱 한 번만 받는다는 보장 필요. 이러한 중복 문제를 위해 seq num 사용. ack가 손실된 경우, 발신자는 타임아웃으로 인해 메시지를 재전송. 이때 수신자의 카운터가 n+1로 커지므로 발신자는 이미 메시지를 받았음을 인지함으로써 중복 수신을 피함. 통신 추상화 분산 공유 메모리 (DSM) 하나의 프로세스가 서로 다른 기기들 위에서 하나의 가상 주소 공간을 공유하여, 분산된 연산이 마치 멀티 스레드 응용 프로그램처럼 보이게 함. 대부분 운영체제의 가상 메모리 시스템 기반으로 동작. 페이지가 접근되었을 때. 최선의 경우. 페이지가 이미 기기 내에 있어 빠르게 데이터 가져옴. 페이지가 다른 기기에 있어, 페이지 폴트 핸들러가 다른 기기에 메시지를 보내 페이지를 달라고 요청. 가장 큰 문제는 실패를 처리하는 방식. 만약 주소 공간의 일부가 사라진다면 분산 연산의 자료 구조를 사용 불가하게 됨. 특정 메모리 접근은 굉장히 느려 성능 문제 존재. 현재는 사용하지 않음. Remote Procedure Call RPC 원격 기계에서의 코드 실행을 로컬 내의 함수를 부르는 것처럼 간단하게 만드는 것이 목적. 클라이언트는 프로시저 호출을 하고, 후에 결과를 리턴 받음. 서버는 공지할 루틴을 정의. 나머지는 스텁 생성기(프로토콜 컴파일러)와 런타임 라이브러리 두 부분으로 나누어 담당. 스텁 생성기 함수의 인자들을 묶는 불편함을 없애고 자동으로 메시지를 만듦. 실수를 막고 최적화가 가능하여 성능 개선. 서버가 클라이언트에게 공지할 프로시저 집합을 컴파일러에 입력으로 전달. 클라이언트 용으로 인터페이스에 명시된 함수들로 구성된 클라이언트 스텁을 생성하여 호출. 클라이언트 스텁의 각 함수들이 원격 프로시저 호출을 위한 일을 처리. 메시지 버퍼 생성. 메시지 버퍼에 필요 정보를 병합. RPC 서버에 메시지 전송. 응답 대기. 리턴 코드와 인자 풀기. 호출자에게 리턴. 메시지 풀기. 실제 함수 호출. 결과 통합 및 응답 전송. 런타임 라이브러리 성능과 신뢰성에 관한 문제들 처리. 원격 서비스의 위치를 찾는 문제. 가장 간단한 방법 : 기존 시스템 활용. 호스트명과 포트 번호를 활용하여 통신 작업 구별. 패킷이 특정 주소로부터 시스템에 있는 임의의 다른 기계로 전달될 수 있는 메커니즘 제공. 어떤 전송 계층 프로토콜 위에 만들지. 요청이 확실히 전달, 응답 확실히 수신을 원하면 TCP 고려 가능. But, 신뢰할 수 있는 통신 계층 상에 RPC를 구현하면 성능이 굉장히 떨어짐. 그래서 UDP 같은 신뢰할 수 없는 통신 계층 사용. 순서 번호 등을 사용하여 각 RPC가 한 번만 발생할 수 있도록 보장. 다른 문제들 원격 호출 완료까지 오랜 시간이 걸린다면? 응답이 즉시 생성되지 않는 경우 먼저 ack를 보내도록 하면 클라이언트는 서버가 요청을 받았는지, 처리 중인지 확인 가능. 한 패킷에 담을 수 있는 양보다 더 많은 수의 인자를 갖는 프로시저 호출들을 처리할 수 있어야. 단편화와 재조합을 이용하여 구현 가능. 그렇지 않은 RPC 런타임은 그런 기능을 자체적으로 구현 필요. 바이트 순서 표시. 빅 엔디안과 리틀 엔디안과 같이 서로 다른 저장 방식을 사용하는 기계들끼리 통신을 하느냐가 중요. RPC에서는 메시지 포맷에 잘 정의되어 있는 엔디안을 사용하는 것으로 문제를 해결. XDR의 엔디안을 준수하여 송수신 가능. 만약 기계가 다른 엔디안을 사용하여 통신한다면, 메시지의 각 정보는 변환되어야 하므로 성능 비용 지불이 필요. 클라이언트에게 비동기적 실행을 허가할 것인가. 어떤 RPC는 동기적으로 동작하여, 결과가 리턴될 때까지 대기하므로 대기 시간이 길어짐. 어떤 경우에는 비동기적으로 호출하여 호출 도중에 다른 작업을 자유롭게 진행 가능. Network File System 분산 파일 시스템 다수의 클라이언트 기계와 하나의 서버가 있으며, 서버는 데이터를 디스크에 저장하고 클라이언트는 약속된 포맷에 따라 메시지를 보내 데이터를 요청. 데이터 공유가 쉬우며, 중앙 집중형 관리라서 보안적 이점이 있음. 기본적인 분산 파일 시스템 서버의 파일에 접근하려면 클라이언트 측 파일 시스템에 시스템 콜을 호출. 분산 파일 시스템의 목표는 파일들에 로컬 파일 시스템과 동일하게 접근할 수 있게 하는 것. 만약 클라이언트가 read() 요청을 내리면 클라이언트 파일 시스템은 서버 측 파일 시스템에 메시지를 전송해서 해당 블럭을 읽도록 함. 파일 서버는 디스크에서 블럭을 읽어 클라이언트가 요청한 데이터와 함께 메시지를 전송. 시스템 콜은 사용자 버퍼에 데이터를 복사하는 것으로 요청 완료. NFS에 대하여 클라이언트-서버 통신 메시지 형식을 정의하고 공개한 오픈 프로토콜. 핵심: 단순하고 빠른 서버 크래시 복구 여러 클라이언트/단일 서버 환경일 때, 서버가 다운되면 모든 클라이언트들은 일을 할 수 없게 되므로 서버의 간단하고 빠른 크래시 복구가 목표. 빠른 크래시 복구의 열쇠: 상태를 유지하지 않음 stateless 프로토콜을 설계. 서버는 각 클라이언트에서 서버에서 발생하고 있는 일에 관해 어떤 정보도 저장하지 않음. 즉, 서버는 클라이언트가 무엇을 하든 전형 상관하지 않고, 대신 각 요청에 필요 정보들을 담아 전송하게 함. NFSv2 프로토콜 파일 핸들 특정 연산을 수행할 파일이나 디렉터리를 고유하게 설명하는데 사용. 볼륨 식별자, 아이노드 번호, 생성 번호로 구성되며, 서버는 이 정보를 조합하여 원하는 파일/디렉터리를 식별. 루트 디렉터리 정보는 NFS 마운트 프로토콜을 통해 얻을 수 있음. 파일 핸들이 준비되었다면 클라이언트는 각 파일을 읽거나 쓰기 위해 프로토콜 메시지 전송 가능. 프로토콜에서 분산 파일 시스템으로 클라이언트가 파일 연산의 상태를 관리하는 방법. 정수형으로 표현되는 파일 디스크립터와 이에 연결된 NFS 파일 핸들에 대한 정보, 현재의 파일 오프셋 등을 저장. 클라이언트는 각 읽기 요청을 포맷된 읽기 프로토콜 메시지로 변환하여 서버가 파일의 정확히 어느 부분의 바이트를 읽어야 할지를 알 수 있도록 함. 읽기가 처리되면 현재 파일 위치를 갱신. 서버가 언제 사용하는지. 파일이 처음 열렸다면 클라이언트 파일 시스템은 LOOKUP 요청 메시지 전송. 서버에 보내는 요청은 요청을 완료하는 데 필요한 모든 정보가 담겨있음. 그래서 서버가 상태 정보가 없이도 요청에 응답 가능. 서버의 고장을 멱등연산으로 처리하기 NFSv2에서 고장들을 요청 재전송으로 처리. 재시도를 통해 문제를 쉽게 해결할 수 있는 이유는 연산의 멱등성 덕분. 연산을 여러 차례 수행해서 얻는 결과가 동일하므로 재시도 가능. LOOKUP이나 READ 요청은 파일 서버에서 정보를 읽기만 하고 갱신하지 않기 때문에 멱등 연산. WRITE 또한 정확한 오프셋을 이용하므로 여러 번 쓰기 연산 해도 동일한 결과를 내는 멱등 연산. mkdir 등은 멱등하게 처리하기 어려움. 성능 개선하기: 클라이언트 측 캐싱 클라이언트가 서버에서 읽은 파일 데이터를 클라이언트 메모리에 캐싱하여 성능을 개선할 수 있음. 캐시 일관성 문제를 생각해야 함. 캐시 일관성 문제 갱신 가시성 문제와 오래된 캐시 문제가 존재. flush-on-close(close-to-open) 파일을 갱신하여 파일을 닫는 시점에 갱신 내용을 서버로 보냄으로써, 다른 노드에서 파일을 열면 닫힌 시점의 최신 내용을 읽을 수 있음. 캐시에 보관된 내용을 사용하기 전에 파일의 변경 여부를 미리 검사. 파일을 열 때 GETATTR 요청을 서버로 전송하여 파일의 속성 정보를 가져옴. 만약 갱신 시점이 파일이 클라이언트에 캐싱된 이후라면 클라이언트는 캐시된 파일을 무효화. 속성 정보 캐시를 클라이언트에 추가. 파일 접근 전에 최신본인지를 검사할 때 캐시되어 있는 속성 정보를 사용. NFS의 캐시 일관성 기법에 대한 평가 flush-on-close 방식의 성능상 문제 클라이언트에서 파일을 일시적으로 생성/삭제해도 내용이 무조건 서버로 전달. 짧은 수명의 파일은 메모리에만 유지하고 서버와 통신하지 않도록 하여 성능 개선 가능. 속성 정보 캐시로 인해 사용자가 어떤 버전의 파일을 읽고 있는지 파악이 더욱 어려움. 서버 측 쓰기 버퍼링의 의미 요청을 받으면 서버는 저장 장치에 완전히 쓴 후 리턴. 이떄 데이터를 서버의 메모리에만 저장하고 클라이언트에 알리면 크래시에 의해 문제가 발생할 수 있음. 따라서 서버는 클라이언트에 성공을 알리기 전에 각 쓰기를 안정적인 저장 장치에 커밋해야 함. Andrew File System 핵심 목적은 확장성. AFS 버전 1 기본 원칙 중 하나 : 로컬 디스크에 파일 전체를 캐싱. 네트워크 통신이 발생하지 않으므로 매우 빠름. 클라이언트의 메모리에 로컬 디스크의 블럭들의 사본을 캐싱. 작업 종료 시, 클라이언트는 파일의 변경 여부를 검사하고, 변경되었다면 새로운 버전을 서버로 Store. 파일 변경 여부 검사 -> 파일의 stat 정보를 얻어옴 -> 파일의 내용을 로컬 디스크로 가져옴 -> 파일을 서버에 저장 -> 파일의 stat 정보 설정 -> 디렉터리의 내용을 보여줌 버전 1의 문제점 경로명을 따라가는 것은 매우 비싼 작업. 원하는 파일을 찾을 때까지 경로명 전체를 따라가야 함. 클라이언트가 TestAuth 프로토콜 메시지를 너무 많이 요청. 서버들은 클라이언트 캐시에 저장되어 있는 파일 사본의 사용 여부를 알려주느라 대부분의 시간을 낭비. 서버들 간의 오버헤드가 적절히 분산되지 않았으며, 문백 교환 등 다른 오버헤드를 유발. AFS 버전 2 클라이언트-서버 간의 상호작용 횟수를 줄이기 위해 콜백 개념 도입. 클라이언트에 캐쉬된 파일들에 상태 정보가 추가. 캐싱된 파일의 변경 사실을 알려주게 됨. 경로명 대신 파일 식별자를 이용하여 파일의 위치를 표현. 파일을 가져오는 과정에서 클라이언트가 서버에 콜백을 설정하여 서버와의 상호작용을 없앰. 캐시 일관성 다른 기계/같은 기계 내의 프로세스들 간의 일관성 고려가 필요. 서버는 캐시된 사본을 갖고 있는 클라이언트들과 콜백을 끊어 더이상 오래된 파일 사본을 캐시에 갖고 있지 않도록 함. last writer wins close()를 마지막으로 부르는 클라이언트가 서버에 마지막으로 파일 전체 갱신. AFSv2의 확장성과 성능 하나의 서버가 약 50개의 클라이언트를 지원할 수 있음. 성능이 거의 로컬 성능에 가깝게 나옴. 큰 파일을 순차적으로 다시 읽기를 시도할 때 NFS는 원격 접속이 로컬 디스크보다 느린 반면 AFS는 빠르며 서버의 오버헤드가 낮음. 순차 쓰기 동작은 양쪽이 비슷한 성능을 보임. AFS는 파일 순차 덮어쓰기에서 성능이 매우 안 좋음. 클라이언트가 파일 전체를 먼저 가져온 후, 덮어쓰기를 수행하기 때문. 큰 파일의 일부 작은 데이터를 접근하는 워크로드에서는 NFS가 AFS보다 훨씬 더 좋은 성능 보임.
이전 React Deep Dive 9에서는 HTML이 먼저 존재하는 상태에서 React가 기존 DOM에 연결되는 Hydration 과정을 확인했다. 클라이언트 컴포넌트가 실행되더라도 기존 DOM이 그대로 유지될 수 있었고, 서버 HTML과 클라이언트의 첫 결과가 다르면 Hydration mismatch가 발생하는 것도 확인했다. 다만 당시에는 직접 준비한 HTML fixture를 사용했다. 브라우저가 이미 HTML을 가지고 있다는 조건은 만들었지만, 실제로 페이지를 요청하고 그 응답을 받아 화면을 표시하는 과정까지 살펴본 것은 아니었다. 그래서 Next.js에서는 그보다 한 단계 앞에서 시작해보려고 한다. 사용자가 URL에 처음 접근하거나 페이지를 새로고침하면 브라우저는 새로운 페이지를 요청한다. 반면 이미 열린 화면에서 버튼을 눌러 State를 변경할 때는 React가 현재 화면에서 Update를 처리한다. 그렇다면 페이지를 처음 받아오는 과정과 이미 열린 화면에서 발생하는 State Update는 어떻게 다를까? 이번에는 같은 숫자 UI를 두고 버튼 클릭과 새로고침을 비교한 뒤, JavaScript를 켜고 끄면서 처음 받은 HTML과 React의 상호작용을 나누어 확인해봤다. 숫자는 바뀌었는데 페이지 요청은 없었다 /next-0 페이지에 안내 문장과 숫자 증가 버튼을 두었다. 숫자는 Client Component의 State로 관리했다. 아래는 실제 작성한 코드에서 스타일과 안내 문장을 덜어낸 실험 부분이다. "use client"; import { useEffect, useState } from "react"; export default function BrowserInteractionExperiment() { const [count, setCount] = useState(0); useEffect(() => { console.log("[browser][next-0] count effect", { count }); }, [count]); const handleIncrement = () => { console.log("[browser][next-0] increment click", { count }); setCount((count) => count + 1); }; return ( <section> <p> 숫자: <output id="next-zero-count">{count}</output> </p> <button type="button" onClick={handleIncrement}> 숫자 증가 </button> </section> ); } 버튼을 한 번 클릭하자 화면 숫자가 0 에서 1 로 바뀌었다. Console에는 다음 로그가 추가됐다. [browser][next-0] increment click { count: 0 } [browser][next-0] count effect { count: 1 } click 로그에는 State Update 전의 count: 0 이 남았고, 변경된 값 1 은 다음 화면과 Effect 로그에서 확인됐다. 그렇다면 숫자가 바뀔 때 페이지도 다시 요청됐을까? 초기 페이지 로드에서는 Network에 /next-0 의 document 요청이 있었고 화면에는 숫자 0 이 표시됐다. 페이지가 열린 뒤 Network 기록을 지우고 버튼을 한 번 클릭했다. 숫자는 1 로 바뀌었지만 새로운 document 요청은 발생하지 않았다. 이 버튼은 현재 페이지에서 State만 변경한다. 숫자를 0 에서 1 로 바꾸기 위해 페이지 HTML을 다시 받아오지는 않았다. 새로고침하자 document 요청이 생겼다 이어서 숫자가 1 인 상태에서 일반 새로고침을 했다. 이번에는 Network에 새 document 요청이 생겼고 숫자는 다시 0 으로 돌아왔다. 조작 화면 숫자 새 document 요청 숫자 증가 클릭 0 → 1 없음 일반 새로고침 1 → 0 있음 클릭은 이미 시작된 React 화면의 State를 갱신했다. 새로고침은 페이지를 다시 요청하는 시작점으로 돌아갔다. 이 예제는 State를 외부에 저장하지 않으므로 새 페이지에서 useState(0) 으로 시작했다. 이 결과는 React에서 익힌 Update 흐름 앞에 페이지 요청이라는 별도 과정이 있음을 보여준다. 요청이 생겼다는 사실만으로 서버에서 어떤 컴포넌트가 몇 번 실행됐는지까지 확정할 수는 없다. JavaScript를 끄자 화면은 남고 숫자는 바뀌지 않았다 다음에는 같은 코드와 페이지를 유지하고 브라우저 JavaScript 실행 여부를 바꿨다. JavaScript를 켠 상태에서는 세 번 클릭하며 숫자가 0 → 1 → 2 → 3 으로 바뀌었다. 각 클릭의 현재값과 변경 후 Effect 값이 Console에 남았다. JavaScript를 끈 상태의 캡처에서는 안내 문장, 숫자 0 , 버튼이 그대로 표시됐다. 페이지에 준비한 noscript 안내도 나타났고 Console에는 로그가 없었다. 이어서 끈 상태에서 버튼을 눌렀다. 숫자는 0 으로 유지됐다. 버튼의 모양이 보이는 것과 React의 onClick handler가 연결되어 숫자를 바꾸는 것은 다른 상태였다. Network에서는 next-0 의 document 요청과 응답 상태 200 을 확인했다. 이어서 Response 탭을 열자 응답의 body 안에 안내 문장, 초기 숫자 0 , 버튼이 HTML 요소로 들어 있었다. 문구가 script 데이터 안에만 있는 것이 아니라 실제 body 안의 요소로 존재했다. 캡처에서 class를 덜어내면 다음 부분이다. <p id="next-zero-message">이 문장은 페이지 응답에서 확인할 대상이다.</p> <output id="next-zero-count">0</output> <button type="button">숫자 증가</button> Elements 의 현재 DOM 대신 Network의 Response를 읽어, 페이지에서 받은 응답 자체를 확인했다. 응답에는 noscript 안내도 들어 있었다. 브라우저 JavaScript가 UI를 새로 만들지 않아도 받은 HTML로 이 화면을 표시할 수 있었다. 응답에 <script> 태그가 남아 있는 것과, 브라우저가 해당 JavaScript를 실행하는 것은 별개의 조건이다. JavaScript 실행을 다시 허용한 뒤 페이지를 새로고침했다. noscript 안내가 사라졌고, 버튼을 반복해서 누르자 숫자가 0 에서 7 까지 증가했다. 조건 페이지 화면 숫자 증가 JavaScript 켬 표시됨 클릭에 따라 증가 JavaScript 끔 표시됨; noscript 안내도 표시 눌러도 0 유지 다시 켜고 새로고침 표시됨; noscript 안내 사라짐 다시 증가, 7까지 확인 Next.js 공식 가이드는 최초 로드에서 HTML로 화면을 표시하고, 브라우저 JavaScript가 Client Component를 Hydration해 상호작용을 연결한다고 설명한다. Hydration은 React가 기존 HTML에 연결되어 DOM 관리를 맡는 과정이다. 화면을 표시하는 일과 React event handler가 동작하는 일은 구분된다. Console의 Server 표시는 브라우저 실행을 뜻하지 않았다 페이지 함수에는 다음 로그를 두었다. console.log("[server][next-0] page function executed"); JavaScript를 켠 상태의 Browser Console에는 이 로그가 Server 표시와 함께 보였다. 개발 도구가 전달한 서버 로그이므로 Console에 나타났다는 이유로 브라우저에서 페이지 함수가 실행됐다고 해석하지 않았다. 반대로 JavaScript를 끈 상태의 Console이 비어 있다는 사실도 서버 코드가 실행되지 않았다는 뜻은 아니다. 초기 count: 0 Effect는 두 줄로 표시됐다. 현재 App Router 개발 환경의 StrictMode 추가 실행과 맞는 동작이다. Effect 로그 개수를 Commit이나 Paint 횟수로 바꾸어 해석하지 않았다. 이번 비교에서 RSC Payload 내부 구조, 정확한 서버 컴포넌트 실행 시점, Streaming, Cache hit, DOM node 전체 재사용 여부와 Hydration 완료 시간은 측정하지 않았다. State Update보다 앞에는 페이지 요청이 있었다 버튼 클릭은 현재 화면의 State를 바꿨고, 새로고침은 페이지를 다시 요청해 숫자를 초기값으로 돌렸다. JavaScript를 끄면 응답 HTML로 화면은 표시됐지만 버튼을 눌러도 숫자는 바뀌지 않았다. React Deep Dive에서 주로 봤던 State Update는 이미 페이지가 열린 이후의 흐름이었다. 이번에는 그 앞에 페이지를 요청하고 초기 HTML을 받아 표시하는 과정이 있다는 것을 확인했다. HTML이 보이는 상태와 React가 연결되어 이벤트와 State Update를 처리하는 상태도 나누어 볼 수 있었다. Next.js에서는 이 페이지 시작 과정과 이후의 React Update를 함께 다루게 된다. 그렇다면 초기 화면을 만드는 과정에서 어떤 컴포넌트가 서버에서 실행되고, 어떤 컴포넌트가 브라우저와 연결될까? 다음 챕터에서는 Server Component와 Client Component는 어디에서 실행되는가 라는 질문으로 범위를 좁힌다.
이전 글 에서는 Consumer가 필요로 하는 데이터와 그 시점을 기준으로 이벤트에 무엇을 담을지 살펴봤다. 이번에는 메시지를 보낸 뒤, 처리 결과를 사용자에게 어떻게 알려줄지 생각해보려고 한다. 관리자가 대용량 엑셀 파일 생성을 요청하는 기능을 만든다고 해보자. 파일을 만드는 데 수십 초가 걸린다. HTTP 요청을 계속 붙잡아두기 부담스러워 Kafka로 작업을 넘기고, API는 먼저 응답하도록 바꿨다. 응답 시간은 짧아졌다. 그런데 화면에 완료되었습니다 라고 표시해도 될까? Consumer가 아직 메시지를 읽지 않았을 수도 있다. 파일을 만드는 중일 수도 있고, 처리에 실패해 재시도하고 있을 수도 있다. 요청을 접수한 것과 파일을 다 만든 것은 다르다. Kafka가 메시지를 받아들였다는 확인도 Consumer의 업무 완료를 뜻하지 않는다. 사용자가 작업 상태와 결과를 확인할 방법이 필요하다. 1. 토스뱅크: 무엇이 끝나야 성공이라고 할 수 있을까? 토스뱅크의 「은행 최초 코어뱅킹 MSA 전환기 (feat. 지금 이자 받기)」 에는 지금 이자 받기 의 일부 처리를 Kafka로 분리한 사례가 나온다. 기존에는 한 번의 이자 지급을 위해 여러 테이블에 많은 DB 쓰기가 발생했다. 토스뱅크는 이 중 같은 트랜잭션에서 처리하지 않아도 되는 작업을 분리했다. 기준은 고객의 잔액과 통장 데이터에 DB 쓰기 지연이 어떤 영향을 주는지였다. 반드시 함께 처리해야 하는 데이터는 유지하고, 즉시 반영할 필요가 없는 세금 관련 DB 쓰기는 Kafka를 통해 비동기로 처리했다. 이 사례를 사용자 응답의 관점에서 보면, 비동기로 넘길 작업을 고르기 전에 어디까지 처리돼야 완료라고 안내할 수 있는지 부터 정해야 한다. 주문이 생성되면 완료로 안내하는 서비스라면, 안내 메일이 늦어져도 주문은 완료된 상태다. 반면 엑셀 생성 요청을 접수한 시점에는 아직 다운로드할 파일이 없다. 엑셀 기능에서는 우선 생성 요청을 접수했습니다 라고 안내하고, 파일이 실제로 준비됐는지는 이후에 확인할 수 있어야 한다. 2. Microsoft: 비동기 작업은 상태를 조회하게 한다 Microsoft의 「Asynchronous Request-Reply Pattern」 은 오래 걸리는 작업을 HTTP 요청 하나에서 끝까지 기다리지 않는 구조를 설명한다. 클라이언트가 작업을 요청하면 API는 접수 사실과 상태 조회 URL을 반환한다. 백그라운드에서 작업이 진행되는 동안 클라이언트는 별도의 HTTP 요청으로 현재 상태를 확인한다. 이때 최초 응답으로 202 Accepted 를 사용할 수 있다. HTTP 명세 에서 202 는 요청이 처리를 위해 받아들여졌지만, 아직 처리가 완료되지는 않았다는 의미다. 작업 ID로 결과를 조회한다 엑셀 생성 요청을 POST /export-jobs 로 받는다고 해보자. API는 작업 ID와 상태 조회 위치를 반환한다. HTTP/1.1 202 Accepted Location: /export-jobs/job-1001 Retry-After: 5 Content-Type: application/json { "jobId": "job-1001", "status": "PENDING" } Location 은 상태 조회 URL이고, Retry-After: 5 는 다음 조회까지 5초 정도 기다리라는 안내다. 클라이언트는 이 값을 참고해 폴링 간격을 정할 수 있다. 이후 클라이언트가 GET /export-jobs/job-1001 을 호출하면 작업의 현재 상태를 반환한다. 아직 파일을 만드는 중이라면 다음처럼 응답할 수 있다. { "jobId": "job-1001", "status": "PROCESSING" } 파일 생성이 끝나면 다운로드 위치를 제공한다. HTTP/1.1 200 OK Content-Type: application/json { "jobId": "job-1001", "status": "SUCCEEDED", "downloadUrl": "/export-jobs/job-1001/file" } 실패한 작업도 같은 상태 API에서 조회할 수 있다. HTTP/1.1 200 OK Content-Type: application/json { "jobId": "job-1001", "status": "FAILED", "error": { "code": "EXPORT_GENERATION_FAILED", "message": "파일을 생성하지 못했습니다." } } 여기서 200 OK 는 작업 상태를 정상적으로 조회했다 는 의미다. 파일 생성의 성공 여부는 본문의 status 로 구분한다. 작업이 존재하지 않거나 조회 자체에 오류가 발생했다면 그에 맞는 HTTP 오류 상태를 반환한다. Microsoft 문서에는 완료 후 303 See Other 로 결과 위치를 알려주거나, 처리 오류에 맞는 4xx 를 반환하는 방식도 나온다. 이 글에서는 성공과 실패를 같은 형식으로 조회하도록 200 OK 응답의 본문에 작업 상태를 담는다. 클라이언트는 SUCCEEDED 나 FAILED 를 확인하면 폴링을 멈추고, 다운로드 버튼이나 실패 사유를 보여주면 된다. 접수했다고 응답한 작업은 남아 있어야 한다 API가 접수 응답을 보낸 직후 서버가 내려갔다고 해보자. 요청 정보가 메모리에만 있었다면 사용자는 기다리고 있는데 실제로는 아무 일도 일어나지 않을 수 있다. 작업을 DB에 저장하는 것만으로도 해결되지 않는 문제가 있다. Job 저장에는 성공했지만 Kafka에 메시지를 보내기 전에 서버가 내려가면, 작업은 남아 있어도 Consumer가 실행할 계기가 없어진다. 앞서 다룬 Transactional Outbox를 여기에 사용할 수 있다. AWS의 Outbox 설명 처럼 업무 데이터와 전달할 이벤트를 같은 DB 트랜잭션에 저장하는 방식이다. 엑셀 기능에서는 작업을 나타내는 Job 레코드와 Outbox 이벤트를 함께 저장한다. Job과 Outbox의 DB 커밋이 성공하면 API는 202 Accepted 를 반환하고, Relay는 커밋된 이벤트를 읽어 Kafka에 전달한다. 응답 반환과 Relay의 전달은 커밋 이후 각각 진행된다. Job에는 상태뿐 아니라 요청자, 조회 기간, 필터 등 파일 생성에 필요한 조건도 저장한다. 이 예시에서는 API와 Consumer가 같은 Job 저장소를 사용하므로, Consumer는 메시지의 jobId 로 해당 작업의 생성 조건을 읽을 수 있다. 앞선 글의 기준을 여기에 적용하면 ID만 보내도 필요한 정보를 어디서 가져올 수 있는지 가 분명해야 한다. 다른 서비스의 API를 호출해야 한다면 그 API에 대한 의존성이 생긴다. 또한 조회 조건을 저장하는 것만으로 요청 당시의 원본 데이터까지 보존되지는 않는다. 특정 시점의 데이터로 파일을 만들어야 한다면 그 데이터를 조회하거나 보존하는 방법도 정해야 한다. Consumer는 작업을 시작할 때 상태를 PROCESSING 으로 바꾸고, 파일 저장이 끝나 다운로드할 수 있게 되면 파일 위치와 함께 SUCCEEDED 를 기록한다. 상태 조회 API는 Job 저장소에서 현재 상태를 읽는다. 사용자가 결과를 조회할 때마다 Kafka Consumer에 응답을 요청할 필요는 없다. Outbox를 사용해도 메시지가 중복 전달될 수는 있다. 같은 작업 메시지를 다시 받은 Consumer가 어떻게 동작할지는 별도로 정해야 한다. 3. Shopify: Kafka의 데이터를 화면까지 전달한다 상태 조회 API가 있다면 클라이언트는 일정 간격으로 API를 호출해 완료 여부를 확인할 수 있다. 상태가 자주 변하거나 결과를 빠르게 화면에 보여줘야 한다면 서버에서 변경 사실을 전달하는 방법도 있다. Shopify의 「Using Server Sent Events to Simplify Real-time Streaming at Scale」 은 블랙프라이데이·사이버먼데이 기간의 실시간 판매 현황 지도를 다룬다. 기존에는 여러 컴포넌트와 폴링을 거쳐 데이터가 화면에 도달했다. Shopify는 이를 개선하면서 Kafka 토픽을 구독하는 SSE 서버를 두고, 새로운 데이터를 연결된 클라이언트로 전달하도록 구성했다. 이 화면은 서버가 브라우저로 새 데이터를 보내면 됐기 때문에, 단방향 통신인 SSE가 요구에 맞았다. 앞의 엑셀 기능에도 응용할 수 있다. Consumer가 파일을 만들고 Job의 SUCCEEDED 상태를 커밋한 뒤 완료 알림을 SSE로 전달하도록 구현하는 식이다. 브라우저는 알림에 담긴 jobId 로 상태 API를 조회해 다운로드 위치를 확인할 수 있다. 엑셀 파일 하나를 요청하고 결과를 확인하는 기능이라면 우선 폴링으로 시작해도 된다. 페이지를 열어둔 사용자에게 상태 변화를 빠르게 알려줘야 할 때 SSE를 검토할 수 있다. 방식 결과를 확인하는 방법 고려할 점 폴링 클라이언트가 상태 API를 주기적으로 호출 조회 간격, 중단 조건, 요청량 SSE 서버가 연결된 브라우저에 상태 변화를 전달 연결 관리, 재연결 후 누락 보완 웹훅 요청한 시스템의 Callback URL로 결과 전달 인증, 재시도, 중복 수신 결과를 확인하는 주체가 브라우저인지 다른 시스템인지, 얼마나 빨리 알려야 하는지에 따라 전달 방식을 고르면 된다. 알림을 놓쳐도 결과는 확인할 수 있어야 한다 사용자가 브라우저를 닫은 사이에 파일 생성이 끝날 수도 있다. Job 상태는 SUCCEEDED 로 바뀌었지만, SSE 연결이 끊어져 완료 알림은 받지 못한 상황이다. 화면을 다시 열거나 연결이 복구됐을 때 상태 API를 조회하면, 알림을 놓친 사용자도 준비된 파일을 받을 수 있다. Job 상태를 저장한 뒤 알림을 보내기 전에 Consumer가 내려갈 수도 있다. 별도 SSE 서버와 브라우저의 연결은 유지돼도 완료 알림이 전달되지 않는 상황이다. 따라서 화면을 다시 열거나 SSE에 재연결했을 때뿐 아니라, 작업이 끝나지 않은 상태로 일정 시간 알림이 없을 때도 상태 API를 조회하도록 한다. SSE는 상태 변화를 빠르게 알려주고, 상태 API는 저장된 결과를 확인하는 역할 을 맡는다. 4. 처리 중 으로 영원히 남는 작업도 관리해야 한다 메시지가 Kafka에 쌓인 채 처리되지 않거나, Consumer가 파일을 만드는 도중 내려가면 어떻게 될까? 작업 상태를 기록하는 것과 멈춘 작업을 찾아 복구하는 것은 별개의 일이다. 엑셀 작업에는 다음 정도의 상태를 둘 수 있다. 상태 의미 PENDING 요청이 저장되어 실행을 기다림. 이 예시에서는 재시도 대기도 포함 PROCESSING 작업을 시작했으며 아직 완료 결과가 기록되지 않음 SUCCEEDED 결과 파일이 준비되어 조회·다운로드 가능 FAILED 정해진 재시도나 복구 정책에 따라 실패로 확정 PENDING 이 오래 유지된다면 여러 지점을 확인해야 한다. Outbox에서 Kafka로 이벤트가 전달되지 않았을 수도 있고, Consumer가 메시지를 읽지 못하고 있을 수도 있다. 재시도를 기다리는 작업이라면 아직 다음 시도 시간이 오지 않았을 수도 있다. 이 예시에서는 재시도 대기도 PENDING 에 포함하므로, 재시도를 예약하는 로직에서 Job 상태도 함께 갱신해야 한다. PROCESSING 은 작업을 시작했다는 기록이다. Consumer가 지금도 실행 중이라는 뜻은 아니다. 작업 도중 서버가 내려갔다면 저장소에는 계속 PROCESSING 으로 남을 수 있다. requestedAt , startedAt , updatedAt , attempt 를 함께 남겨두면 어디서 얼마나 지연됐고 몇 번째 실행인지 확인하기 쉽다. 처리 시간이 긴 작업이라면 Heartbeat나 작업 임대 시간(lease)으로 실행이 멈췄는지 판단할 수도 있다. 다만 일정 시간이 지났다는 이유만으로 곧바로 실패 처리하고 다시 실행하기는 어렵다. 파일은 이미 저장됐는데 SUCCEEDED 상태를 기록하는 순간에만 장애가 발생했을 수도 있기 때문이다. 따라서 남아 있는 결과 파일을 확인해 상태를 보정하거나, 다시 실행해도 문제가 없도록 중복 처리를 제어한 뒤 재시도해야 한다. DLT에 들어갔다고 작업이 자동으로 실패하는 것도 아니다 여러 번의 재시도에도 처리하지 못한 메시지를 DLT로 옮겼다고 해보자. 메시지는 DLT에 있는데 Job 테이블에는 여전히 PROCESSING 이라고 남아 있을 수 있다. DLT 이동과 Job 상태 변경은 별개의 처리다. 실패를 확정하는 DLT 처리기나 복구 담당 서비스가 jobId 로 작업을 찾아 상태와 실패 사유를 기록해야 한다. Spring Kafka에서는 별도의 DLT 처리 메서드 를 지정하고, 여기에 Job 상태를 변경하는 로직을 구현할 수 있다. 운영자가 원인을 수정한 뒤 재처리하는 정책이라면 FAILED 로 바로 확정하기보다 RECOVERY_PENDING 같은 상태를 추가할 수도 있다. 사용자에게 표시할 상태는 서비스의 복구 정책에 맞게 정해야 한다. 이전 시도의 결과가 현재 상태를 덮어쓰면 안 된다 첫 번째 실행이 멈춘 것으로 판단해 두 번째 실행을 시작했고, 두 번째 실행이 성공했다고 해보자. 그런데 뒤늦게 첫 번째 실행의 실패 결과가 기록되려 한다. 조건 없이 상태를 갱신하면 이미 SUCCEEDED 인 작업이 다시 FAILED 가 될 수 있다. 이를 막으려면 현재 실행 시도가 일치하고, 허용된 상태 전이일 때만 상태를 변경해야 한다. 상태를 먼저 조회한 뒤 나중에 갱신하면 그 사이 다른 실행이 상태를 바꿀 수 있으므로, 조건 확인과 갱신도 원자적으로 처리해야 한다. 예를 들어 jobId , attempt , 현재 상태를 UPDATE 의 조건에 함께 넣을 수 있다. 첫 번째 시도의 결과를 기록하려는데 저장된 attempt 가 이미 두 번째 시도라면 갱신되지 않도록 하는 방식이다. 여기서 attempt 는 애플리케이션이 관리하는 작업 실행 차수다. 새 실행을 배정할 때 원자적으로 증가시키고, 배정된 실행은 그 값을 가지고 결과를 기록한다. 이 조건으로 오래된 실행이 Job 상태를 덮어쓰는 것은 막을 수 있다. 파일 업로드처럼 DB 밖에서 발생하는 작업은 별도로 중복 실행을 고려해야 한다. 5. 같은 요청이 두 번 들어올 수도 있다 사용자가 엑셀 생성 버튼을 눌렀다. 서버에서는 Job과 Outbox 이벤트를 정상적으로 저장했지만, 응답이 전달되기 직전에 네트워크 연결이 끊겼다고 해보자. 사용자는 요청이 실패했다고 생각하고 버튼을 다시 누를 수 있다. 서버가 이를 새로운 요청으로 처리하면 같은 파일을 만드는 Job이 두 개 생긴다. 중복 생성이 문제가 되는 기능이라면 요청에 멱등 키를 사용할 수 있다. Idempotency-Key: export-request-abc123 같은 키로 같은 요청이 다시 들어오면 새 작업을 만들지 않고 기존 jobId 를 반환한다. Microsoft 문서에서도 응답 유실로 POST가 재시도될 때 중복 작업을 막는 방법으로 멱등 키를 소개한다. 이때 클라이언트는 같은 논리적 요청을 재시도할 때 기존 키를 재사용해야 한다. 버튼을 누를 때마다 새 키를 만들면 이 상황의 중복을 막을 수 없다. 사용자가 별도의 파일 생성을 의도적으로 요청할 때는 새 키를 사용한다. 같은 키로 다른 요청이 들어왔을 때의 처리도 정해야 한다. 9월 데이터를 요청할 때 쓴 키로 10월 데이터를 요청했는데 기존 작업을 반환하면 엉뚱한 파일을 안내하게 된다. 이 예시에서는 키와 함께 요청 내용을 보관하고, 같은 키로 다른 생성 조건이 들어오면 오류를 반환하도록 한다. 같은 키의 요청이 동시에 들어올 수도 있다. 요청자별로 키의 유효 범위를 정하고 DB 유일성 제약을 두는 등, 키 확인과 Job 생성을 원자적으로 처리해야 한다. HTTP 요청을 중복 없이 접수했더라도 Kafka 메시지는 다시 전달될 수 있다. 요청 접수의 멱등성과 Consumer 처리의 멱등성은 각각 고려해야 한다. 운영에서는 API 응답 시간만 보면 안 된다 오래 걸리는 작업을 Kafka로 넘기면 API 응답 시간은 짧아질 수 있다. 사용자가 파일을 받는 시간도 짧아졌는지는 따로 확인해야 한다. API가 100ms 안에 응답해도, 실행 대기에 30초, 파일 생성에 40초가 걸린다면 사용자는 약 70초를 기다린다. 폴링 간격에 따라 화면에 완료가 표시되는 시점은 더 늦어질 수도 있다. 이런 비동기 작업은 API 응답 시간 외에도 다음 지표를 함께 봐야 한다. 접수부터 작업 시작까지의 대기 시간 접수부터 결과가 준비될 때까지의 전체 소요 시간 PENDING 이나 PROCESSING 상태에 오래 머무는 작업 수 작업 실패율과 재시도 횟수 Kafka Consumer Lag도 중요한 지표지만, 특정 사용자의 파일이 준비됐는지는 Job 상태와 결과를 통해 확인해야 한다. 사용자가 기다리는 것은 파일이다 엑셀 생성 버튼을 누른 사용자는 Kafka에 메시지가 잘 들어갔는지 궁금해하지 않는다. 지금 기다리면 되는지, 파일이 준비됐는지, 실패했다면 다시 요청해야 하는지 알고 싶다. 접수한 작업을 저장하고, Consumer가 처리 결과를 기록하고, 그 결과를 조회할 수 있게 만드는 이유다. 알림을 놓치거나 화면을 닫았다가 돌아와도 결과를 확인할 수 있어야 한다. API가 응답한 뒤에도 사용자의 기다림은 계속된다. 작업을 비동기로 넘겼다면 그 기다림이 어떻게 끝나는지까지 설계해야 한다. 다음 글에서는 요청은 계속 들어오는데 Consumer가 따라가지 못하는 상황을 살펴보려고 한다. Consumer를 늘리면 메시지 적체도 해결될까? 참고 자료 토스뱅크, 은행 최초 코어뱅킹 MSA 전환기 (feat. 지금 이자 받기) Microsoft, Asynchronous Request-Reply Pattern Shopify, Using Server Sent Events to Simplify Real-time Streaming at Scale IETF, RFC 9110 — HTTP Semantics AWS, Transactional outbox pattern Spring for Apache Kafka, DLT Strategies
How to Use Yelp Reviews Safely in 2026: An Educational Guide Introduction Online reviews have become an important part of everyday decision-making. Before visiting a restaurant, choosing a local service, booking an appointment, or trying a new business, many people look at customer experiences first. Yelp reviews can provide useful information about service quality, customer experiences, pricing, atmosphere, and common concerns. Learning how to use Yelp reviews safely is not simply about reading a high or low rating. It is about understanding different opinions, checking details, identifying useful patterns, and making decisions based on several pieces of information. This skill can also improve digital literacy and help people become more thoughtful online consumers. For students, workers, families, and everyday internet users, learning how to evaluate online reviews can be useful in many situations. It encourages people to ask questions, compare information, and avoid making decisions based on a single comment. ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰ 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 If You Want To More Information Just contace Now. 24 Hours Reply/Contact ➤E-mail: teamusatrustzone@gmail.com ➤WhatsApp: +1 (343) 600-0811 ➤Telegram: @usatrustzone ➤Visit Now: https://usatrustzone.com/product/buy-yelp-reviews/ 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰ According to educational guidance such as information shared by UsaTrustZone, responsible use of online information starts with learning how to understand sources and apply information carefully. Yelp can be useful when its reviews are considered as one part of a broader decision-making process. Understanding Yelp Reviews What Are Yelp Reviews? Yelp reviews are customer opinions about businesses and services. People may write about restaurants, salons, repair services, healthcare-related businesses, entertainment locations, and many other local establishments. Reviews can describe personal experiences, including customer service, environment, wait times, and general satisfaction. Reading these experiences can help users understand what other customers noticed. However, every review represents an individual experience. One person's experience may not be exactly the same as another person's experience, so it is helpful to consider several reviews rather than depending on one comment. Why Reviews Are Useful Reviews can introduce people to details that may not be obvious from a business description. For example, customers may mention whether a restaurant is suitable for families, whether a service is convenient, or whether the atmosphere is quiet or busy. This makes review reading an educational skill as well as a practical activity. People learn to compare information, recognize common themes, and decide which details are most relevant to their own needs. How to Read Yelp Reviews Carefully Look Beyond the Overall Rating An overall rating can provide a quick overview, but it does not explain the entire customer experience. A business with many positive reviews may still have occasional complaints about particular services, while a business with mixed ratings may have strengths that are important to a specific customer. Instead of looking only at the number of stars, read several recent and detailed reviews. Pay attention to repeated comments about service, cleanliness, communication, waiting time, quality, or other factors that matter to you. Compare Different Opinions Different customers naturally have different expectations. One person may prefer a quiet environment, while another may enjoy a lively atmosphere. Similarly, one customer may consider a particular price reasonable while another may consider it expensive. Comparing different perspectives helps you understand the context behind a review. This is an important digital literacy skill because it teaches you to examine information rather than immediately accepting one person's opinion as universal. Educational Benefits of Learning From Reviews Developing Critical Thinking Review analysis can improve critical-thinking skills. When reading several opinions, users can ask simple questions: Is this experience common? Are multiple customers mentioning the same issue? Is the reviewer discussing something that is personally important? These questions encourage logical thinking. Instead of accepting every statement immediately, users learn to separate personal opinions from repeated observations and make decisions using broader information. Improving Digital Literacy Digital literacy means knowing how to find, understand, evaluate, and use online information effectively. Yelp reviews provide a simple real-world environment for developing these abilities. People can practice checking dates, comparing comments, understanding ratings, and looking for additional information before making a decision. These habits can also be useful on other websites and digital platforms. Practical Applications in Daily Life Choosing Restaurants and Local Services One common use of Yelp is researching restaurants. Reviews may provide information about menu choices, atmosphere, customer service, portions, and general experiences. The same approach can be used when researching other local services. By comparing multiple experiences and checking relevant details, people can better understand what a business may offer before visiting. Planning Everyday Activities Reviews can also help with planning. Someone visiting a new neighborhood might research cafes, entertainment locations, repair services, or other businesses before deciding where to go. This process can save time and make planning more organized. It also encourages people to think about their personal requirements before choosing a location. Building Better Online Decision-Making Skills Identify Your Own Needs Before reading reviews, determine what matters most to you. For example, you might care about location, opening hours, customer service, accessibility, atmosphere, or price. Having clear priorities makes review research more useful. Instead of trying to find a business with the highest rating, you can focus on information that actually relates to your situation. Use Multiple Sources of Information Yelp reviews can be useful, but they do not have to be the only source of information. Official business information, menus, operating hours, policies, and other reliable sources can provide additional context. Using several sources helps create a more complete picture. This is especially useful when an important decision involves time, money, or personal preferences. Responsible Use of Online Reviews Respect Other People's Experiences Responsible review reading includes understanding that customers may have different experiences. A negative review does not automatically mean that every customer will have the same experience. Likewise, a positive review does not guarantee that everyone will feel the same way. Treating reviews as individual experiences encourages a balanced and respectful approach to online information. Avoid Making Unfair Conclusions It is better to focus on specific information than to make broad conclusions about a business or its employees based on one comment. Look for repeated themes and relevant details. This approach also encourages responsible online behavior. When people eventually write their own reviews, they can provide clear, honest, and respectful descriptions of their experiences. Case Studies and Examples Example 1: Choosing a Restaurant Imagine someone moving to a new neighborhood and looking for a restaurant for a family dinner. Instead of choosing a location only because it has a high rating, they read several reviews. Some customers mention friendly service, while others discuss noise levels and waiting times. The person then considers which factors matter most to their family. This approach turns review reading into a practical decision-making exercise. Example 2: Finding a Local Service A person may need a local repair or maintenance service. They can read reviews to understand common customer experiences, communication quality, appointment processes, and service descriptions. Rather than depending on a single review, they compare multiple comments and check additional business information. This gives them a clearer understanding of the available options. Example 3: Learning Digital Literacy A student can use Yelp reviews as a small research exercise. The student might compare several businesses and organize comments into categories such as service, environment, convenience, and customer satisfaction. This simple activity teaches information organization and comparison. It demonstrates how everyday websites can become practical learning tools for developing research skills. Step-by-Step Guide to Using Yelp Reviews Step 1: Define Your Purpose First, decide what you are looking for. Write down two or three factors that matter most to you. Step 2: Search for the Business Find the relevant business and review its basic information. Check the location, services, hours, and other available details. Step 3: Read Several Reviews Read a mixture of detailed reviews instead of focusing on one comment. Look for information that directly relates to your needs. Step 4: Identify Repeated Themes Notice whether several customers mention similar experiences. Repeated observations can provide useful context. Step 5: Consider Different Perspectives Remember that people have different expectations. Consider whether a reviewer's preferences are similar to yours. Step 6: Check Additional Information Compare the review information with other available business details. This can help you understand the situation more completely. Step 7: Make Your Own Decision After reviewing the information, consider your priorities and choose what fits your personal needs. The goal is not simply to follow another person's opinion but to
1. 웹브라우저와 자바스크립트 웹 문서 안에 <script> 태그로 자바스크립트 작성 자바스크립트 코드가 짧으면 웹 문서에서 자바스크립트를 실행할 위치에 바로 코드를 작성한다. 다음은 텍스트를 클릭했을 때 글자색을 바꾸는 예제이다. <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>글자색 바꾸기</title> <style> body { text-align:center; } h1 { color:blue; } </style> </head> <body> <h1 id="heading">자바스크립트</h1> <p id="text">위 텍스트를 클릭해 보세요</p> <script> let heading = document.querySelector('#heading'); heading.onclick = function() { heading.style.color = "red"; } </script> </body> </html> 외부 스크립트 파일로 연결해서 자바스크립트 작성 자바스크립트 코드를 따로 파일로 저장한 후 웹 문서에 연결해서 사용할 수 있다. <script> 태그를 사용하지 않고 확장자는 *.js로 저장한다. <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>글자색 바꾸기</title> <style> body { text-align:center; } h1 { color:blue; } </style> </head> <body> <h1 id="heading">자바스크립트</h1> <p id="text">위 텍스트를 클릭해 보세요</p> <script src="change-color.js"></script> </body> </html> 2.자바스크립트 용어와 기본 입출력 식과 문 식: 표현식, 연산식, 실제 값, 함수 실행 등 문: 명령, 조건문, 제어문, 끝에 세미콜론(;)을 붙인다. 기본 입출력 1) 알림 창 출력: alert("메세지") 2) 확인 창 출력: confirm("메세지") 3) 프롬프트 창에서 입력받기: prompt("메세지") 4) 웹 브라우저 화면 출력 document.write()문: document.write("메세지") 5) 콘솔 창 출력 console.log()문: console.log("메세지") 3. 변수 변수란? 프로그램에서 자료를 담아두는 공간 변수 선언하기: let 변수명 상수 선언하기: const 상수명 상수는 한번 값을 할당하면 프로그램 안에서 값이 변경되지 않는다. 변수 선언 규칙 1) 변수 이름은 영어,숫자, _만 사용한다. 2) 영어 대소 문자가 구별된다. 3) 예약어는 변수로 사용할 수 없다. (ex. var) 4) 여러 단어로 연결된 변수는 중간에 대문자를 섞어 쓴다. (ex. total area→TotalArea) 5) 변수 이름은 의미 있게 작성한다. 4. 자료형 자료형이란? 숫자, 문자 등 컴퓨터가 처리할 수 있도록 자료형을 알려준다. 1) 숫자형: 정수와 실수로 나누어 구분한다. typeof 숫자 2) 문자열: 작은따옴표(')나 큰따옴표(")로 묶은 데이터 3) 논리형: 참이나 거짓의 값을 표현하는 자료형 4) undefined 유형과 null 유형 undefined: 자료형이 정의되지 않았을 때 데이터 상태 null: 데이터 값이 유효하지 않은 상태 5) 배열: 하나의 변수에 값을 여러 개 저장 배열명["값1", "값2", ...] 인덱스: 배열의 각 요소에 자신만의 방 번호가 할당되는데, 방 번호가 인덱스이다. 0, 1, 2, 3, ... 5. 연산자 산술 연산자: 수학 계산을 할 때 사용, 피연산자는 숫자나 변수가 온다. ex) +(더하기), -(빼기), *(곱하기), /(몫), %(나머지), ++(+1), --(-1) 할당 연산자: 연산자 오른쪽의 실행 결과를 왼쪽 변수에 할당 6. 조건문 if 문: if문 괄호 안의 조건이 True면 명령 실행, False면 아무것도 하지 않는다. if else 문: if 조건이 True가 아닐 때 실행할 명령을 else 문 다음에 추가 다음은 if else 문을 사용하여 사용자가 입력한 변수가 3의 배수인지 확인한다. <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>조건문</title> </head> <body> <script> let userNumber=parseInt(prompt('숫자를 입력하세요.')); if (userNumber%3==0) alert('3의 배수입니다.'); else alert('3의 배수가 아닙니다.'); </script> </body> </html> swich 문: 처리할 명령이 많을 때 사용, 조건을 체크한 후 case 문을 사용하여 명령을 처리한다. <script> var session = prompt("관심 세션을 선택하세요. 1-마케팅, 2-개발, 3-디자인"); switch (session) { case "1": document.write("마케팅 세션을 선택하셨습니다."); break; case "2": document.write("개발 세션을 선택하셨습니다."); break; case "3": document.write("디자인 세션을 선택하셨습니다."); break; default: document.write("잘못된 선택입니다."); } </script>
🎓 Education & Training Kyungpook National University — B.S. in Computer Science and Engineering (Mar 2022 – Present) Krafton Jungle (Sep 2025 – Jan 2026) Completed an intensive 5-month software engineering bootcamp sponsored by Krafton . Implemented core x86 OS mechanisms (threads, virtual memory, system calls) in the Pintos project, gaining deep insight into system-level operations. Established a strong foundation in computer systems and backend architecture. Team Project : Open-source AI Automation Platform Wrocław University of Science and Technology, Poland — Exchange Student (Feb 2024 – Feb 2025) Clustering Project : Clustering Points in N-Dimensional Space Using Genetic Algorithms (C++) Strengthened adaptability and cross-cultural communication skills through international collaboration and coursework.
시작하기 전에 지금까지 네트워크 장비에 대해서 계속해서 공부하고 있는데 이번 파트에서는 여러 대의 호스트를 연결하는 허브 와 MAC 주소를 통해 원하는 포트로만 내보내도록 하는 스위치 에 대해서 배울 것이다. 그 과정에서 관련된 동작 방식인 반이중 모드 통신과 전이중 모드 통신, 허브에서 발생하는 충돌이라는 문제를 해결하기 위한 프로토콜인 CSMA/CD 도 배울 것이다. 시작하기에 앞서 짚어둘 것은 물리 계층은 주소 개념이 없다 는 것이다. 그렇기에 물리 계층의 네트워크 장비는 정보를 보낼 때 어떤 조작이나 판단을 하지 않는다. 하지만 데이터 링크 계층에는 MAC 주소라는 개념이 있다. 그렇기에 이 정보의 주소에 대한 조작과 판단을 할 수 있는 것이 특징이다. 허브 허브는 여러 대의 호스트를 연결하는 장치이다. 위 그림과 같이 커넥터를 연결할 수 있는 4개의 연결 지점이 있는데 이걸 포트 라고 한다. 허브는 2가지 큰 특징이 있다. 첫째, 전달받은 신호를 다른 모든 포트로 그대로 다시 내보낸다. 아까 시작하기에 앞서 말했듯이 물리 계층에서는 주소 개념이 없기에 허브는 수신지를 특정하지 않고 신호를 전달받으면 어떠한 조작이나 판단 없이 모든 포트에 보내기만 한다. 그래서 신호를 전달받은 호스트의 데이터 링크 계층은 그 일단 전달해놓은 신호의 MAC주소를 보고 자신과 관련 없으면 폐기한다. 둘째, 반이중 모드로 통신한다. 반이중(half duplex) 모드는 송수신을 번갈아가면서 하는 통신 방식이다. 일방통행이 아닌 1차선 도로로 비유할 수 있다. 무전기가 다른 쪽 말이 끝나야 이쪽에서 말할 수 있는 그런 방식과 같다고 보면 된다. 이와 반대되는 개념인 전이중(full duplex) 모드는 송수신을 양방향으로 할 수 있는 2차선 도로와도 같은 통신 방식이다. 이러한 2가지 특징은 중요한 네트워크 개념을 내포하면서 허브의 한계를 설명하기도 한다. 콜리전 도메인 한 호스트가 허브에 송신할 때 다른 호스트가 송신해버리면 어떻게 될까? 충돌(콜리전) 이 발생한다. 이렇게 한 허브에 호스트가 많이 연결될 수록 충돌이 발생할 가능성이 높다. 이렇게 충돌이 발생할 수 있는 영역을 콜리전 도메인이라 한다. 이렇게 허브의 넓은 콜리전 도메인의 충돌 문제를 해결하기 위해 CSMA/CD 프로토콜을 사용하거나 스위치 장비를 사용한다. CSMA/CD 풀어서 쓰면 Carrier Sense Multiple Access with Collision Detection이다. 캐리어를 감지, 다중 접근, 충돌 검출 이라는 의미 3개가 담긴 단어이다. 이걸 하나하나 살펴보도록 하자 CS(Carrier Sense), 캐리어 감지 누가 보내고 있나? 하고 허브에 전송 중인 호스트가 있는지 눈치보는 신호 감지. MA(Multiple Access), 다중 접근 캐리어 감지를 해도 부득이하게 동시에 네트워크를 사용할 때가 있다. 물론 충돌은 발생한다. CD(Collision Detection), 충돌 검출 충돌이 발생했다면 이를 검출하는데, 이걸 충돌 검출이라 한다. 충돌을 검출한 호스트는 다른 호스트에게 충돌이 발생했다고 알리기 위해 잼 신호라는 특별한 신호를 보내고 임의의 시간 대기 후 다시 전송한다. 정리하자면 현재 누가 보내고 있는지 확인하고, 다른 호스트가 전송 중이지 않을 때만 메시지를 보낸다. 만약 부득이하게 충돌이 일어났다면 임의의 시간동안 대기 후 다시 전송한다. 스위치 허브처럼 반이중 모드로 통신하면 충돌 위험이 있지만 애초에 전이중 모드로 통신을 한다면 CSMA/CD를 사용할 필요도 없어진다. 이런 기능을 지원하는 게 스위치이다. 데이터 링크 계층에서 쓰이는 스위치는 2계층에서 사용한다 해서 L2 스위치 라고도 불린다. 여러 포트에 호스트를 연결할 수 있는 점은 허브와 유사하지만 스위치는 허브와 달리 특정 MAC 주소를 가진 호스트에만 프레임을 전달할 수 있고, 전이중 모드의 통신을 지원하는 차이점이 있다. 스위치는 특정 포트와 그 포트에 연결된 호스트의 MAC 주소와의 관계를 기억하는 MAC 주소 학습 이라는 중요한 특징이 있다. 관계를 기억하기 위해 메모리에 표 형태로 기억하는데 이 표 형태의 정보를 MAC 주소 테이블 이라고 한다. 그럼 이 MAC 주소 학습은 어떻게 이루어질까? MAC 주소 학습 MAC 주소 학습은 3가지 기능을 통해 이루어진다. 플러딩 포워딩과 필터링 에이징 위 사진에서 A에서 C로 프레임을 전송하는 상황을 보자. 처음에 A가 스위치로 프레임을 송신하면 받은 프레임의 송신지 MAC 주소 를 바탕으로 A의 MAC 주소와 연결된 포트를 **MAC 주소 테이블에 저장한다. 그 다음 수신했던 1번 포트를 제외한 나머지 모든 포트(2,3,4번)에 프레임을 전송하는데 이걸 플러딩 이라고 한다. B와 D는 자신과 관련 없는 프레임이라 폐기한다. 반면 C는 자신이 받은 프레임에 대해 응답 프레임을 전송하고 이 때 C가 스위치에게 프레임을 줄 때 송신지 MAC 주소 도 같이 주므로 스위치는 C의 MAC 주소와 연결된 포트를 알아낸다. 이제 A와 C의 MAC 주소와 연결된 포트를 알기에 두 호스트끼리 프레임을 주고 받을 땐 아까처럼 B와 D에게 프레임을 보내지 않아도 된다. 이렇게 두 호스트의 MAC 주소와 연결된 포트를 알았을 때 보낼 포트를 제외하고 다른 모든 포트는 가리는 것을 필터링 이라고 하고 전송될 곳에 프레임을 보내는 것을 포워딩 이라고 한다. 만약 A와 C같은 관계에서 일정 시간동안 프레임을 주고받지 않았다면 해당 항목은 삭제된다. 이를 에이징 이라고 한다. 브리지 스위치랑 유사한 장비로 브리지 라는 장비도 있는데 네트워크 영역을 구획해 도메인을 나누거나 네트워크를 확장하는 용도로 쓰인다. 앞서 설명한 스위치의 기능도 제공하지만 최근엔 스위치가 대중화되어 사용 빈도는 줄어드는 추세이다. VLAN 스위치의 또 다른 중요한 기능인 VLAN은 Virtual LAN의 줄임말로 말 그대로 한 대의 스위치로 가상의 LAN을 만든다. 한 대의 스위치에 연결된 모든 호스트들이 언제나 서로 메시지를 자주 주고 받는 소속감이 강한 경우가 아닐 수 있다. 위 사진과 같이 하나의 스위치에 서로 다른 부서가 나누어질 수도 있는 것이다. 이렇게 되면 굳이 받지 않아도 될 브로드캐스트 메시지를 안 받는다고 분리하고자 새로운 스위치 장비를 구비하는 것은 낭비가 될 것이다. 이럴 때 VLAN을 구성하면 한 대의 물리적 스위치로 여러 대의 스위치가 있는 것 처럼 논리적인 LAN을 구획할 수 있다. 이렇게 VLAN을 구성하면 호스트 A D와 호스트 E I는 물리적인 거리와 관계없이 다른 LAN에 있는 것처럼 인식하고 브로드캐스트 도메인도 달라지게 된다. 이런 VLAN을 구성하는 방법 중 가장 대중적인 방식으로 포트 기반 VLAN 이 있다. 사전에 특정 포트에 VLAN을 할당하고 그 포트에 호스트를 연결하는 방법이다. 하지만 이는 포트 수가 부족해질 때 여러 대의 스위치를 구비해 같은 VLAN 포트끼리 연결할 때 포트가 낭비되는 문제가 생긴다. 이럴 때 VLAN 트렁킹 이라는 방법으로 해결할 수 있다. 스위치 간 통신을 위한 특별한 포트인 트렁크 포트 에 VLAN 스위치를 서로 연결해, 낭비되는 포트를 최소화 하고 같은 스위치에 연결되어 있지 않아도 같은 LAN에 속하도록 네트워크를 구성할 수 있다. 트렁크 포트로 전달받은 프레임이 어떤 VLAN 소속인지 확인하는 방법 프레임이 스위치 A에서 B로 트렁크 포트로 전달될 때 어떤 VLAN에 속한 프레임인지 알 수 있을까? 스위치가 학습되지 않은 MAC 주소를 포함한다면 잘 알 수 없기에 802.1Q 프레임 이라는 확장된 이더넷 프레임에 포함된 32비트 크기의 VLAN 태그 라는 정보로 식별한다. MAC 기반 VLAN MAC 주소에 따라 VLAN이 결정되는 방식. 위 그림과 같이 MAC 주소 테이블 같은 표 형식의 매핑 테이블을 통해 VLAN을 결정한다.
How to Keep LinkedIn Accounts Safe in 2026: A Practical Educational Guide Introduction LinkedIn has become an important part of modern professional life. People use it to maintain professional profiles, communicate with colleagues, discover learning opportunities, follow industries, and build meaningful professional connections. Because so much useful information can be connected to one account, understanding basic LinkedIn account safety is an important digital skill. Keeping a LinkedIn account safe does not need to be complicated. Simple habits such as using a unique password, enabling two-factor authentication, checking active sessions, protecting the email connected to the account, and being careful with unexpected messages can make account management more organized. ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰ 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 If You Want To More Information Just contace Now. 24 Hours Reply/Contact ➤E-mail: teamusatrustzone@gmail.com ➤WhatsApp: +1 (343) 600-0811 ➤Telegram: @usatrustzone ➤Visit Now: https://usatrustzone.com/product/buy-linkedin-accounts/ 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 🌟 ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰ This guide, prepared with UsaTrustZone as a source of information and guidance, explains practical ways to understand LinkedIn account safety in 2026. The goal is educational: to help users develop better digital habits and use LinkedIn confidently in everyday professional activities. Understanding LinkedIn Account Safety Why Account Safety Matters A LinkedIn profile can contain professional information such as your name, education, work history, skills, connections, and contact information. Keeping these details organized and protected is an important part of responsible digital communication. Account safety is also connected to everyday digital habits. When users learn how passwords, verification methods, privacy settings, and active sessions work, they gain knowledge that can be useful beyond LinkedIn. Building Better Digital Habits Good account management starts with consistency. Instead of waiting until something unusual happens, users can regularly review their account settings and security options. Useful habits include using a unique password, enabling two-factor authentication, keeping recovery information updated, reviewing active login sessions, protecting the email account connected to LinkedIn, and being careful with unexpected links and messages. Creating a Strong LinkedIn Password Why Unique Passwords Are Important A password is one of the basic layers protecting an online account. LinkedIn recommends using a strong password that is unique to the account and does not contain easily identifiable information such as your name, phone number, or email address. Using the same password across several websites can make account management more difficult. A separate password for LinkedIn helps keep the account independent from other online services. Practical Password Habits A useful password should be difficult for others to guess while remaining manageable for the account owner. Consider using a combination of letters, numbers, and special characters, avoiding birthdays and common names, avoiding information visible on your public profile, never sharing your password, and considering a reputable password manager. Using Two-Factor Authentication Understanding 2FA Two-factor authentication adds another verification step when signing in. Instead of relying only on a password, the account can require another method of confirmation. LinkedIn currently supports two-factor authentication through an authenticator app or SMS. Understanding this feature can also help users become more familiar with similar verification systems on other online services. Developing a Verification Routine When two-factor authentication is enabled, users should pay attention to unexpected verification requests. If a person receives a sign-in prompt without trying to access the account, the request should not be approved. The main lesson is simple: never approve a login that you did not initiate. Managing LinkedIn Privacy and Sessions Reviewing Active Sessions LinkedIn provides a Where you're signed in section where users can review active sessions and information about devices and login activity. Users can also end individual sessions or sign out of multiple sessions. Checking active sessions can be a useful monthly habit. For example, if you recently used a shared computer, an old phone, or another device that you no longer use, reviewing sessions can help you keep your account organized. Understanding Privacy Settings LinkedIn's Settings & Privacy area includes options for account preferences, sign-in security, visibility, data privacy, notifications, and other account controls. Learning these settings helps users make informed decisions about what information they share publicly and how other people can interact with their profile. Recognizing Suspicious Messages and Links Developing Better Online Awareness Professional-looking messages can sometimes encourage users to click links, provide information, or take immediate action. Learning to pause and examine unexpected communication is an important digital skill. Before clicking an unfamiliar link, consider whether the message was expected, whether the request makes sense, whether the sender is familiar, whether the message creates unnecessary urgency, and whether the website address is consistent with the service. Learning Through Everyday Examples Imagine receiving a message claiming that your account needs immediate verification. Instead of clicking immediately, open LinkedIn through your normal browser or app and check your account directly. This small habit encourages independent verification rather than reacting to unexpected instructions. Case Studies and Practical Examples Example One: A Student Managing a Professional Profile A university student creates a LinkedIn profile to document education, skills, projects, and professional interests. During setup, the student chooses a unique password and enables two-factor authentication. Over time, the student learns how to review privacy settings and active sessions. These habits become useful when using other educational platforms and online services. Example Two: A Remote Worker Using Multiple Devices A remote worker uses LinkedIn on a personal laptop and smartphone. Later, the person notices an unfamiliar active session. Instead of ignoring it, the user reviews the session information and ends the unfamiliar session. This example shows the value of regularly reviewing account activity. Example Three: Receiving an Unexpected Login Request A user receives a LinkedIn sign-in prompt even though they are not logging in. The user does not approve the request and checks the account directly. The broader lesson is to treat unexpected authentication requests seriously and verify activity through the normal account interface. Step-by-Step Method for Keeping a LinkedIn Account Safe Step One: Review Your Password Open your LinkedIn account settings and review your password habits. Make sure the password is unique and does not contain easily guessed personal information. Step Two: Enable Two-Factor Authentication Open Settings & Privacy, go to Sign in & security, and select Two-factor authentication. Follow LinkedIn's verification instructions. Step Three: Check Active Sessions Visit the Where you're signed in section. Review the devices and sessions shown there and end sessions that you no longer need or recognize. Step Four: Protect Your Email Account Your email address is an important part of account management. Use a strong, unique password for your email and enable two-factor authentication there when available. Step Five: Review Privacy Settings Review who can see your profile information, how people can contact you, and what activity is visible. Step Six: Practice Careful Communication Treat unexpected messages and links carefully. Verify unusual requests through the official LinkedIn website or app rather than immediately following an external instruction. FAQs About Keeping LinkedIn Accounts Safe How can I keep my LinkedIn account safe? Start with a unique password and enable two-factor authentication. Then review active sessions and privacy settings regularly. Is two-factor authentication useful for LinkedIn? Yes. It adds another verification step beyond the password and is an important part of modern account management. How often should I review my LinkedIn settings? A monthly review can be a simple habit. You should also review settings after changing devices, passwords, or important account information. What should I do if I see an unfamiliar LinkedIn session? Review the session information and end any session you do not recognize. Consider changing your password as part of your account-management routine. Should I click links in unexpected LinkedIn messages? Pause and verify unexpected requests first. Opening LinkedIn directly through the official app or website is a useful way to check account information. Can these habits help outside LinkedIn? Yes. Understanding passwords, two-factor authentication, privacy settings, session management, and careful communication provides useful digital-literacy skills for many online services. Conclusion and Final Thoughts Learning how to keep LinkedIn accounts safe in 2026 is not only about protecting one professional profile. It is also about developing practical digital habits that can support everyday online activities. A strong password, two-factor authentication, regular session reviews, thoughtful privacy settings, and careful communication can all contribute to better account management. The most useful approach is to make these actions part of a regular routine rather than treating them as a one-time task. With guidance from sources such as UsaTrustZone and official LinkedIn resources, users can continue learning about r