{"id":20716320,"url":"https://github.com/norinus/reactboard","last_synced_at":"2026-05-06T09:34:24.647Z","repository":{"id":262550073,"uuid":"887626514","full_name":"norinus/reactboard","owner":"norinus","description":"스프링 부트 JPA, QueryDSL, Liquibase. MapStruct 리엑트 백엔드 예제 프로젝트","archived":false,"fork":false,"pushed_at":"2024-11-13T02:12:50.000Z","size":72,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-17T22:11:36.361Z","etag":null,"topics":["jpa","liquibase","mapstruct","querydsl","react","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/norinus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-13T02:09:35.000Z","updated_at":"2024-11-13T02:15:04.000Z","dependencies_parsed_at":"2024-11-13T03:20:54.766Z","dependency_job_id":"f254fe5a-6eda-43a2-80fd-42f11115c355","html_url":"https://github.com/norinus/reactboard","commit_stats":null,"previous_names":["norinus/reactboard"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norinus%2Freactboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norinus%2Freactboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norinus%2Freactboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norinus%2Freactboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/norinus","download_url":"https://codeload.github.com/norinus/reactboard/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242989250,"owners_count":20217749,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jpa","liquibase","mapstruct","querydsl","react","springboot"],"created_at":"2024-11-17T03:05:28.518Z","updated_at":"2026-05-06T09:34:24.618Z","avatar_url":"https://github.com/norinus.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 스프링 부트  JPA, QueryDSL, Liquibase. MapStruct 리엑트 백엔드 예제 프로젝트\n\n이 프로젝트는 스프링 부트  JPA, QueryDSL, Liquibase. MapStruct 기반 프로젝트입니다. \n\n## 프로젝트 개요\n\n1. **JPA** - 데이터베이스 엑서스를 JPA 리포지토리를 이용 CRUD 작성\n\n2. **QueryDSL** - 데이터베이스 엑서스를 QueryDSL 의존성을 이용 CRUD 작성\n\n3. **Liquibase** - Database 버전 관리 모듈 \n\n4. **MapStruct** - 엔티티 DTO간 변환 작업을 위해 사용\n   \n   \n  \n# MySQL 데이터베이스 및 사용자 설정 가이드\n\n이 가이드는 MySQL 데이터베이스와 사용자 계정을 특정 권한으로 생성하는 방법에 대한 단계별 설명을 제공합니다.\n\n## 사전 준비 사항\n- MySQL이 시스템에 설치되어 있고 MySQL 서버가 실행 중인지 확인하세요.\n- 데이터베이스와 사용자 계정을 생성하기 위해 루트 사용자 비밀번호가 필요합니다.\n\n## 데이터베이스 및 사용자 생성 단계\n\n### 1단계: MySQL에 로그인\n루트 사용자로 MySQL에 로그인하려면 터미널에서 다음 명령어를 실행하세요:\n\n```bash\nmysql -u root -p\n```\n\n루트 사용자 비밀번호를 입력하라는 메시지가 나타납니다.\n\n### 2단계: 데이터베이스 생성\n로그인한 후 새로운 데이터베이스를 생성합니다. 여기서는 `klaatus`라는 이름의 데이터베이스를 예제로 사용하겠습니다.\n\n```sql\nCREATE DATABASE lab;\n```\n\n### 3단계: 사용자 생성 및 권한 부여\n이제 새로운 MySQL 사용자를 생성하고, 방금 생성한 데이터베이스에 대한 권한을 부여합니다. `klaatus`와 `1234`를 원하는 사용자 이름과 비밀번호로 대체하여 사용하세요.\n\n```sql\nCREATE USER 'klaatus'@'localhost' IDENTIFIED BY '1234';\nGRANT ALL PRIVILEGES ON lab.* TO 'klaatus'@'localhost';\nFLUSH PRIVILEGES;\n```\n\n이 명령어는 `klaatus`라는 사용자를 생성하고 `lab` 데이터베이스에 대한 모든 권한을 부여합니다.\n\n### 4단계: MySQL에서 로그아웃\n모든 작업이 완료되면 다음 명령어로 MySQL에서 로그아웃할 수 있습니다:\n\n```sql\nEXIT;\n```\n\n### 추가 참고 사항\n- 사용자 및 데이터베이스 이름은 고유해야 하므로 필요에 따라 수정하세요.\n- 생성한 사용자로 데이터베이스에 접속하려면 다음 명령어를 사용하세요:\n\n```bash\nmysql -u klaatus -p\n```\n\n비밀번호 입력 시 `1234`를 입력하여 로그인합니다.\n\n## 문제 해결\n- 문제가 발생할 경우 MySQL이 실행 중인지, 사용자가 데이터베이스와 사용자 생성을 위한 권한을 가지고 있는지 확인하세요.\n- 사용자가 모든 호스트에서 접근할 수 있도록 하려면 `localhost`를 `%`로 변경할 수 있지만, 보안 위험이 있을 수 있습니다.\n\n---\n\n이 단계들을 완료하면 MySQL 데이터베이스와 사용자가 성공적으로 설정됩니다!\n\n\n# 게시판 애플리케이션\n\n이 프로젝트는 Spring Boot 기반의 게시판 애플리케이션으로, MySQL 데이터베이스와 Liquibase를 사용하여 데이터베이스 마이그레이션을 관리합니다.\n\n## 설정 파일 (`application.yml`)\n\n아래는 애플리케이션 설정 파일인 `application.yml`의 주요 설정에 대한 설명입니다.\n\n```yaml\nspring:\n  application:\n    name: board  # 애플리케이션 이름 설정\n\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 데이터베이스 드라이버 설정\n    url: jdbc:mysql://localhost:3306/lab?useSSL=false\u0026serverTimezone=Asia/Seoul\u0026characterEncoding=UTF-8\n    # 데이터베이스 URL 설정\n    # - useSSL=false: SSL 연결 비활성화\n    # - serverTimezone=Asia/Seoul: 서버 시간대를 'Asia/Seoul'로 설정\n    # - characterEncoding=UTF-8: UTF-8 인코딩 사용\n    username: klaatus  # 데이터베이스 사용자 이름\n    password: 1234  # 데이터베이스 비밀번호\n\n  jpa:\n    open-in-view: true  # 웹 환경에서 지연 로딩 문제 해결을 위해 뷰 레이어까지 영속성 컨텍스트 열어둠\n    hibernate:\n      ddl-auto: none  # 스키마 자동 생성 비활성화 (Liquibase로 스키마 관리)\n    show-sql: true  # Hibernate가 실행하는 SQL 쿼리를 로그로 출력\n    properties:\n      hibernate.format_sql: true  # SQL 쿼리를 가독성 있게 포맷하여 출력\n      dialect: org.hibernate.dialect.MySQL8InnoDBDialect  # MySQL8 InnoDB용 Hibernate 다이얼렉트 설정\n\n  liquibase:\n    change-log: classpath:/db/changelog/db.changelog-master.xml  # Liquibase 체인지 로그 파일 경로\n    enabled: true  # Liquibase를 활성화하여 데이터베이스 마이그레이션 수행\n\nlogging:\n  level:\n    root: INFO  # 기본 로깅 레벨을 INFO로 설정\n    org.springframework.web: DEBUG  # Spring Web 모듈에 대한 디버그 레벨 로깅 활성화\n```\n\n# Spring Boot 프로젝트 빌드 설정\n\n이 문서는 `build.gradle` 파일의 설정에 대한 설명입니다. 이 설정 파일은 Spring Boot 애플리케이션에 필요한 의존성 및 플러그인들을 포함하고 있으며, Lombok, MapStruct, QueryDSL, Liquibase 등을 활용하여 개발 환경을 구성합니다.\n\n## build.gradle 파일\n\n### 플러그인 설정\n\n```gradle\nplugins {\n    id 'java'  // Java 플러그인 추가\n    id 'org.springframework.boot' version '3.3.5'  // Spring Boot 플러그인 추가\n    id 'io.spring.dependency-management' version '1.1.6'  // Spring 의존성 관리 플러그인\n}\n```\n\n### 프로젝트 정보\n\n```gradle\ngroup = 'com.lab'  // 프로젝트 그룹 설정\nversion = '0.0.1-SNAPSHOT'  // 버전 설정\n```\n\n### 자바 버전 설정\n\n```gradle\njava {\n    toolchain {\n        languageVersion = JavaLanguageVersion.of(17)  // 자바 17 버전 사용\n    }\n}\n```\n\n- **Java 17**: 프로젝트에서 Java 17을 사용하도록 설정합니다.\n\n### 컴파일 전용 설정\n\n```gradle\nconfigurations {\n    compileOnly {\n        extendsFrom annotationProcessor  // Lombok과 같은 애노테이션 프로세서를 포함하는 설정 확장\n    }\n}\n```\n\n- **compileOnly**: 컴파일 시에만 필요한 의존성을 설정합니다. Lombok과 같은 애노테이션 프로세서를 포함합니다.\n\n### 저장소 설정\n\n```gradle\nrepositories {\n    mavenCentral()  // Maven Central 저장소 사용\n}\n```\n\n- **mavenCentral**: 프로젝트에서 필요한 라이브러리를 Maven Central에서 다운로드합니다.\n\n### 의존성 설정\n\n```gradle\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'  // JPA Starter\n    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'  // Thymeleaf Starter\n    implementation 'org.springframework.boot:spring-boot-starter-web'  // Web Starter\n    compileOnly 'org.projectlombok:lombok'  // Lombok (컴파일 전용)\n    developmentOnly 'org.springframework.boot:spring-boot-devtools'  // 개발 도구\n    runtimeOnly 'com.mysql:mysql-connector-j'  // MySQL 커넥터\n    annotationProcessor 'org.projectlombok:lombok'  // Lombok 애노테이션 프로세서\n    testImplementation 'org.springframework.boot:spring-boot-starter-test'  // 테스트 라이브러리\n    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'  // JUnit 플랫폼 런처\n    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'  // OpenAPI 문서화\n\n    implementation 'org.mapstruct:mapstruct:1.5.5.Final'  // MapStruct 라이브러리\n    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'  // MapStruct 애노테이션 프로세서\n    annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'  // Lombok과 MapStruct 바인딩\n\n    implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.0'  // Jackson JSON 라이브러리\n\n    implementation 'org.liquibase:liquibase-core:4.30.0'  // Liquibase 마이그레이션 라이브러리\n\n    implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'  // QueryDSL JPA 지원\n    annotationProcessor \"com.querydsl:querydsl-apt:5.1.0:jakarta\"  // QueryDSL APT\n    annotationProcessor \"jakarta.annotation:jakarta.annotation-api\"  // Jakarta 애노테이션\n    annotationProcessor \"jakarta.persistence:jakarta.persistence-api\"  // Jakarta Persistence 애노테이션\n\n    testCompileOnly 'org.projectlombok:lombok'  // 테스트 시 Lombok 컴파일 전용\n    testAnnotationProcessor 'org.projectlombok:lombok'  // Lombok 애노테이션 프로세서 (테스트용)\n}\n\n\n```\n### QueryDSL 생성 소스 디렉토리 설정\n\n```gradle\ndef generatedDir = file(\"build/generated/sources/annotationProcessor/java/main\")\n```\n\n- **generatedDir**: QueryDSL 애노테이션 프로세서가 생성한 소스 파일을 저장할 디렉토리입니다. `build/generated/sources/annotationProcessor/java/main` 경로를 사용하여 설정됩니다.\n\n### 소스 세트에 생성 디렉토리 추가\n\n```gradle\nsourceSets {\n    main.java.srcDirs += [ generatedDir ]\n}\n```\n\n- **sourceSets**: `main` 소스 세트에 `generatedDir` 디렉토리를 추가하여 QueryDSL에서 생성된 소스 파일을 컴파일 경로에 포함시킵니다.\n\n### 컴파일 시 생성 소스 출력 디렉토리 설정\n\n```gradle\ncompileJava {\n    options.getGeneratedSourceOutputDirectory().set(generatedDir)\n}\n```\n\n- **compileJava**: 자바 컴파일 태스크 설정으로, 애노테이션 프로세서가 생성한 소스 파일을 `generatedDir` 디렉토리에 저장하도록 지정합니다.\n\n### 애노테이션 프로세서 경로 설정\n\n```gradle\ntasks.withType(JavaCompile).configureEach {\n    options.annotationProcessorPath = configurations.annotationProcessor\n}\n```\n\n- **annotationProcessorPath**: 모든 Java 컴파일 작업에 대해 애노테이션 프로세서 경로를 설정하여, 필요한 애노테이션 프로세서를 로드할 수 있도록 구성합니다.\n\n### 클린업 설정\n\n```gradle\nclean.doLast {\n    file(generatedDir).deleteDir()\n}\n```\n\n- **clean.doLast**: `clean` 태스크가 완료된 후 `generatedDir` 디렉토리를 삭제하여, 이전 빌드에서 생성된 파일들을 정리합니다.\n\n### 추가 클린 디렉토리 설정\n\n```gradle\nclean {\n    delete file('src/main/generated')\n}\n```\n\n- **clean**: `src/main/generated` 디렉토리를 삭제하여 불필요한 생성 파일들을 정리합니다.\n\n### JUnit 플랫폼 설정\n\n```gradle\ntasks.named('test') {\n    useJUnitPlatform()\n}\n```\n\n- **JUnit Platform 사용**: `test` 태스크가 JUnit 플랫폼을 사용하도록 설정하여 최신 JUnit 5 기능을 사용할 수 있게 합니다.\n\n## 요약\n\n이 설정을 통해 QueryDSL에서 생성된 소스 파일이 `build/generated/sources/annotationProcessor/java/main` 디렉토리에 저장되며, 이 디렉토리가 소스 세트에 포함됩니다. `clean` 태스크에서 불필요한 파일들을 정리하며, JUnit 5 플랫폼을 테스트에 사용하여 테스트 기능을 확장합니다.\n\n각 의존성 설명:\n- **Spring Boot Starters**: `spring-boot-starter-data-jpa`, `spring-boot-starter-thymeleaf`, `spring-boot-starter-web`을 포함하여 JPA, Thymeleaf 템플릿 엔진, 웹 MVC를 지원합니다.\n- **Lombok**: 코드를 줄여주는 라이브러리로, 컴파일 시점에 애노테이션 프로세서가 코드 생성을 돕습니다.\n- **DevTools**: 개발용 도구로, 애플리케이션 자동 재시작을 지원합니다.\n- **MySQL Connector**: MySQL 데이터베이스와 연결하기 위한 드라이버입니다.\n- **SpringDoc OpenAPI**: OpenAPI 문서를 생성하고 웹 UI로 제공하는 라이브러리입니다.\n- **MapStruct**: DTO와 엔티티 간 매핑을 위한 라이브러리입니다.\n- **Jackson Databind**: JSON 직렬화와 역직렬화를 위한 라이브러리입니다.\n- **Liquibase**: 데이터베이스 마이그레이션 관리\n\n\n# QueryDSL 설정\n\n이 문서는 QueryDSL을 사용하기 위한 `QuerydslConfig` 클래스 설정에 대한 설명입니다. 이 설정은 Spring Boot 환경에서 QueryDSL을 사용하는 데 필요한 `JPAQueryFactory` 빈을 제공합니다.\n\n## QuerydslConfig 클래스 설명\n\n`QuerydslConfig` 클래스는 QueryDSL을 사용하기 위한 설정 클래스로, Spring Boot 애플리케이션에서 QueryDSL의 `JPAQueryFactory`를 빈으로 등록하여 의존성 주입을 통해 사용할 수 있도록 합니다.\n\n### 코드 예제\n\n```java\n@Configuration\npublic class QuerydslConfig {\n\n    @PersistenceContext\n    EntityManager entityManager;\n\n    @Bean\n    public JPAQueryFactory jpaQueryFactory() {\n        return new JPAQueryFactory(entityManager);\n    }\n}\n```\n\n### 구성 요소 설명\n\n- **@Configuration**: 이 클래스가 Spring의 설정 클래스임을 나타내며, 애플리케이션에서 사용할 빈을 정의합니다.\n  \n- **EntityManager**: JPA에서 데이터베이스와 상호 작용하기 위한 핵심 인터페이스로, `@PersistenceContext` 애노테이션을 통해 주입됩니다.\n\n- **JPAQueryFactory 빈**: `JPAQueryFactory`는 QueryDSL에서 쿼리를 생성하는데 사용되며, `EntityManager`를 인수로 받아 인스턴스를 생성합니다. 이 빈을 사용하여 QueryDSL 기반의 쿼리를 작성할 수 있습니다.\n\n### 사용법\n\n- 이 설정 클래스를 추가하면 `JPAQueryFactory`를 다른 서비스나 레포지토리 클래스에서 의존성 주입을 통해 사용할 수 있습니다.\n- QueryDSL을 사용하여 복잡한 쿼리를 간편하게 작성하고, Spring Data JPA와 함께 사용할 수 있습니다.\n\n## 필요 조건\n\n- **QueryDSL** 라이브러리가 `build.gradle` 파일에 포함되어 있어야 합니다.\n- Spring Data JPA가 프로젝트에 설정되어 있어야 합니다.\n\n이 설정 클래스를 통해 QueryDSL 쿼리를 손쉽게 작성하고 관리할 수 있습니다.\n\n\n## WebConfig 추가\n\n```java\n\n@Configuration\npublic class WebConfig implements WebMvcConfigurer {\n\n    /**\n     * CORS 허용 출처 설정:\n     *\n     * origins 속성에 { \"http://localhost:8080\", \"http://localhost:3000\" } 두 개의 출처를 지정함으로써,\n     * 이 서버는 http://localhost:8080과 http://localhost:3000에서 오는 요청을 허용하게 됩니다.\n     * 보통 백엔드(Spring 애플리케이션)와 프론트엔드(React나 Vue 등)가 다른 포트에서 개발 서버로 실행될 때 필요합니다.\n     * 예를 들어, Spring Boot 백엔드는 8080 포트, React 개발 서버는 3000 포트에서 각각 실행되는 상황입니다.\n     * 그리고 허용 메소드 정의로 허용된 메소드만 접근 하도록 함\n     *\n     * 안전한 리소스 공유:\n     * CORS 설정을 통해 지정된 출처에서만 리소스에 접근할 수 있게 함으로써, 불필요한 외부 접근을 차단하고 보안을 강화할 수 있습니다.\n     */\n    @Override\n    public void addCorsMappings(CorsRegistry registry) {\n        registry.addMapping(\"/**\") // 모든 경로에 대해 CORS 허용\n                .allowedOrigins(\"http://localhost:8080\", \"http://localhost:3000\") // 허용할 출처\n                .allowedMethods(\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\") // 허용할 HTTP 메서드\n                .allowedHeaders(\"*\") // 허용할 헤더\n                .allowCredentials(true); // 인증 정보 허용\n    }\n}\n- 리엑트에서 접근하는 3000 출처 허용\n-  허용 메소드 정의로 허용된 메소드만 접근 하도록 함\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorinus%2Freactboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnorinus%2Freactboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorinus%2Freactboard/lists"}