From 766a1a416a950547b923b6fa51e251e9e5048af3 Mon Sep 17 00:00:00 2001 From: seongho5356 Date: Sun, 23 Aug 2026 22:22:21 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=EB=B6=80=ED=95=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9A=A9=20noop=20=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EB=B0=9C=EC=86=A1=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지원서 제출 몰림 부하 테스트 시 SendGrid/Gmail 일일 한도를 소모하지 않도록 실제 발송 없이 지연만 재현하는 MailSender 구현체를 추가한다. - mail.provider=noop 으로 활성화 (기존 smtp/sendgrid 스위치와 동일한 방식) - mail.noop-delay-ms 로 발송 지연을 흉내낼 수 있으며 기본값은 0 - SmtpMailSender/SendGridMailSender 와 동일하게 afterCommit 이후 동작한다. 트랜잭션 안에서 지연을 주면 DB 커넥션 점유 시간이 함께 늘어나 측정 대상이 왜곡되므로 구조를 맞춰야 한다. Co-Authored-By: Claude Opus 5 --- .../global/infra/email/MailProperties.java | 2 + .../infra/email/sender/NoopMailSender.java | 75 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/main/java/KUSITMS/WITHUS/global/infra/email/sender/NoopMailSender.java diff --git a/src/main/java/KUSITMS/WITHUS/global/infra/email/MailProperties.java b/src/main/java/KUSITMS/WITHUS/global/infra/email/MailProperties.java index b6e0a49..89ae00d 100644 --- a/src/main/java/KUSITMS/WITHUS/global/infra/email/MailProperties.java +++ b/src/main/java/KUSITMS/WITHUS/global/infra/email/MailProperties.java @@ -11,6 +11,8 @@ @ConfigurationProperties(prefix = "mail") public class MailProperties { private String provider = "smtp"; + /** provider=noop 일 때 실제 발송 대신 흉내낼 지연(ms). 부하 테스트용. */ + private long noopDelayMs = 0L; private String fromEmail; private String fromName = "WITHUS"; private String sendgridApiKey; diff --git a/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/NoopMailSender.java b/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/NoopMailSender.java new file mode 100644 index 0000000..8702b1d --- /dev/null +++ b/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/NoopMailSender.java @@ -0,0 +1,75 @@ +package KUSITMS.WITHUS.global.infra.email.sender; + +import KUSITMS.WITHUS.global.infra.email.MailProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.InputStreamSource; +import org.springframework.stereotype.Component; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import java.util.List; + +/** + * 실제 발송 없이 발송 지연만 재현하는 구현체. + * 부하 테스트에서 SendGrid/Gmail 일일 한도를 소모하지 않기 위해 사용한다. + * + *

{@link SmtpMailSender}, {@link SendGridMailSender} 와 동일하게 커밋 이후에 동작한다. + * 트랜잭션 안에서 지연을 주면 DB 커넥션 점유 시간이 함께 늘어나 전혀 다른 것을 측정하게 되므로 + * afterCommit 구조를 반드시 맞춰야 한다. + */ +@Slf4j +@Component +@Profile("!test") +@ConditionalOnProperty(name = "mail.provider", havingValue = "noop") +@RequiredArgsConstructor +public class NoopMailSender implements MailSender { + + private final MailProperties mailProperties; + + @Override + public void send(String to, String subject, String text) { + simulateAfterCommit(to, subject); + } + + @Override + public void sendWithAttachments( + String to, + String subject, + String html, + List attachments + ) { + simulateAfterCommit(to, subject); + } + + private void simulateAfterCommit(String to, String subject) { + if (!TransactionSynchronizationManager.isSynchronizationActive()) { + simulate(to, subject); + return; + } + + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + simulate(to, subject); + } + }); + } + + private void simulate(String to, String subject) { + long delayMs = mailProperties.getNoopDelayMs(); + + if (delayMs > 0) { + try { + Thread.sleep(delayMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + } + + log.info("Email skipped by noop provider (simulated {}ms): [{}] subject: {}", delayMs, to, subject); + } +} From 9441468ac7f00ece7167b89c55107694c3df3af1 Mon Sep 17 00:00:00 2001 From: seongho5356 Date: Sun, 23 Aug 2026 22:22:33 +0900 Subject: [PATCH 2/7] =?UTF-8?q?chore:=20=EB=A9=94=EC=9D=BC=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20=EC=86=8C=EC=9A=94=20=EC=8B=9C=EA=B0=84=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85=20=EC=B6=94=EA=B0=80=20#184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메일 발송이 afterCommit 에서 요청 스레드로 동기 실행되므로 발송 왕복 시간이 응답 시간에 그대로 가산된다. 그 값을 부하 테스트 없이 파악할 수 있도록 발송 소요 시간을 로그에 남긴다. - SmtpMailSender: 재시도를 포함한 총 소요 시간과 시도 횟수를 기록. 성공 로그가 두 메서드에 중복되어 있던 것을 sendWithRetry 한 곳으로 통합 - SendGridMailSender: HTTP 왕복 소요 시간을 성공/거부 로그 모두에 기록 Co-Authored-By: Claude Opus 5 --- .../email/sender/SendGridMailSender.java | 14 +++++++++-- .../infra/email/sender/SmtpMailSender.java | 24 +++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/SendGridMailSender.java b/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/SendGridMailSender.java index 561b6d9..d82f03a 100644 --- a/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/SendGridMailSender.java +++ b/src/main/java/KUSITMS/WITHUS/global/infra/email/sender/SendGridMailSender.java @@ -83,10 +83,14 @@ private void sendMail(String to, String subject, String html, List response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + long elapsedMs = (System.nanoTime() - startedAt) / 1_000_000L; + if (response.statusCode() != ACCEPTED) { log.error( - "SendGrid rejected email: status={} to={} subject={} body={}", + "SendGrid rejected email in {}ms: status={} to={} subject={} body={}", + elapsedMs, response.statusCode(), to, subject, @@ -96,7 +100,13 @@ private void sendMail(String to, String subject, String html, List Date: Sun, 23 Aug 2026 22:24:10 +0900 Subject: [PATCH 3/7] =?UTF-8?q?chore:=20PR=20=EC=9D=B4=EB=B2=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EB=8F=84=20=EB=B0=B0=ED=8F=AC=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=20=ED=8A=B8=EB=A6=AC=EA=B1=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit develop 머지 없이 PR 상태에서 클러스터에 올려 부하 테스트를 수행하기 위해 주석 처리되어 있던 pull_request 트리거를 활성화한다. Co-Authored-By: Claude Opus 5 --- .github/workflows/deploy-multiarch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-multiarch.yml b/.github/workflows/deploy-multiarch.yml index eb736fc..fa6a84e 100644 --- a/.github/workflows/deploy-multiarch.yml +++ b/.github/workflows/deploy-multiarch.yml @@ -3,8 +3,8 @@ name: Deployment Workflow on: push: branches: [ "develop" ] -# pull_request: -# branches: [ "develop" ] + pull_request: + branches: [ "develop" ] jobs: build-and-push: From a7891f42aec6bbff02da671124d263f63ac87531 Mon Sep 17 00:00:00 2001 From: seongho5356 Date: Sun, 23 Aug 2026 22:47:34 +0900 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20noop=20=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=A7=80=EC=97=B0=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EB=B0=94=EC=9D=B8=EB=94=A9=20=EB=AA=85=EC=8B=9C=20#184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mail.noop-delay-ms 는 relaxed binding 규칙상 환경변수로는 MAIL_NOOPDELAYMS 가 되어야 하고, MAIL_NOOP_DELAY_MS 로 주면 mail.noop.delay.ms 로 해석되어 바인딩되지 않은 채 조용히 기본값 0 이 유지된다. 환경변수 이름을 플레이스홀더로 명시해 모호성을 제거한다. Co-Authored-By: Claude Opus 5 --- src/main/resources/application.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d2c0e0a..7947be7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,9 @@ spring: profiles: active: ${SPRING_PROFILES_ACTIVE:dev} + +mail: + # provider=noop 일 때 실제 발송 대신 흉내낼 지연(ms). + # relaxed binding 으로는 MAIL_NOOPDELAYMS 가 되어 헷갈리므로, + # 환경변수 이름을 플레이스홀더로 명시해 둔다. + noop-delay-ms: ${MAIL_NOOP_DELAY_MS:0} From 134f94abe1f1594559b9718d16edbc36fbd8d8be Mon Sep 17 00:00:00 2001 From: seongho5356 Date: Sun, 23 Aug 2026 22:56:26 +0900 Subject: [PATCH 5/7] =?UTF-8?q?test:=20=EB=B6=80=ED=95=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9A=A9=20noop=20=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=9D=84=20=EC=8B=A4=ED=96=89=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=EB=A1=9C=20=EA=B0=95=EC=A0=9C=20#184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프로퍼티 우선순위상 ConfigMap(application-argo.yml)과 환경변수가 base application.yml 보다 위에 있어 저장소 안에서는 mail.provider 를 덮을 수 없다. 커맨드라인 인자는 최상위이므로 실행 인자로 지정한다. @ConditionalOnProperty 는 MailProperties 가 아니라 Environment 를 조회하므로 필드 기본값 수정으로는 NoopMailSender 가 등록되지 않는다. 임시 변경이며 테스트 종료 후 되돌려야 한다. develop 머지 금지. Co-Authored-By: Claude Opus 5 --- deploy/Dockerfile | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/deploy/Dockerfile b/deploy/Dockerfile index ddd4f09..de1b801 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -9,4 +9,14 @@ FROM eclipse-temurin:17-jre AS runtime WORKDIR /app COPY --from=builder /app/build/libs/*.jar app.jar EXPOSE 8080 -ENTRYPOINT ["java", "-jar", "app.jar"] + +# ############################################################################ +# 임시: 지원서 제출 부하 테스트(#184) 전용 설정. 절대 develop 에 머지하지 말 것. +# +# 커맨드라인 인자는 프로퍼티 우선순위 최상위라 ConfigMap/환경변수를 모두 덮는다. +# noop 은 메일을 실제로 발송하지 않으므로, 이 상태에서는 지원서 접수 확인은 물론 +# 회원가입 인증메일·조직 초대·평가 리마인드가 전부 나가지 않는다. +# +# 테스트 종료 후 이 인자 두 개를 제거하고 재배포해야 메일이 정상화된다. +# ############################################################################ +ENTRYPOINT ["java", "-jar", "app.jar", "--mail.provider=noop", "--mail.noop-delay-ms=1500"] From ccd472e400bcfeeafc52a25f365a73e971c1bc84 Mon Sep 17 00:00:00 2001 From: seongho5356 Date: Sun, 23 Aug 2026 23:26:50 +0900 Subject: [PATCH 6/7] =?UTF-8?q?test:=20=EC=A7=80=EC=9B=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=B6=9C=20=EB=AA=B0=EB=A6=BC=20=EB=B6=80=ED=95=98=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20k6=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20#184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ApplicationServiceImpl.create() 의 처리량 상한을 측정한다. - setup 에서 공고 슬러그로 recruitmentId·질문 ID·need* 플래그를 받아 페이로드를 조립한다. 공고 설정이 바뀌어도 스크립트 수정이 필요 없다. - FILE_KB=0 이면 파일형 질문을 페이로드에서 제외해 NCP 업로드를 타지 않는다. 기본값(500KB)과 비교하면 업로드가 트랜잭션에서 차지하는 비중이 분리된다. - 5xx 중 커넥션 풀 고갈을 submit_pool_exhausted 로 따로 집계해 트랜잭션 길이가 병목인지 바로 판별한다. - PROFILE=smoke|ramp|soak 로 시나리오를 전환한다. Co-Authored-By: Claude Opus 5 --- k6/application-submit-burst.js | 212 +++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 k6/application-submit-burst.js diff --git a/k6/application-submit-burst.js b/k6/application-submit-burst.js new file mode 100644 index 0000000..eb5d33b --- /dev/null +++ b/k6/application-submit-burst.js @@ -0,0 +1,212 @@ +// 지원서 제출 몰림(write burst) 부하 테스트 +// +// ApplicationServiceImpl.create() 는 단일 @Transactional 안에서 NCP 업로드와 DB 쓰기를 +// 함께 수행한다. 커넥션 점유 시간이 업로드 시간에 묶이므로 처리량 상한이 +// Hikari pool / 트랜잭션 시간 +// 으로 고정된다. 이 스크립트는 그 상한을 찾는다. +// +// 실행 +// k6 run -e BASE_URL=https://stg.recruit-withus.co.kr -e SLUG=fdHhU7Mle \ +// -e PROFILE=smoke k6/application-submit-burst.js +// +// PROFILE +// smoke : VU 2, 30s — 페이로드가 공고 설정과 맞는지 확인 +// ramp : VU 0→150 — 처리량이 꺾이는 지점과 첫 5xx 시점 +// soak : VU 고정, 5m — 지속 부하 안정성 +// +// FILE_KB +// 0 이면 파일형 질문을 페이로드에서 아예 빼고 보낸다(업로드 없음). +// 0 보다 크면 그 크기의 더미 파일을 첨부한다. +// 두 값을 비교하면 NCP 업로드가 트랜잭션에서 차지하는 비중이 드러난다. +// +// 주의 +// - 실제 지원서가 생성되고 NCP 에 파일이 쌓인다. 라운드마다 정리해야 +// 테이블 크기가 달라지지 않아 라운드 간 비교가 유효하다. +// - 메일은 mail.provider=noop 으로 막아둔 상태에서 돌릴 것. + +import http from 'k6/http'; +import { check, sleep, fail } from 'k6'; +import { Counter, Rate, Trend } from 'k6/metrics'; + +const BASE_URL = __ENV.BASE_URL; +const SLUG = __ENV.SLUG; +const PROFILE = __ENV.PROFILE || 'smoke'; +const FILE_KB = Number(__ENV.FILE_KB || '500'); +const SLEEP_SECONDS = Number(__ENV.SLEEP_SECONDS || '0'); + +if (!BASE_URL) fail('BASE_URL is required. e.g. -e BASE_URL=https://stg.recruit-withus.co.kr'); +if (!SLUG) fail('SLUG is required. e.g. -e SLUG=fdHhU7Mle'); + +const PROFILES = { + smoke: { vus: Number(__ENV.VUS || '2'), duration: __ENV.DURATION || '30s' }, + ramp: { + stages: [ + { duration: '30s', target: 10 }, + { duration: '1m', target: 30 }, + { duration: '1m', target: 60 }, + { duration: '1m', target: 100 }, + { duration: '1m', target: 150 }, + { duration: '30s', target: 0 }, + ], + }, + soak: { vus: Number(__ENV.VUS || '20'), duration: __ENV.DURATION || '5m' }, +}; + +if (!PROFILES[PROFILE]) fail(`Unknown PROFILE: ${PROFILE}. use smoke|ramp|soak`); + +export const options = { + ...PROFILES[PROFILE], + // 한계를 찾는 게 목적이므로 실패해도 중단하지 않는다. + thresholds: { + submit_failed: ['rate<0.05'], + http_req_duration: ['p(95)<10000'], + }, +}; + +const submitFailed = new Rate('submit_failed'); +const submitDuration = new Trend('submit_duration', true); +const submitOk = new Counter('submit_ok'); +const submit5xx = new Counter('submit_5xx'); +const submit4xx = new Counter('submit_4xx'); +const submitPoolExhausted = new Counter('submit_pool_exhausted'); + +// VU 당 한 번만 만든다. 매 반복 생성하면 클라이언트 CPU 가 병목이 된다. +const FILLER = FILE_KB > 0 + ? 'k6-loadtest-filler-'.repeat(Math.ceil((FILE_KB * 1024) / 19)).slice(0, FILE_KB * 1024) + : ''; + +export function setup() { + const res = http.get(`${BASE_URL}/api/v1/recruitments/slug/${SLUG}`); + if (res.status !== 200) { + fail(`Failed to load recruitment. status=${res.status} body=${String(res.body).slice(0, 300)}`); + } + + const d = res.json().result; + if (!d) fail('Recruitment detail is empty.'); + + const questions = (d.applicationQuestions || []).map((q) => ({ + questionId: q.questionId, + type: q.type, + })); + + // "2026.12.24" + "00:30" -> "2026-12-24T00:30:00" + const availableTimes = (d.availableTimeRanges || []).map((r) => { + const date = String(r.date).replace(/\./g, '-'); + const time = String(r.startTime).length === 5 ? `${r.startTime}:00` : r.startTime; + return `${date}T${time}`; + }); + + const positions = (d.positions || []).map((p) => p.id ?? p.organizationRoleId); + + const setupData = { + recruitmentId: d.recruitmentId, + positionId: positions.length > 0 ? positions[0] : null, + questions, + availableTimes, + needImage: d.needImage, + needGender: d.needGender, + needAddress: d.needAddress, + needSchool: d.needSchool, + needBirthDate: d.needBirthDate, + needMajor: d.needMajor, + needAcademicStatus: d.needAcademicStatus, + }; + + console.log( + `[setup] recruitmentId=${setupData.recruitmentId} ` + + `questions=${questions.length}(file=${questions.filter((q) => q.type === 'FILE').length}) ` + + `availableTimes=${availableTimes.length} needImage=${d.needImage} ` + + `deadline=${d.documentDeadline} FILE_KB=${FILE_KB} PROFILE=${PROFILE}` + ); + + return setupData; +} + +export default function (data) { + const suffix = `${__VU}-${__ITER}-${Date.now()}`; + const attachFile = FILE_KB > 0; + + // ApplicationValidator.validateFileAnswers 는 answers 중 FILE 질문 수와 + // 실제 파일 개수가 정확히 일치해야 통과한다. FILE_KB=0 이면 FILE 질문을 + // answers 에서 제외해 파일 없이 보낸다. + const answers = []; + let fileName = null; + + for (const q of data.questions) { + if (q.type === 'FILE') { + if (!attachFile) continue; + fileName = `loadtest-${suffix}.pdf`; + answers.push({ questionId: q.questionId, answerText: null, fileName }); + } else { + answers.push({ + questionId: q.questionId, + answerText: `[k6] VU=${__VU} ITER=${__ITER} 자동 생성 답변입니다.`, + fileName: null, + }); + } + } + + const request = { + name: `부하테스트${__VU}-${__ITER}`, + email: `loadtest+${suffix}@example.com`, + phoneNumber: `010${String(Math.floor(Math.random() * 100000000)).padStart(8, '0')}`, + recruitmentId: data.recruitmentId, + positionId: data.positionId, + answers, + availableTimes: data.availableTimes, + gender: data.needGender ? 'MALE' : null, + university: data.needSchool ? '상명대학교' : null, + major: data.needMajor ? '컴퓨터과학과' : null, + academicStatus: data.needAcademicStatus ? 'ENROLLED' : null, + birthDate: data.needBirthDate ? '2000-01-01' : null, + address: data.needAddress ? '서울시 도봉구 56로 501' : null, + }; + + const payload = { + request: http.file(JSON.stringify(request), 'request.json', 'application/json'), + }; + + if (data.needImage) { + payload.profileImage = http.file(FILLER || 'x', `loadtest-${suffix}.jpg`, 'image/jpeg'); + } + + if (attachFile) { + payload.files = http.file(FILLER, fileName, 'application/pdf'); + } + + const res = http.post(`${BASE_URL}/api/v1/applications`, payload, { + tags: { name: 'POST /api/v1/applications' }, + timeout: '60s', + }); + + submitDuration.add(res.timings.duration); + + const ok = check(res, { 'submit 200': (r) => r.status === 200 }); + submitFailed.add(!ok); + + if (ok) { + submitOk.add(1); + return; + } + + const body = String(res.body || ''); + + if (res.status >= 500 || res.status === 0) { + submit5xx.add(1); + // 커넥션 풀 고갈을 따로 센다. 이게 지배적이면 트랜잭션 길이가 병목이다. + if (/SQLTransientConnection|Connection is not available|HikariPool/i.test(body)) { + submitPoolExhausted.add(1); + } + if (__ITER % 50 === 0) { + console.error(`5xx status=${res.status} body=${body.slice(0, 200)}`); + } + } else { + submit4xx.add(1); + // 400 이면 페이로드가 공고 설정과 안 맞는 것이므로 즉시 드러나야 한다. + if (__ITER === 0) { + console.error(`${res.status} status=${res.status} body=${body.slice(0, 500)}`); + } + } + + if (SLEEP_SECONDS > 0) sleep(SLEEP_SECONDS); +} From f110cc5e9ca658f3824703a7454f740f9b1c663e Mon Sep 17 00:00:00 2001 From: seongho5356 Date: Sun, 23 Aug 2026 23:30:29 +0900 Subject: [PATCH 7/7] =?UTF-8?q?Revert=20"test:=20=EB=B6=80=ED=95=98=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9A=A9=20noop=20=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=84=A4=EC=A0=95=EC=9D=84=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EC=9D=B8=EC=9E=90=EB=A1=9C=20=EA=B0=95=EC=A0=9C=20#184"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 134f94abe1f1594559b9718d16edbc36fbd8d8be. --- deploy/Dockerfile | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/deploy/Dockerfile b/deploy/Dockerfile index de1b801..ddd4f09 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -9,14 +9,4 @@ FROM eclipse-temurin:17-jre AS runtime WORKDIR /app COPY --from=builder /app/build/libs/*.jar app.jar EXPOSE 8080 - -# ############################################################################ -# 임시: 지원서 제출 부하 테스트(#184) 전용 설정. 절대 develop 에 머지하지 말 것. -# -# 커맨드라인 인자는 프로퍼티 우선순위 최상위라 ConfigMap/환경변수를 모두 덮는다. -# noop 은 메일을 실제로 발송하지 않으므로, 이 상태에서는 지원서 접수 확인은 물론 -# 회원가입 인증메일·조직 초대·평가 리마인드가 전부 나가지 않는다. -# -# 테스트 종료 후 이 인자 두 개를 제거하고 재배포해야 메일이 정상화된다. -# ############################################################################ -ENTRYPOINT ["java", "-jar", "app.jar", "--mail.provider=noop", "--mail.noop-delay-ms=1500"] +ENTRYPOINT ["java", "-jar", "app.jar"]