Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
##QueryDSL
generated

HELP.md
.gradle
/build/
Expand Down
73 changes: 65 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,27 +1,84 @@
plugins {
id 'org.springframework.boot' version '2.1.3.RELEASE'
id 'java'
buildscript {
ext {
springBootVersion = '2.1.3.RELEASE'
querydslPluginVersion = '1.0.10'
}
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" } // plugin 저장소
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
}
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'org.dailystudio'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'


repositories {
mavenCentral()
}


configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}


dependencies {

compile("com.querydsl:querydsl-jpa") // querydsl
compile("com.querydsl:querydsl-apt") // querydsl

runtimeOnly('com.h2database:h2')//h2
compile("org.springframework.boot:spring-boot-devtools")

runtimeOnly 'mysql:mysql-connector-java'//mysql
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'//jpa

implementation('io.springfox:springfox-swagger2:+')//swagger
implementation('io.springfox:springfox-swagger-ui:+')

compile "org.projectlombok:lombok:+"//lombok
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

testCompile('org.assertj:assertj-core:3.9.0')//test용
}

// querydsl 적용
apply plugin: "com.ewerk.gradle.plugins.querydsl" // Plugin 적용
def querydslSrcDir = 'src/main/generated' //QClass 생성 위치

querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslSourcesDir = querydslSrcDir
}

sourceSets {
main {
java {
srcDirs 'src/main/java', querydslSrcDir
}
}
}

//JPA Annotation Processor Error를 잡아준다.
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}

configurations {
querydsl.extendsFrom compileClasspath
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
@SpringBootApplication
public class SpringbootstudyApplication {

public static void main(String[] args) {
SpringApplication.run(SpringbootstudyApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(SpringbootstudyApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.dailystudio.springbootstudy.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Configuration
public class QueryDSLConfig {

@PersistenceContext
private EntityManager entityManager;

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.dailystudio.springbootstudy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any()) // 현재 RequestMapping으로 할당된 모든 URL 리스트를 추출
.paths(PathSelectors.ant("/api/**")) // 그중 /api/** 인 URL들만 필터링
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.dailystudio.springbootstudy.controller;

import lombok.RequiredArgsConstructor;
import org.dailystudio.springbootstudy.repository.StoreRepository;
import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("api/test")
public class StoreController {

private final StoreRepository storeRepository;
private final StoreRepositorySupport storeRepositorySupport;

}
23 changes: 23 additions & 0 deletions src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.dailystudio.springbootstudy.domain;

import lombok.Getter;

import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "clerk")
@Getter
public class Clerk {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "clerk_id")
private Long id;

@NotNull
private String name;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "store_id")
private Store store;
}
36 changes: 36 additions & 0 deletions src/main/java/org/dailystudio/springbootstudy/domain/Store.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.dailystudio.springbootstudy.domain;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "store")
@Getter
@NoArgsConstructor
public class Store {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "store_id")
private Long id;

@NotNull
private String name;

@NotNull
private String phone;

@OneToMany(mappedBy = "store")
private List<Clerk> clerks = new ArrayList<>();

@Builder
public Store(String name, String phone){
this.name=name;
this.phone=phone;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.dailystudio.springbootstudy.dto;

import lombok.Getter;
import org.dailystudio.springbootstudy.domain.Clerk;

@Getter
public class ClerkNameDto {

private String name;

public ClerkNameDto(Clerk clerk){
this.name = clerk.getName();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.dailystudio.springbootstudy.repository;

import org.dailystudio.springbootstudy.domain.Clerk;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ClerkRespository extends JpaRepository<Clerk,Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.dailystudio.springbootstudy.repository;

import org.dailystudio.springbootstudy.domain.Store;
import org.springframework.data.jpa.repository.JpaRepository;

public interface StoreRepository extends JpaRepository<Store,Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.dailystudio.springbootstudy.repository.querydsl;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.dailystudio.springbootstudy.domain.QClerk;
import org.dailystudio.springbootstudy.domain.QStore;
import org.dailystudio.springbootstudy.domain.Store;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import org.springframework.stereotype.Repository;

import java.util.List;

import static org.dailystudio.springbootstudy.domain.QStore.store;

@Repository
public class StoreRepositorySupport extends QuerydslRepositorySupport {

private final JPAQueryFactory jpaQueryFactory;

public StoreRepositorySupport(JPAQueryFactory jpaQueryFactory){
super(Store.class);
this.jpaQueryFactory=jpaQueryFactory;
}

public List<Store> findByName(String name){
return jpaQueryFactory
.selectFrom(store)
.where(store.name.eq(name))
.fetch();
}

public List<Store> findAllEager(){
QStore store = QStore.store;
QClerk clerk = QClerk.clerk;

return from(store)
.leftJoin(store.clerks,clerk).fetchJoin()
.distinct()
.fetch();
}
}
7 changes: 7 additions & 0 deletions src/main/resources/application-local.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:~/ds;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=create

spring.jpa.hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
14 changes: 14 additions & 0 deletions src/main/resources/application-prod.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## �����ͺ��̽� ������ ���� �⺻ ����
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=saul2449


## �����ͺ��̽� ��Ű�� �ּ�
## jdbc:mysql://�ּ�/��Ű���̸�?����
spring.datasource.url=jdbc:mysql://localhost/ds?useSSL=false&serverTimezone=UTC


##MYSQL �����
spring.jpa.database=mysql
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
10 changes: 10 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1,11 @@
## ����� properties�� �����մϴ�.
spring.profiles.active=local

# Database
spring.jpa.show-sql=true
#spring.jpa.properties.hibernate.format_sql=true


# Log
#logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type=debug
Loading