Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
a3c9a37
#250 [Fix] 투표 비율 계산 기준을 preVoteOption에서 postVoteOption으로 수정 (#252)
HYH0804 May 27, 2026
a38c141
#254 [Refactor] 관점 등록/수정 시 GPT 검수 코드 제거 (#256)
HYH0804 Jun 3, 2026
cee2c5d
#255 [Refactor] VoteStatsResponse OptionStat에 title 필드 추가 (#257)
HYH0804 Jun 3, 2026
53533b8
#258 [Feat] 출석체크 API 추가
si-zero Jun 3, 2026
77db7a1
#260 [Feat] 스웨거 어드민/유저 분리
si-zero Jun 4, 2026
a9d4293
[Feat] 알림기능 (#263)
HYH0804 Jun 11, 2026
b5a681b
#262 [Fix] APNs 자격증명 S3 다운로드 시 임시파일 충돌 오류 수정
HYH0804 Jun 11, 2026
d281fa3
#264 [Fix] AdMob SSV 포인트 미적립 버그 수정
si-zero Jun 11, 2026
968d6a3
#262 merge (#266)
HYH0804 Jun 14, 2026
d041631
[Chore] adMob 크롤링 파일 설정: adMob 크롤링 파일 설정 #269
si-zero Jun 16, 2026
ec25882
#270 [Feat] 설정 파일 추가
si-zero Jun 16, 2026
4c45999
[Chore] JWT필터 설정 #271
si-zero Jun 16, 2026
e0c9c1c
#275 [Fix] AdMob SSV 콜백 파라미터 optional 처리 및 서명 검증 활성화
si-zero Jun 18, 2026
ab2cb78
#277 [Fix] AdMob SSV 콜백 URL 검증 요청 처리 실패
si-zero Jun 18, 2026
04d947c
#279 [Fix] AdMob SSV 엔드포인트 검증 실패 시 항상 200 반환
si-zero Jun 18, 2026
d9ea3b5
#283 [Fix] /me/content-activities voteSide null 반환 버그
si-zero Jun 19, 2026
ec27b01
#285 [Feat] content-activities 응답에 option_title 필드 추가
si-zero Jun 20, 2026
6663e7a
#287 [Fix] AdMob SSV 서명 검증 오류로 인한 포인트 미지급 버그
si-zero Jun 24, 2026
39aca84
#289 [Fix] 오늘의 배틀 개수 변경
si-zero Jul 5, 2026
11e2da1
#293 [Fix] 사전투표 철학자 아이콘 미노출
si-zero Jul 5, 2026
aa449f0
#297 [Fix] 댓글 작성 시각이 9시간 전으로 표시되는 버그
si-zero Jul 6, 2026
3259a1a
#301 [Fix] robots.txt 파일 부재로 AdMob app-ads.txt 크롤링 차단
si-zero Jul 6, 2026
e91819b
#305 [Fix] S3 오디오 조각 재다운로드 시 FileAlreadyExistsException으로 TTS 파이프라인 실패
si-zero Jul 6, 2026
d64d5ca
#309 [Fix] JwtFilter 자체 화이트리스트에 /robots.txt 누락으로 401 발생
si-zero Jul 6, 2026
ff16d85
#316 [Fix] 포인트 정책표 대비 코드 불일치 4건 수정
si-zero Jul 7, 2026
f50c749
Merge branch 'main' into dev
si-zero Jul 7, 2026
d9e28a1
#321 [Feat] 알림 미읽음 여부 확인 API 추가
si-zero Jul 7, 2026
4279341
#313 [Hotfix] Railway 배포 환경 FFmpeg 자동 설치 적용 (#320)
jucheonsu Jul 7, 2026
f77048c
#327 [Fix] 알림 전체 읽음 처리 후 모두 읽음 신호가 전달되지 않던 문제 수정
si-zero Jul 13, 2026
99886f9
#331 [Docs] 출석체크 API 명세서를 실제 코드에 맞춰 갱신
si-zero Jul 13, 2026
087b8c0
#333 [Fix] app-ads.txt가 text/html로 응답되어 AdMob 크롤러가 무시하는 문제 수정
si-zero Jul 13, 2026
d33ff1f
#337 [Feat] 인앱 알림 테스트용 API 추가
si-zero Jul 14, 2026
17f35a4
#341 [Fix] 미문서화/중복 포인트 지급 로직 정리
si-zero Jul 15, 2026
acbe078
관리자 페이지를 새 admin-web(Next.js) 앱으로 리다이렉트 (#346)
Roy-wonji Jul 15, 2026
de75bdf
#349 [Feat] admin.web.url env 주입 + 기본값 picke.up.railway.app (#350)
Roy-wonji Jul 15, 2026
9493351
#352 [Fix] JwtFilter 화이트리스트 /api/v1/auth 전체 매칭으로 logout 인증 우회, 500 에러 발생
si-zero Jul 16, 2026
00bfcb3
#356 [Feat] 이용약관/개인정보처리방침 페이지 백엔드 서빙
si-zero Jul 20, 2026
1998ee0
Merge branch 'main' into merge/#358
si-zero Jul 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/com/swyp/picke/domain/oauth/jwt/JwtFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ public class JwtFilter extends OncePerRequestFilter {
"/.well-known",
"/api/v1/resources",
"/app-ads.txt",
"/terms",
"/privacy-policy",
"/robots.txt"
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
"/battle/**",
"/.well-known/**",
"/app-ads.txt",
"/robots.txt"
"/robots.txt",
"/terms",
"/privacy-policy"
).permitAll()

// 2. 관리자 HTML 화면 렌더링 요청
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
/**
* app-ads.txt, robots.txt는 크롤러(AdMob, 검색엔진)가 Content-Type: text/plain을 기대하므로,
* 정적 리소스 핸들러의 MIME 추론에 맡기지 않고 명시적으로 text/plain으로 응답한다.
* 이용약관/개인정보처리방침은 노션 공유 링크가 로그인 리다이렉트 루프에 걸려 외부(AdMob 심사 등)에서
* 접근 불가능해서, 인증 없이 접근 가능한 정적 HTML로 직접 서빙한다.
*/
@Tag(name = "정적 텍스트 파일", description = "app-ads.txt, robots.txt 서빙")
@Tag(name = "정적 텍스트 파일", description = "app-ads.txt, robots.txt, 약관/정책 페이지 서빙")
@RestController
public class StaticTextFileController {

Expand All @@ -33,6 +35,18 @@ public ResponseEntity<Resource> getRobotsTxt() throws IOException {
return textResponse("static/robots.txt");
}

@Operation(summary = "서비스 이용약관 조회")
@GetMapping("/terms")
public ResponseEntity<Resource> getTerms() throws IOException {
return htmlResponse("static/terms.html");
}

@Operation(summary = "개인정보 처리방침 조회")
@GetMapping("/privacy-policy")
public ResponseEntity<Resource> getPrivacyPolicy() throws IOException {
return htmlResponse("static/privacy-policy.html");
}

private ResponseEntity<Resource> textResponse(String classpathLocation) throws IOException {
Resource resource = new ClassPathResource(classpathLocation);
return ResponseEntity.ok()
Expand All @@ -41,4 +55,13 @@ private ResponseEntity<Resource> textResponse(String classpathLocation) throws I
.header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600")
.body(resource);
}

private ResponseEntity<Resource> htmlResponse(String classpathLocation) throws IOException {
Resource resource = new ClassPathResource(classpathLocation);
return ResponseEntity.ok()
.contentType(MediaType.TEXT_HTML)
.contentLength(resource.contentLength())
.header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600")
.body(resource);
}
}
77 changes: 77 additions & 0 deletions src/main/resources/static/privacy-policy.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PicKé 개인정보 처리방침</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Apple SD Gothic Neo", "Malgun Gothic", sans-serif; line-height: 1.7; max-width: 720px; margin: 0 auto; padding: 40px 20px; color: #1a1a1a; }
h1 { font-size: 1.6rem; margin-bottom: 0.5rem; }
h3 { font-size: 1.1rem; margin-top: 2rem; }
p, li { font-size: 0.95rem; }
.effective-date { color: #666; font-size: 0.9rem; margin-bottom: 2rem; }
</style>
</head>
<body>

<h1>PicKé 개인정보 처리방침</h1>

<h3>제1조 (개인정보의 처리 목적)</h3>
<p>회사는 다음의 목적을 위해 개인정보를 처리하며, 목적 외 용도로는 이용하지 않습니다.</p>
<ol>
<li><strong>서비스 제공</strong>: 이용자의 투표 및 선택 데이터 기반 가치관 성향 분석 리포트 생성, 콘텐츠 추천.</li>
<li><strong>회원 관리</strong>: 회원제 서비스 이용에 따른 본인 식별, 부정 이용 방지, 각종 고지 전달.</li>
<li><strong>서비스 개선</strong>: 접속 빈도 파악 및 서비스 이용 통계 분석을 통한 서비스 고도화.</li>
</ol>

<h3>제2조 (처리하는 개인정보 항목)</h3>
<p>회사는 서비스 제공을 위해 아래의 항목을 수집합니다.</p>
<ol>
<li><strong>회원 가입 및 소셜 로그인</strong>: 이메일, 닉네임, 프로필 이미지.</li>
<li><strong>서비스 이용 과정 중 자동 수집</strong>:
<ul>
<li>서비스 내 콘텐츠 클릭 및 선택 기록(배틀 참여, 투표 등)</li>
<li>의사결정 고민 시간(Latency) 및 콘텐츠 재생 구간 체류 기록</li>
<li>기기정보(OS, 모델명), 접속 로그, IP 주소, 쿠키.</li>
<li>광고 식별자(ADID/IDFA): 맞춤형 광고 제공 및 광고 효과 분석 목적.</li>
</ul>
</li>
</ol>

<h3>제3조 (개인정보의 처리 및 보유 기간)</h3>
<ol>
<li><strong>회원 정보</strong>: 회원 탈퇴 시까지 보유.</li>
<li><strong>서비스 이용 기록</strong>: 서비스 이용 종료 시까지 또는 관련 법령(통신비밀보호법 등)에 따른 보존 기간(3개월) 동안 보관.</li>
</ol>

<h3>제4조 (개인정보처리의 위탁)</h3>
<p>회사는 서비스 분석 및 인프라 운영을 위해 다음과 같이 개인정보 처리 업무를 위탁하고 있습니다.</p>
<ol>
<li><strong>서버 운영</strong>: Google Cloud Platform (데이터 저장 및 관리)</li>
<li><strong>사용자 행동 분석</strong>: Mixpanel, Inc. (서비스 이용 통계 및 행동 데이터 분석)</li>
<li><strong>광고 플랫폼</strong>: Google AdMob (맞춤형 광고 노출 제어)</li>
</ol>

<h3>제5조 (정보주체의 권리·의무 및 행사방법)</h3>
<p>이용자는 언제든지 자신의 개인정보 열람, 정정, 삭제, 처리 정지를 요구할 수 있습니다. 서비스 내 설정 메뉴를 통해 직접 처리하거나 고객센터를 통해 요청하실 수 있습니다.</p>

<h3>제6조 (개인정보 자동 수집 장치의 설치·운영 및 거부)</h3>
<ol>
<li>회사는 이용자에게 최적화된 서비스를 제공하기 위해 '쿠키(Cookie)' 및 '광고 식별자'를 사용합니다.</li>
<li>이용자는 브라우저 설정 또는 모바일 기기 설정을 통해 쿠키 허용 거부 및 광고 추적 제한을 설정할 수 있습니다. 단, 거부 시 일부 맞춤형 서비스 이용이 어려울 수 있습니다.</li>
</ol>

<h3>제7조 (개인정보의 안전성 확보조치)</h3>
<p>회사는 개인정보 보호를 위해 접근 권한 관리, 데이터 암호화, 보안 프로그램 설치 등 기술적/관리적 조치를 다하고 있습니다.</p>

<h3>제8조 (개인정보 보호책임자)</h3>
<ul>
<li><strong>성명</strong>: 천다올 (대표자)</li>
<li><strong>담당부서</strong>: 서비스 운영팀</li>
<li><strong>연락처</strong>: picke.project@gmail.com</li>
</ul>

<p class="effective-date"><strong>부칙</strong><br>본 개인정보 처리방침은 2026년 4월 5일부터 시행됩니다.</p>

</body>
</html>
74 changes: 74 additions & 0 deletions src/main/resources/static/terms.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PICKé 서비스 이용약관</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Apple SD Gothic Neo", "Malgun Gothic", sans-serif; line-height: 1.7; max-width: 720px; margin: 0 auto; padding: 40px 20px; color: #1a1a1a; }
h1 { font-size: 1.6rem; margin-bottom: 0.5rem; }
h3 { font-size: 1.1rem; margin-top: 2rem; }
p, li { font-size: 0.95rem; }
.effective-date { color: #666; font-size: 0.9rem; margin-bottom: 2rem; }
</style>
</head>
<body>

<h1>PICKé 서비스 이용약관</h1>

<h3>제1조 (목적)</h3>
<p>본 약관은 PICKé(이하 "회사")가 제공하는 지식 콘텐츠 큐레이션 및 가치관 분석 서비스(이하 "서비스")의 이용과 관련하여 회사와 이용자 간의 권리, 의무 및 책임사항, 서비스 이용조건 및 절차 등을 규정함을 목적으로 합니다.</p>

<h3>제2조 (정의)</h3>
<ol>
<li>"서비스"란 회사가 운영하는 애플리케이션 및 웹을 통해 제공되는 지식 콘텐츠 시청, 투표 참여, 가치관 분석 리포트 등을 의미합니다.</li>
<li>"콘텐츠"란 회사가 생성한 텍스트, 오디오(TTS 포함), 이미지, 인터랙티브 분기형 대본 등을 말합니다.</li>
<li>"내공(포인트)"이란 서비스 내 활동에 따라 부여되는 무상의 가상 데이터로, 등급 상승 및 특정 기능 이용에 사용됩니다. 이는 현금으로 환급되지 않으며 제3자에게 유료로 양도할 수 없습니다.</li>
</ol>

<h3>제3조 (서비스의 특징 및 기술적 제한)</h3>
<ol>
<li>회사는 AI 및 TTS(Text-to-Speech) 기술을 활용하여 콘텐츠를 제공하며, 기술적 특성상 일시적인 음성-텍스트 싱크 불일치나 기계적 오류가 발생할 수 있습니다.</li>
<li>회사가 제공하는 성향 분석 결과는 이용자의 유희와 자아 성찰을 돕기 위한 참고 자료일 뿐, 의학적·법률적·윤리적 판단의 절대적 기준이 될 수 없습니다.</li>
</ol>

<h3>제4조 (회원가입 및 계정관리)</h3>
<ol>
<li>이용자는 소셜 로그인 등을 통해 약관 동의 후 서비스를 이용할 수 있습니다.</li>
<li>회원은 자신의 계정 및 식별코드 관리에 대한 책임을 지며, 타인의 정보 도용 시 서비스 이용이 영구 제한될 수 있습니다.</li>
</ol>

<h3>제5조 (서비스 이용 및 제한)</h3>
<ol>
<li>회사는 다음의 경우 이용을 제한하거나 게시물을 삭제할 수 있습니다.
<ul>
<li>자동화된 수단(매크로, 봇 등)을 이용하여 부정한 방법으로 투표하거나 내공을 쌓는 행위</li>
<li>서비스 내에서 타인에게 불쾌감을 주는 욕설, 비하, 특정 사상 강요 등의 행위</li>
</ul>
</li>
<li>일일 투표 참여 한도를 초과한 경우, 광고 시청 등을 통해 추가 참여권을 획득해야 합니다.</li>
</ol>

<h3>제6조 (저작권 및 데이터 활용)</h3>
<ol>
<li>서비스 내 모든 콘텐츠와 성향 분석 리포트의 디자인/알고리즘에 대한 저작권은 회사에 귀속됩니다.</li>
<li>회원은 자신의 분석 결과를 비영리적인 목적으로 소셜 미디어 등에 자유롭게 공유할 수 있습니다.</li>
<li>회사는 서비스 고도화를 위해 이용자의 투표 데이터를 익명화하여 통계 및 분석 자료로 활용할 수 있습니다.</li>
</ol>

<h3>제7조 (책임제한)</h3>
<ol>
<li>회사는 천재지변, 기간통신사업자의 장애 등 불가항력으로 인한 서비스 중단에 책임을 지지 않습니다.</li>
<li>회사는 콘텐츠가 담고 있는 철학적 견해의 객관적 타당성을 보장하지 않으며, 이용자의 선택에 따른 심리적 변화나 결과에 대해 책임을 지지 않습니다.</li>
</ol>

<h3>제8조 (준거법 및 관할법원)</h3>
<ol>
<li>본 약관의 해석 및 회사와 이용자 간의 분쟁에는 대한민국 법률을 적용합니다.</li>
<li>서비스 이용과 관련하여 발생한 분쟁은 회사의 본사 소재지 관할 법원을 제1심 합의관할 법원으로 합니다.</li>
</ol>

<p class="effective-date"><strong>부칙</strong><br>본 약관은 2026년 4월 5일부터 시행됩니다.</p>

</body>
</html>
Loading