시공전 사진과 시공후 사진이 있다고 바로 비교 화면을 만들 수 있는 것은 아니다. 둘을 나란히 놓으면 방문자는 같은 공간이 이렇게 바뀌었다고 읽는다. 실제 사진 포트폴리오 프로그램을 다시 읽으며 내가 주목한 것은 그 약속을 코드에서 따로 다룬 구조였다. 비교를 확인하지 못한 경우에도 쓸 수 있는 시공후 사진은 남기고, 근거 없는 짝은 만들지 않기로 했다.
사진 한 장을 고르는 일과 관계를 확인하는 일은 달랐다
일반 갤러리는 이 현장의 시공후 장면을 보여 준다. 전후 비교는 여기에 두 장이 같은 물리 공간과 방향을 담았다는 관계를 더한다. 원본에 같은 방이라는 이름이 있거나 폴더에서 앞뒤로 정렬됐다는 이유만으로 그 관계를 만들면 안 됐다. 한 사진의 단계가 맞다는 판단과 두 사진이 비교 가능한 짝이라는 판단을 분리했다.
읽은 검수 기록에도 시공후 장면은 남기면서 방향이 맞지 않는 시공전은 비공개로 두고, 별도로 확인한 주방 한 쌍만 연결한 사례가 있다. 이 글은 해당 원본 사진을 새로 눈으로 검수한 결과가 아니다. 당시 검수 기록, 현재 선택 코드와 시험 소스를 대조해 제작자가 어떤 판단을 프로그램에 남겼는지 설명한다.
갤러리와 비교에 같은 공개 스위치를 쓰지 않았다
원래 렌더러는 선별 목록에서 시공후이면서 공개 보류가 없는 사진을 일반 갤러리 후보로 쓴다. 비교 쪽은 검수한 비교 기록, 시공전→시공후 순서, 같은 현장과 물리 공간 ID, 방 분류와 표시 방향을 더 확인한다. 비교가 성립하지 않는다는 이유만으로 독립적인 시공후 갤러리를 함께 지우지 않는다.
반대 방향도 중요했다. 일반 갤러리에 넣지 않기로 한 시공후가 비교의 한쪽으로만 쓰일 수 있다. 그래서 공개 데이터에는 gallery_photo_keys와 comparison_photo_keys를 따로 둔다. 사진이 어느 맥락에서 보이는지를 하나의 공개 여부로 줄이지 않은 것이다. 이번 공유 예제도 이 두 목록을 별도로 계산하되 검수된 합성 입력만 받도록 범위를 좁혔다.
방향이 같다는 조건도 검수의 대체품은 아니었다
표시 방향 검사는 원본 파일의 가로세로만 읽는 것이 아니다. 이 프로그램은 검수한 회전을 먼저 적용하고 화면에서 바로 선 사진의 크기를 사용한다. 그 뒤 가로·세로·정사각 방향이 맞는지 비교한다. 회전 정보와 표시 크기를 따로 관리하지 않으면 같은 사진도 잘못 분류될 수 있다.
다만 둘 다 가로라는 사실이 같은 벽과 창을 보고 있다는 증거는 아니다. 코드에는 검수한 비교 기록이라는 별도 조건이 남아 있다. 같은 현장과 물리 공간 ID, 공간 분류까지 맞아야 하며 넓은 방 분류만으로 ID를 만들어 내지 않는다. 나는 이런 자동 검사와 실제 장면 판단의 경계를 설명하는 것이 예쁜 비교 효과를 소개하는 것보다 먼저라고 봤다.
보류는 사진의 단계를 바꾸는 대신 공개 경로를 막았다
출처 확인이나 인물 반사, 마감·정리 확인이 필요한 사진은 보류로 다룬다. 보류했다고 시공후를 시공전으로 바꾸거나 원본을 지우지 않는다. 원래 선별 모듈은 사진의 단계와 소속을 남기고 별도의 publication_hold를 적용한다. 해결 뒤에는 같은 사진을 다시 검토할 수 있어야 하기 때문이다.
보류는 본문에서만 숨기면 부족하다. 대표 사진이 보류되면 다른 시공후 후보를 찾고, 한쪽이 보류된 전후 비교는 나오지 않으며, 공개 확대보기 목록에서도 빠져야 한다. 실제 시험 소스에는 사진 ID뿐 아니라 원본·작은 이미지 경로가 생성 결과에 남지 않는지 확인하는 항목이 있다. CSS로 가렸다는 사실과 공개 자료에서 제외했다는 사실을 구별했다.
확대보기의 자료도 현재 공개 목록에서 만들었다
공개 데이터 함수는 일반 갤러리와 검수한 비교가 실제로 쓰는 키를 합친 뒤 그 사진만 photos에 넣는다. 원본 재료 전체를 브라우저로 보내고 화면에서 골라 숨기는 방식과 구별되는 지점이다. 시공전은 검수한 비교 안에 있을 때만 이 공개 집합에 들어갈 수 있다. 일반 갤러리를 비웠다고 확대보기에서 다시 나타나면 안 된다.
이 구조는 공개 목록의 일관성을 다루며 이미지 파일 서버의 접근 제어까지 자동으로 보장하지는 않는다. 독자가 다른 사이트에 적용한다면 메타데이터 응답, 썸네일, 확대보기, 직접 파일 제공과 캐시 정책을 각각 확인해야 한다. 이번 글과 모듈은 목록 계산과 선택한 생성 코드의 책임을 설명하며 실제 운영 이미지 주소를 새로 검사하지 않았다.
사진이 비어도 현장의 기록까지 지우지는 않았다
시공전만 있거나 모든 사진이 보류된 현장은 목록에서 없애는 대신 시공후 사진을 준비한다는 상태로 남길 수 있다. 원래 코드와 시험도 개별 현장 항목을 유지하고 시공전 썸네일을 대신 보여 주지 않는 방식을 담고 있다. 빈 화면을 채우려고 확인되지 않은 사진을 끌어오면 기록과 표현이 함께 흔들릴 수 있다.
이때 카피는 없다는 사실과 확인 중이라는 상태를 구별해야 한다. 사진이 아예 없는지, 시공전 자료만 있는지, 공개 확인을 기다리는지에 따라 관리자의 다음 일이 다르다. 방문자에게는 확인하지 않은 결과를 약속하지 않는 짧은 준비 문구가 필요하다. 공개할 수 없는 자료가 남아 있어도 원본과 선별·보류의 이유는 작업 장부에 보존한다.
재사용할 것은 효과보다 판단의 분리였다
이번에는 고객 원본을 공개하는 대신 독립 합성 메타데이터로 같은 선택을 재현했다. 비교를 미검수로 바꾸거나 물리 공간을 다르게 주고, 한쪽을 보류하면 어떤 목록이 달라지는지 기록으로 읽을 수 있다. 기존 자산·설명 근거 모듈과는 다른 책임이며 함께 쓸 수 있다. 하나는 문장의 근거 연결을, 이번 것은 사진이 나타날 맥락을 계산한다.
새 예제의 19개 시험과 압축 추출 뒤 재시험은 이 좁은 계약을 확인한다. 원래 프로그램의 과거 회귀 기록이나 원본 사진 검수, 실제 브라우저 검수와 섞어 말하지 않는다. 포트폴리오의 설득력은 사진을 많이 붙이는 데서만 나오지 않는다. 무엇을 보여 주고 어떤 관계는 아직 말할 수 없는지 제작자가 설명할 수 있을 때 비교 한 쌍의 의미도 더 분명해진다.