Skip to content

✨ OMF-234 이미지, 하이퍼 링크 추가 작업#116

Merged
KJaeKwan merged 5 commits intodevelopfrom
OMF-234
Mar 2, 2026
Merged

✨ OMF-234 이미지, 하이퍼 링크 추가 작업#116
KJaeKwan merged 5 commits intodevelopfrom
OMF-234

Conversation

@KJaeKwan
Copy link
Collaborator

@KJaeKwan KJaeKwan commented Mar 2, 2026

✨ Related Issue


📌 Task Details

  • 설문, 섹션, 문항, 객관식 옵션에 이미지, 하이퍼링크 추가 작업

💬 Review Requirements (Optional)

  • bo에서 이미지, 하이퍼링크 추가, 확인 검증했습니다

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 설문, 섹션, 문제, 선택지에 이미지 업로드 및 관리 기능 추가
    • 설문 구성 중 HTML 미리보기 및 하이퍼링크 삽입 기능 추가
    • 이미지 업로드 시 폴더 분류 기능 추가
  • 버그 수정

    • 관리자 인증 로직을 암호 검증 메서드로 개선

@KJaeKwan KJaeKwan self-assigned this Mar 2, 2026
@KJaeKwan KJaeKwan added the 🌟feature 새로운 기능 label Mar 2, 2026
@coderabbitai
Copy link

coderabbitai bot commented Mar 2, 2026

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

.coderabbit.yml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'tools'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
📝 Walkthrough

Walkthrough

설문 도메인 전체에 imageUrl 필드를 추가하여 이미지 지원을 구현합니다. 엔티티, DTO, 요청/응답 객체, 저장소, 서비스 계층을 수정하고, 관리자 UI에 이미지 업로드 및 미리보기 기능을 통합합니다.

Changes

Cohort / File(s) Summary
Domain Entities - Survey & Sections
src/main/java/OneQ/OnSurvey/domain/survey/entity/Survey.java, src/main/java/OneQ/OnSurvey/domain/question/entity/Section.java, src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveySingleViewInfo.java, src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveySection.java
imageUrl 필드 추가 및 updateSurvey/updateSection 메서드 서명 확장
Domain Entities - Questions
src/main/java/OneQ/OnSurvey/domain/question/entity/Question.java, src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveyQuestion.java
imageUrl 필드 추가 및 updateQuestion 메서드 확장
Question Type Implementations
src/main/java/OneQ/OnSurvey/domain/question/entity/question/*.java (Choice, DateAnswer, LongAnswer, NPS, NumberAnswer, Rating, ShortAnswer)
모든 질문 유형에 imageUrl 파라미터를 of(...) 팩토리 메서드와 updateQuestion(...) 메서드에 추가
Choice Options
src/main/java/OneQ/OnSurvey/domain/question/entity/ChoiceOption.java, src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveyQuestion.java
ChoiceOption 엔티티 및 중첩된 Option 레코드에 imageUrl 필드 추가
Admin Response DTOs
src/main/java/OneQ/OnSurvey/domain/admin/api/dto/response/AdminSurveyDetailResponse.java
SurveyInformationDto, QuestionDto, SectionDto 및 ChoicePropDto.OptionDto에 imageUrl 필드 추가
Question DTOs
src/main/java/OneQ/OnSurvey/domain/question/model/dto/OptionDto.java, src/main/java/OneQ/OnSurvey/domain/question/model/dto/QuestionUpsertDto.java, src/main/java/OneQ/OnSurvey/domain/question/model/dto/SectionDto.java, src/main/java/OneQ/OnSurvey/domain/question/model/dto/type/*.java
모든 DTO에 imageUrl 필드 추가 및 fromEntity 매핑 업데이트
Survey DTOs & Responses
src/main/java/OneQ/OnSurvey/domain/survey/model/dto/SurveyDetailData.java, src/main/java/OneQ/OnSurvey/domain/survey/model/response/SurveyDetailResponse.java, src/main/java/OneQ/OnSurvey/domain/survey/model/response/SurveyFormResponse.java, src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationInfoResponse.java
설문 응답 객체에 imageUrl 필드 추가
Survey Requests
src/main/java/OneQ/OnSurvey/domain/survey/model/request/SurveyFormRequest.java, src/main/java/OneQ/OnSurvey/domain/survey/model/request/FreeSurveyFormRequest.java, src/main/java/OneQ/OnSurvey/domain/survey/model/request/SectionRequest.java
요청 객체에 imageUrl 필드 추가
Participation Response
src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationQuestionResponse.java
sectionImageUrl 필드 추가 및 imageUrl을 포함하는 새 of(...) 오버로드 메서드 추가
Repositories
src/main/java/OneQ/OnSurvey/domain/question/repository/section/SectionRepositoryImpl.java, src/main/java/OneQ/OnSurvey/domain/survey/repository/SurveyRepositoryImpl.java
쿼리 프로젝션에 imageUrl 필드 추가
Mapper
src/main/java/OneQ/OnSurvey/domain/admin/infra/mapper/AdminSurveyMapper.java
모든 to...(...) 메서드에 imageUrl 매핑 추가
Services
src/main/java/OneQ/OnSurvey/domain/question/service/QuestionCommandService.java, src/main/java/OneQ/OnSurvey/domain/question/service/QuestionConverter.java, src/main/java/OneQ/OnSurvey/domain/survey/service/command/SurveyCommandService.java, src/main/java/OneQ/OnSurvey/domain/survey/service/query/SurveyQueryService.java
imageUrl 파라미터를 엔티티 업데이트 및 생성 호출에 전파
Authentication & Image Handling
src/main/java/OneQ/OnSurvey/domain/admin/application/AdminAuthService.java, src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/controller/ImageController.java, src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/enums/ImageSubFolder.java, src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/service/ImageModifyService.java
CustomUserDetails를 Authenticatable로 변경, ImageSubFolder enum에 SURVEY 추가, upload 메서드 오버로드 추가
Admin UI Template
src/main/resources/templates/bo/survey.html
설문, 섹션, 질문, 옵션 레벨의 이미지 업로드 UI 추가, 하이퍼링크 삽입 다이얼로그 구현, HTML 미리보기 기능 추가

Sequence Diagram(s)

sequenceDiagram
    participant User as 관리자
    participant Controller as ImageController
    participant ImageService as ImageModifyService
    participant NCP as NCP<br/>Object Storage
    participant Database as Database
    participant Entity as Survey Entity

    User->>Controller: POST /upload<br/>(file, context=SURVEY)
    Controller->>ImageService: upload(file, userKey, SURVEY)
    ImageService->>NCP: PUT /survey/image.jpg
    NCP-->>ImageService: imageUrl
    ImageService-->>Controller: ImageUploadResponse
    Controller-->>User: 이미지 URL 반환
    
    User->>User: 설문 저장 시<br/>imageUrl 포함
    User->>Database: updateSurvey(..., imageUrl)
    Database->>Entity: Survey.imageUrl = imageUrl
    Entity-->>Database: 저장 완료
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description check ✅ Passed PR 설명이 필수 섹션을 모두 포함하고 있으며, 관련 이슈, 작업 내용, 검증 현황이 명확하게 기재되어 있습니다.
Title check ✅ Passed 제목은 이미지와 하이퍼링크 기능 추가라는 주요 변경사항을 정확하게 반영하고 있으며, PR 설명 및 커밋 로그와 일치합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch OMF-234

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@KJaeKwan
Copy link
Collaborator Author

KJaeKwan commented Mar 2, 2026

하이퍼링크 처리 방식 요약:

저장 방식

  • 사용자가 텍스트 + URL 입력 → confirmHyperlink()가 ${text} HTML 문자열을 그대로 textarea / input의 value에 삽입
  • 서버로는 이 raw HTML 문자열이 content 또는 description 필드로 전송됨

렌더링 방식 (미리보기)

  • <textarea> / 는 HTML을 렌더링할 수 없어서, 값에 <가 포함되면 별도의
    를 동적으로 생성해 아래에 삽입 - 섹션/질문 설명: syncDescHtmlPreview(textarea) → .desc-html-preview div 생성 후 innerHTML로 렌더링 - 객관식 옵션: syncOptionHtmlPreview(input) → .option-text-html-preview div 생성 후 innerHTML로 렌더링
  • 원본 textarea/input은 그대로 유지(수정 가능), 미리보기 div만 시각적으로 표시

로드 시

  • 서버에서 받은 값을 addOptionWithData(), addSectionWithoutSave(), addNewQuestion()에서 HTML 포함 여부 확인 후 각 sync 함수 호출

문제 및 수정 이력

  • escapeHtml()이 "를 이스케이프 안 해서 value="...href="url"..." 속성이 깨지던 문제 → .replace(/"/g, '"') 추가로 수정

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/main/java/OneQ/OnSurvey/domain/survey/repository/SurveyRepositoryImpl.java (1)

180-180: ⚠️ Potential issue | 🟡 Minor

디버그용 System.out.println 문을 제거해주세요.

프로덕션 코드에 디버그 출력문이 남아있습니다. 로깅이 필요한 경우 SLF4J 로거를 사용하시기 바랍니다.

🧹 제안된 수정
-        System.out.println("result = " + result);
         return result.get(surveyId);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/repository/SurveyRepositoryImpl.java`
at line 180, Remove the debug System.out.println("result = " + result); in
SurveyRepositoryImpl and, if the output is needed, replace it with an SLF4J
logger call (e.g., logger.debug or logger.info) inside the same method where the
variable result is used; ensure the SurveyRepositoryImpl class has a Logger
instance (LoggerFactory.getLogger(SurveyRepositoryImpl.class)) and use that for
any logging instead of System.out.println.
src/main/java/OneQ/OnSurvey/domain/question/service/QuestionCommandService.java (1)

127-205: ⚠️ Potential issue | 🟠 Major

imageUrl(하이퍼링크 포함 가능) 입력값 검증 없이 저장되고 있습니다.

현재 변경으로 질문/보기/섹션 전 경로에서 URL 문자열이 그대로 영속화됩니다. 허용 스킴(http/https)·길이·공백 정규화 검증을 공통화해서 적용해 주세요.

🔧 제안 패치 (공통 URL 검증 도입 예시)
+    private String sanitizeUrl(String raw) {
+        if (raw == null || raw.isBlank()) return null;
+        String normalized = raw.trim();
+        if (normalized.length() > 2048) {
+            throw new CustomException(ErrorCode.INVALID_REQUEST);
+        }
+        String lower = normalized.toLowerCase(Locale.ROOT);
+        if (!(lower.startsWith("http://") || lower.startsWith("https://"))) {
+            throw new CustomException(ErrorCode.INVALID_REQUEST);
+        }
+        return normalized;
+    }
-                upsertInfo.getImageUrl()
+                sanitizeUrl(upsertInfo.getImageUrl())
-                    optionInfo.getImageUrl()
+                    sanitizeUrl(optionInfo.getImageUrl())
-                    sectionDto.imageUrl()
+                    sanitizeUrl(sectionDto.imageUrl())

Also applies to: 361-375, 419-426

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/OneQ/OnSurvey/domain/question/service/QuestionCommandService.java`
around lines 127 - 205, The code stores imageUrl from
QuestionUpsertDto.UpsertInfo without validation in
QuestionCommandService.updateQuestion (and the other update blocks at the noted
locations); add a shared URL validation/normalization utility (e.g.,
UrlUtils.normalizeAndValidateUrl(String) or
UrlValidator.validateAndNormalize(String)) that enforces allowed schemes
(http/https), trims/normalizes whitespace, checks max length, and returns
null/throws on invalid input, then call it on upsertInfo.getImageUrl() before
passing the value into each subtype's updateQuestion (e.g.,
Choice.updateQuestion, Rating.updateQuestion, DateAnswer.updateQuestion,
ShortAnswer.updateQuestion, LongAnswer.updateQuestion,
NumberAnswer.updateQuestion) so all branches use the sanitized URL.
src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationQuestionResponse.java (1)

25-53: 🧹 Nitpick | 🔵 Trivial

팩토리 오버로드 중복은 단일 경로 위임으로 줄여 주세요.

기본값 계산 로직이 두 군데에 중복되어 추후 수정 시 불일치 위험이 있습니다.

♻️ 제안 패치
     public static ParticipationQuestionResponse of(
         String title,
         String description,
         Integer currSection,
         Integer nextSection,
         List<DefaultQuestionDto> info
     ) {
-        return new ParticipationQuestionResponse(
-            title, description, null,
-            currSection != null ? currSection : 1,
-            currSection != null ? nextSection : 0,
-            info
-        );
+        return of(title, description, null, currSection, nextSection, info);
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationQuestionResponse.java`
around lines 25 - 53, The two overloaded static factory methods
ParticipationQuestionResponse.of currently duplicate the defaulting logic for
currSection/nextSection; consolidate by having the 5-arg of(String title, String
description, Integer currSection, Integer nextSection, List<DefaultQuestionDto>
info) delegate to the 6-arg of(...) with imageUrl = null (or vice versa) so the
default computation currSection != null ? currSection : 1 and currSection !=
null ? nextSection : 0 exists in only one method; update the single canonical
of(...) (referencing title, description, imageUrl, currSection, nextSection,
info) to perform the defaulting and return the new
ParticipationQuestionResponse.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/main/java/OneQ/OnSurvey/domain/survey/entity/Survey.java`:
- Around line 62-63: The Survey entity now defines a new field imageUrl mapped
to column "image_url" but there is no corresponding DB migration; add a
migration that alters the survey table to add the image_url column (matching
`@Column` definition and TEXT type) or install/configure a migration framework
(Flyway/Liquibase) and add a migration file for the Survey -> imageUrl change so
deployments and local DBs are in sync; reference the Survey entity and the
image_url column when creating the migration.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/model/request/FreeSurveyFormRequest.java`:
- Around line 12-13: The FreeSurveyFormRequest DTO's imageUrl field lacks URL
format validation, so invalid values may be accepted; add a validation
annotation to imageUrl (e.g., javax.validation.constraints.Pattern enforcing
^https?://.* or org.hibernate.validator.constraints.URL) on the imageUrl field
in class FreeSurveyFormRequest and ensure the class is validated (e.g., `@Valid`
usage upstream) so requests fail on malformed URLs and return proper validation
messages; reference the imageUrl field in FreeSurveyFormRequest when making this
change.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/model/request/SurveyFormRequest.java`:
- Around line 40-41: SurveyFormRequest.imageUrl lacks URL format validation;
mirror the validation used in FreeSurveyFormRequest by adding the same
URL-validation annotation (e.g., `@URL` or the `@Pattern` regex used in
FreeSurveyFormRequest) to the String imageUrl field in class SurveyFormRequest,
keep the existing `@Schema`(description="설문 이미지 URL"), and import any required
validator annotation so the field enforces the same URL format constraints as
FreeSurveyFormRequest.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/service/command/SurveyCommandService.java`:
- Line 127: The updateSurvey call can receive a null imageUrl from
SurveyFormRequest or FreeSurveyFormRequest which will erase the existing image;
either add a null-safe assignment inside Survey.updateSurvey (e.g., set imageUrl
= imageUrl != null ? imageUrl : this.imageUrl) or change the callers (the
survey.updateSurvey invocations) to pass survey.getImageUrl() when
request.imageUrl() is null so the existing image is preserved; locate
Survey.updateSurvey and the two caller sites (the survey.updateSurvey calls
around the current update flow) and implement one of these fixes consistently.

In
`@src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/service/ImageModifyService.java`:
- Around line 50-56: The upload method should defensively handle a null
ImageSubFolder to avoid NPE in ObjectKeyFactory.build; inside
ImageModifyService.upload, check if the incoming ImageSubFolder sub is null and
replace it with a sensible non-null fallback (e.g. ImageSubFolder.DEFAULT or
another appropriate enum constant used for general/public uploads) before
calling ObjectKeyFactory.build(...); update the null-guard near the start of
upload so objectKey generation always receives a valid sub value.

In `@src/main/resources/templates/bo/survey.html`:
- Around line 1492-1494: The template assigns untrusted user input directly to
innerHTML (e.g., the textarea -> preview assignment using variables textarea and
preview at the noted locations), which allows XSS; fix by sanitizing or escaping
the textarea.value before rendering (or use textContent / createTextNode for
plain text) and, if HTML is required, pass the input through a trusted HTML
sanitizer library (or whitelist/escape tags) and then set preview.innerHTML only
with the sanitized output; apply the same change to every occurrence that
assigns user-controlled values to innerHTML (all instances involving
textarea/preview or similar preview elements mentioned in the comment).
- Around line 1439-1456: The change currently only updates the hidden input and
preview in handleSurveyImageUpload and removeSurveyImage, so the image URL is
not persisted to the server; update handleSurveyImageUpload to call the backend
save endpoint (e.g., invoke a new or existing API helper like
saveSurveyImage(url, surveyId)) right after receiving the uploaded URL and
before showing final success toast, handle API errors (rollback preview/hidden
input if save fails) and disable UI while saving; likewise update
removeSurveyImage to call the backend delete or save-empty-image endpoint (e.g.,
removeSurveyImageOnServer(surveyId) or saveSurveyImage('', surveyId)) and only
hide the preview and clear the hidden input after the server acknowledges
success, handling errors and updating the user via toasts.
- Around line 1540-1553: The confirmHyperlink function currently concatenates
user-provided url and text into a string anchor, allowing attribute/scheme
injection; replace the string concatenation with safe DOM-based construction and
scheme validation: validate the url (using the URL constructor or a regex) to
allow only safe schemes (e.g., http, https, mailto) and reject javascript: and
other dangerous schemes, create an <a> element via document.createElement('a'),
set its href only after validation, assign the link text via element.textContent
(not innerHTML) to escape quotes/markup, then insert element.outerHTML into
_hyperlinkTargetTextarea.value at the selection (use the existing start/end
handling), and dispatch the input event as before.

---

Outside diff comments:
In
`@src/main/java/OneQ/OnSurvey/domain/question/service/QuestionCommandService.java`:
- Around line 127-205: The code stores imageUrl from
QuestionUpsertDto.UpsertInfo without validation in
QuestionCommandService.updateQuestion (and the other update blocks at the noted
locations); add a shared URL validation/normalization utility (e.g.,
UrlUtils.normalizeAndValidateUrl(String) or
UrlValidator.validateAndNormalize(String)) that enforces allowed schemes
(http/https), trims/normalizes whitespace, checks max length, and returns
null/throws on invalid input, then call it on upsertInfo.getImageUrl() before
passing the value into each subtype's updateQuestion (e.g.,
Choice.updateQuestion, Rating.updateQuestion, DateAnswer.updateQuestion,
ShortAnswer.updateQuestion, LongAnswer.updateQuestion,
NumberAnswer.updateQuestion) so all branches use the sanitized URL.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationQuestionResponse.java`:
- Around line 25-53: The two overloaded static factory methods
ParticipationQuestionResponse.of currently duplicate the defaulting logic for
currSection/nextSection; consolidate by having the 5-arg of(String title, String
description, Integer currSection, Integer nextSection, List<DefaultQuestionDto>
info) delegate to the 6-arg of(...) with imageUrl = null (or vice versa) so the
default computation currSection != null ? currSection : 1 and currSection !=
null ? nextSection : 0 exists in only one method; update the single canonical
of(...) (referencing title, description, imageUrl, currSection, nextSection,
info) to perform the defaulting and return the new
ParticipationQuestionResponse.

In
`@src/main/java/OneQ/OnSurvey/domain/survey/repository/SurveyRepositoryImpl.java`:
- Line 180: Remove the debug System.out.println("result = " + result); in
SurveyRepositoryImpl and, if the output is needed, replace it with an SLF4J
logger call (e.g., logger.debug or logger.info) inside the same method where the
variable result is used; ensure the SurveyRepositoryImpl class has a Logger
instance (LoggerFactory.getLogger(SurveyRepositoryImpl.class)) and use that for
any logging instead of System.out.println.

ℹ️ Review info

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c2591bd and 327b15c.

📒 Files selected for processing (42)
  • src/main/java/OneQ/OnSurvey/domain/admin/api/dto/response/AdminSurveyDetailResponse.java
  • src/main/java/OneQ/OnSurvey/domain/admin/application/AdminAuthService.java
  • src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveyQuestion.java
  • src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveySection.java
  • src/main/java/OneQ/OnSurvey/domain/admin/domain/model/survey/SurveySingleViewInfo.java
  • src/main/java/OneQ/OnSurvey/domain/admin/infra/mapper/AdminSurveyMapper.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/ChoiceOption.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/Question.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/Section.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/Choice.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/DateAnswer.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/LongAnswer.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/NPS.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/NumberAnswer.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/Rating.java
  • src/main/java/OneQ/OnSurvey/domain/question/entity/question/ShortAnswer.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/OptionDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/QuestionUpsertDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/SectionDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/type/ChoiceDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/type/DateDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/type/DefaultQuestionDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/model/dto/type/RatingDto.java
  • src/main/java/OneQ/OnSurvey/domain/question/repository/section/SectionRepositoryImpl.java
  • src/main/java/OneQ/OnSurvey/domain/question/service/QuestionCommandService.java
  • src/main/java/OneQ/OnSurvey/domain/question/service/QuestionConverter.java
  • src/main/java/OneQ/OnSurvey/domain/survey/entity/Survey.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/dto/SurveyDetailData.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/request/FreeSurveyFormRequest.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/request/SectionRequest.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/request/SurveyFormRequest.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationInfoResponse.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/response/ParticipationQuestionResponse.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/response/SurveyDetailResponse.java
  • src/main/java/OneQ/OnSurvey/domain/survey/model/response/SurveyFormResponse.java
  • src/main/java/OneQ/OnSurvey/domain/survey/repository/SurveyRepositoryImpl.java
  • src/main/java/OneQ/OnSurvey/domain/survey/service/command/SurveyCommandService.java
  • src/main/java/OneQ/OnSurvey/domain/survey/service/query/SurveyQueryService.java
  • src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/controller/ImageController.java
  • src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/enums/ImageSubFolder.java
  • src/main/java/OneQ/OnSurvey/global/infra/ncp/objectStorage/image/service/ImageModifyService.java
  • src/main/resources/templates/bo/survey.html

@KJaeKwan KJaeKwan changed the title ✨ OMF-235 이미지, 하이퍼 링크 추가 작업 ✨ OMF-234 이미지, 하이퍼 링크 추가 작업 Mar 2, 2026
Copy link
Collaborator

@wonjuneee wonjuneee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

설문 이미지 url이 정상적으로 저장이 안되고 있어서, 해당 부분 수정해서 커밋 추가로 올려놨습니다

@KJaeKwan KJaeKwan merged commit 229a9b0 into develop Mar 2, 2026
3 checks passed
KJaeKwan added a commit that referenced this pull request Mar 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🌟feature 새로운 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants