Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
561 commits
Select commit Hold shift + click to select a range
4395b5a
Merge pull request #71 from On-Survey/feat/ON-214
wonjuneee Dec 19, 2025
3b1a7b0
build: queryDSL 버전업
wonjuneee Dec 19, 2025
b7376f7
mod: 특정 필드만 조회하여 DTO에 매핑하도록 수정
wonjuneee Dec 19, 2025
8b1a58a
mod: Segmentation 필터링 관련하여 관심사 필드도 조회하도록 수정
wonjuneee Dec 19, 2025
b6ca42e
chore: TestController 삭제
KJaeKwan Dec 21, 2025
85db7aa
fix: 인자가 비어있는 쿼리 요청 방지
wonjuneee Dec 21, 2025
0114b9b
feat: CSV 내보내기 기능
KJaeKwan Dec 21, 2025
3eecf8a
chore: logging 추가
KJaeKwan Dec 21, 2025
7695394
chore: 성별 한국어 매핑 삭제
KJaeKwan Dec 21, 2025
614ce90
refactor: 파일명 설문제목_yyyyMMdd 형태로 변경
KJaeKwan Dec 21, 2025
14193d2
fix: csv 파일 내보내기 권한 설정
KJaeKwan Dec 21, 2025
0e641ea
docs: Swagger description 추가
KJaeKwan Dec 21, 2025
eb57d23
Merge pull request #73 from On-Survey/feat/224
KJaeKwan Dec 21, 2025
16c3275
Merge pull request #72 from On-Survey/feat/ON-221
wonjuneee Dec 21, 2025
41776e7
refactor: 문항 순서 조정
KJaeKwan Dec 21, 2025
dd1fb93
fix: 임시저장 시 보기에 대한 요청이 누락되던 버그 수정
wonjuneee Dec 21, 2025
27767f1
docs: 스웨거 임시저장 API 예시 수정 및 예외처리 수정
wonjuneee Dec 21, 2025
f0a1874
Merge pull request #74 from On-Survey/feat/ON-229
wonjuneee Dec 21, 2025
75281df
chore: ExposedHeader 추가 (csv)
KJaeKwan Dec 23, 2025
25b624d
Merge branch 'develop' of github.com:On-Survey/Backend into develop
KJaeKwan Dec 23, 2025
affdb7a
feat: 미등록 에러에 대한 Sentry 에러 수집, Discord 알림 전송
KJaeKwan Dec 28, 2025
c9ec8e8
feat: 결제 발생시 Discord 알림 전송
KJaeKwan Dec 28, 2025
deb2b95
Merge branch 'feat/ON-250-sentry' of github.com:On-Survey/Backend int…
KJaeKwan Dec 28, 2025
2796d4e
feat: 설문 등록시 Discord 알림 전송
KJaeKwan Dec 28, 2025
e0cf5b2
refactor: DiscordWebhookClient 분리
KJaeKwan Dec 28, 2025
ccd0166
fix: 코드리뷰 반영
KJaeKwan Dec 29, 2025
74050b1
Merge pull request #76 from On-Survey/feat/ON-250-sentry
KJaeKwan Dec 29, 2025
4947cdb
hotfix: DiscordWebhookPayload에 @Data annotation 추가
KJaeKwan Dec 29, 2025
154d294
chore: 환불시 코인 반환 금액이 promotionAmount에 종속되도록 수정
KJaeKwan Dec 30, 2025
3c16598
Merge pull request #77 from On-Survey/feat/SUR-44-changePromotion
KJaeKwan Dec 30, 2025
758846e
hotfix: 잘못 사용되고 있는 memberId를 userKey로 변경
KJaeKwan Dec 30, 2025
5afcef7
hotfix: 잘못 사용되고 있는 memberId를 userKey로 변경
KJaeKwan Dec 30, 2025
8ecff57
hotfix: 실패한 트랜잭션으로 조회하지 않기
KJaeKwan Dec 30, 2025
498a35c
hotfix: 실패한 트랜잭션 롤백 후 재조회
KJaeKwan Dec 30, 2025
e74d1d3
hotfix: 분산락 잡는 순서 조정
KJaeKwan Jan 4, 2026
0faaade
fix: 스크리닝 참여한 설문은 스크리닝 문항에 뜨지 않도록 수정
KJaeKwan Jan 4, 2026
872035a
refactor: ScreeningAnswer에서만 메서드를 인터페이스 분리를 통해 구현 클래스 의존하지 않도록 변경
KJaeKwan Jan 4, 2026
3dffc6c
chore: 미사용 메서드 정리
KJaeKwan Jan 4, 2026
2279876
Merge pull request #78 from On-Survey/feat/SUR-66
wonjuneee Jan 4, 2026
776bbbc
mod: 문항 숫자형을 TEXT 타입으로 분리
wonjuneee Jan 4, 2026
a1fca54
fix: 세그멘테이션 필터링 로직 추가
wonjuneee Jan 4, 2026
3c5225f
refactor: 미사용 import 제거 및 사용자 세그멘테이션 추가
wonjuneee Jan 4, 2026
13ee628
refactor: 미사용 관심사 변수 제거
wonjuneee Jan 4, 2026
00613e7
Merge pull request #79 from On-Survey/feat/SUR-62
wonjuneee Jan 4, 2026
339eff1
fix: 스크리닝 문항이 없거나 스크리닝 응답이 존재할 때 정답을 맞춘 경우에만 설문이 노출되도록 수정
wonjuneee Jan 6, 2026
26d0422
hotfix: '전체 연령대' 필터 누락 해결
KJaeKwan Jan 6, 2026
406bdea
fix: 쿼리 조건 및 조인 조건 수정
wonjuneee Jan 6, 2026
b4c6830
fix: 스크리닝 응답 여부를 필터링할지 파라미터로 결정하도록 수정
wonjuneee Jan 7, 2026
5953e27
Merge branch 'develop' into feat/SUR-70
wonjuneee Jan 7, 2026
c9f832b
Merge pull request #80 from On-Survey/feat/SUR-70
wonjuneee Jan 7, 2026
f9756e6
mod: 코드래빗 새로운 커밋에 대한 자동리뷰 실행 여부 #3
wonjuneee Jan 7, 2026
0adf9db
hotfix: 테스트 사항이 잘못 커밋된 부분 롤백
wonjuneee Jan 7, 2026
c872c12
hotfix: maxAge가 null인 부분 임시 수정
wonjuneee Jan 8, 2026
fa6285a
hotfix: 프로모션 지급 로깅 추가
KJaeKwan Jan 8, 2026
6c30d83
hotfix: 사용자의 관심사가 등록되어 있지 않을 경우 MemberSegmentation이 null로 반환되는 버그 수정
wonjuneee Jan 8, 2026
4a688ee
hotfix: 사용자 정보 조회 시 온보딩 완료 여부도 함께 보내도록 수정
wonjuneee Jan 8, 2026
773ae68
fix: 프로모션 락 재획득 제거, grant 생성 시점 조정
KJaeKwan Jan 9, 2026
b7c0fd6
feat: 설문생성 및 응답 시 응답목표, 응답자 수 설정
wonjuneee Jan 9, 2026
8b15441
mod: 설문 참여 가능 여부 확인 및 잠재 응답자 관리 개선
wonjuneee Jan 9, 2026
744e151
Merge pull request #81 from On-Survey/feat/promotionLock
KJaeKwan Jan 10, 2026
305016f
feat: 사용자가 설문 참여 중임을 알리는 API 구현
wonjuneee Jan 10, 2026
441856c
feat: 설문 기본정보 반환 API 구현
wonjuneee Jan 11, 2026
a75ded1
feat: 프로모션 지급 결과 재조회하는 임시 컨트롤러 추가
KJaeKwan Jan 11, 2026
c08420f
Merge pull request #83 from On-Survey/feat/promotionLock
KJaeKwan Jan 11, 2026
4c91fc7
refactor: 설문조회 API 분리 및 메서드 분리
wonjuneee Jan 11, 2026
1625bcf
refactor: 설문상태 확인 메서드 분리 및 설문응답 목표인원 값 캐싱 안되어 있을 경우 캐싱 진행하도록 수정
wonjuneee Jan 11, 2026
f8d3651
fix: API 엔드포인트 및 설문상태 조건이 반대로 되어있던 것 수정
wonjuneee Jan 11, 2026
fa0d8b7
feat: 설문 생성자 캐싱 추가
wonjuneee Jan 11, 2026
3d1cf02
chore: 로깅 수정
wonjuneee Jan 11, 2026
9efbacf
refactor: 로깅 추가, 코드 정리
KJaeKwan Jan 11, 2026
6a16d39
feat: 결제 횟수, 금액 정보 API
KJaeKwan Jan 11, 2026
77d46be
fix: 문항응답이 이미 존재할 경우 내용을 덮어쓰도록 수정
wonjuneee Jan 12, 2026
fcf8d25
fix: 문자열 대소문자 구분없도록 수정
wonjuneee Jan 12, 2026
2dd8f4d
Merge pull request #85 from On-Survey/feat/OMF-76
KJaeKwan Jan 12, 2026
3abced3
fix: 코드리뷰 반영
wonjuneee Jan 12, 2026
5fc4931
Merge pull request #86 from On-Survey/feat/OMF-77
wonjuneee Jan 12, 2026
ea4db69
mod: GlobalStats에 일간 활성 사용자 수를 함께 반환하도록 수정
wonjuneee Jan 13, 2026
1d019f0
mod: Sorted Set으로 일간사용자 추적 및 매시간 삭제 스케줄링 추가
wonjuneee Jan 13, 2026
47403e0
fix: 코드리뷰 반영
wonjuneee Jan 13, 2026
1b1b032
feat: 스크리닝 인트로에 응답 개수 추가로 반환
wonjuneee Jan 14, 2026
b124242
refactor: 주석제거 및 방어코드 실행주체 이관
wonjuneee Jan 14, 2026
ce9e295
fix: 삭제된 API 임시 복원
wonjuneee Jan 15, 2026
6cc9b24
fix: 코드리뷰 반영
wonjuneee Jan 15, 2026
b2baa1b
Merge pull request #82 from On-Survey/feat/OMF-60
wonjuneee Jan 15, 2026
57521cd
Merge pull request #87 from On-Survey/feat/OMF-32
wonjuneee Jan 15, 2026
9a56e37
Merge pull request #88 from On-Survey/feat/OMF-45
wonjuneee Jan 15, 2026
9fcc62b
mod: 이미 존재하는 스크리닝 데이터 조회하도록 수정
wonjuneee Jan 16, 2026
ad3a4e5
mod: 설문 수정 시 스크리닝 데이터도 추가로 반환하도록 수정
wonjuneee Jan 16, 2026
dae10e5
feat: 무료 설문 등록
KJaeKwan Jan 17, 2026
bf761c5
feat: 응답 필드에 isFree 추가, 정렬 기준 추가
KJaeKwan Jan 17, 2026
dba0aa2
mod: 미사용 파라미터 제거 및 주석 추가
wonjuneee Jan 17, 2026
6137dd1
chore: DTO 날짜 필드 검증 추가
KJaeKwan Jan 17, 2026
8e65d46
Merge pull request #90 from On-Survey/feat/OMF-80
KJaeKwan Jan 17, 2026
8f9ddc6
Merge pull request #89 from On-Survey/feat/OMF-94
wonjuneee Jan 18, 2026
3058a2c
Merge branch 'develop' into feat/OMF-95
wonjuneee Jan 18, 2026
80b90d7
Merge pull request #91 from On-Survey/feat/OMF-95
wonjuneee Jan 18, 2026
db06e89
mod: Response 네이밍 수정
wonjuneee Jan 18, 2026
05df891
feat: 단일 스크리닝 퀴즈 조회 API 구현
wonjuneee Jan 18, 2026
a2f8c07
mod: 스크리닝 퀴즈 리다이렉션 필요 여부 판단
wonjuneee Jan 19, 2026
77aee81
fix: 예외 핸들링 추가 및 쿼리문 수정
wonjuneee Jan 19, 2026
6de406e
refactor: 불필요한 직렬화 필드 제거
wonjuneee Jan 19, 2026
7bcc974
chore: 주석 문구 변경
wonjuneee Jan 19, 2026
5dfd008
fix: 응답 수를 중복으로 업데이트하던 로직 제거
wonjuneee Jan 19, 2026
5954309
fix: 코드리뷰 반영
wonjuneee Jan 19, 2026
6548c2c
Merge pull request #92 from On-Survey/feat/OMF-101
wonjuneee Jan 19, 2026
8511035
Merge pull request #93 from On-Survey/feat/OMF-111
wonjuneee Jan 19, 2026
3df3976
refactor: 설문 상세조회에 isFree 필드 추가
KJaeKwan Jan 19, 2026
d3d905a
Merge branch 'develop' of github.com:On-Survey/Backend into develop
KJaeKwan Jan 19, 2026
fca1094
mod: 설문 title, description 타입 변경
wonjuneee Jan 20, 2026
037c706
mod: Question 엔티티의 제목, 설명 타입 수정
wonjuneee Jan 20, 2026
358f893
hotfix: 무료 설문에 프로모션 지급 안 되도록 검증 추가
KJaeKwan Jan 20, 2026
a0fa068
Merge pull request #94 from On-Survey/feat/OMF-117
wonjuneee Jan 20, 2026
bc105d0
build: 배포 파이프라인 수동 트리거 추가
wonjuneee Jan 21, 2026
e4be09f
build: 배포 파이프라인 수동 트리거 추가
wonjuneee Jan 21, 2026
da3557f
feat: 설문참여에 대한 사용자의 상태를 판단하는 로직 통합
wonjuneee Jan 22, 2026
5a22457
refactor: 미사용 API 및 통폐합된 로직 제거
wonjuneee Jan 22, 2026
c713d67
chore: 미사용 import 제거
wonjuneee Jan 22, 2026
ce5ae13
Merge pull request #95 from On-Survey/feat/OMF-130
wonjuneee Jan 22, 2026
fe3ecc6
hotfix: 잘못 삭제된 로직 복구
wonjuneee Jan 23, 2026
c406d73
feat: AT가 없거나 유효하지 않은 AT로 사용자 정보를 요청하는 경우에 대한 로깅, 알림 추가
wonjuneee Jan 23, 2026
ed52936
mod: 워크플로우 수동 실행 시 input을 받지 않도록 수정
wonjuneee Jan 23, 2026
e6f678a
fix: 코드리뷰 반영 및 로깅 수정
wonjuneee Jan 23, 2026
a2c4a37
Merge branch 'develop' into feat/OMF-133
wonjuneee Jan 23, 2026
796cc49
Merge pull request #96 from On-Survey/feat/OMF-133
wonjuneee Jan 24, 2026
8ca0984
mod: 인증로직 호출 시, 토큰 만료 여부를 확인하도록 수정
wonjuneee Jan 26, 2026
6b88e3f
mod: sslContext 생성 시기를 빈 초기화 시점으로 수정
wonjuneee Jan 26, 2026
8a6a3f2
fix: AT를 헤더에 설정한 뒤, 반환한 값을 사용하도록 수정
wonjuneee Jan 27, 2026
5e29141
fix: 토큰만료 여부파악 시간단위 수정 및 누락된 인자 추가
wonjuneee Jan 27, 2026
da119c0
chore: 토큰 만료여부 판단 시 예외로깅 추가
wonjuneee Jan 27, 2026
6d84e42
Merge pull request #97 from On-Survey/feat/OMF-135
wonjuneee Jan 27, 2026
2aa6810
chore: 스웨거 보안 스킴 이름 수정
wonjuneee Jan 29, 2026
95f936c
Merge pull request #98 from On-Survey/feat/OMF-151
wonjuneee Jan 29, 2026
7879f4b
chore: 스웨거 보안 스킴 필드 수정
wonjuneee Jan 30, 2026
7c0bd71
feat: 설문 폼 등록 기능
KJaeKwan Jan 30, 2026
7a29e6f
chore: 설문 존재 검증 추가 및 Swagger 설명 보강
KJaeKwan Jan 30, 2026
eee894d
Merge pull request #99 from On-Survey/feat/OMF-149
wonjuneee Jan 31, 2026
8513d37
feat: 문항의 Section 관련 메타데이터 필드 추가
wonjuneee Jan 31, 2026
2c0430d
mod: Section을 기반으로 문항을 처리하도록 로직 개편
wonjuneee Jan 31, 2026
63be832
feat: section 등이 null인 경우 방어코드 추가
wonjuneee Jan 31, 2026
41f489a
fix: 코드리뷰 반영
wonjuneee Jan 31, 2026
ac974a0
mod: 응답 다건 생성/수정 가능하도록 구현
wonjuneee Jan 31, 2026
5896d79
docs: 스키마 예시에 section 필드 추가
wonjuneee Jan 31, 2026
650ca5e
fix: 생성했던 스크리닝 퀴즈를 건너뛰기를 통해 추후 삭제 가능하도록 수정
wonjuneee Jan 31, 2026
1bc9c9f
Merge pull request #100 from On-Survey/feat/OMF-155
wonjuneee Feb 1, 2026
8c16055
feat: 홈 결제 API (coin 지급 X)
KJaeKwan Feb 1, 2026
80e46c5
chore: 코드 리뷰 반영
KJaeKwan Feb 1, 2026
7fbe9e7
Merge pull request #102 from On-Survey/feat/OMF-158
KJaeKwan Feb 1, 2026
1c392cc
chore: deadline 확인 로깅 추가
KJaeKwan Feb 1, 2026
4483239
feat: 백오피스 - 설문제작 템플릿 작성
wonjuneee Jan 28, 2026
daeffe4
feat: 백오피스를 위한 어드민 도메인 구현
wonjuneee Jan 31, 2026
7dcc700
mod: 어드민 세션 필터 구현
wonjuneee Jan 31, 2026
eb39750
mod: 사용자 정보 및 권한조회 로직 추출
wonjuneee Jan 31, 2026
5509309
build: thymeleaf 템플릿 엔진 종속성 추가
wonjuneee Jan 31, 2026
4b95fa6
Update deployment condition for NCP
wonjuneee Feb 1, 2026
dc5f8c4
chore: 테스트용 로깅 제거
KJaeKwan Feb 1, 2026
1518e25
Merge branch 'develop' of github.com:On-Survey/Backend into develop
KJaeKwan Feb 1, 2026
396c717
chore: 테스트용 배포
wonjuneee Feb 1, 2026
903ad8f
feat: 섹션 to 섹션 분기처리를 위한 임시로직 구현
wonjuneee Feb 1, 2026
bc71f48
feat: 섹션 관련 모델 구현
wonjuneee Feb 2, 2026
6a1fe08
mod: 섹션 테이블 추가로 인한 변경사항 반영
wonjuneee Feb 3, 2026
6878cd4
feat: 섹션 다건수정 API 구현
wonjuneee Feb 3, 2026
50ae122
feat: 설문관리 API 응답에 섹션관련 정보 추가
wonjuneee Feb 3, 2026
24a4332
hotfix: 권한설정 및 병렬처리 오류 해결
wonjuneee Feb 3, 2026
b456197
fix: 세그먼트(연령대,성별) 설정한 경우에면 csv 컬럼 추가
KJaeKwan Feb 4, 2026
ed8f031
hotfix: update cicd.yml
wonjuneee Feb 5, 2026
1785217
fix: 정상적인 암호 값이 온 경우에만 복호화&Member update 진행
KJaeKwan Feb 7, 2026
07782c4
chore: GCM 태그 길이 고려
KJaeKwan Feb 8, 2026
9195ccb
Merge pull request #104 from On-Survey/OMF-172
KJaeKwan Feb 8, 2026
1f962a5
Merge pull request #105 from On-Survey/feat/OMF-181
KJaeKwan Feb 8, 2026
48e8dcb
hotfix: GCM 태그 길이 고려 (잘못 남긴 커밋 수정)
KJaeKwan Feb 8, 2026
4cff484
Merge pull request #101 from On-Survey/feat/OMF-156
wonjuneee Feb 8, 2026
8e84e0e
feat: 프로모션 상태 재조회 하는 스케줄러 추가
KJaeKwan Feb 8, 2026
a494838
refactor: 예외 처리 추가
KJaeKwan Feb 8, 2026
695d576
chore: 설문 등록 Discord 알림 구체화
KJaeKwan Feb 8, 2026
447c8f8
Merge pull request #107 from On-Survey/feat/OMF-190
KJaeKwan Feb 8, 2026
178a900
fix: 온보딩시 중복 관심사 삽입 시도 에러 수정
KJaeKwan Feb 8, 2026
79def85
feat: 백오피스 - 설문제작 템플릿 작성
wonjuneee Jan 28, 2026
1f5a30b
feat: 백오피스를 위한 어드민 도메인 구현
wonjuneee Jan 31, 2026
5bc1b99
mod: 어드민 세션 필터 구현
wonjuneee Jan 31, 2026
89b5a9c
mod: 사용자 정보 및 권한조회 로직 추출
wonjuneee Jan 31, 2026
e48f04b
build: thymeleaf 템플릿 엔진 종속성 추가
wonjuneee Jan 31, 2026
20356a9
chore: 테스트용 배포
wonjuneee Feb 1, 2026
5e97fea
feat: 섹션 to 섹션 분기처리를 위한 임시로직 구현
wonjuneee Feb 1, 2026
dec8e76
feat: 섹션 관련 모델 구현
wonjuneee Feb 2, 2026
5a5fd29
mod: 섹션 테이블 추가로 인한 변경사항 반영
wonjuneee Feb 3, 2026
d454724
feat: 섹션 다건수정 API 구현
wonjuneee Feb 3, 2026
7e984b2
feat: 설문관리 API 응답에 섹션관련 정보 추가
wonjuneee Feb 3, 2026
bdf863f
hotfix: 권한설정 및 병렬처리 오류 해결
wonjuneee Feb 3, 2026
29909f8
mod: API 호출 및 데이터 정합성을 위한 수정
wonjuneee Feb 5, 2026
32dce83
feat: 설문변환 및 사용자 검색 정적 페이지 구현
wonjuneee Feb 6, 2026
068a647
mod: 정적 페이지 최종 구성 완료
wonjuneee Feb 10, 2026
8d448ee
refactor: 정적페이지 최소한으로 분리
wonjuneee Feb 11, 2026
590b65f
feat: 세션 인증 로직 구현
wonjuneee Feb 11, 2026
cdae862
feat: 설문변환요청 검색 필터링 로직 구현
wonjuneee Feb 11, 2026
b041275
feat: 백오피스에서 활용하는 어드민 API 스펙 구현
wonjuneee Feb 11, 2026
fb0c4af
feat: Member 도메인 어댑터 연결
wonjuneee Feb 11, 2026
6c688b9
feat: Survey 도메인 어댑터 연결
wonjuneee Feb 11, 2026
c3e4866
Merge remote-tracking branch 'origin/feat/OMF-100' into feat/OMF-100
wonjuneee Feb 11, 2026
81cf0df
fix: 설문변환 요청 페이지네이션 반영
wonjuneee Feb 11, 2026
ceb82e4
mod: 설문 전체조회 시, 세그먼트 일치 필터링을 일치여부 필드값으로 대체
wonjuneee Feb 12, 2026
89eebf6
feat: 열려있는 설문 조회 API 추가 구현 및 로깅 수정
wonjuneee Feb 12, 2026
e59b25c
fix: 코드리뷰 반영
wonjuneee Feb 12, 2026
b2ed4e1
Merge pull request #108 from On-Survey/feat/OMF-194
wonjuneee Feb 12, 2026
5c42111
fix: 스크리닝 퀴즈를 통과하지 못한 설문은 조회되지 않도록 수정
wonjuneee Feb 12, 2026
398fd09
refactor: 스크리닝 퀴즈 조회 로직 개선
wonjuneee Feb 12, 2026
9a0b76a
fix: 쿼리조건 수정 및 불필요한 변환 제거
wonjuneee Feb 12, 2026
6b8335d
Merge pull request #109 from On-Survey/feat/OMF-195
wonjuneee Feb 12, 2026
b5c5946
Merge branch 'develop' into feat/OMF-100
wonjuneee Feb 12, 2026
0f802e1
fix: 잘못 병합된 코드 수정
wonjuneee Feb 12, 2026
490c4f4
Merge pull request #103 from On-Survey/feat/OMF-100
wonjuneee Feb 12, 2026
ddcafcd
fix: 정적요소이 적절한 필터체인에 걸리도록 수정
wonjuneee Feb 12, 2026
8e3238c
fix: 완료된 응답만 전체 응답 수에 합산하도록 수정
wonjuneee Jan 21, 2026
ddaa168
fix: 필터링 없는 설문응답 수 조회 시에도 완료한 케이스만 합산되도록 수정
wonjuneee Feb 13, 2026
3b7b3c3
mod: 스크리닝 퀴즈 참여자 수를 response의 memberId 개수로 합산하도록 수정
wonjuneee Feb 13, 2026
2fbf3e3
perf: 중복조인, 서브쿼리 등에 대한 쿼리문 최적화
wonjuneee Feb 13, 2026
abc9d84
Merge pull request #106 from On-Survey/OMF-146
KJaeKwan Feb 14, 2026
2d17118
refactor: 보기 ID 순서대로 반환하도록 명시적 수정
wonjuneee Feb 14, 2026
c148564
Merge pull request #110 from On-Survey/feat/OMF-128
wonjuneee Feb 14, 2026
ac67896
fix: 무료설문 등록 시, 등록되어 있는 스크리닝 퀴즈 삭제
wonjuneee Feb 16, 2026
441e7a5
fix: 무료설문 확인 후 스크리닝 삭제하도록 수정
wonjuneee Feb 16, 2026
721a695
build: redisson 종속성 추가
wonjuneee Feb 18, 2026
8bb5011
mod: 분산락을 통한 설문참여 가능여부 판단 로직 동시성 이슈 해결
wonjuneee Feb 18, 2026
e7a7c1d
feat: Redis 락/데이터 타입 처리를 위한 유틸리티 메서드 구현
wonjuneee Feb 18, 2026
564cc52
mod: Redis 유틸리티 클래스를 사용하도록 수정
wonjuneee Feb 18, 2026
f418d33
Merge pull request #111 from On-Survey/feat/OMF-204
wonjuneee Feb 18, 2026
2e49914
mod: Redis 유틸리티 클래스를 컴포넌트로 변경하여 주입
wonjuneee Feb 19, 2026
5e3ff3f
hotfix: CSV파일 추출 권한 설정 에러 수정
wonjuneee Feb 19, 2026
6a461a9
fix: 코드리뷰 반영
wonjuneee Feb 19, 2026
84d0447
fix: 응답 조회에서 복수 응답 가능한 문항에 대해 응답자 수 많게 뜨는 문제 해결
KJaeKwan Feb 20, 2026
7d89cc9
fix: 설문응답 제출 시 락을 통해 중복제출이 발생하지 않도록 수정
wonjuneee Feb 20, 2026
ba95d62
fix: 응답완료 시에도 락 활용하도록 수정
wonjuneee Feb 21, 2026
491bbf0
feat: 갱신손실, 팬텀리드를 방지하기 위한 락 획득 후 트랜잭션을 수행하는 메서드 구현
wonjuneee Feb 21, 2026
ec91ca4
fix: surveyInfo를 조회하는 타이밍에 따라 completed_count의 값의 갱신손실이 발생하는 케이스 수정
wonjuneee Feb 22, 2026
f02e8b3
fix: 중복선택 가능 문항의 응답을 Set으로 받아와 누락없이 추출되도록 수정
wonjuneee Feb 22, 2026
e4267b2
fix: TreeSet으로 응답 내용이 정렬되도록 하고, 응답하지 않은 문항에 대한 NPE 방어코드 추가
wonjuneee Feb 22, 2026
c2591bd
Merge pull request #114 from On-Survey/feat/OMF-222
wonjuneee Feb 23, 2026
b90a4f5
feat: 마감기한 지난 설문 종료하는 스케줄러 추가
wonjuneee Feb 23, 2026
26594c2
feat: 설문, 분기, 문항에 이미지 필드 추가
Mar 1, 2026
46830de
feat: bo에 이미지, hyper link 기능 추가
Mar 2, 2026
327b15c
fix: option에 hyper link 적용되도록 수정
Mar 2, 2026
2b21ba9
Merge pull request #113 from On-Survey/feat/OMF-208
KJaeKwan Mar 2, 2026
430a52e
fix: 코드 리뷰 반영
Mar 2, 2026
f2daaf7
fix: 설문 이미지 url 저장 안되던 것 수정
wonjuneee Mar 2, 2026
229a9b0
Merge pull request #116 from On-Survey/OMF-234
KJaeKwan Mar 2, 2026
5502dba
feat: Dev server 작업
Mar 4, 2026
47536c5
fix: logback에 dev profile 추가
Mar 4, 2026
d6d7dea
fix: dev profile 추가
Mar 4, 2026
9c4bae9
fix: certs 볼륨 마운트 추가
Mar 4, 2026
24a4589
fix: dev server swagger 추가, 인증서 마운트
Mar 4, 2026
4c2c611
Merge pull request #112 from On-Survey/feat/OMF-132
wonjuneee Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .coderabbit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ reviews:
# Default: {}
auto_review:
enabled: true
auto_incremental_review: true
auto_incremental_review: false # PR 내 새로운 커밋 시 자동리뷰 진행 여부

# Ignore reviewing if the title of the pull request contains any of these keywords (case-insensitive).
# Default: []
Expand Down Expand Up @@ -69,4 +69,4 @@ tools:
enabled: true

chat:
auto_reply: true
auto_reply: true
28 changes: 28 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# VCS/IDE
.git
.idea
.gradle
*.iml
.DS_Store

# 빌드 산출물
build
out
target
.gradle/

# 런타임 데이터(이미지 빌드에 불필요)
mysql_data
redis_data
**/*.sock
**/*.pid
**/*.log

# 환경파일
.env
.env.*
!.env.sample

# 기타
node_modules
__pycache__
178 changes: 178 additions & 0 deletions .github/workflows/cicd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
name: Java CI/CD with Docker and GitHub Actions

on:
push:
branches: [ "develop", "main" ]
pull_request:
branches: [ "develop", "main" ]
workflow_dispatch:


jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
tag: ${{ steps.vars.outputs.tag }}
steps:
- uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build with Gradle Wrapper
run: ./gradlew clean build

- name: Docker login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: Set image tag (commit SHA)
id: vars
run: echo "tag=${GITHUB_SHA}" >> "$GITHUB_OUTPUT"

- name: Build Docker image
run: |
docker build \
-t ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:${{ steps.vars.outputs.tag }} \
-t ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:latest \
.

- name: Push Docker images
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:${{ steps.vars.outputs.tag }}
docker push ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:latest

deploy-dev:
needs: build-and-push
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/develop' && github.event_name != 'pull_request'
steps:
- name: Checkout code (for docker-compose.dev.yml)
uses: actions/checkout@v4

- name: Create dev config from secrets
run: |
mkdir -p config
printf "%s" "${{ secrets.ONSURVEY_APP_DEV_YML }}" > config/application-dev.yml
chmod 600 config/application-dev.yml

- name: Copy files to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.DEV_EC2_HOST }}
username: ${{ secrets.DEV_EC2_USER }}
key: ${{ secrets.DEV_EC2_SSH_KEY }}
source: "docker-compose.dev.yml,config/application-dev.yml,blue-green.sh"
target: "/deploy/"

- name: Deploy on EC2 (blue-green)
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DEV_EC2_HOST }}
username: ${{ secrets.DEV_EC2_USER }}
key: ${{ secrets.DEV_EC2_SSH_KEY }}
script: |
set -euo pipefail
DEPLOY_DIR=/deploy
cd "$DEPLOY_DIR"

cat > .env <<EOF
COMPOSE_PROJECT_NAME=deploy-dev
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
SPRING_IMAGE_TAG=${{ needs.build-and-push.outputs.tag }}
MYSQL_ROOT_PASSWORD=${{ secrets.DEV_MYSQL_ROOT_PASSWORD }}
MYSQL_DATABASE=onsurvey
MYSQL_USER=${{ secrets.DEV_MYSQL_USER }}
MYSQL_PASSWORD=${{ secrets.DEV_MYSQL_PASSWORD }}
REDIS_PASSWORD=${{ secrets.DEV_REDIS_PASSWORD }}
TZ=Asia/Seoul
EOF

chmod 600 config/application-dev.yml || true
chmod +x blue-green.sh || true

if [ ! -L nginx/upstreams/spring-upstream.conf ]; then
( cd nginx/upstreams && ln -s spring-8080.conf spring-upstream.conf )
fi

docker compose -p deploy-dev -f docker-compose.dev.yml up -d nginx mysql redis

docker pull ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:${{ needs.build-and-push.outputs.tag }} || true
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:latest || true

bash ./blue-green.sh "${{ needs.build-and-push.outputs.tag }}" deploy-dev docker-compose.dev.yml

echo "✅ DEV deploy done (tag=${{ needs.build-and-push.outputs.tag }})"

deploy-ncp:
needs: build-and-push
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
steps:
- name: Checkout code (for docker-compose.yml)
uses: actions/checkout@v4

- name: Create prod config from secrets
run: |
mkdir -p config
printf "%s" "${{ secrets.ONSURVEY_APP_PROD_YML }}" > config/application-prod.yml
chmod 600 config/application-prod.yml

- name: Copy files to NCP server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.NCP_HOST }}
username: ${{ secrets.NCP_USER }}
key: ${{ secrets.NCP_SSH_KEY }}
source: "docker-compose.yml,config/application-prod.yml,blue-green.sh"
target: "/deploy/"

- name: Deploy on NCP (blue-green)
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_HOST }}
username: ${{ secrets.NCP_USER }}
key: ${{ secrets.NCP_SSH_KEY }}
script: |
set -euo pipefail
DEPLOY_DIR=/deploy
cd "$DEPLOY_DIR"

cat > .env <<EOF
COMPOSE_PROJECT_NAME=deploy
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
SPRING_IMAGE_TAG=${{ needs.build-and-push.outputs.tag }}
REDIS_PASSWORD=${{ secrets.PROD_REDIS_PASSWORD }}
TZ=Asia/Seoul
EOF

chmod 600 config/application-prod.yml || true
chmod +x blue-green.sh || true

if [ ! -L nginx/upstreams/spring-upstream.conf ]; then
( cd nginx/upstreams && ln -s spring-blue.conf spring-upstream.conf )
fi

docker compose -p deploy -f docker-compose.yml up -d nginx redis

docker pull ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:${{ needs.build-and-push.outputs.tag }} || true
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/onsurvey:latest || true

bash ./blue-green.sh "${{ needs.build-and-push.outputs.tag }}" deploy docker-compose.yml

docker network inspect deploy_web | grep -q '"Name": "onsurvey-redis"' || { echo "ERROR: redis not on deploy_web"; exit 1; }

echo "✅ PROD deploy done (tag=${{ needs.build-and-push.outputs.tag }})"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
*.pem
./onsurvey-mTLS_private.key
./onsurvey-mTLS_public.crt
./docker-compose.local.yml

HELP.md
.gradle
Expand Down
17 changes: 17 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FROM gradle:8.10.2-jdk21-alpine AS build
WORKDIR /src
COPY . .
RUN gradle --no-daemon bootJar -x test

FROM eclipse-temurin:21-jre-alpine
WORKDIR /app

RUN apk add --no-cache tzdata curl && \
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && echo "Asia/Seoul" > /etc/timezone

ENV TZ=Asia/Seoul
COPY --from=build /src/build/libs/*.jar /app/app.jar
EXPOSE 8080

ENV JAVA_OPTS="-XX:+UseG1GC -XX:MaxRAMPercentage=75 -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Seoul"
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/app.jar"]
126 changes: 126 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# ONSURVEY BACKEND REPOSITORY

---

## 1. 프로젝트 개요
| 항목 | 내용 |
|------|------------------------------------------------------------|
| **프로젝트명** | *ON SURVEY* |
| **주요 기술** | Java 21, Spring Boot 3, Spring JPA, QueryDSL, Redis, MySQL |

---

## 2. 주요 DOMAIN
| DOMAIN | 설명 |
|---------------|------------|
| FORM | 설문 생성 및 수정 |
| MEMBER | 사용자 정보 관리 |
| MANAGEMENT | 설문 관리 및 집계 |
| PARTICIPATION | 설문 참여 |
| PAYMENT | 결제 |
| 멱등성 & 분산 락 | PromotionGrant + Redis 락으로 중복 지급 방지 |

---

## 3. 프로젝트 구조 (수정 중)
```
Backend/
├─ src/
│ └─ main/
│ ├─ java/OneQ/OnSurvey/
│ │ ├─ domain/
│ │ │ ├─ form/ # 설문 생성 및 수정
│ │ │ │ ├─ api/
│ │ │ │ │ ├─ FormController
│ │ │ │ │ └─ dto/
│ │ │ │ │ ├─ request/
│ │ │ │ │ ├─ response/
│ │ │ │ │ └─ DefaultSurveyDto
│ │ │ │ ├─ application/
│ │ │ │ │ ├─ SurveyService
│ │ │ │ │ └─ QuestionService
│ │ │ │ ├─ domain/
│ │ │ │ │ ├─ model/ # 도메인 엔티티 (POJO)
│ │ │ │ │ │ ├─ Survey
│ │ │ │ │ │ └─ Question
│ │ │ │ │ └─ repository/
│ │ │ │ │ ├─ SurveyRepository
│ │ │ │ │ └─ QuestionRepository
│ │ │ │ └─ infra/
│ │ │ │ ├─ entity/ # 영속성 엔티티 (@Entity)
│ │ │ │ │ ├─ SurveyEntity
│ │ │ │ │ ├─ QuestionEntity
│ │ │ │ │ └─ ScreeningEntity
│ │ │ │ ├─ mapper/ # POJO <-> JpaEntity 컨버터
│ │ │ │ └─ jpa/
│ │ │ │ └─ SurveyJpaRepository
│ │ │ ├─ management/ # 설문 관리 및 집계
│ │ │ ├─ member/ # 사용자 관리
│ │ │ └─ participation/ # 설문 참여
│ │ └─ global/ # 공유 설정
│ │ ├─ annotation/
│ │ ├─ auth/
│ │ ├─ config/
│ │ ├─ entity/
│ │ ├─ exception/
│ │ ├─ handler/
│ │ ├─ infra/
│ │ ├─ response/
│ │ └─ util/
│ └─ resources/
│ └─ application.yml # 환경 설정
├─ build.gradle
├─ Dockerfile
├─ docker-compose.yml
└─ README.md
```

---

## 4. 배포·운영
### Docker 이미지
```bash
# JAR 파일 빌드 (Gradle)
./gradlew bootJar

# 이미지 생성
docker build -t yourrepo/yourproject:latest .
```

---

## 4. 테스트
| 테스트 종류 | 실행 명령 | 비고 |
|------------|----------|------|
| 단위 테스트 | `./gradlew test` | JUnit 5 + Mockito |
| 통합 테스트 | `./gradlew integrationTest` (프로젝트에 정의) | Testcontainers 로 실제 DB 구동 |
| 커버리지 보고서 | `./gradlew jacocoTestReport` | `build/reports/jacoco/test/html/index.html` 확인 |

---

## 5. 멱등성 & 분산 락 (Promotion)

토스 프로모션 포인트 지급은 다음 조합으로 중복 지급을 방지합니다.

- DB 유니크 제약 + 낙관적 락 기반 멱등 처리
- Redis 기반 분산 락
- 토스 API 재시도 및 결과 폴링
- 포인트 지급 여부 플래그

---

### 5.1 PromotionGrant 기반 멱등 처리

- 엔티티: `promotion_grant`
- 유니크 제약 (1 유저 · 1 설문 · 1 코드당 1건)
- `user_key`, `survey_id`, `promotion_code`

---

## 요약
| 섹션 | 핵심 내용 |
|----------|--------------------------------------------|
| 레포지토리 개요 | Java 21 + Spring Boot 3 기반 백엔드 서버 |
| 주요 도메인 | 설문 생성, 관리, 참여 / 사용자 및 결제 관리 |
| 구조 | Bounded Context를 기반으로 한 도메인 분리 |
| 배포 | Dockerfile, docker‑compose, GitHub Actions |
Loading
Loading