diff --git a/.github/workflows/dev-server-cicd.yml b/.github/workflows/dev-server-cicd.yml index 97019aad..22bc0d4a 100644 --- a/.github/workflows/dev-server-cicd.yml +++ b/.github/workflows/dev-server-cicd.yml @@ -36,6 +36,7 @@ jobs: ./gradlew build shell: bash + - name: Configure AWS credentials if: ${{ github.ref == 'refs/heads/develop'}} uses: aws-actions/configure-aws-credentials@v4 @@ -72,4 +73,4 @@ jobs: --deployment-config-name CodeDeployDefault.AllAtOnce \ --deployment-group-name ${{ secrets.AWS_CODEDEPLOY_DEV_GROUP_NAME }} \ --file-exists-behavior OVERWRITE \ - --s3-location bucket=${{ secrets.AWS_S3_DEPLOY_DEV_BUCKET_NAME }},bundleType=zip,key=deploy.zip \ No newline at end of file + --s3-location bucket=${{ secrets.AWS_S3_DEPLOY_DEV_BUCKET_NAME }},bundleType=zip,key=deploy.zip diff --git a/.github/workflows/prod-server-cicd.yml b/.github/workflows/prod-server-cicd.yml index b3ec9fc5..cedae36f 100644 --- a/.github/workflows/prod-server-cicd.yml +++ b/.github/workflows/prod-server-cicd.yml @@ -62,7 +62,7 @@ jobs: - name: Upload build file to S3 and trigger CodeDeploy if: ${{ github.ref == 'refs/heads/main' }} run: | - mkdir -p deploy && cp -r deploy-main/* deploy/ + mkdir -p deploy && cp -r deploy-prod/* deploy/ zip -r deploy.zip deploy aws s3 cp deploy.zip s3://${{ secrets.AWS_S3_DEPLOY_PROD_BUCKET_NAME }}/deploy.zip @@ -72,4 +72,4 @@ jobs: --deployment-config-name CodeDeployDefault.AllAtOnce \ --deployment-group-name ${{ secrets.AWS_CODEDEPLOY_PROD_GROUP_NAME }} \ --file-exists-behavior OVERWRITE \ - --s3-location bucket=${{ secrets.AWS_S3_DEPLOY_PROD_BUCKET_NAME }},bundleType=zip,key=deploy.zip \ No newline at end of file + --s3-location bucket=${{ secrets.AWS_S3_DEPLOY_PROD_BUCKET_NAME }},bundleType=zip,key=deploy.zip diff --git a/build.gradle b/build.gradle index eb3db2e8..18d20d61 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'org.asciidoctor.jvm.convert' version '3.3.2' } -group = 'store.undabang' +group = 'com.project200' version = '0.0.1-SNAPSHOT' java { @@ -18,6 +18,9 @@ configurations { compileOnly { extendsFrom annotationProcessor } + + asciidoctorExt + mockitoAgent } repositories { @@ -26,6 +29,7 @@ repositories { ext { set('snippetsDir', file("build/generated-snippets")) + springRestDocsVersion = '3.0.3' } dependencies { @@ -42,14 +46,34 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + asciidoctorExt "org.springframework.restdocs:spring-restdocs-asciidoctor:${springRestDocsVersion}" + + mockitoAgent('org.mockito:mockito-core') { + transitive = false + } + } tasks.named('test') { outputs.dir snippetsDir useJUnitPlatform() + jvmArgs("-javaagent:${configurations.mockitoAgent.asPath}") } tasks.named('asciidoctor') { + configurations 'asciidoctorExt' inputs.dir snippetsDir - dependsOn test + sourceDir file('src/docs/asciidoc') + attributes([ + 'snippets': snippetsDir + ]) + dependsOn tasks.named('test') } + +// 생성된 문서를 JAR에 포함시키기 +bootJar { + dependsOn tasks.named('asciidoctor') // asciidoctor 작업이 먼저 실행되도록 보장 + from("${tasks.named('asciidoctor').get().outputDir}") { // AsciidoctorTask의 outputDir 사용 + into 'static/docs' + } +} \ No newline at end of file diff --git a/compose.yaml b/compose.yaml index 86a7d618..4d2047e1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -7,4 +7,4 @@ services: - 'MYSQL_ROOT_PASSWORD=verysecret' - 'MYSQL_USER=myuser' ports: - - '3306' \ No newline at end of file + - '3306' diff --git a/.gitmessage b/documents/.gitmessage similarity index 100% rename from .gitmessage rename to documents/.gitmessage diff --git "a/documents/Docker Compose MySQL\354\227\220 \354\231\270\353\266\200 \353\217\204\352\265\254\353\241\234 \354\227\260\352\262\260\355\225\230\352\270\260.md" "b/documents/Docker Compose MySQL\354\227\220 \354\231\270\353\266\200 \353\217\204\352\265\254\353\241\234 \354\227\260\352\262\260\355\225\230\352\270\260.md" new file mode 100644 index 00000000..644a7b94 --- /dev/null +++ "b/documents/Docker Compose MySQL\354\227\220 \354\231\270\353\266\200 \353\217\204\352\265\254\353\241\234 \354\227\260\352\262\260\355\225\230\352\270\260.md" @@ -0,0 +1,37 @@ +## Docker Compose MySQL에 외부 도구로 연결하기 +### 1. 현재 포트 확인하기 +현재 파일에서 MySQL 포트가 `- '3306'` 형태로 설정되어 있습니다. 이는 Docker가 호스트의 랜덤 포트에 MySQL의 3306 포트를 매핑한다는 의미입니다. 먼저 실제 매핑된 포트를 확인해야 합니다: `compose.yaml` +``` bash +docker ps +``` +또는 +``` bash +docker-compose ps +``` +명령어를 실행하면 다음과 비슷한 출력이 표시됩니다: +``` +NAME IMAGE ... PORTS ... +mysql mysql:latest ... 0.0.0.0:32769->3306/tcp ... +``` +여기서 32769는 호스트 머신에서 MySQL에 접근할 수 있는 포트 번호입니다. +### 2. 데이터그립에서 연결하기 +1. 데이터그립을 실행하고 새 데이터 소스를 생성합니다. +2. MySQL을 선택합니다. +3. 다음 정보를 입력합니다: + - 호스트(Host): localhost + - 포트(Port): 32769 (또는 `docker ps` 명령어로 확인한 포트) + - 사용자(User): 일반 사용자 접속은 `myuser`, 관리자 접속은 `root` + - 비밀번호(Password): 일반 사용자는 `secret`, root 사용자는 `verysecret` + - 데이터베이스(Database): `mydatabase` + +4. '테스트 연결'을 클릭하여 연결이 성공하는지 확인합니다. + +### 3. MySQL 콘솔로 연결하기 +터미널이나 명령 프롬프트에서: +``` bash +# 일반 사용자로 연결 +mysql -h127.0.0.1 -P32769 -umyuser -psecret mydatabase + +# 또는 root 사용자로 연결 +mysql -h127.0.0.1 -P32769 -uroot -pverysecret +``` diff --git a/documents/JUnit5ExampleTests.java b/documents/JUnit5ExampleTests.java new file mode 100644 index 00000000..4b58c355 --- /dev/null +++ b/documents/JUnit5ExampleTests.java @@ -0,0 +1,51 @@ +package com.project200.undabang; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) +@AutoConfigureRestDocs +@SpringBootTest +public class JUnit5ExampleTests { + + private MockMvc mockMvc; + + @BeforeEach + void setUp(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) { + this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .apply(documentationConfiguration(restDocumentation)) // REST Docs 기능 적용 + .build(); + } + + @Test + public void testExample() throws Exception { + this.mockMvc.perform(get("/api/items/{id}", 1L).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(document("items/get-by-id", // operation-identifier + pathParameters(parameterWithName("id").description("조회할 아이템의 ID")), + responseFields( + fieldWithPath("id").description("아이템의 고유 식별자"), + fieldWithPath("name").description("아이템의 이름") + ) + )); + } +} diff --git "a/documents/Spring REST Docs \354\204\244\354\240\225 \353\260\251\353\262\225.docx" "b/documents/Spring REST Docs \354\204\244\354\240\225 \353\260\251\353\262\225.docx" new file mode 100644 index 00000000..b190c411 Binary files /dev/null and "b/documents/Spring REST Docs \354\204\244\354\240\225 \353\260\251\353\262\225.docx" differ diff --git a/documents/Undabang Database SQL.sql b/documents/Undabang Database SQL.sql new file mode 100644 index 00000000..f9725d1f --- /dev/null +++ b/documents/Undabang Database SQL.sql @@ -0,0 +1,382 @@ +drop table if exists chats; +drop table if exists chatrooms; +drop table if exists comment_reports; +drop table if exists comment_report_subjects; +drop table if exists comments; +drop table if exists exercise_pictures; +drop table if exists exercises; +drop table if exists likes; +drop table if exists member_blocks; +drop table if exists member_locations; +drop table if exists member_pictures; +drop table if exists member_reports; +drop table if exists member_report_subjects; +drop table if exists post_pictures; +drop table if exists pictures; +drop table if exists post_reports; +drop table if exists post_report_subjects; +drop table if exists posts; +drop table if exists post_type; +drop table if exists preferred_exercises; +drop table if exists exercise_types; +drop table if exists members; +drop table if exists reports; + +DROP TRIGGER IF EXISTS before_insert_members; + +create table exercise_types +( + exercise_id bigint auto_increment + primary key, + exercise_name varchar(50) not null, + exercise_type_created_at datetime default CURRENT_TIMESTAMP not null, + exercise_type_deleted_at datetime null, + exercise_type_emoji varchar(10) not null +); + +INSERT INTO exercise_types (exercise_name, exercise_type_emoji) +VALUES ('헬스', '💪'), + ('조깅', '🏃'), + ('자전거', '🚲'), + ('수영', '🏊'), + ('요가', '🧘'), + ('등산', '⛰️'), + ('축구', '⚽'), + ('농구', '🏀'), + ('테니스', '🎾'), + ('배드민턴', '🏸'); + +create table members +( + member_id char(36) not null + primary key, + member_email varchar(320) null, + member_gender char null comment 'M: 남 / F: 여 / U: 비공개', + member_bday date null, + member_nickname varchar(50) not null, + member_desc varchar(500) null, + member_score tinyint default 35 null comment '0~100, 초기값 35', + member_warned_count tinyint default 0 not null comment '관리자 처리 신고 누적', + member_created_at datetime default CURRENT_TIMESTAMP not null, + member_deleted_at datetime null comment '탈퇴 시 삭제 일시 기록', + constraint member_email + unique (member_email), + constraint member_nickname + unique (member_nickname) +); + +CREATE TRIGGER before_insert_members + BEFORE INSERT + ON members + FOR EACH ROW +BEGIN + IF NEW.member_id IS NULL OR NEW.member_id = '' THEN + SET NEW.member_id = UUID(); +END IF; +END; + + +create table chatrooms +( + chatroom_id bigint auto_increment + primary key, + sender_id char(36) not null, + receiver_id char(36) not null, + chatroom_created_at datetime default CURRENT_TIMESTAMP not null, + chatroom_deleted_at datetime null, + constraint FK_cr_receiver + foreign key (receiver_id) references members (member_id), + constraint FK_cr_sender + foreign key (sender_id) references members (member_id) +); + +create table chats +( + chat_id bigint auto_increment + primary key, + chatroom_id bigint not null, + sender_id char(36) not null, + chat_content varchar(500) not null, + chat_is_read tinyint(1) default 0 not null, + chat_sended_at datetime default CURRENT_TIMESTAMP not null, + chat_deleted_at datetime null, + constraint FK_c_chatroom + foreign key (chatroom_id) references chatrooms (chatroom_id), + constraint FK_c_sender + foreign key (sender_id) references members (member_id) +); + +create table exercises +( + exercise_id bigint auto_increment + primary key, + member_id char(36) not null, + exercise_started_at datetime default CURRENT_TIMESTAMP not null, + exercise_ended_at datetime default (exercise_started_at + interval 1 hour) not null, + exercise_detail text null, + exercise_title varchar(255) not null, + exercise_personal_type varchar(255) null comment '시스템이 아닌 개인 등록', + exercise_created_at datetime default CURRENT_TIMESTAMP not null, + exercise_deleted_at datetime null, + constraint FK_ex_member + foreign key (member_id) references members (member_id) +); + +create table member_blocks +( + member_block_id bigint auto_increment + primary key, + blocker_id char(36) not null, + blocked_id char(36) not null, + member_block_created_at datetime default CURRENT_TIMESTAMP not null, + member_block_deleted_at datetime null, + constraint FK_mb_blocked + foreign key (blocked_id) references members (member_id), + constraint FK_mb_blocker + foreign key (blocker_id) references members (member_id) +); + +create table member_locations +( + member_location_id bigint auto_increment + primary key, + member_id char(36) not null, + member_location_title varchar(255) not null comment '사용자 지정 명칭', + member_location_latitude varchar(30) not null comment '위도(18자)', + member_location_longitude varchar(30) not null comment '경도(18자)', + member_location_address varchar(255) not null comment '주소(34자)', + member_location_created_at datetime default CURRENT_TIMESTAMP not null, + member_location_deleted_at datetime null, + constraint FK_ml_member + foreign key (member_id) references members (member_id) +); + +CREATE TABLE pictures +( + picture_id bigint auto_increment primary key, + picture_name varchar(255) null, + picture_extension varchar(10) null, + picture_size int null comment '바이트 단위', + picture_url varchar(255) null, + picture_created_at datetime default CURRENT_TIMESTAMP not null, + picture_deleted_at datetime null +); + +create table exercise_pictures +( + picture_id bigint not null + primary key, + exercise_id bigint not null, + constraint FK_ep_exercises + foreign key (exercise_id) references exercises (exercise_id), + constraint FK_ep_pictures + foreign key (picture_id) references pictures (picture_id) +); + +create table member_pictures +( + picture_id bigint not null + primary key, + member_id char(36) not null, + member_pictures_name varchar(255) null, + member_pictures_size int null comment '바이트 단위', + member_pictures_url varchar(255) null, + member_pictures_created_at datetime default CURRENT_TIMESTAMP not null, + member_pictures_deleted_at datetime null, + constraint FK_mp_member + foreign key (member_id) references members (member_id), + constraint FK_mp_pictures + foreign key (picture_id) references pictures (picture_id) +); + +create table post_type +( + post_type_id bigint auto_increment + primary key, + post_type_name varchar(255) not null, + post_type_desc varchar(255) not null +); + +INSERT INTO post_type (post_type_name, post_type_desc) +VALUES ('오운완 게시판', '오늘의 운동한 모습이나 결과를 자랑하는 게시판입니다'); + +create table posts +( + post_id bigint auto_increment + primary key, + member_id char(36) not null, + post_type_id bigint not null, + post_content text not null, + post_is_reported tinyint(1) default 0 null comment '관리자 제제 시 1', + post_created_at datetime default CURRENT_TIMESTAMP not null, + post_deleted_at datetime null, + post_likes_cnt int default 0 not null, + constraint FK_posts_member + foreign key (member_id) references members (member_id), + constraint FK_posts_type + foreign key (post_type_id) references post_type (post_type_id) +); + +create table comments +( + comment_id bigint auto_increment + primary key, + member_id char(36) not null, + post_id bigint not null, + comment_content varchar(255) not null, + comment_is_reported tinyint(1) default 0 null comment '관리자 제제 시 1', + comment_created_at datetime default CURRENT_TIMESTAMP not null, + comment_deleted_at datetime null, + constraint FK_comments_member + foreign key (member_id) references members (member_id), + constraint FK_comments_post + foreign key (post_id) references posts (post_id) +); + +create table likes +( + like_id bigint auto_increment + primary key, + member_id char(36) not null, + post_id bigint not null, + like_created_at datetime default CURRENT_TIMESTAMP not null, + like_canceled_at datetime null, + constraint FK_likes_member + foreign key (member_id) references members (member_id), + constraint FK_likes_post + foreign key (post_id) references posts (post_id) +); + +create table post_pictures +( + picture_id bigint not null + primary key, + post_id bigint not null, + constraint FK_pp_pictures + foreign key (picture_id) references pictures (picture_id), + constraint FK_pp_posts + foreign key (post_id) references posts (post_id) +); + +create table preferred_exercises +( + preferred_exercise_id bigint auto_increment + primary key, + exercise_id bigint not null, + member_id char(36) not null, + preferred_exercise_created_at datetime default CURRENT_TIMESTAMP not null, + preferred_exercise_deleted_at datetime null, + preferred_exercise_skill_level varchar(30) null, + constraint check_preferred_exercise_skill_level check (preferred_exercise_skill_level in + ('BEGINNER', 'NOVICE', 'INTERMEDIATE', 'EXPERT')), + constraint FK_pe_member + foreign key (member_id) references members (member_id), + constraint FK_pe_type + foreign key (exercise_id) references exercise_types (exercise_id) +); + +create table reports +( + report_id bigint auto_increment + primary key, + report_content varchar(500) null, + report_datetime datetime default CURRENT_TIMESTAMP not null, + report_processing_status varchar(30) default 'PENDING' not null, + report_processed_at datetime null, + report_processing_content varchar(500) null, + constraint check_report_processing_status check (report_processing_status in + ('PENDING', 'PROCESSING', 'COMPLETED', 'REJECTED', 'POSTPONED')) +); + +create table comment_report_subjects +( + comment_report_subject_id bigint auto_increment not null + primary key, + comment_report_subject_name varchar(255) not null +); + +INSERT INTO comment_report_subjects (comment_report_subject_name) +VALUES ('스팸홍보/도배입니다.'), + ('음란물입니다.'), + ('불법정보를 포함하고 있습니다.'), + ('청소년에게 유해한 내용입니다.'), + ('욕설/생명경시/혐오/차별적 표현입니다.'), + ('개인정보가 노출되었습니다.'), + ('불쾌한 표현이 있습니다.'), + ('기타'); + +create table comment_reports +( + report_id bigint not null + primary key, + comment_id bigint not null, + comment_report_subject_id bigint not null, + constraint FK_comment_report_subjects_TO_comment_reports_1 + foreign key (comment_report_subject_id) references comment_report_subjects (comment_report_subject_id), + constraint FK_comments_TO_comment_reports_1 + foreign key (comment_id) references comments (comment_id), + constraint FK_reports_TO_comment_reports_1 + foreign key (report_id) references reports (report_id) +); + +create table member_report_subjects +( + member_report_subject_id bigint auto_increment not null + primary key, + member_report_subject_name varchar(255) not null +); + +INSERT INTO member_report_subjects (member_report_subject_name) +VALUES ('사용자 사진에 음란물이 있습니다.'), + ('사용자 정보에 불법정보를 포함하고 있습니다.'), + ('사용자 정보에 청소년에게 유해한 내용이 있습니다.'), + ('사용자 정보에 욕설/생명경시/혐오/차별적 표현이 있습니다.'), + ('사용자 정보에 개인정보가 노출되었습니다.'), + ('사용자 정보에 불쾌한 표현이 있습니다.'), + ('약속된 운동에 상습적으로 무단 불참하였습니다.'), + ('기타'); + +create table member_reports +( + report_id bigint not null + primary key, + member_id char(36) not null, + member_report_subject_id bigint not null, + constraint FK_member_report_subjects_TO_member_reports_1 + foreign key (member_report_subject_id) references member_report_subjects (member_report_subject_id), + constraint FK_members_TO_member_reports_1 + foreign key (member_id) references members (member_id), + constraint FK_reports_TO_member_reports_1 + foreign key (report_id) references reports (report_id) +); + +create table post_report_subjects +( + post_report_subject_id bigint auto_increment not null + primary key, + post_report_subject_name varchar(255) not null +); + +INSERT INTO post_report_subjects (post_report_subject_name) +VALUES ('스팸홍보/도배입니다.'), + ('음란물입니다.'), + ('불법정보를 포함하고 있습니다.'), + ('청소년에게 유해한 내용입니다.'), + ('욕설/생명경시/혐오/차별적 표현입니다.'), + ('개인정보가 노출되었습니다.'), + ('불쾌한 표현이 있습니다.'), + ('기타'); + +create table post_reports +( + report_id bigint not null + primary key, + post_id bigint not null, + post_report_subject_id bigint not null, + constraint FK_post_report_subjects_TO_post_reports_1 + foreign key (post_report_subject_id) references post_report_subjects (post_report_subject_id), + constraint FK_posts_TO_post_reports_1 + foreign key (post_id) references posts (post_id), + constraint FK_reports_TO_post_reports_1 + foreign key (report_id) references reports (report_id) +); \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55b..9bbc975c 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca025c83..37f853b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a93..faf93008 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + org.gradle.wrapper.GradleWrapperMain \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index db3a6ac2..9d21a218 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/com/project200/undabang/UndabangApplication.java b/src/main/java/com/project200/undabang/UndabangApplication.java new file mode 100644 index 00000000..8860d16a --- /dev/null +++ b/src/main/java/com/project200/undabang/UndabangApplication.java @@ -0,0 +1,56 @@ +package com.project200.undabang; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@SpringBootApplication +public class UndabangApplication { + + public static void main(String[] args) { + SpringApplication.run(UndabangApplication.class, args); + } + + @GetMapping("/") + public ResponseEntity> testEndpoint(@RequestHeader(value = "Authorization", required = false) String authHeader) { + if (authHeader != null && !authHeader.isBlank()) { + // 토큰이 존재할 경우 + Map response = new HashMap<>(); + response.put("message", "Authorized"); + response.put("AUTH INPUT HEADER come", "Congrats!"); + return ResponseEntity.ok(response); + } else { + // 토큰이 없을 경우 + Map response = new HashMap<>(); + response.put("error", "Unauthorized"); + response.put("AUTH INPUT Didn't come", "OOPS!"); + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response); + } + } + + @GetMapping("/open") + public ResponseEntity> testOpenEndpoint() { + Map map = new HashMap<>(); + map.put("opened", "url"); + map.put("no token", "url"); + return ResponseEntity.ok().body(map); + } + + @GetMapping("/user") + public ResponseEntity> testUserEndPoint(@RequestHeader(value = "X-USER-ID", required = false) String userId) { + // 토큰이 존재할 경우 + Map response = new HashMap<>(); + response.put("message", "Authorized"); + response.put("이 메시지는 https://www.undabang.store", "/user - id token"); + response.put("X-USER-ID : ", userId); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/project200/undabang/chat/entity/Chat.java b/src/main/java/com/project200/undabang/chat/entity/Chat.java new file mode 100644 index 00000000..1e84c277 --- /dev/null +++ b/src/main/java/com/project200/undabang/chat/entity/Chat.java @@ -0,0 +1,50 @@ +package com.project200.undabang.chat.entity; + +import com.project200.undabang.member.entity.Member; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "chats") +public class Chat { + @Id + @Column(name = "chat_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "chatroom_id", nullable = false) + private Chatroom chatroom; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "sender_id", nullable = false) + private Member sender; + + @Size(max = 500) + @NotNull + @Column(name = "chat_content", nullable = false, length = 500) + private String chatContent; + + @NotNull + @ColumnDefault("0") + @Column(name = "chat_is_read", nullable = false) + private Boolean chatIsRead = false; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "chat_sended_at", nullable = false) + private LocalDateTime chatSendedAt = LocalDateTime.now(); + + @Column(name = "chat_deleted_at") + private LocalDateTime chatDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/chat/entity/Chatroom.java b/src/main/java/com/project200/undabang/chat/entity/Chatroom.java new file mode 100644 index 00000000..63632be8 --- /dev/null +++ b/src/main/java/com/project200/undabang/chat/entity/Chatroom.java @@ -0,0 +1,39 @@ +package com.project200.undabang.chat.entity; + +import com.project200.undabang.member.entity.Member; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "chatrooms") +public class Chatroom { + @Id + @Column(name = "chatroom_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "sender_id", nullable = false) + private Member sender; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "receiver_id", nullable = false) + private Member receiver; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "chatroom_created_at", nullable = false) + private LocalDateTime chatroomCreatedAt = LocalDateTime.now(); + + @Column(name = "chatroom_deleted_at") + private LocalDateTime chatroomDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/comment/entity/Comment.java b/src/main/java/com/project200/undabang/comment/entity/Comment.java new file mode 100644 index 00000000..93cc8c7e --- /dev/null +++ b/src/main/java/com/project200/undabang/comment/entity/Comment.java @@ -0,0 +1,51 @@ +package com.project200.undabang.comment.entity; + +import com.project200.undabang.member.entity.Member; +import com.project200.undabang.post.entity.Post; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "comments") +public class Comment { + @Id + @Column(name = "comment_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @Size(max = 255) + @NotNull + @Column(name = "comment_content", nullable = false) + private String commentContent; + + @org.hibernate.annotations.Comment("관리자 제제 시 1") + @ColumnDefault("0") + @Column(name = "comment_is_reported") + private Boolean commentIsReported = false; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "comment_created_at", nullable = false) + private LocalDateTime commentCreatedAt = LocalDateTime.now(); + + @Column(name = "comment_deleted_at") + private LocalDateTime commentDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/common/entity/Picture.java b/src/main/java/com/project200/undabang/common/entity/Picture.java new file mode 100644 index 00000000..03eb074c --- /dev/null +++ b/src/main/java/com/project200/undabang/common/entity/Picture.java @@ -0,0 +1,49 @@ +package com.project200.undabang.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "pictures") +public class Picture { + @Id + @Column(name = "picture_id", nullable = false) + private Long id; + + @Size(max = 255) + @Column(name = "picture_name") + private String pictureName; + + @Size(max = 10) + @Column(name = "picture_extension", length = 10) + private String pictureExtension; + + @Comment("바이트 단위") + @Column(name = "picture_size") + private Integer pictureSize; + + @Size(max = 255) + @Column(name = "picture_url") + private String pictureUrl; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "picture_created_at", nullable = false) + private LocalDateTime pictureCreatedAt = LocalDateTime.now(); + + @Column(name = "picture_deleted_at") + private LocalDateTime pictureDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/exercise/entity/Exercise.java b/src/main/java/com/project200/undabang/exercise/entity/Exercise.java new file mode 100644 index 00000000..494618d2 --- /dev/null +++ b/src/main/java/com/project200/undabang/exercise/entity/Exercise.java @@ -0,0 +1,59 @@ +package com.project200.undabang.exercise.entity; + +import com.project200.undabang.member.entity.Member; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "exercises") +public class Exercise { + @Id + @Column(name = "exercise_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "exercise_started_at", nullable = false) + private LocalDateTime exerciseStartedAt = LocalDateTime.now(); + + @NotNull + @ColumnDefault("((`exercise_started_at` + interval 1 hour))") + @Column(name = "exercise_ended_at", nullable = false) + private LocalDateTime exerciseEndedAt = LocalDateTime.now().plusHours(1); + + @Lob + @Column(name = "exercise_detail", columnDefinition = "text") + private String exerciseDetail; + + @Size(max = 255) + @NotNull + @Column(name = "exercise_title", nullable = false) + private String exerciseTitle; + + @Size(max = 255) + @org.hibernate.annotations.Comment("시스템이 아닌 개인 등록") + @Column(name = "exercise_personal_type") + private String exercisePersonalType; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "exercise_created_at", nullable = false) + private LocalDateTime exerciseCreatedAt = LocalDateTime.now(); + + @Column(name = "exercise_deleted_at") + private LocalDateTime exerciseDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/exercise/entity/ExercisePicture.java b/src/main/java/com/project200/undabang/exercise/entity/ExercisePicture.java new file mode 100644 index 00000000..1242470d --- /dev/null +++ b/src/main/java/com/project200/undabang/exercise/entity/ExercisePicture.java @@ -0,0 +1,28 @@ +package com.project200.undabang.exercise.entity; + +import com.project200.undabang.common.entity.Picture; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "exercise_pictures") +public class ExercisePicture { + @Id + @Column(name = "picture_id", nullable = false) + private Long id; + + @MapsId + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "picture_id", nullable = false) + private Picture pictures; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "exercise_id", nullable = false) + private Exercise exercise; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/exercise/entity/ExerciseType.java b/src/main/java/com/project200/undabang/exercise/entity/ExerciseType.java new file mode 100644 index 00000000..fa9c6a9a --- /dev/null +++ b/src/main/java/com/project200/undabang/exercise/entity/ExerciseType.java @@ -0,0 +1,42 @@ +package com.project200.undabang.exercise.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "exercise_types") +public class ExerciseType { + @Id + @Column(name = "exercise_id", nullable = false) + private Long id; + + @Size(max = 50) + @NotNull + @Column(name = "exercise_name", nullable = false, length = 50) + private String exerciseName; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "exercise_type_created_at", nullable = false) + private LocalDateTime exerciseTypeCreatedAt = LocalDateTime.now(); + + @Column(name = "exercise_type_deleted_at") + private LocalDateTime exerciseTypeDeletedAt; + + @Size(max = 10) + @NotNull + @Column(name = "exercise_type_emoji", nullable = false, length = 10) + private String exerciseTypeEmoji; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/interaction/entity/Like.java b/src/main/java/com/project200/undabang/interaction/entity/Like.java new file mode 100644 index 00000000..b068adf9 --- /dev/null +++ b/src/main/java/com/project200/undabang/interaction/entity/Like.java @@ -0,0 +1,40 @@ +package com.project200.undabang.interaction.entity; + +import com.project200.undabang.member.entity.Member; +import com.project200.undabang.post.entity.Post; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "likes") +public class Like { + @Id + @Column(name = "like_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "like_created_at", nullable = false) + private LocalDateTime likeCreatedAt = LocalDateTime.now(); + + @Column(name = "like_canceled_at") + private LocalDateTime likeCanceledAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/member/entity/Member.java b/src/main/java/com/project200/undabang/member/entity/Member.java new file mode 100644 index 00000000..2e9eee2a --- /dev/null +++ b/src/main/java/com/project200/undabang/member/entity/Member.java @@ -0,0 +1,66 @@ +package com.project200.undabang.member.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.Comment; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "members") +public class Member { + @Id + @Size(max = 36) + @Column(name = "member_id", nullable = false, length = 36, columnDefinition = "char(36)") + private String memberId; + + @Size(max = 320) + @Column(name = "member_email", length = 320, unique = true) + private String memberEmail; + + @Comment("M: 남 / F: 여 / U: 비공개") + @Column(name = "member_gender") + private Character memberGender; + + @Column(name = "member_bday") + private LocalDate memberBday; + + @Size(max = 50) + @NotNull + @Column(name = "member_nickname", nullable = false, length = 50, unique = true) + private String memberNickname; + + @Size(max = 500) + @Column(name = "member_desc", length = 500) + private String memberDesc; + + @Comment("0~100, 초기값 35") + @ColumnDefault("35") + @Column(name = "member_score") + private Byte memberScore = 35; + + @NotNull + @Comment("관리자 처리 신고 누적") + @ColumnDefault("0") + @Column(name = "member_warned_count", nullable = false) + private Byte memberWarnedCount = 0; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "member_created_at", nullable = false) + private LocalDateTime memberCreatedAt = LocalDateTime.now(); + + @Comment("탈퇴 시 삭제 일시 기록") + @Column(name = "member_deleted_at") + private LocalDateTime memberDeletedAt; +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/member/entity/MemberBlock.java b/src/main/java/com/project200/undabang/member/entity/MemberBlock.java new file mode 100644 index 00000000..a485e8ae --- /dev/null +++ b/src/main/java/com/project200/undabang/member/entity/MemberBlock.java @@ -0,0 +1,38 @@ +package com.project200.undabang.member.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "member_blocks") +public class MemberBlock { + @Id + @Column(name = "member_block_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "blocker_id", nullable = false) + private Member blocker; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "blocked_id", nullable = false) + private Member blocked; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "member_block_created_at", nullable = false) + private LocalDateTime memberBlockCreatedAt = LocalDateTime.now(); + + @Column(name = "member_block_deleted_at") + private LocalDateTime memberBlockDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/member/entity/MemberLocation.java b/src/main/java/com/project200/undabang/member/entity/MemberLocation.java new file mode 100644 index 00000000..b0efcd8b --- /dev/null +++ b/src/main/java/com/project200/undabang/member/entity/MemberLocation.java @@ -0,0 +1,58 @@ +package com.project200.undabang.member.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "member_locations") +public class MemberLocation { + @Id + @Column(name = "member_location_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @Size(max = 255) + @NotNull + @org.hibernate.annotations.Comment("사용자 지정 명칭") + @Column(name = "member_location_title", nullable = false) + private String memberLocationTitle; + + @Size(max = 30) + @NotNull + @org.hibernate.annotations.Comment("위도(18자)") + @Column(name = "member_location_latitude", nullable = false, length = 30) + private String memberLocationLatitude; + + @Size(max = 30) + @NotNull + @org.hibernate.annotations.Comment("경도(18자)") + @Column(name = "member_location_longitude", nullable = false, length = 30) + private String memberLocationLongitude; + + @Size(max = 255) + @NotNull + @org.hibernate.annotations.Comment("주소(34자)") + @Column(name = "member_location_address", nullable = false) + private String memberLocationAddress; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "member_location_created_at", nullable = false) + private LocalDateTime memberLocationCreatedAt = LocalDateTime.now(); + + @Column(name = "member_location_deleted_at") + private LocalDateTime memberLocationDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/member/entity/MemberPicture.java b/src/main/java/com/project200/undabang/member/entity/MemberPicture.java new file mode 100644 index 00000000..d66c6f4e --- /dev/null +++ b/src/main/java/com/project200/undabang/member/entity/MemberPicture.java @@ -0,0 +1,52 @@ +package com.project200.undabang.member.entity; + +import com.project200.undabang.common.entity.Picture; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "member_pictures") +public class MemberPicture { + @Id + @Column(name = "picture_id", nullable = false) + private Long id; + + @MapsId + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "picture_id", nullable = false) + private Picture pictures; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @Size(max = 255) + @Column(name = "member_pictures_name") + private String memberPicturesName; + + @org.hibernate.annotations.Comment("바이트 단위") + @Column(name = "member_pictures_size") + private Integer memberPicturesSize; + + @Size(max = 255) + @Column(name = "member_pictures_url") + private String memberPicturesUrl; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "member_pictures_created_at", nullable = false) + private LocalDateTime memberPicturesCreatedAt = LocalDateTime.now(); + + @Column(name = "member_pictures_deleted_at") + private LocalDateTime memberPicturesDeletedAt; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/member/entity/PreferredExercise.java b/src/main/java/com/project200/undabang/member/entity/PreferredExercise.java new file mode 100644 index 00000000..8e6ccd16 --- /dev/null +++ b/src/main/java/com/project200/undabang/member/entity/PreferredExercise.java @@ -0,0 +1,46 @@ +package com.project200.undabang.member.entity; + +import com.project200.undabang.exercise.entity.ExerciseType; +import com.project200.undabang.member.enums.ExerciseSkillLevel; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "preferred_exercises") +public class PreferredExercise { + @Id + @Column(name = "preferred_exercise_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "exercise_id", nullable = false) + private ExerciseType exercise; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "preferred_exercise_created_at", nullable = false) + private LocalDateTime preferredExerciseCreatedAt = LocalDateTime.now(); + + @Column(name = "preferred_exercise_deleted_at") + private LocalDateTime preferredExerciseDeletedAt; + + @Enumerated(EnumType.STRING) + @Column(name = "preferred_exercise_skill_level", length = 30) + @JdbcTypeCode(SqlTypes.VARCHAR) + private ExerciseSkillLevel preferredExerciseSkillLevel; +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/member/enums/ExerciseSkillLevel.java b/src/main/java/com/project200/undabang/member/enums/ExerciseSkillLevel.java new file mode 100644 index 00000000..920785a2 --- /dev/null +++ b/src/main/java/com/project200/undabang/member/enums/ExerciseSkillLevel.java @@ -0,0 +1,17 @@ +package com.project200.undabang.member.enums; + +import lombok.Getter; + +@Getter +public enum ExerciseSkillLevel { + BEGINNER("초보자"), + NOVICE("입문자"), + INTERMEDIATE("숙련자"), + EXPERT("전문가"); + + private final String description; + + ExerciseSkillLevel(String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/post/entity/Post.java b/src/main/java/com/project200/undabang/post/entity/Post.java new file mode 100644 index 00000000..ff14cbd7 --- /dev/null +++ b/src/main/java/com/project200/undabang/post/entity/Post.java @@ -0,0 +1,54 @@ +package com.project200.undabang.post.entity; + +import com.project200.undabang.member.entity.Member; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "posts") +public class Post { + @Id + @Column(name = "post_id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_type_id", nullable = false) + private PostType postType; + + @NotNull + @Lob + @Column(name = "post_content", nullable = false, columnDefinition = "text") + private String postContent; + + @org.hibernate.annotations.Comment("관리자 제제 시 1") + @ColumnDefault("0") + @Column(name = "post_is_reported") + private Boolean postIsReported = false; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "post_created_at", nullable = false) + private LocalDateTime postCreatedAt = LocalDateTime.now(); + + @Column(name = "post_deleted_at") + private LocalDateTime postDeletedAt; + + @NotNull + @ColumnDefault("0") + @Column(name = "post_likes_cnt", nullable = false) + private Integer postLikesCnt = 0; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/post/entity/PostPicture.java b/src/main/java/com/project200/undabang/post/entity/PostPicture.java new file mode 100644 index 00000000..7368ce02 --- /dev/null +++ b/src/main/java/com/project200/undabang/post/entity/PostPicture.java @@ -0,0 +1,28 @@ +package com.project200.undabang.post.entity; + +import com.project200.undabang.common.entity.Picture; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "post_pictures") +public class PostPicture { + @Id + @Column(name = "picture_id", nullable = false) + private Long id; + + @MapsId + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "picture_id", nullable = false) + private Picture pictures; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/post/entity/PostType.java b/src/main/java/com/project200/undabang/post/entity/PostType.java new file mode 100644 index 00000000..d5358de0 --- /dev/null +++ b/src/main/java/com/project200/undabang/post/entity/PostType.java @@ -0,0 +1,31 @@ +package com.project200.undabang.post.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "post_type") +public class PostType { + @Id + @Column(name = "post_type_id", nullable = false) + private Long id; + + @Size(max = 255) + @NotNull + @Column(name = "post_type_name", nullable = false) + private String postTypeName; + + @Size(max = 255) + @NotNull + @Column(name = "post_type_desc", nullable = false) + private String postTypeDesc; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/CommentReport.java b/src/main/java/com/project200/undabang/report/entity/CommentReport.java new file mode 100644 index 00000000..360b6ddf --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/CommentReport.java @@ -0,0 +1,33 @@ +package com.project200.undabang.report.entity; + +import com.project200.undabang.comment.entity.Comment; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "comment_reports") +public class CommentReport { + @Id + @Column(name = "report_id", nullable = false) + private Long id; + + @MapsId + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "report_id", nullable = false) + private Report reports; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "comment_id", nullable = false) + private Comment comment; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "comment_report_subject_id", nullable = false) + private CommentReportSubject commentReportSubject; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/CommentReportSubject.java b/src/main/java/com/project200/undabang/report/entity/CommentReportSubject.java new file mode 100644 index 00000000..d481e597 --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/CommentReportSubject.java @@ -0,0 +1,26 @@ +package com.project200.undabang.report.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "comment_report_subjects") +public class CommentReportSubject { + @Id + @Column(name = "comment_report_subject_id", nullable = false) + private Long id; + + @Size(max = 255) + @NotNull + @Column(name = "comment_report_subject_name", nullable = false) + private String commentReportSubjectName; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/MemberReport.java b/src/main/java/com/project200/undabang/report/entity/MemberReport.java new file mode 100644 index 00000000..39af7b6b --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/MemberReport.java @@ -0,0 +1,33 @@ +package com.project200.undabang.report.entity; + +import com.project200.undabang.member.entity.Member; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "member_reports") +public class MemberReport { + @Id + @Column(name = "report_id", nullable = false) + private Long id; + + @MapsId + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "report_id", nullable = false) + private Report reports; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_report_subject_id", nullable = false) + private MemberReportSubject memberReportSubject; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/MemberReportSubject.java b/src/main/java/com/project200/undabang/report/entity/MemberReportSubject.java new file mode 100644 index 00000000..fb9a846a --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/MemberReportSubject.java @@ -0,0 +1,26 @@ +package com.project200.undabang.report.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "member_report_subjects") +public class MemberReportSubject { + @Id + @Column(name = "member_report_subject_id", nullable = false) + private Long id; + + @Size(max = 255) + @NotNull + @Column(name = "member_report_subject_name", nullable = false) + private String memberReportSubjectName; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/PostReport.java b/src/main/java/com/project200/undabang/report/entity/PostReport.java new file mode 100644 index 00000000..129af001 --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/PostReport.java @@ -0,0 +1,33 @@ +package com.project200.undabang.report.entity; + +import com.project200.undabang.post.entity.Post; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "post_reports") +public class PostReport { + @Id + @Column(name = "report_id", nullable = false) + private Long id; + + @MapsId + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "report_id", nullable = false) + private Report reports; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_report_subject_id", nullable = false) + private PostReportSubject postReportSubject; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/PostReportSubject.java b/src/main/java/com/project200/undabang/report/entity/PostReportSubject.java new file mode 100644 index 00000000..b978b6f0 --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/PostReportSubject.java @@ -0,0 +1,26 @@ +package com.project200.undabang.report.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "post_report_subjects") +public class PostReportSubject { + @Id + @Column(name = "post_report_subject_id", nullable = false) + private Long id; + + @Size(max = 255) + @NotNull + @Column(name = "post_report_subject_name", nullable = false) + private String postReportSubjectName; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/entity/Report.java b/src/main/java/com/project200/undabang/report/entity/Report.java new file mode 100644 index 00000000..67190bdf --- /dev/null +++ b/src/main/java/com/project200/undabang/report/entity/Report.java @@ -0,0 +1,46 @@ +package com.project200.undabang.report.entity; + +import com.project200.undabang.report.enums.ReportProcessingStatus; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@Table(name = "reports") +public class Report { + @Id + @Column(name = "report_id", nullable = false) + private Long id; + + @Size(max = 500) + @Column(name = "report_content", length = 500) + private String reportContent; + + @NotNull + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "report_datetime", nullable = false) + private LocalDateTime reportDatetime = LocalDateTime.now(); + + @Enumerated(EnumType.STRING) + @Column(name = "report_processing_status", nullable = false, length = 30) + @JdbcTypeCode(SqlTypes.VARCHAR) + @ColumnDefault("'PENDING'") + private ReportProcessingStatus reportProcessingStatus = ReportProcessingStatus.PENDING; + + @Column(name = "report_processed_at") + private LocalDateTime reportProcessedAt; + + @Size(max = 500) + @Column(name = "report_processing_content", length = 500) + private String reportProcessingContent; + +} \ No newline at end of file diff --git a/src/main/java/com/project200/undabang/report/enums/ReportProcessingStatus.java b/src/main/java/com/project200/undabang/report/enums/ReportProcessingStatus.java new file mode 100644 index 00000000..29e0ea20 --- /dev/null +++ b/src/main/java/com/project200/undabang/report/enums/ReportProcessingStatus.java @@ -0,0 +1,18 @@ +package com.project200.undabang.report.enums; + +import lombok.Getter; + +@Getter +public enum ReportProcessingStatus { + PENDING("처리 대기"), + PROCESSING("처리 중"), + COMPLETED("처리 완료"), + REJECTED("거부됨"), + POSTPONED("보류됨"); + + private final String description; + + ReportProcessingStatus(String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/src/main/java/store/undabang/undabang/UndabangApplication.java b/src/main/java/store/undabang/undabang/UndabangApplication.java deleted file mode 100644 index c83420e5..00000000 --- a/src/main/java/store/undabang/undabang/UndabangApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package store.undabang.undabang; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class UndabangApplication { - - public static void main(String[] args) { - SpringApplication.run(UndabangApplication.class, args); - } - -} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index e69de29b..7609883a 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -0,0 +1,22 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/mydatabase + username: myuser + password: secret + driver-class-name: com.mysql.cj.jdbc.Driver + + jpa: + properties: + hibernate: + format_sql: true + use_sql_comments: true + + transaction: + default-timeout: 60s + +logging: + level: + com.project200.undabang: debug # 애플리케이션 로그 + org.hibernate.SQL: debug # SQL 쿼리 로깅 + org.hibernate.orm.jdbc.bind: trace # SQL 파라미터 바인딩 로깅 (Hibernate 6.x) + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ed9b0b8a..9cec0d93 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,4 +6,8 @@ spring: active: local jpa: - open-in-view: false \ No newline at end of file + open-in-view: false + database-platform: org.hibernate.dialect.MySQL8Dialect + hibernate: + ddl-auto: validate + diff --git a/src/test/java/store/undabang/undabang/UndabangApplicationTests.java b/src/test/java/com/project200/undabang/UndabangApplicationTests.java similarity index 84% rename from src/test/java/store/undabang/undabang/UndabangApplicationTests.java rename to src/test/java/com/project200/undabang/UndabangApplicationTests.java index e58b740d..e9f7275e 100644 --- a/src/test/java/store/undabang/undabang/UndabangApplicationTests.java +++ b/src/test/java/com/project200/undabang/UndabangApplicationTests.java @@ -1,4 +1,4 @@ -package store.undabang.undabang; +package com.project200.undabang; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index e69de29b..9d92aaf6 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -0,0 +1,36 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;DB_CLOSE_DELAY=-1 + username: sa + password: + driver-class-name: org.h2.Driver + + jpa: + defer-datasource-initialization: true + database-platform: org.hibernate.dialect.H2Dialect + hibernate: + ddl-auto: create-drop + properties: + hibernate: + format_sql: true + use_sql_comments: true + dialect: org.hibernate.dialect.H2Dialect + + h2: + console: + enabled: true + path: /h2-console + +# sql: +# init: +# mode: always +# data-locations: classpath:test-data.sql # 테스트 용 데이터 추가 필요할 때 사용 + + transaction: + default-timeout: 30s + +logging: + level: + com.project200.undabang: debug + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace \ No newline at end of file diff --git a/src/test/resources/test-data.sql b/src/test/resources/test-data.sql new file mode 100644 index 00000000..e69de29b