diff --git a/src/main/java/life/mosu/mosuserver/application/form/FormService.java b/src/main/java/life/mosu/mosuserver/application/form/FormService.java deleted file mode 100644 index 1006ff40..00000000 --- a/src/main/java/life/mosu/mosuserver/application/form/FormService.java +++ /dev/null @@ -1,44 +0,0 @@ -package life.mosu.mosuserver.application.form; - -import java.util.List; -import life.mosu.mosuserver.domain.form.FormJpaEntity; -import life.mosu.mosuserver.domain.form.FormJpaRepository; -import life.mosu.mosuserver.global.exception.CustomRuntimeException; -import life.mosu.mosuserver.global.exception.ErrorCode; -import life.mosu.mosuserver.presentation.form.dto.FormListResponse; -import life.mosu.mosuserver.presentation.form.dto.FormResponse; -import life.mosu.mosuserver.presentation.form.dto.RegisterFormRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class FormService { - - private final FormJpaRepository formJpaRepository; - - @Transactional - public void registerForm(RegisterFormRequest request) { - FormJpaEntity form = request.toEntity(); - formJpaRepository.save(form); - } - - @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) - public FormResponse getFormId(Long formId) { - FormJpaEntity form = formJpaRepository.findById(formId).orElseThrow( - () -> new CustomRuntimeException(ErrorCode.NOT_FOUND_FORM) - ); - return FormResponse.from(form); - } - - @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) - public FormListResponse getAllForms() { - List forms = formJpaRepository.findAll() - .stream() - .map(FormResponse::from) - .toList(); - return FormListResponse.of(forms); - } -} diff --git a/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java b/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java index 76e46921..0fe139d4 100644 --- a/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java +++ b/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java @@ -37,8 +37,6 @@ public UserJpaEntity process(final OAuthUserInfo info) { .phoneNumber(info.phoneNumber()) .userRole(UserRole.ROLE_PENDING) .provider(AuthProvider.KAKAO) - .agreedToTermsOfService(true) - .agreedToPrivacyPolicy(true) .agreedToMarketing(info.marketingAgreed()) .build(); return userRepository.save(newUser); diff --git a/src/main/java/life/mosu/mosuserver/domain/file/FileMoveFailLog.java b/src/main/java/life/mosu/mosuserver/domain/file/FileMoveFailLog.java index f934dd34..b8be6ce0 100644 --- a/src/main/java/life/mosu/mosuserver/domain/file/FileMoveFailLog.java +++ b/src/main/java/life/mosu/mosuserver/domain/file/FileMoveFailLog.java @@ -1,5 +1,6 @@ package life.mosu.mosuserver.domain.file; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -17,6 +18,7 @@ public class FileMoveFailLog extends BaseTimeEntity { private Long faqId; + @Column(columnDefinition = "TEXT") private String s3Key; private Folder destinationFolder; diff --git a/src/main/java/life/mosu/mosuserver/domain/file/FileWithTime.java b/src/main/java/life/mosu/mosuserver/domain/file/FileWithTime.java index b179b6ff..66810ba2 100644 --- a/src/main/java/life/mosu/mosuserver/domain/file/FileWithTime.java +++ b/src/main/java/life/mosu/mosuserver/domain/file/FileWithTime.java @@ -17,7 +17,7 @@ public abstract class FileWithTime extends BaseTimeEntity { @Column private String fileName; - @Column + @Column(columnDefinition = "TEXT") private String s3Key; @Enumerated(EnumType.STRING) diff --git a/src/main/java/life/mosu/mosuserver/domain/form/FormJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/form/FormJpaEntity.java deleted file mode 100644 index fb61eb25..00000000 --- a/src/main/java/life/mosu/mosuserver/domain/form/FormJpaEntity.java +++ /dev/null @@ -1,96 +0,0 @@ -package life.mosu.mosuserver.domain.form; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import java.time.LocalDate; -import life.mosu.mosuserver.domain.application.entity.Subject; -import life.mosu.mosuserver.domain.base.BaseTimeEntity; -import life.mosu.mosuserver.domain.exam.entity.Area; -import life.mosu.mosuserver.domain.profile.entity.Gender; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity -@Table(name = "form") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class FormJpaEntity extends BaseTimeEntity { - - @Id - @Column(name = "form_id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "exam_date", nullable = false) - private LocalDate examDate; - - @Column(name = "org_name") - private String orgName; - - @Column(name = "password") - private String password; - - @Column(name = "user_name") - private String userName; - - @Enumerated(EnumType.STRING) - private Gender gender; - - @Column(name = "birth") - private LocalDate birth; - - @Column(name = "phone_number") - private String phoneNumber; - - @Column(name = "subjects") - @Enumerated(EnumType.STRING) - private Subject subject; - - @Column(name = "subjects2") - @Enumerated(EnumType.STRING) - private Subject subject2; - - @Column(name = "lunch") - private boolean lunch; - - @Column(name = "area") - @Enumerated(EnumType.STRING) - private Area area; - - @Column(name = "school_name") - private String schoolName; - - @Column(name = "file_name") - private String fileName; - - @Column(name = "s3_key") - private String s3Key; - - @Builder - public FormJpaEntity(LocalDate examDate, String orgName, String password, String userName, - Gender gender, LocalDate birth, String phoneNumber, Subject subject, Subject subject2, - boolean lunch, Area area, String schoolName, String fileName, String s3Key) { - this.examDate = examDate; - this.orgName = orgName; - this.password = password; - this.userName = userName; - this.gender = gender; - this.birth = birth; - this.phoneNumber = phoneNumber; - this.subject = subject; - this.subject2 = subject2; - this.lunch = lunch; - this.area = area; - this.schoolName = schoolName; - this.fileName = fileName; - this.s3Key = s3Key; - } -} diff --git a/src/main/java/life/mosu/mosuserver/domain/form/FormJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/form/FormJpaRepository.java deleted file mode 100644 index 83feb367..00000000 --- a/src/main/java/life/mosu/mosuserver/domain/form/FormJpaRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package life.mosu.mosuserver.domain.form; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface FormJpaRepository extends JpaRepository { - -} diff --git a/src/main/java/life/mosu/mosuserver/domain/user/entity/UserJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/user/entity/UserJpaEntity.java index a936bcc2..19fa1b74 100644 --- a/src/main/java/life/mosu/mosuserver/domain/user/entity/UserJpaEntity.java +++ b/src/main/java/life/mosu/mosuserver/domain/user/entity/UserJpaEntity.java @@ -47,18 +47,12 @@ public class UserJpaEntity extends BaseTimeEntity { @Column(name = "birth") private LocalDate birth; - @Column(name = "phone_number") + @Column(name = "phone_number", unique = true) private String phoneNumber; @Column(name = "customer_key") private String customerKey; - @Column(name = "agreed_to_terms_of_service") - private boolean agreedToTermsOfService; - - @Column(name = "agreed_to_privacy_policy") - private boolean agreedToPrivacyPolicy; - @Column(name = "agreed_to_marketing") private boolean agreedToMarketing; @@ -72,8 +66,7 @@ public class UserJpaEntity extends BaseTimeEntity { @Builder public UserJpaEntity(String loginId, String password, Gender gender, String name, - String phoneNumber, - LocalDate birth, boolean agreedToTermsOfService, boolean agreedToPrivacyPolicy, + String phoneNumber, LocalDate birth, boolean agreedToMarketing, UserRole userRole, AuthProvider provider) { this.loginId = loginId; this.password = password; @@ -82,8 +75,6 @@ public UserJpaEntity(String loginId, String password, Gender gender, String name this.phoneNumber = phoneNumber; this.birth = birth; this.customerKey = generateUUIDCustomerKey(); - this.agreedToTermsOfService = agreedToTermsOfService; - this.agreedToPrivacyPolicy = agreedToPrivacyPolicy; this.agreedToMarketing = agreedToMarketing; this.userRole = userRole; this.provider = provider; diff --git a/src/main/java/life/mosu/mosuserver/presentation/.gitkeep b/src/main/java/life/mosu/mosuserver/presentation/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationGuestRequest.java b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationGuestRequest.java index 64b702cc..becb61a1 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationGuestRequest.java +++ b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationGuestRequest.java @@ -49,8 +49,6 @@ public UserJpaEntity toUserJpaEntity() { .userRole(UserRole.ROLE_USER) .provider(AuthProvider.MOSU) .agreedToMarketing(true) - .agreedToPrivacyPolicy(true) - .agreedToTermsOfService(true) .build(); } diff --git a/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/SignUpAccountRequest.java b/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/SignUpAccountRequest.java index ba97e99e..61aa2bb5 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/SignUpAccountRequest.java +++ b/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/SignUpAccountRequest.java @@ -55,8 +55,6 @@ public UserJpaEntity toAuthEntity(PasswordEncoder passwordEncoder) { return UserJpaEntity.builder() .loginId(id) .password(passwordEncode(passwordEncoder, password)) - .agreedToTermsOfService(true) - .agreedToPrivacyPolicy(true) .agreedToMarketing(serviceTermRequest.agreedToMarketing()) .gender(Gender.fromName(gender)) .name(userName) diff --git a/src/main/java/life/mosu/mosuserver/presentation/form/FormController.java b/src/main/java/life/mosu/mosuserver/presentation/form/FormController.java deleted file mode 100644 index 11ddbbc9..00000000 --- a/src/main/java/life/mosu/mosuserver/presentation/form/FormController.java +++ /dev/null @@ -1,48 +0,0 @@ -package life.mosu.mosuserver.presentation.form; - -import jakarta.validation.Valid; -import life.mosu.mosuserver.application.form.FormService; -import life.mosu.mosuserver.global.util.ApiResponseWrapper; -import life.mosu.mosuserver.presentation.form.dto.FormListResponse; -import life.mosu.mosuserver.presentation.form.dto.FormResponse; -import life.mosu.mosuserver.presentation.form.dto.RegisterFormRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/form") -public class FormController implements FormControllerDocs { - - private final FormService formService; - - @PostMapping - public ResponseEntity> registerForm( - @Valid @RequestBody RegisterFormRequest request) { - formService.registerForm(request); - return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.CREATED, "Form 등록 성공")); - } - - @GetMapping("/{formId}") - public ResponseEntity> getForms( - @PathVariable Long formId - ) { - FormResponse response = formService.getFormId(formId); - return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "Form 조회 성공", response)); - } - - @GetMapping - public ResponseEntity> getAllForms() { - FormListResponse responses = formService.getAllForms(); - - return ResponseEntity.ok( - ApiResponseWrapper.success(HttpStatus.OK, "FormList 조회 성공", responses)); - } -} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/form/FormControllerDocs.java b/src/main/java/life/mosu/mosuserver/presentation/form/FormControllerDocs.java deleted file mode 100644 index aaa75345..00000000 --- a/src/main/java/life/mosu/mosuserver/presentation/form/FormControllerDocs.java +++ /dev/null @@ -1,25 +0,0 @@ -package life.mosu.mosuserver.presentation.form; - -import io.swagger.v3.oas.annotations.Operation; -import jakarta.validation.Valid; -import life.mosu.mosuserver.global.util.ApiResponseWrapper; -import life.mosu.mosuserver.presentation.form.dto.FormListResponse; -import life.mosu.mosuserver.presentation.form.dto.FormResponse; -import life.mosu.mosuserver.presentation.form.dto.RegisterFormRequest; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; - -public interface FormControllerDocs { - - @Operation(summary = "Form 등록", description = "새로운 Form을 등록합니다. 권한은 아직 아무것도 없는데 추가될 수 있습니다") - public ResponseEntity> registerForm( - @Valid @RequestBody RegisterFormRequest request); - - @Operation(summary = "Form 단건 조회", description = "특정 Form ID에 해당하는 Form 정보를 조회합니다. 권한은 아직 아무것도 없는데 추가될 수 있습니다") - public ResponseEntity> getForms( - @PathVariable Long formId); - - @Operation(summary = "모든 Form 조회", description = "등록된 모든 Form 정보를 조회합니다. 권한은 아직 아무것도 없는데 추가될 수 있습니다") - public ResponseEntity> getAllForms(); -} diff --git a/src/main/java/life/mosu/mosuserver/presentation/form/dto/FormListResponse.java b/src/main/java/life/mosu/mosuserver/presentation/form/dto/FormListResponse.java deleted file mode 100644 index ce70d5f5..00000000 --- a/src/main/java/life/mosu/mosuserver/presentation/form/dto/FormListResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package life.mosu.mosuserver.presentation.form.dto; - -import java.util.List; - -public record FormListResponse( - List forms -) { - - public static FormListResponse of(List forms) { - return new FormListResponse(forms); - } -} diff --git a/src/main/java/life/mosu/mosuserver/presentation/form/dto/FormResponse.java b/src/main/java/life/mosu/mosuserver/presentation/form/dto/FormResponse.java deleted file mode 100644 index 5757ae3a..00000000 --- a/src/main/java/life/mosu/mosuserver/presentation/form/dto/FormResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -package life.mosu.mosuserver.presentation.form.dto; - -import java.time.LocalDate; -import life.mosu.mosuserver.domain.form.FormJpaEntity; - -public record FormResponse( - String orgName, - String password, - String userName, - String gender, - LocalDate birth, - String phoneNumber, - String subject, - String subject2, - Boolean lunch, - String area, - String schoolName, - LocalDate examDate -) { - - public static FormResponse from(FormJpaEntity form) { - return new FormResponse( - form.getOrgName(), - form.getPassword(), - form.getUserName(), - form.getGender() != null ? form.getGender().name() : null, - form.getBirth(), - form.getPhoneNumber(), - form.getSubject() != null ? form.getSubject().name() : null, - form.getSubject2() != null ? form.getSubject2().name() : null, - form.isLunch(), - form.getArea() != null ? form.getArea().name() : null, - form.getSchoolName(), - form.getExamDate() - ); - } - -} diff --git a/src/main/java/life/mosu/mosuserver/presentation/form/dto/RegisterFormRequest.java b/src/main/java/life/mosu/mosuserver/presentation/form/dto/RegisterFormRequest.java deleted file mode 100644 index ced2303b..00000000 --- a/src/main/java/life/mosu/mosuserver/presentation/form/dto/RegisterFormRequest.java +++ /dev/null @@ -1,59 +0,0 @@ -package life.mosu.mosuserver.presentation.form.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import java.time.LocalDate; -import life.mosu.mosuserver.domain.application.entity.Subject; -import life.mosu.mosuserver.domain.exam.entity.Area; -import life.mosu.mosuserver.domain.form.FormJpaEntity; -import life.mosu.mosuserver.domain.profile.entity.Gender; -import life.mosu.mosuserver.presentation.common.FileRequest; - -public record RegisterFormRequest( - @Schema(description = "시험 기간", example = "2025-07-29") - @NotNull LocalDate examDate, - @Schema(description = "기관명", example = "모수학원") - @NotNull String orgName, - @Schema(description = "비밀번호", example = "1234") - @NotNull String password, - @Schema(description = "신청 대표자 이름", example = "김모수") - @NotNull String userName, - @Schema(description = "성별", example = "MALE") - @NotNull String gender, - @Schema(description = "생년월일", example = "2000-01-01") - @NotNull LocalDate birth, - @Schema(description = "전화번호", example = "010-1234-5678") - @NotNull String phoneNumber, - @Schema(description = "주요 과목", example = "생활과 윤리") - @NotNull String subject, - @Schema(description = "보조 과목", example = "화학Ⅱ") - @NotNull String subject2, - @Schema(description = "점심 제공 여부", example = "true") - @NotNull Boolean lunch, - @Schema(description = "지역", example = "대구") - @NotNull String area, - @Schema(description = "학교명", example = "대치중학교") - @NotNull String schoolName, - @Schema(description = "수험표 파일 정보", implementation = FileRequest.class) - FileRequest admissionTicket -) { - - public FormJpaEntity toEntity() { - return FormJpaEntity.builder() - .orgName(orgName) - .password(password) - .userName(userName) - .gender(Gender.valueOf(gender)) - .birth(birth) - .phoneNumber(phoneNumber) - .subject(Subject.getSubject(subject)) - .subject2(Subject.getSubject(subject2)) - .lunch(lunch) - .examDate(examDate) - .area(Area.from(area)) - .schoolName(schoolName) - .fileName(admissionTicket().fileName()) - .s3Key(admissionTicket().s3Key()) - .build(); - } -} diff --git a/src/main/resources/application-base.yml b/src/main/resources/application-base.yml index c74b38c9..7301ede7 100644 --- a/src/main/resources/application-base.yml +++ b/src/main/resources/application-base.yml @@ -36,16 +36,20 @@ spring: hikari: maximum-pool-size: 15 minimum-idle: 15 + flyway: + enabled: true + baseline-on-migrate: true servlet: multipart: max-file-size: ${MAX_FILE_SIZE} max-request-size: ${MAX_REQUEST_SIZE} + jpa: open-in-view: false show-sql: true hibernate: - ddl-auto: update + ddl-auto: validate properties: hibernate: diff --git a/src/main/resources/db/data/data.sql b/src/main/resources/db/data/data.sql deleted file mode 100644 index 2bb55f4b..00000000 --- a/src/main/resources/db/data/data.sql +++ /dev/null @@ -1,60 +0,0 @@ -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.931747', '2025-08-03 05:01:17.931747', '강남구 대치동 987', '서울특별시', - '06234', 'DAECHI', 532, '2025-10-12 23:59:59.000000', '2025-10-19', '고정 도시락', 9000, '대치중학교', - false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.939018', '2025-08-03 05:01:17.939018', '양천구 목동서로 369', '서울특별시', - '07995', 'MOKDONG', 896, '2025-10-19 23:59:59.000000', '2025-10-26', '고정 도시락', 9000, - '목운중학교', false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.945445', '2025-08-03 05:01:17.945445', '양천구 신정로 250', '서울특별시', - '08018', 'MOKDONG', 896, '2025-10-26 23:59:59.000000', '2025-11-02', '고정 도시락', 9000, - '신서중학교', false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.952291', '2025-08-03 05:01:17.952291', '강남구 개포로 619', '서울특별시', - '06327', 'DAECHI', 840, '2025-10-19 23:59:59.000000', '2025-10-26', '고정 도시락', 9000, '개원중학교', - false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.958425', '2025-08-03 05:01:17.958425', '강남구 개포로 619', '서울특별시', - '06327', 'DAECHI', 840, '2025-10-26 23:59:59.000000', '2025-11-02', '고정 도시락', 9000, '개원중학교', - false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.965381', '2025-08-03 05:01:17.965381', '영등포구 문래로 195', '서울특별시', - '07291', 'MOKDONG', 558, '2025-10-12 23:59:59.000000', '2025-10-19', '고정 도시락', 9000, - '문래중학교', false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.972408', '2025-08-03 05:01:17.972408', '노원구 덕릉로 70길 99', '서울특별시', - '01673', 'NOWON', 448, '2025-10-12 23:59:59.000000', '2025-10-19', '고정 도시락', 9000, '온곡중학교', - false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.978612', '2025-08-03 05:01:17.978612', '노원구 덕릉로 70길 99', '서울특별시', - '01673', 'NOWON', 448, '2025-10-26 23:59:59.000000', '2025-11-02', '고정 도시락', 9000, '온곡중학교', - false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.982574', '2025-08-03 05:01:17.982574', '대구광역시 달서구 장기로 76', '서울특별시', - '42677', 'DAEGU', 392, '2025-10-12 23:59:59.000000', '2025-10-19', '고정 도시락', 9000, '노변중학교', - false, 'OPEN'); -INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, - deadline_time, exam_date, lunch_name, lunch_price, school_name, deleted, - exam_status) -VALUES ('2025-08-03 05:01:17.988270', '2025-08-03 05:01:17.988270', '대구광역시 달서구 장기로 76', '서울특별시', - '42677', 'DAEGU', 392, '2025-10-26 23:59:59.000000', '2025-11-02', '고정 도시락', 9000, '노변중학교', - false, 'OPEN'); \ No newline at end of file diff --git a/src/main/resources/db/migration/.gitkeep b/src/main/resources/db/migration/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 00000000..0cc86a24 --- /dev/null +++ b/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,362 @@ +CREATE TABLE application +( + application_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + deleted BIT(1) NULL, + user_id BIGINT NULL, + parent_phone_number VARCHAR(255) NULL, + application_status VARCHAR(255) NOT NULL, + agreed_to_notices BIT(1) NULL, + agreed_to_refund_policy BIT(1) NULL, + CONSTRAINT pk_application PRIMARY KEY (application_id) +); + +CREATE TABLE application_failure_log +( + application_failure_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + application_id BIGINT NOT NULL, + user_id BIGINT NOT NULL, + reason VARCHAR(255) NOT NULL, + snapshot TEXT NULL, + CONSTRAINT pk_application_failure_log PRIMARY KEY (application_failure_id) +); + +CREATE TABLE banner +( + deleted BIT(1) NOT NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + file_name VARCHAR(255) NULL, + s3key TEXT NULL, + visibility VARCHAR(255) NULL, + created_at datetime NULL, + updated_at datetime NULL, + title VARCHAR(255) NULL, + dead_line datetime NULL, + banner_link VARCHAR(255) NULL, + CONSTRAINT pk_banner PRIMARY KEY (id) +); + +CREATE TABLE blocked_ip_history_log +( + id BIGINT AUTO_INCREMENT NOT NULL, + ip VARCHAR(255) NULL, + penalty_level VARCHAR(255) NULL, + blocked_at datetime NULL, + CONSTRAINT pk_blocked_ip_history_log PRIMARY KEY (id) +); + +CREATE TABLE event +( + deleted BIT(1) NOT NULL, + event_id BIGINT AUTO_INCREMENT NOT NULL, + file_name VARCHAR(255) NULL, + s3key TEXT NULL, + visibility VARCHAR(255) NULL, + created_at datetime NULL, + updated_at datetime NULL, + event_title VARCHAR(255) NOT NULL, + event_link VARCHAR(255) NULL, + start_date date NULL, + end_date date NULL, + CONSTRAINT pk_event PRIMARY KEY (event_id) +); + +CREATE TABLE exam +( + deleted BIT(1) NOT NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + school_name VARCHAR(255) NULL, + area VARCHAR(255) NULL, + capacity INT NULL, + deadline_time datetime NULL, + exam_date date NOT NULL, + lunch_name VARCHAR(255) NULL, + lunch_price INT NULL, + exam_status VARCHAR(255) NOT NULL, + zipcode VARCHAR(255) NULL, + street VARCHAR(255) NULL, + detail VARCHAR(255) NULL, + CONSTRAINT pk_exam PRIMARY KEY (id) +); + +CREATE TABLE exam_application +( + id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + deleted BIT(1) NULL, + application_id BIGINT NULL, + user_id BIGINT NULL, + exam_id BIGINT NULL, + lunch_checked BIT(1) NULL, + exam_number VARCHAR(255) NULL, + CONSTRAINT pk_exam_application PRIMARY KEY (id) +); + +CREATE TABLE exam_subject +( + id BIGINT AUTO_INCREMENT NOT NULL, + exam_application_id BIGINT NULL, + subject VARCHAR(255) NULL, + CONSTRAINT pk_exam_subject PRIMARY KEY (id) +); + +CREATE TABLE exam_ticket_image +( + exam_ticket_image_id BIGINT AUTO_INCREMENT NOT NULL, + file_name VARCHAR(255) NULL, + s3key TEXT NULL, + visibility VARCHAR(255) NULL, + application_id BIGINT NOT NULL, + CONSTRAINT pk_exam_ticket_image PRIMARY KEY (exam_ticket_image_id) +); + +CREATE TABLE faq +( + deleted BIT(1) NOT NULL, + faq_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + question VARCHAR(500) NOT NULL, + answer VARCHAR(255) NOT NULL, + author VARCHAR(255) NOT NULL, + user_id BIGINT NOT NULL, + CONSTRAINT pk_faq PRIMARY KEY (faq_id) +); + +CREATE TABLE file_move_fail_log +( + id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + faq_id BIGINT NULL, + s3key TEXT NULL, + destination_folder SMALLINT NULL, + CONSTRAINT pk_filemovefaillog PRIMARY KEY (id) +); + +CREATE TABLE inquiry +( + deleted BIT(1) NOT NULL, + inquiry_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + title VARCHAR(300) NOT NULL, + content VARCHAR(1000) NOT NULL, + user_id BIGINT NOT NULL, + author VARCHAR(255) NULL, + status VARCHAR(255) NULL, + CONSTRAINT pk_inquiry PRIMARY KEY (inquiry_id) +); + +CREATE TABLE inquiry_answer +( + deleted BIT(1) NOT NULL, + inquiry_answer_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + title VARCHAR(300) NOT NULL, + content VARCHAR(1000) NOT NULL, + inquiry_id BIGINT NOT NULL, + author VARCHAR(255) NOT NULL, + user_id BIGINT NOT NULL, + CONSTRAINT pk_inquiry_answer PRIMARY KEY (inquiry_answer_id) +); + +CREATE TABLE inquiry_answer_attachment +( + inquiry_answer_attachment_id BIGINT AUTO_INCREMENT NOT NULL, + file_name VARCHAR(255) NULL, + s3key TEXT NULL, + visibility VARCHAR(255) NULL, + inquiry_answer_id BIGINT NOT NULL, + CONSTRAINT pk_inquiry_answer_attachment PRIMARY KEY (inquiry_answer_attachment_id) +); + +CREATE TABLE inquiry_attachment +( + inquiry_attachment_id BIGINT AUTO_INCREMENT NOT NULL, + file_name VARCHAR(255) NULL, + s3key TEXT NULL, + visibility VARCHAR(255) NULL, + inquiry_id BIGINT NOT NULL, + CONSTRAINT pk_inquiry_attachment PRIMARY KEY (inquiry_attachment_id) +); + +CREATE TABLE notice +( + deleted BIT(1) NOT NULL, + notice_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + title VARCHAR(255) NOT NULL, + content VARCHAR(3000) NOT NULL, + user_id BIGINT NOT NULL, + author VARCHAR(255) NOT NULL, + CONSTRAINT pk_notice PRIMARY KEY (notice_id) +); + +CREATE TABLE notice_attachment +( + notice_attachment_id BIGINT AUTO_INCREMENT NOT NULL, + file_name VARCHAR(255) NULL, + s3key TEXT NULL, + visibility VARCHAR(255) NULL, + notice_id BIGINT NOT NULL, + CONSTRAINT pk_notice_attachment PRIMARY KEY (notice_attachment_id) +); + +CREATE TABLE notify +( + deleted BIT(1) NOT NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + notify_custom_key VARCHAR(255) NOT NULL, + notify_type VARCHAR(255) NOT NULL, + notify_result_code VARCHAR(255) NOT NULL, + CONSTRAINT pk_notify PRIMARY KEY (id) +); + +CREATE TABLE payment +( + payment_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + deleted BIT(1) NULL, + exam_application_id BIGINT NULL, + application_id BIGINT NULL, + payment_key VARCHAR(255) NULL, + order_id VARCHAR(255) NOT NULL, + status VARCHAR(255) NOT NULL, + method VARCHAR(255) NULL, + total_amount INT NULL, + supplied_amount INT NULL, + vat_amount INT NULL, + balance_amount INT NULL, + tax_free_amount INT NULL, + CONSTRAINT pk_payment PRIMARY KEY (payment_id) +); + +CREATE TABLE payment_failure_log +( + payment_failure_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + payment_id BIGINT NOT NULL, + exam_application_id BIGINT NOT NULL, + application_id BIGINT NULL, + reason VARCHAR(255) NOT NULL, + snapshot TEXT NULL, + CONSTRAINT pk_payment_failure_log PRIMARY KEY (payment_failure_id) +); + +CREATE TABLE profile +( + deleted BIT(1) NOT NULL, + profile_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + user_id BIGINT NOT NULL, + user_name VARCHAR(255) NOT NULL, + gender VARCHAR(255) NOT NULL, + birth date NOT NULL, + phone_number VARCHAR(255) NOT NULL, + email VARCHAR(255) NULL, + education VARCHAR(255) NULL, + recommender_phone_number VARCHAR(255) NULL, + grade VARCHAR(255) NULL, + school_name VARCHAR(255) NULL, + zipcode VARCHAR(255) NULL, + street VARCHAR(255) NULL, + CONSTRAINT pk_profile PRIMARY KEY (profile_id) +); + +CREATE TABLE recommendation +( + deleted BIT(1) NOT NULL, + recommendation_id BIGINT AUTO_INCREMENT NOT NULL, + user_id BIGINT NULL, + recommeded_name VARCHAR(255) NULL, + recommeded_phone_number VARCHAR(255) NULL, + bank VARCHAR(255) NULL, + account_number VARCHAR(255) NULL, + CONSTRAINT pk_recommendation PRIMARY KEY (recommendation_id) +); + +CREATE TABLE refund +( + refund_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + deleted BIT(1) NULL, + transaction_key VARCHAR(255) NOT NULL, + exam_application_id BIGINT NULL, + reason VARCHAR(255) NOT NULL, + refund_status VARCHAR(255) NULL, + refunded_amount INT NULL, + refundable_amount INT NULL, + CONSTRAINT pk_refund PRIMARY KEY (refund_id) +); + +CREATE TABLE refund_failure_log +( + refund_failure_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + refund_id BIGINT NOT NULL, + exam_application_id BIGINT NOT NULL, + reason VARCHAR(255) NOT NULL, + snapshot TEXT NULL, + CONSTRAINT pk_refund_failure_log PRIMARY KEY (refund_failure_id) +); + +CREATE TABLE user +( + deleted BIT(1) NOT NULL, + user_id BIGINT AUTO_INCREMENT NOT NULL, + created_at datetime NULL, + updated_at datetime NULL, + login_id VARCHAR(50) NULL, + password VARCHAR(255) NULL, + gender VARCHAR(255) NULL, + name VARCHAR(255) NULL, + birth date NULL, + phone_number VARCHAR(255) NULL, + customer_key VARCHAR(255) NULL, + agreed_to_marketing BIT(1) NULL, + user_role VARCHAR(50) NOT NULL, + provider VARCHAR(255) NULL, + CONSTRAINT pk_user PRIMARY KEY (user_id) +); + +CREATE TABLE virtual_account_log +( + deleted BIT(1) NOT NULL, + virtual_account_log_id BIGINT AUTO_INCREMENT NOT NULL, + application_id BIGINT NULL, + order_id VARCHAR(255) NULL, + account_number VARCHAR(255) NULL, + bank_name VARCHAR(255) NULL, + customer_name VARCHAR(255) NULL, + customer_email VARCHAR(255) NULL, + deposit_status SMALLINT NULL, + CONSTRAINT pk_virtual_account_log PRIMARY KEY (virtual_account_log_id) +); + +ALTER TABLE profile + ADD CONSTRAINT uc_25d92281884ae5fdff0d3ec10 UNIQUE (user_id); + +ALTER TABLE notify + ADD CONSTRAINT uc_notify_notify_custom_key UNIQUE (notify_custom_key); + +ALTER TABLE user + ADD CONSTRAINT uc_user_login UNIQUE (login_id); + +ALTER TABLE user + ADD CONSTRAINT uc_user_phone_number UNIQUE (phone_number); + +CREATE INDEX idx_status_created_at ON payment (status, created_at); \ No newline at end of file diff --git a/src/main/resources/db/migration/V2__insert_data.sql b/src/main/resources/db/migration/V2__insert_data.sql new file mode 100644 index 00000000..b4f0b5f5 --- /dev/null +++ b/src/main/resources/db/migration/V2__insert_data.sql @@ -0,0 +1,153 @@ +-- 학교 +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.636240', '2025-08-07 13:11:24.636240', '강남구 남부순환로378길 39', '서울특별시', + '06299', + 'DAECHI', 532, '2025-10-12 23:59:59.000000', '2025-10-19', 'OPEN', '고정 도시락', 9000, '대치중학교', + false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.712606', '2025-08-07 13:11:24.712606', '양천구 목동동로 235', '서울특별시', + '07996', 'MOKDONG', 896, '2025-10-19 23:59:59.000000', '2025-10-26', 'OPEN', '고정 도시락', 9000, + '목운중학교', false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.718072', '2025-08-07 13:11:24.718072', '양천구 중앙로 206', '서울특별시', '08091', + 'MOKDONG', 896, '2025-10-26 23:59:59.000000', '2025-11-02', 'OPEN', '고정 도시락', 9000, '신서중학교', + false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.723008', '2025-08-07 13:11:24.723008', '강남구 영동대로 101', '서울특별시', + '06328', + 'DAECHI', 840, '2025-10-19 23:59:59.000000', '2025-10-26', 'OPEN', '고정 도시락', 9000, '개원중학교', + false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.727606', '2025-08-07 13:11:24.727606', '강남구 영동대로 101', '서울특별시', + '06328', + 'DAECHI', 840, '2025-10-26 23:59:59.000000', '2025-11-02', 'OPEN', '고정 도시락', 9000, '개원중학교', + false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.732472', '2025-08-07 13:11:24.732472', '영등포구 선유서로13길 6', '서울특별시', + '07283', 'MOKDONG', 558, '2025-10-12 23:59:59.000000', '2025-10-19', 'OPEN', '고정 도시락', 9000, + '문래중학교', false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.740652', '2025-08-07 13:11:24.740652', '노원구 노원로 492', '서울특별시', + '01678', 'NOWON', 448, '2025-10-12 23:59:59.000000', '2025-10-19', 'OPEN', '고정 도시락', 9000, + '온곡중학교', false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.747536', '2025-08-07 13:11:24.747536', '노원구 노원로 492', '서울특별시', + '01673', 'NOWON', 448, '2025-10-26 23:59:59.000000', '2025-11-02', 'OPEN', '고정 도시락', 9000, + '온곡중학교', false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.755154', '2025-08-07 13:11:24.755154', '수성구 시지로 66', '대구광역시', + '42251', 'DAEGU', 392, '2025-10-12 23:59:59.000000', '2025-10-19', 'OPEN', '고정 도시락', 9000, + '노변중학교', false); +INSERT INTO sa.exam (created_at, updated_at, detail, street, zipcode, area, capacity, deadline_time, + exam_date, exam_status, lunch_name, lunch_price, school_name, deleted) +VALUES ('2025-08-07 13:11:24.763288', '2025-08-07 13:11:24.763288', '수성구 시지로 66', '대구광역시', + '42251', 'DAEGU', 392, '2025-10-19 23:59:59.000000', '2025-10-26', 'OPEN', '고정 도시락', 9000, + '노변중학교', false); + +-- 이벤트 +INSERT INTO sa.event (created_at, updated_at, file_name, s3key, visibility, end_date, start_date, + event_link, event_title, deleted) +VALUES ('2025-08-07 16:02:29.725574', '2025-08-07 16:02:29.725574', + '78a916d5-2d29-4c3e-a6e1-4d4bebca9a2c_event.png', + 'event/92151238-2ce3-444a-b5ef-9afb45988f01_78a916d5-2d29-4c3e-a6e1-4d4bebca9a2c_event.png', + 'PUBLIC', '2025-11-02', '2025-08-07', 'https://www.mosuedu.com/events/recommend', + '친구야 수능 치고 만원 받자!', false); +INSERT INTO sa.event (created_at, updated_at, file_name, s3key, visibility, end_date, start_date, + event_link, event_title, deleted) +VALUES ('2025-08-08 15:44:22.962184', '2025-08-08 15:44:22.962184', 'event-1.jpeg', + 'event/76a5c2fb-522a-4f86-a773-2baa80c336c4_event-1.jpeg', 'PUBLIC', '2025-12-31', + '2025-08-01', + 'https://www.medsky.co.kr/?fbclid=PAQ0xDSwMCYqJleHRuA2FlbQIxMQABp2RuRa3LXajOc8u3WmvdJ1RU9BhFCi7WORwWX0dM539Uvpmw080SNp5YYftB_aem_ys794fY1xyubFiy9EZSnug', + '메드스카이 GRAND OPEN, 모수 회원이면 5만원 할인', false); +INSERT INTO sa.event (created_at, updated_at, file_name, s3key, visibility, end_date, start_date, + event_link, event_title, deleted) +VALUES ('2025-08-08 15:50:54.014641', '2025-08-08 15:50:54.014641', 'carousel-2.png', + 'event/369859c2-c678-4edd-a30e-21e60011924f_carousel-2.png', 'PUBLIC', '2025-12-31', + '2025-08-01', + 'https://skyhacks.oopy.io/?fbclid=PAQ0xDSwMCYrZleHRuA2FlbQIxMQABp5KOImPRKXoNbGHgYTKbZ5mYlHpaVuGaAxfoz_ZqVGaqcdkTBMMPn3M3Q1Dn_aem_bg0-V6eNLt7jwxWnB8KJ3Q', + '모수가 강력 추천하는 SKY 독학 관리 프로그램', false); + +-- 게시글 +INSERT INTO sa.notice (created_at, updated_at, author, content, title, user_id, deleted) +VALUES ('2025-08-06 23:27:52.391738', '2025-08-06 23:27:52.391738', '관리자', '![모수 이벤트 이미지](https://mosu-files.s3.amazonaws.com/notice/78a916d5-2d29-4c3e-a6e1-4d4bebca9a2c_event.png) + +친구에게 \'**모의가 아닌 진짜 수능**\'을 추천하고, **1만 원 환급 혜택**을 받아 가세요! + +--- + +**참여 방법** + +1. 아래 입력란에 **내가 추천한 친구의 이름과 연락처**, **나의 환급 계좌번호**를 작성해 주세요. +2. **내가 추천한 친구가 모의 수능 신청 시 추천인란에 내 전화번호를 정확히 입력**하도록 도와주세요. +3. ※ 제휴업체 신청링크를 통해 모의수능에 신청한 경우에도, **내가 추천한 친구가 모수 홈페이지에서 직접 신청하면 이벤트 참여 가능**합니다. + +--- + +**보상 지급 안내** + +* **환급 금액**: 10,000원 +* **지급 시기**: 2025년 11월 중 **일괄 송금** +* **이벤트 기간**: ~ 2025년 11월 2일까지 + +--- + +**유의사항** + +* 추천인과 추천받은 친구의 **정보가 정확히 일치**해야 보상이 지급됩니다. +* **이벤트 중복 신청은 불가**하며, 여러 명을 추천하더라도 **1인당 최초 1회만 인정**됩니다. +* 이벤트 페이지 정보 입력은 **1회만 가능**하며, 작성 후 **수정이 불가**하니 신중히 입력해 주세요. +* ※ 수정이 필요한 경우 **고객센터로 문의** 바랍니다. + +--- + +**궁금한 점이 있다면** + +* [모수 홈페이지 문의] +* 카카오톡 채널: [https://pf.kakao.com/_xhHxjxin](https://pf.kakao.com/_xhHxjxin) + + +**정확하게 입력하고, 추천 보상도 꼭 챙기세요!**', '[이벤트] 친구야 수능 치고 만원 받자!', 1, false); +INSERT INTO sa.notice_attachment (file_name, s3key, visibility, notice_id) +VALUES ('event.png', 'notice/78a916d5-2d29-4c3e-a6e1-4d4bebca9a2c_event.png', 'PUBLIC', 1); + +-- FAQ +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:08:39.444988', '2025-08-06 23:08:39.444988', + '개인 모의고사를 지참하지 않을 시 평가원 기출 모의고사를 제공합니다.
하지만, 더 나은 실전 경험을 위해 풀어본 적 없는 고퀄리티 사설 모의고사를 가져오시는 것을 권장합니다.', + '관리자', '모의고사를 꼭 가져가야 하나요?', 1, false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:09:09.241691', '2025-08-06 23:09:09.241691', + '시험지 규격에는 제한이 없습니다.
다만, 시험지 젤 앞장에 이름과 수험번호를 반드시 기입해 주세요.
미기입 시 본인의 시험지가 배부되지 않을 수 있습니다.', + '관리자', '시험지 규격이 정해져 있나요?', 1, false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:10:08.251791', '2025-08-06 23:10:08.251791', + '• 과목별 모의고사(한국사 제외 필수)
• 신분증과 수험표
• 필요시 개인 샤프, 지우개, 화이트, 귀마개
※ 모수에서는 OMR 전용 샤프와 컴퓨터용 사인펜을 제공합니다.', + '관리자', '준비물은 무엇인가요?', 1, false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:13:23.425224', '2025-08-06 23:13:23.425224', + '• 모수는 오전 8시까지 입실을 원칙으로 합니다.
• 실제 수능처럼 준비하려면 7시 30분까지 입실하여 예열 지문 풀이 등 사전 준비를 마치길 추천드립니다.', + '관리자', '몇 시까지 입실해야 하나요?', 1, false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:13:57.002072', '2025-08-06 23:13:57.002072', + '영어 듣기 문항은 수험생마다 다르므로, 평가원 영어 듣기 문제와 음원 파일을 제공·재생하여 진행합니다.', '관리자', '영어 듣기는 어떻게 진행되나요?', 1, + false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:14:14.494197', '2025-08-06 23:14:14.494197', + '시험 종료 후 회수된 시험지는 당일 퇴실 시 모든 과목 시험지와 답안지를 봉투에 담아 배부해드립니다.', '관리자', '시험 종료 후 시험지는 언제 돌려받나요?', + 1, false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:14:33.957577', '2025-08-06 23:14:33.957577', '네, 가능합니다.', '관리자', + '간식이나 음료 반입이 가능한가요?', 1, false); +INSERT INTO sa.faq (created_at, updated_at, answer, author, question, user_id, deleted) +VALUES ('2025-08-06 23:15:09.186770', '2025-08-06 23:15:09.186770', '- 부득이하게 퇴실해야 할 경우, 시험실 또는 복도 감독관에게 먼저 말씀해 주세요. +- 감독관이 보이지 않을 경우, 층별 시험 관리본부로 오시면 안내드립니다. +- 단, 시험 시간 중에는 타 수험생에게 방해가 될 수 있으므로 가급적 쉬는 시간 이용을 권장합니다.', '관리자', '중간 퇴실이 가능한가요?', 1, false);