# --- 2) 최종 이미지(Stage: runner) ---
FROM public.ecr.aws/docker/library/node:20.5.1-alpine3.18
# 1. 작업 디렉터리 설정
WORKDIR /application
# 2. 배포 시 필요한 운영 의존성만 설치
COPY package*.json ./
RUN npm ci --omit=dev
# 3. 빌드 산출물(standalone, static, 설정 파일 등) 복사
COPY .next/standalone ./
COPY .next/static ./.next/static
COPY next.config.js ./
COPY run_server.js ./
# 4. 데이터 vercel 에 전송 안함
ENV NEXT_TELEMETRY_DISABLED=1
# 5. 포트 개방 및 실행 명령
EXPOSE 3000
CMD ["node", "run_server.js"]
🔸 .dockerignore 설정
불필요한 파일을 빌드 context에서 제외하여 Docker 빌드 속도 향상
기존에는 Dockerfile 안에서 빌드를 했기 때문에, .next 폴더가 .dockerignore 에 포함되어 있었지만, 다시 외부에서 빌드하고, Dockerfile 에서는 필요한 파일만 복사해 오는 형식으로 변경하므로, .dockerignore 에서 .next 폴더를 제외시켜야 docker context 를 로드하여 복사할 수 있다.
# Next.js 빌드/캐시 폴더
.next/
!/.next/standalone
!/.next/static
# 테스트 산출물
tests/
__tests__/
jest.config.js
node_modules
.git
.gitignore
Dockerfile
docker-compose.yml
README.md
# 2) 환경 변수
.env
.env.*
buildspec/
├── buildspec-build.yml # AWS CodeBuild 빌드 단계 정의
├── Dockerfile # Docker 이미지 빌드를 위한 정의
├── pre_build.sh # 빌드 전 환경 설정 스크립트
└── post_build.sh # ECR 푸시 스크립트
.dockerignore
next.config.js
feature/address-edit → dev 머지를 위한 PR 생성 시 이미 dev에 반영된feature/account-add 변경내역이 Bitbucket PR 화면에서 함께 나타나는 문제 발생
즉, 예상되는 PR 변경점은 feature/address-edit 내용만 보여야 하는데, 이전에 이미 병합된 feature/account-add의 내용까지 PR에 포함된 것처럼 보였습니다.
🧑💻 원인 분석 및 설명
이 문제는 Git의 브랜치 간 merge-base 불일치 때문에 발생합니다.
feature/account-add 브랜치를 dev와 master 각각에 별도로 머지하면서, 같은 변경점이 서로 다른 커밋(SHA) 으로 생성되었습니다.
이후 master에서 생성한 새 브랜치(feature/address-edit)를 dev에 머지할 때, Git은 두 브랜치 간의 공통 조상(commit) 을 기준으로 diff를 계산합니다.
이때 dev가 이미 포함한 변경 내용임에도 master 브랜치에서의 변경점 SHA가 다르기 때문에, Git은 dev가 이미 가진 변경점을 "새로운 변경점"으로 간주하여 PR에 표시한 것입니다.
이를 시각적으로 표현하면 다음과 같습니다.
A───D1───dev
\ ↑
C1 | feature/account-add 내용 (SHA A)
\
\ (release/0410 경로)
C1'──B───master──A1──feature/address-edit
↑
| feature/account-add 내용 (SHA B)
여기서 dev는 SHA A의 변경점을, master는 SHA B의 변경점을 각각 가지고 있습니다. Git의 diff 계산 기준인 merge-base가 C1 이전의 커밋이므로 중복 변경이 발생한 것입니다.
✅ 해결 방법
이 문제를 해결하는 방법은 다음과 같이 크게 세 가지가 있습니다.
방법 1: dev 브랜치를 master로 최신화 (권장/선택)
git checkout dev
git merge --no-ff master # 또는 rebase
git push origin dev
장점: 한 번의 작업으로 이후 PR이 깔끔해집니다.
단점: dev의 히스토리가 길어질 수 있습니다.
선택한 방법은 배포할때 사용한 release 브랜치를 배포시 master 에도 merge 함과 동시에, dev 에도 merge 하는 방식으로 진행
방법 2: feature 브랜치를 dev 기준으로 rebase
git checkout feature/address-edit
git rebase dev # 충돌 시 해결
git push -f origin feature/address-edit
form 형태로, POST 로 게다가 <html> 텍스트로 데이터를 요청/응답 받아야한다.
프론트에서 Request 파라미터를 말아서 form 으로 보내고,
Request 파라미터 중 하나인 "ServerReplyURL" 키에 어떤 값을 담아 보내야 하는지가 고민이었다.
왜냐하면, ServerReplyURL 이 url 은, 편의점을 선택하는 ecpay.map 화면으로 url 이 이동 되었다가,
유저가 편의점 선택을 완료하여 제출하고 나서
1. 다시 돌아올 mysite 페이지
2. POST 로 쏴주는 응답 데이터를 받을 엔드 포인트
이 두가지 역할을 해야하기 때문이다.
하지만, Next.js 를 사용하고 있어서, 프론트에서도 POST 요청을 받을 수 있는 엔드포인트를 만들 수 있다.
1. app 밑에 api 라우트 파일 생성
/app/api/checkout/cvs-result/route.ts
import { NextResponse } from "next/server";
// ECPAY 편의점 선택 결과 리턴 엔드 포인트
export async function POST(request: Request) {
const url = new URL(request.url);
const body = await request.text();
return NextResponse.redirect(`https://mysite.com/checkout?${body}`);
}
2. 편의점 선택 컴포넌트 생성
/components/SelectConvenience.tsx
SelectConvenience 컴포넌트는, 편의점 종류를 버튼으로 제공하고,
특정 편의점 버튼을 눌러서 선택하면,
ecpay 에 지점 선택을 위한 map 페이지를 요청하는 컴포넌트 이다.
편의점 종류 선택지 버튼을 UI 로 제공하고,
form 을 숨겨서 submit 할 수 있도록 하였다.
ECPAY 로 보내는 request parameter 에
필수 파라미터 정보를 세팅하고,
ServerReplyUrl = "https://mysite.com/api/checkout/cvs-result" 로 뚫어 놓은 API 주소를 세팅한다
따봉 많이 받으신 분의 코멘트 요약해보면, API 문서에 어디에도 서버사이드에서만 작동한다는 말이 없는데, distancematrix 는 서버사이드로 요청해야한다고 해서 트러블 슈팅에 시간을 많이 소요했다. 결론은 클라이언트 사이드에서 distance matrix 를 구하려면 Javascript API 를 사용해야한다.