From 15088ebb4e95b7c4c37ebb4cabbe83d8f772bae1 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Tue, 26 Mar 2019 01:28:20 +0900 Subject: [PATCH 01/28] =?UTF-8?q?1=EC=A3=BC=EC=B0=A8=20=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=EB=94=94=20=EB=82=B4=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 환경설정 2. 기본적인 Spring RestFul 구조 학습 3. 스프링 빈 기초 학습 4. 어노테이션 학습 --- build.gradle | 6 ++- .../SpringbootstudyApplication.java | 6 +-- .../controller/TestController.java | 51 +++++++++++++++++++ .../controller/UserController.java | 49 ++++++++++++++++++ .../springbootstudy/dto/UserReqDto.java | 9 ++++ .../springbootstudy/dto/UserResDto.java | 13 +++++ .../springbootstudy/service/UserService.java | 15 ++++++ .../SpringbootstudyApplicationTests.java | 6 +-- 8 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/TestController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/UserController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/service/UserService.java diff --git a/build.gradle b/build.gradle index 3f2652e..dc1bc18 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,8 @@ plugins { id 'java' } +apply plugin: 'java' +apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'org.dailystudio' @@ -21,7 +23,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok:+' + annotationProcessor 'org.projectlombok:lombok:+' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java index 574a96e..44a039e 100644 --- a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java +++ b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java @@ -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); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java new file mode 100644 index 0000000..e88c41d --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java @@ -0,0 +1,51 @@ +package org.dailystudio.springbootstudy.controller; + +import org.dailystudio.springbootstudy.dto.UserReqDto; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("api/test") +public class TestController { + + @GetMapping + public String test() { + String str = "hello world"; + return str; + } + + @GetMapping("/get") + public String me() { + return "me"; + } + + @GetMapping("/path/{parameter}") + public String parameter(@PathVariable("parameter") String output) { + return output; + } + + @PostMapping("/post") + public String postTest0() { + return "post"; + } + + @PostMapping("/post/{name}") + public String postTest1(@PathVariable("name") String output) { + return output; + } + + @PostMapping("/post/instance/user") + public String postTest2(@RequestBody UserReqDto user) { + String output = user.getName() + user.getNumber(); + return output; + } + + @DeleteMapping("/delete") + public String deleteTest() { + return "delete"; + } + + @PutMapping + public String putTest() { + return "put"; + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java new file mode 100644 index 0000000..59069b7 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java @@ -0,0 +1,49 @@ +package org.dailystudio.springbootstudy.controller; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.dto.UserReqDto; +import org.dailystudio.springbootstudy.dto.UserResDto; +import org.dailystudio.springbootstudy.service.UserService; +import org.springframework.http.ResponseEntity; +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; + +/* +RestFul한 API란 무엇인가? +하나의 URI는 반드시 그에 상응하는 데이터를 나타내는 구조이다. + +예를 들어 +/api/user/1/name 로 접근하는 경우 +'1번' '유저'의 '이름' 대한 데이터를 나타낸다. + +@RestController = @Controller + @ResponseBody 이다. +기존에 @Controller를 사용했을 때는 뷰를 반환하였지만 +@RestController를 사용하면 데이터만 반환하게 된다. +이러한 데이터는 JSON형태로 반환된다. + +우리는 RestFul API를 구현할 때 반환값으로 ResponseEntity를 이용할 것이다. +ResponseEntity를 이용하게 되면 +서버에서 직접 + +1. 상태코드 --> OK(200), NOT_FOUND(404)... +2. HttpHeader --> Content-type : JSON(application/json)... +3. 응답 메세지 --> 요청에 대한 응답 값 + +를 지정해서 클라이언트에게 보내줄 수 있다. + */ +@RestController +@RequestMapping("api/user") +@RequiredArgsConstructor +public class UserController { + + private final UserService userService; + + @PostMapping + public ResponseEntity getUserName(@RequestBody UserReqDto userReqDto) { + //UserReqDto userReqDto = userService.getUserInfo(userReqDto); + //return ResponseEntity.ok().body(userReqDto); + return ResponseEntity.ok().body(userService.getUserInfo(userReqDto)); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java new file mode 100644 index 0000000..1423821 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java @@ -0,0 +1,9 @@ +package org.dailystudio.springbootstudy.dto; + +import lombok.Getter; + +@Getter +public class UserReqDto { + private String name; + private Integer number; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java new file mode 100644 index 0000000..88dc11c --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java @@ -0,0 +1,13 @@ +package org.dailystudio.springbootstudy.dto; + +import lombok.Getter; + +@Getter +public class UserResDto { + private String name; + + public UserResDto(UserReqDto userReqDto) { + this.name = userReqDto.getName(); + } + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java new file mode 100644 index 0000000..35544a9 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -0,0 +1,15 @@ +package org.dailystudio.springbootstudy.service; + +import org.dailystudio.springbootstudy.dto.UserReqDto; +import org.dailystudio.springbootstudy.dto.UserResDto; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + public UserResDto getUserInfo(UserReqDto userReqDto) { + UserResDto userResDto = new UserResDto(userReqDto); + return userResDto; + } + +} diff --git a/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java b/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java index 1cbed09..71a1031 100644 --- a/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java +++ b/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java @@ -9,8 +9,8 @@ @SpringBootTest public class SpringbootstudyApplicationTests { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } From d3821172d74b10e91d55719280d4237cfdb3db80 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Thu, 28 Mar 2019 17:21:36 +0900 Subject: [PATCH 02/28] =?UTF-8?q?requestParam=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootstudy/controller/TestController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java index e88c41d..ac93731 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java @@ -19,10 +19,15 @@ public String me() { } @GetMapping("/path/{parameter}") - public String parameter(@PathVariable("parameter") String output) { + public String pathVariable(@PathVariable("parameter") String output) { return output; } + @GetMapping("/path") + public String parameter(@RequestParam("no") String number) { + return "번호는" + number; + } + @PostMapping("/post") public String postTest0() { return "post"; From b0a8494b68917f05331b8d7de7c7830d1cfc2edb Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 29 Mar 2019 14:40:20 +0900 Subject: [PATCH 03/28] =?UTF-8?q?Swagger=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Swagger 의존성추가 2. Swagger 어노테이션 예제 코드 추가 --- build.gradle | 6 +- .../springbootstudy/config/SwaggerConfig.java | 24 ++++++ .../controller/TestController.java | 56 ------------- .../controller/UserController.java | 79 +++++++++++-------- .../springbootstudy/domain/User.java | 13 +++ .../springbootstudy/dto/UserReqDto.java | 9 --- .../springbootstudy/dto/UserResDto.java | 13 --- .../dto/user/UserInfoResDto.java | 6 ++ .../dto/user/UserSaveReqDto.java | 19 +++++ .../springbootstudy/service/UserService.java | 51 ++++++++++-- 10 files changed, 158 insertions(+), 118 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/TestController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/User.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java diff --git a/build.gradle b/build.gradle index dc1bc18..9564827 100644 --- a/build.gradle +++ b/build.gradle @@ -22,8 +22,10 @@ repositories { } dependencies { + implementation('io.springfox:springfox-swagger2:+') + implementation('io.springfox:springfox-swagger-ui:+') + + compile "org.projectlombok: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' } diff --git a/src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java b/src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java new file mode 100644 index 0000000..aae4943 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java @@ -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(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java deleted file mode 100644 index ac93731..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TestController.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.dailystudio.springbootstudy.controller; - -import org.dailystudio.springbootstudy.dto.UserReqDto; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("api/test") -public class TestController { - - @GetMapping - public String test() { - String str = "hello world"; - return str; - } - - @GetMapping("/get") - public String me() { - return "me"; - } - - @GetMapping("/path/{parameter}") - public String pathVariable(@PathVariable("parameter") String output) { - return output; - } - - @GetMapping("/path") - public String parameter(@RequestParam("no") String number) { - return "번호는" + number; - } - - @PostMapping("/post") - public String postTest0() { - return "post"; - } - - @PostMapping("/post/{name}") - public String postTest1(@PathVariable("name") String output) { - return output; - } - - @PostMapping("/post/instance/user") - public String postTest2(@RequestBody UserReqDto user) { - String output = user.getName() + user.getNumber(); - return output; - } - - @DeleteMapping("/delete") - public String deleteTest() { - return "delete"; - } - - @PutMapping - public String putTest() { - return "put"; - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java index 59069b7..f5b5f9d 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java @@ -1,38 +1,23 @@ package org.dailystudio.springbootstudy.controller; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.dto.UserReqDto; -import org.dailystudio.springbootstudy.dto.UserResDto; +import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; +import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; import org.dailystudio.springbootstudy.service.UserService; import org.springframework.http.ResponseEntity; -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; +import org.springframework.web.bind.annotation.*; -/* -RestFul한 API란 무엇인가? -하나의 URI는 반드시 그에 상응하는 데이터를 나타내는 구조이다. - -예를 들어 -/api/user/1/name 로 접근하는 경우 -'1번' '유저'의 '이름' 대한 데이터를 나타낸다. - -@RestController = @Controller + @ResponseBody 이다. -기존에 @Controller를 사용했을 때는 뷰를 반환하였지만 -@RestController를 사용하면 데이터만 반환하게 된다. -이러한 데이터는 JSON형태로 반환된다. - -우리는 RestFul API를 구현할 때 반환값으로 ResponseEntity를 이용할 것이다. -ResponseEntity를 이용하게 되면 -서버에서 직접 +import java.util.List; -1. 상태코드 --> OK(200), NOT_FOUND(404)... -2. HttpHeader --> Content-type : JSON(application/json)... -3. 응답 메세지 --> 요청에 대한 응답 값 - -를 지정해서 클라이언트에게 보내줄 수 있다. +/* + UserService의 메소드는 현재 깡통이야. + 디비와 연결을 하지 않았기 때문에 실제로 불러오는 값이 존재하지않아. + 이번 소스코드에서는 swagger의 기능들을 살펴보고 넘어가자. */ + @RestController @RequestMapping("api/user") @RequiredArgsConstructor @@ -40,10 +25,40 @@ public class UserController { private final UserService userService; - @PostMapping - public ResponseEntity getUserName(@RequestBody UserReqDto userReqDto) { - //UserReqDto userReqDto = userService.getUserInfo(userReqDto); - //return ResponseEntity.ok().body(userReqDto); - return ResponseEntity.ok().body(userService.getUserInfo(userReqDto)); + @ApiOperation(value = "유저 정보 저장하기", + notes = "유저 정보를 저장합니다.") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "유저 저장 성공"), + @ApiResponse(code = 500, message = "서버에러") + }) + @PostMapping("/save") + public ResponseEntity saveUser(@RequestBody UserSaveReqDto userSaveReqDto) { + userService.save(userSaveReqDto); + return ResponseEntity.ok().build(); + } + + @GetMapping + public ResponseEntity> getAllUser() { + List resDtos = userService.getAll(); + return ResponseEntity.ok().body(resDtos); + } + + @GetMapping("/{idx}") + public ResponseEntity getUserInfo(@PathVariable("idx") String idx) { + UserInfoResDto userInfoResDto = userService.findUserByIdx(idx); + return ResponseEntity.ok().body(userInfoResDto); + } + + @PutMapping("/{idx}") + public ResponseEntity changeUserName(@PathVariable("idx") String idx, final String name) { + userService.changeUserName(idx, name); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/{idx}") + public ResponseEntity deleteUser(@PathVariable("idx") String idx) { + userService.deleteUser(idx); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/User.java new file mode 100644 index 0000000..3ce3395 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/User.java @@ -0,0 +1,13 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; + +@Getter +public class User { + private Long userIdx; + private String email; + private String name; + private String pass; + private String phone; + private String auth; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java deleted file mode 100644 index 1423821..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/UserReqDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.dailystudio.springbootstudy.dto; - -import lombok.Getter; - -@Getter -public class UserReqDto { - private String name; - private Integer number; -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java deleted file mode 100644 index 88dc11c..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/UserResDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dailystudio.springbootstudy.dto; - -import lombok.Getter; - -@Getter -public class UserResDto { - private String name; - - public UserResDto(UserReqDto userReqDto) { - this.name = userReqDto.getName(); - } - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java new file mode 100644 index 0000000..519dfbf --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java @@ -0,0 +1,6 @@ +package org.dailystudio.springbootstudy.dto.user; + +public class UserInfoResDto { + private String email; + private String name; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java new file mode 100644 index 0000000..2a4748c --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java @@ -0,0 +1,19 @@ +package org.dailystudio.springbootstudy.dto.user; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; + +@Getter +public class UserSaveReqDto { + @ApiModelProperty(example = "example@gmail.com", position = 1) + private String email; + + @ApiModelProperty(example = "박찬인", position = 2) + private String name; + + @ApiModelProperty(example = "q1w2e3r4!", position = 3) + private String pass; + + @ApiModelProperty(example = "010-1234-1234", position = 4) + private String phone; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index 35544a9..fe2bf05 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -1,15 +1,54 @@ package org.dailystudio.springbootstudy.service; -import org.dailystudio.springbootstudy.dto.UserReqDto; -import org.dailystudio.springbootstudy.dto.UserResDto; +import org.dailystudio.springbootstudy.domain.User; +import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; +import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + @Service public class UserService { - public UserResDto getUserInfo(UserReqDto userReqDto) { - UserResDto userResDto = new UserResDto(userReqDto); - return userResDto; + + public void save(UserSaveReqDto userSaveReqDto) { + //유저 등록 작업 -> DB에 INSERT 해야 겠지? + } + + + public List getAll() { + //모든 유저 찾는 작업 -> DB에서 SELECT 해야겠지? + List users = Arrays.asList(); + //반환 시킬 객체 준비 + List userInfoResDtos = new ArrayList<>(); + //domain -> dto 변환 + + //가공된 dto 반환 + return userInfoResDtos; + } + + public UserInfoResDto findUserByIdx(String idx) { + //DB에 userIdx는 보통 정수로 저장되어있으니까 String으로 받은 idx를 Long(int보다 큰 정수형)으로 변환하자. + Long userIdx = Long.valueOf(idx); + //반환시킬 객체 준비 + UserInfoResDto userInfoResDto = null; + //디비에서 userIdx를 이용하여 User객체를 찾아온다. + + //domain -> dto 변환 + + //가공된 dto 반환 + return userInfoResDto; + } + + public void changeUserName(String idx, String name) { + Long userIdx = Long.valueOf(idx); + //유저 정보를 수정하는 과정 + } + + public void deleteUser(String idx) { + Long userIdx = Long.valueOf(idx); + //유저 정보를 제거하는 과정 } - } From ac2db839cb87a1228b122a39b75e03b82cfabb45 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 29 Mar 2019 17:12:25 +0900 Subject: [PATCH 04/28] =?UTF-8?q?JPA=20=EC=98=88=EC=A0=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. save code 2. findAll code 3. custom find code 4. modify code 5. delete code --- build.gradle | 3 ++ .../springbootstudy/domain/User.java | 38 ++++++++++++++++--- .../dto/user/UserInfoResDto.java | 9 +++++ .../dto/user/UserSaveReqDto.java | 14 +++++++ .../repository/UserRepository.java | 16 ++++++++ .../springbootstudy/service/UserService.java | 31 ++++++++++----- src/main/resources/application.properties | 28 ++++++++++++++ 7 files changed, 124 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java diff --git a/build.gradle b/build.gradle index 9564827..24e56a3 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,9 @@ repositories { } dependencies { + runtimeOnly 'mysql:mysql-connector-java' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation('io.springfox:springfox-swagger2:+') implementation('io.springfox:springfox-swagger-ui:+') diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/User.java index 3ce3395..c788bb4 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/User.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/User.java @@ -1,13 +1,41 @@ package org.dailystudio.springbootstudy.domain; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; @Getter +@NoArgsConstructor +@Entity +@Table(name = "users") public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long userIdx; - private String email; - private String name; - private String pass; - private String phone; - private String auth; + + @Column(name = "userEmail") + private String userEmail; + + @Column(name = "userName") + private String userName; + + @Column(name = "userPass") + private String userPass; + + @Column(name = "userPhone") + private String userPhone; + + @Column(name = "userAuth") + private String userAuth; + + @Builder + public User(String userEmail, String userPass, String userName, String userPhone, String userAuth) { + this.userEmail = userEmail; + this.userAuth = userAuth; + this.userName = userName; + this.userPass = userPass; + this.userPhone = userPhone; + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java index 519dfbf..8f4b248 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java @@ -1,6 +1,15 @@ package org.dailystudio.springbootstudy.dto.user; +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.User; + +@Getter public class UserInfoResDto { private String email; private String name; + + public UserInfoResDto(User user) { + this.email = user.getUserEmail(); + this.name = user.getUserName(); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java index 2a4748c..c3119dc 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java @@ -2,9 +2,12 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Getter; +import org.dailystudio.springbootstudy.domain.User; @Getter public class UserSaveReqDto { + private static final String USER_AUTH = "USER"; + @ApiModelProperty(example = "example@gmail.com", position = 1) private String email; @@ -16,4 +19,15 @@ public class UserSaveReqDto { @ApiModelProperty(example = "010-1234-1234", position = 4) private String phone; + + + public User toEntity() { + return User.builder() + .userEmail(this.email) + .userName(this.name) + .userPass(this.pass) + .userPhone(this.phone) + .userAuth(USER_AUTH) + .build(); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java new file mode 100644 index 0000000..118d387 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java @@ -0,0 +1,16 @@ +package org.dailystudio.springbootstudy.repository; + + +import org.dailystudio.springbootstudy.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface UserRepository extends JpaRepository { + User findByUserIdx(Long idx); + + @Modifying + @Query("UPDATE User u SET u.userName = :name WHERE u.userIdx = :idx") + void updateUserName(@Param("idx") Long userIdx, @Param("name") String userName); +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index fe2bf05..d0d99a3 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -1,30 +1,36 @@ package org.dailystudio.springbootstudy.service; +import lombok.RequiredArgsConstructor; import org.dailystudio.springbootstudy.domain.User; import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; +import org.dailystudio.springbootstudy.repository.UserRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; @Service +@RequiredArgsConstructor public class UserService { + private final UserRepository userRepository; public void save(UserSaveReqDto userSaveReqDto) { - //유저 등록 작업 -> DB에 INSERT 해야 겠지? + User user = userSaveReqDto.toEntity(); + userRepository.save(user); } - public List getAll() { //모든 유저 찾는 작업 -> DB에서 SELECT 해야겠지? - List users = Arrays.asList(); + List users = userRepository.findAll(); //반환 시킬 객체 준비 - List userInfoResDtos = new ArrayList<>(); + List userInfoResDtos; //domain -> dto 변환 - + userInfoResDtos = users.stream() + .map(user -> new UserInfoResDto(user)) + .collect(Collectors.toList()); //가공된 dto 반환 return userInfoResDtos; } @@ -33,22 +39,27 @@ public UserInfoResDto findUserByIdx(String idx) { //DB에 userIdx는 보통 정수로 저장되어있으니까 String으로 받은 idx를 Long(int보다 큰 정수형)으로 변환하자. Long userIdx = Long.valueOf(idx); //반환시킬 객체 준비 - UserInfoResDto userInfoResDto = null; + UserInfoResDto userInfoResDto; //디비에서 userIdx를 이용하여 User객체를 찾아온다. - + User user = userRepository.findByUserIdx(userIdx); //domain -> dto 변환 - + userInfoResDto = new UserInfoResDto(user); //가공된 dto 반환 return userInfoResDto; } + @Transactional public void changeUserName(String idx, String name) { Long userIdx = Long.valueOf(idx); //유저 정보를 수정하는 과정 + userRepository.updateUserName(userIdx, name); } + @Transactional public void deleteUser(String idx) { Long userIdx = Long.valueOf(idx); //유저 정보를 제거하는 과정 + User user = userRepository.findByUserIdx(userIdx); + userRepository.delete(user); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..d8a541b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,29 @@ +## ͺ̽ ⺻ +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 +## Ǵ SQL մϴ. +spring.jpa.show-sql = true + +## α մϴ +logging.level.org.hibernate.type = trace +logging.level.org.hibernate = info + +##ҹ ̽ ذ +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +##ī̽ ھ ̸ ϱ +## +#spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy +# +## +#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + + +#MYSQL +spring.jpa.database = mysql +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect \ No newline at end of file From 679d3f6657a792c1bc88c1cb5c052e1c5ac29bbc Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 29 Mar 2019 17:15:37 +0900 Subject: [PATCH 05/28] =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=8D=BC=ED=8B=B0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d8a541b..ba22e77 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ ## ͺ̽ ⺻ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.username=root -spring.datasource.password=saul2449 +spring.datasource.username=userName +spring.datasource.password=userPass ## ͺ̽ Ű ּ ## jdbc:mysql://ּ/Ű̸? spring.datasource.url=jdbc:mysql://localhost/ds?useSSL=false&serverTimezone=UTC From 3fde4960b167e7e47a75e4f00fb0a615351e1c9b Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 29 Mar 2019 18:41:40 +0900 Subject: [PATCH 06/28] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=8D=BC=ED=8B=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ba22e77..b654424 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,25 +5,19 @@ spring.datasource.password=userPass ## ͺ̽ Ű ּ ## jdbc:mysql://ּ/Ű̸? spring.datasource.url=jdbc:mysql://localhost/ds?useSSL=false&serverTimezone=UTC - ## Ǵ SQL մϴ. -spring.jpa.show-sql = true - +spring.jpa.show-sql=true ## α մϴ -logging.level.org.hibernate.type = trace -logging.level.org.hibernate = info - +logging.level.org.hibernate.type=trace +logging.level.org.hibernate=info ##ҹ ̽ ذ spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - ##ī̽ ھ ̸ ϱ ## #spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy # ## #spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy - - #MYSQL -spring.jpa.database = mysql +spring.jpa.database=mysql spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect \ No newline at end of file From 4c96d9975ac77f579fd1e237cc38ed7205969cf9 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 29 Mar 2019 20:14:34 +0900 Subject: [PATCH 07/28] =?UTF-8?q?=EC=98=81=EC=86=8D=EC=84=B1=EC=9D=84=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. setter를 이용한 update코드 추가 --- .../java/org/dailystudio/springbootstudy/domain/User.java | 4 ++++ .../org/dailystudio/springbootstudy/service/UserService.java | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/User.java index c788bb4..1f780d6 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/User.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/User.java @@ -38,4 +38,8 @@ public User(String userEmail, String userPass, String userName, String userPhone this.userPass = userPass; this.userPhone = userPhone; } + + public void setName(String name) { + this.userName = name; + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index d0d99a3..c39bb01 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -52,7 +52,9 @@ public UserInfoResDto findUserByIdx(String idx) { public void changeUserName(String idx, String name) { Long userIdx = Long.valueOf(idx); //유저 정보를 수정하는 과정 - userRepository.updateUserName(userIdx, name); + User user = userRepository.findByUserIdx(userIdx); +// userRepository.updateUserName(userIdx, name); + user.setName(name); } @Transactional From fec407b6e33a3d05a499ca2f7c3322992676d906 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sat, 30 Mar 2019 00:01:20 +0900 Subject: [PATCH 08/28] =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dailystudio/springbootstudy/service/UserService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index c39bb01..e21a314 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -53,8 +53,13 @@ public void changeUserName(String idx, String name) { Long userIdx = Long.valueOf(idx); //유저 정보를 수정하는 과정 User user = userRepository.findByUserIdx(userIdx); -// userRepository.updateUserName(userIdx, name); + //쿼리를 작성하는 방법 + //userRepository.updateUserName(userIdx, name); + + //Setter를 이용한 방법 user.setName(name); + + //더 나은 방법은 없을까? } @Transactional From b4a8c3710fccd7754f426aba0434cc6b4e9fc90e Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sat, 30 Mar 2019 00:02:34 +0900 Subject: [PATCH 09/28] =?UTF-8?q?transactional=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dailystudio/springbootstudy/service/UserService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index e21a314..0f3ab17 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -17,6 +17,7 @@ public class UserService { private final UserRepository userRepository; + @Transactional public void save(UserSaveReqDto userSaveReqDto) { User user = userSaveReqDto.toEntity(); userRepository.save(user); From d0ef66125b4dde36129b4d95ef0540efdd3677d9 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sat, 30 Mar 2019 03:08:09 +0900 Subject: [PATCH 10/28] =?UTF-8?q?jpa=20=EB=A7=A4=ED=95=91=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. @ManyToOne 예제 2. @OneToMany 예제 3. 순환참조 피하기 --- .../controller/TeamController.java | 27 ++++++++++++++++ .../controller/UserController.java | 5 +-- .../springbootstudy/domain/Team.java | 28 ++++++++++++++++ .../springbootstudy/domain/User.java | 17 ++++++++-- .../springbootstudy/domain/UserImg.java | 32 +++++++++++++++++++ .../dto/team/TeamInfoResDto.java | 24 ++++++++++++++ .../dto/team/TeamNameResDto.java | 13 ++++++++ .../dto/user/UserInfoResDto.java | 8 +++++ .../dto/user/UserNameReqDto.java | 8 +++++ .../dto/user/UserSimpleInfoResDto.java | 20 ++++++++++++ .../repository/TeamRepository.java | 7 ++++ .../repository/UserImgRepository.java | 7 ++++ .../repository/UserRepository.java | 7 ---- .../springbootstudy/service/TeamService.java | 25 +++++++++++++++ .../springbootstudy/service/UserService.java | 30 ++++++----------- src/main/resources/application.properties | 4 +-- 16 files changed, 229 insertions(+), 33 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Team.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/service/TeamService.java diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java new file mode 100644 index 0000000..5d14f95 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java @@ -0,0 +1,27 @@ +package org.dailystudio.springbootstudy.controller; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.dto.team.TeamInfoResDto; +import org.dailystudio.springbootstudy.service.TeamService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("api/team") +@RequiredArgsConstructor +public class TeamController { + + private final TeamService teamService; + + @GetMapping + public ResponseEntity> getAllTeam() { + + List teamInfoResDtos = teamService.getAllTeam(); + + return ResponseEntity.ok().body(teamInfoResDtos); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java index f5b5f9d..eb778da 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; +import org.dailystudio.springbootstudy.dto.user.UserNameReqDto; import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; import org.dailystudio.springbootstudy.service.UserService; import org.springframework.http.ResponseEntity; @@ -50,8 +51,8 @@ public ResponseEntity getUserInfo(@PathVariable("idx") String id } @PutMapping("/{idx}") - public ResponseEntity changeUserName(@PathVariable("idx") String idx, final String name) { - userService.changeUserName(idx, name); + public ResponseEntity changeUserName(@PathVariable("idx") String idx, @RequestBody UserNameReqDto userNameReqDto) { + userService.changeUserName(idx, userNameReqDto); return ResponseEntity.ok().build(); } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java new file mode 100644 index 0000000..2d5a76b --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java @@ -0,0 +1,28 @@ +package org.dailystudio.springbootstudy.domain; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import lombok.Getter; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "team") +@Getter +public class Team { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "teamIdx") + private Long teamIdx; + + @Column + private String teamName; + + //@JoinColumn(name = "teamIdx") //순환참조 문제가 발생한다. + @OneToMany(mappedBy = "team") + @JsonBackReference + private List users = new ArrayList<>(); + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/User.java index 1f780d6..c5ca8d1 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/User.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/User.java @@ -1,10 +1,14 @@ package org.dailystudio.springbootstudy.domain; +import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.dailystudio.springbootstudy.dto.user.UserNameReqDto; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Getter @NoArgsConstructor @@ -30,6 +34,15 @@ public class User { @Column(name = "userAuth") private String userAuth; + @OneToMany + @JoinColumn(name = "userIdx") + private List userImgs = new ArrayList<>(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "teamIdx", insertable = false, updatable = false) + @JsonManagedReference + Team team; + @Builder public User(String userEmail, String userPass, String userName, String userPhone, String userAuth) { this.userEmail = userEmail; @@ -39,7 +52,7 @@ public User(String userEmail, String userPass, String userName, String userPhone this.userPhone = userPhone; } - public void setName(String name) { - this.userName = name; + public void updateName(UserNameReqDto userNameReqDto) { + this.userName = userNameReqDto.getUserName(); } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java b/src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java new file mode 100644 index 0000000..17d29fc --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java @@ -0,0 +1,32 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Getter +@Entity +@Table(name = "userimg") +@NoArgsConstructor +public class UserImg { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long userImgIdx; + + private Long userIdx; + + @Column + private String userImgUrl = "default URL"; + + public UserImg(User user) { + this.userIdx = user.getUserIdx(); + } + + public UserImg(User user, String url) { + this.userIdx = user.getUserIdx(); + this.userImgUrl = url; + } + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java new file mode 100644 index 0000000..741b482 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java @@ -0,0 +1,24 @@ +package org.dailystudio.springbootstudy.dto.team; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.dailystudio.springbootstudy.domain.Team; +import org.dailystudio.springbootstudy.dto.user.UserSimpleInfoResDto; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@NoArgsConstructor +public class TeamInfoResDto { + private String teamName; + + private List userSimpleInfoResDtos; + + public TeamInfoResDto(Team team) { + this.teamName = team.getTeamName(); + this.userSimpleInfoResDtos = team.getUsers().stream() + .map(user -> new UserSimpleInfoResDto(user)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java new file mode 100644 index 0000000..46038d1 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java @@ -0,0 +1,13 @@ +package org.dailystudio.springbootstudy.dto.team; + +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.Team; + +@Getter +public class TeamNameResDto { + private String teamName; + + public TeamNameResDto(Team team) { + this.teamName = team.getTeamName(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java index 8f4b248..e4541ec 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java @@ -2,14 +2,22 @@ import lombok.Getter; import org.dailystudio.springbootstudy.domain.User; +import org.dailystudio.springbootstudy.domain.UserImg; +import org.dailystudio.springbootstudy.dto.team.TeamNameResDto; + +import java.util.List; @Getter public class UserInfoResDto { private String email; private String name; + private List userImgs; + private TeamNameResDto teamNameResDto; public UserInfoResDto(User user) { this.email = user.getUserEmail(); this.name = user.getUserName(); + this.userImgs = user.getUserImgs(); + this.teamNameResDto = new TeamNameResDto(user.getTeam()); } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java new file mode 100644 index 0000000..dfda338 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java @@ -0,0 +1,8 @@ +package org.dailystudio.springbootstudy.dto.user; + +import lombok.Getter; + +@Getter +public class UserNameReqDto { + private String userName; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java new file mode 100644 index 0000000..678653c --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java @@ -0,0 +1,20 @@ +package org.dailystudio.springbootstudy.dto.user; + +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.User; +import org.dailystudio.springbootstudy.domain.UserImg; + +import java.util.List; + +@Getter +public class UserSimpleInfoResDto { + private String email; + private String name; + private List userImgs; + + public UserSimpleInfoResDto(User user) { + this.email = user.getUserEmail(); + this.name = user.getUserName(); + this.userImgs = user.getUserImgs(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java new file mode 100644 index 0000000..2133266 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.Team; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TeamRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java new file mode 100644 index 0000000..3b748dc --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.UserImg; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserImgRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java index 118d387..219a861 100644 --- a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java +++ b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java @@ -3,14 +3,7 @@ import org.dailystudio.springbootstudy.domain.User; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; public interface UserRepository extends JpaRepository { User findByUserIdx(Long idx); - - @Modifying - @Query("UPDATE User u SET u.userName = :name WHERE u.userIdx = :idx") - void updateUserName(@Param("idx") Long userIdx, @Param("name") String userName); } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java new file mode 100644 index 0000000..9d60748 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java @@ -0,0 +1,25 @@ +package org.dailystudio.springbootstudy.service; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Team; +import org.dailystudio.springbootstudy.dto.team.TeamInfoResDto; +import org.dailystudio.springbootstudy.repository.TeamRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class TeamService { + + private final TeamRepository teamRepository; + + public List getAllTeam() { + List teams = teamRepository.findAll(); + List teamInfoResDtos = teams.stream() + .map(team -> new TeamInfoResDto(team)) + .collect(Collectors.toList()); + return teamInfoResDtos; + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index 0f3ab17..eafda6b 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -2,8 +2,11 @@ import lombok.RequiredArgsConstructor; import org.dailystudio.springbootstudy.domain.User; +import org.dailystudio.springbootstudy.domain.UserImg; import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; +import org.dailystudio.springbootstudy.dto.user.UserNameReqDto; import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; +import org.dailystudio.springbootstudy.repository.UserImgRepository; import org.dailystudio.springbootstudy.repository.UserRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,57 +19,44 @@ public class UserService { private final UserRepository userRepository; + private final UserImgRepository userImgRepository; @Transactional public void save(UserSaveReqDto userSaveReqDto) { User user = userSaveReqDto.toEntity(); - userRepository.save(user); + user = userRepository.save(user); + UserImg userImg = new UserImg(user); + userImgRepository.save(userImg); } public List getAll() { - //모든 유저 찾는 작업 -> DB에서 SELECT 해야겠지? List users = userRepository.findAll(); - //반환 시킬 객체 준비 List userInfoResDtos; - //domain -> dto 변환 userInfoResDtos = users.stream() .map(user -> new UserInfoResDto(user)) .collect(Collectors.toList()); - //가공된 dto 반환 return userInfoResDtos; } public UserInfoResDto findUserByIdx(String idx) { - //DB에 userIdx는 보통 정수로 저장되어있으니까 String으로 받은 idx를 Long(int보다 큰 정수형)으로 변환하자. Long userIdx = Long.valueOf(idx); - //반환시킬 객체 준비 UserInfoResDto userInfoResDto; - //디비에서 userIdx를 이용하여 User객체를 찾아온다. User user = userRepository.findByUserIdx(userIdx); - //domain -> dto 변환 userInfoResDto = new UserInfoResDto(user); - //가공된 dto 반환 return userInfoResDto; } @Transactional - public void changeUserName(String idx, String name) { + public void changeUserName(String idx, UserNameReqDto userNameReqDto) { Long userIdx = Long.valueOf(idx); - //유저 정보를 수정하는 과정 User user = userRepository.findByUserIdx(userIdx); - //쿼리를 작성하는 방법 - //userRepository.updateUserName(userIdx, name); - - //Setter를 이용한 방법 - user.setName(name); - - //더 나은 방법은 없을까? + //유저 정보를 수정하는 과정 + user.updateName(userNameReqDto); } @Transactional public void deleteUser(String idx) { Long userIdx = Long.valueOf(idx); - //유저 정보를 제거하는 과정 User user = userRepository.findByUserIdx(userIdx); userRepository.delete(user); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b654424..a7f77e7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ ## ͺ̽ ⺻ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.username=userName -spring.datasource.password=userPass +spring.datasource.username=root +spring.datasource.password=saul2449 ## ͺ̽ Ű ּ ## jdbc:mysql://ּ/Ű̸? spring.datasource.url=jdbc:mysql://localhost/ds?useSSL=false&serverTimezone=UTC From 09cbfd90f5fb2e7ebb2cf3318169a5e77635aa54 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sun, 31 Mar 2019 02:13:47 +0900 Subject: [PATCH 11/28] =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이름전략 변경으로 인한 초기화 --- .../controller/TeamController.java | 21 +++++--- .../controller/UserController.java | 32 ++--------- .../springbootstudy/domain/Team.java | 19 +++---- .../springbootstudy/domain/User.java | 53 +++++++------------ .../springbootstudy/domain/UserImg.java | 32 ----------- .../dto/team/TeamInfoResDto.java | 24 --------- .../dto/team/TeamNameResDto.java | 13 ----- .../dto/team/TeamSaveReqDto.java | 14 +++++ .../dto/user/UserInfoResDto.java | 23 -------- .../dto/user/UserNameReqDto.java | 8 --- .../dto/user/UserSaveReqDto.java | 30 ++++------- .../dto/user/UserSimpleInfoResDto.java | 20 ------- .../repository/UserImgRepository.java | 7 --- .../repository/UserRepository.java | 8 +++ .../springbootstudy/service/TeamService.java | 15 +++--- .../springbootstudy/service/UserService.java | 46 ---------------- src/main/resources/application.properties | 13 +++-- 17 files changed, 93 insertions(+), 285 deletions(-) delete mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java index 5d14f95..4ab9c77 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java @@ -1,12 +1,11 @@ package org.dailystudio.springbootstudy.controller; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.dto.team.TeamInfoResDto; +import org.dailystudio.springbootstudy.domain.Team; +import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; import org.dailystudio.springbootstudy.service.TeamService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -17,11 +16,17 @@ public class TeamController { private final TeamService teamService; - @GetMapping - public ResponseEntity> getAllTeam() { + @PostMapping("/save") + public ResponseEntity saveTeam(@RequestBody TeamSaveReqDto teamSaveReqDto){ + teamService.save(teamSaveReqDto); - List teamInfoResDtos = teamService.getAllTeam(); + return ResponseEntity.ok().build(); + } - return ResponseEntity.ok().body(teamInfoResDtos); + @GetMapping + public ResponseEntity> findAll(){ + List teams = teamService.getTeams(); + return ResponseEntity.ok(teams); } + } diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java index eb778da..8abad08 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java @@ -4,14 +4,13 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; -import org.dailystudio.springbootstudy.dto.user.UserNameReqDto; import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; import org.dailystudio.springbootstudy.service.UserService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; +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; /* UserService의 메소드는 현재 깡통이야. @@ -38,28 +37,5 @@ public ResponseEntity saveUser(@RequestBody UserSaveReqDto userSaveReqDto) return ResponseEntity.ok().build(); } - @GetMapping - public ResponseEntity> getAllUser() { - List resDtos = userService.getAll(); - return ResponseEntity.ok().body(resDtos); - } - - @GetMapping("/{idx}") - public ResponseEntity getUserInfo(@PathVariable("idx") String idx) { - UserInfoResDto userInfoResDto = userService.findUserByIdx(idx); - return ResponseEntity.ok().body(userInfoResDto); - } - - @PutMapping("/{idx}") - public ResponseEntity changeUserName(@PathVariable("idx") String idx, @RequestBody UserNameReqDto userNameReqDto) { - userService.changeUserName(idx, userNameReqDto); - return ResponseEntity.ok().build(); - } - - @DeleteMapping("/{idx}") - public ResponseEntity deleteUser(@PathVariable("idx") String idx) { - userService.deleteUser(idx); - return ResponseEntity.ok().build(); - } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java index 2d5a76b..3ebcdc1 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java @@ -1,28 +1,29 @@ package org.dailystudio.springbootstudy.domain; -import com.fasterxml.jackson.annotation.JsonBackReference; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import javax.persistence.*; -import java.util.ArrayList; import java.util.List; @Entity @Table(name = "team") @Getter +@NoArgsConstructor public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "teamIdx") - private Long teamIdx; + private Long id; - @Column - private String teamName; + private String name; - //@JoinColumn(name = "teamIdx") //순환참조 문제가 발생한다. @OneToMany(mappedBy = "team") - @JsonBackReference - private List users = new ArrayList<>(); + private List users; + @Builder + public Team(String name) { + this.name = name; + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/User.java index c5ca8d1..3d937ef 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/User.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/User.java @@ -1,58 +1,41 @@ package org.dailystudio.springbootstudy.domain; -import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.dailystudio.springbootstudy.dto.user.UserNameReqDto; import javax.persistence.*; -import java.util.ArrayList; -import java.util.List; +import javax.validation.constraints.NotNull; @Getter @NoArgsConstructor @Entity @Table(name = "users") public class User { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long userIdx; - - @Column(name = "userEmail") - private String userEmail; - - @Column(name = "userName") - private String userName; + private Long id; - @Column(name = "userPass") - private String userPass; + @NotNull + @Column + private String email; - @Column(name = "userPhone") - private String userPhone; + @NotNull + private String name; - @Column(name = "userAuth") - private String userAuth; + @NotNull + private String pass; - @OneToMany - @JoinColumn(name = "userIdx") - private List userImgs = new ArrayList<>(); - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "teamIdx", insertable = false, updatable = false) - @JsonManagedReference - Team team; + @ManyToOne + @JoinColumn(name = "team_id") + private Team team; @Builder - public User(String userEmail, String userPass, String userName, String userPhone, String userAuth) { - this.userEmail = userEmail; - this.userAuth = userAuth; - this.userName = userName; - this.userPass = userPass; - this.userPhone = userPhone; - } - - public void updateName(UserNameReqDto userNameReqDto) { - this.userName = userNameReqDto.getUserName(); + public User(String email, String name, String pass, Team team){ + this.email=email; + this.name=name; + this.pass=pass; + this.team=team; } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java b/src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java deleted file mode 100644 index 17d29fc..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/domain/UserImg.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.dailystudio.springbootstudy.domain; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; - -@Getter -@Entity -@Table(name = "userimg") -@NoArgsConstructor -public class UserImg { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long userImgIdx; - - private Long userIdx; - - @Column - private String userImgUrl = "default URL"; - - public UserImg(User user) { - this.userIdx = user.getUserIdx(); - } - - public UserImg(User user, String url) { - this.userIdx = user.getUserIdx(); - this.userImgUrl = url; - } - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java deleted file mode 100644 index 741b482..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamInfoResDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.dailystudio.springbootstudy.dto.team; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.dailystudio.springbootstudy.domain.Team; -import org.dailystudio.springbootstudy.dto.user.UserSimpleInfoResDto; - -import java.util.List; -import java.util.stream.Collectors; - -@Getter -@NoArgsConstructor -public class TeamInfoResDto { - private String teamName; - - private List userSimpleInfoResDtos; - - public TeamInfoResDto(Team team) { - this.teamName = team.getTeamName(); - this.userSimpleInfoResDtos = team.getUsers().stream() - .map(user -> new UserSimpleInfoResDto(user)) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java deleted file mode 100644 index 46038d1..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameResDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dailystudio.springbootstudy.dto.team; - -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.Team; - -@Getter -public class TeamNameResDto { - private String teamName; - - public TeamNameResDto(Team team) { - this.teamName = team.getTeamName(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java new file mode 100644 index 0000000..17d930f --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java @@ -0,0 +1,14 @@ +package org.dailystudio.springbootstudy.dto.team; + +import org.dailystudio.springbootstudy.domain.Team; + +public class TeamSaveReqDto { + + private String teamName; + + public Team toEntity(){ + return Team.builder() + .name(this.teamName) + .build(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java deleted file mode 100644 index e4541ec..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserInfoResDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dailystudio.springbootstudy.dto.user; - -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.User; -import org.dailystudio.springbootstudy.domain.UserImg; -import org.dailystudio.springbootstudy.dto.team.TeamNameResDto; - -import java.util.List; - -@Getter -public class UserInfoResDto { - private String email; - private String name; - private List userImgs; - private TeamNameResDto teamNameResDto; - - public UserInfoResDto(User user) { - this.email = user.getUserEmail(); - this.name = user.getUserName(); - this.userImgs = user.getUserImgs(); - this.teamNameResDto = new TeamNameResDto(user.getTeam()); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java deleted file mode 100644 index dfda338..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserNameReqDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.dailystudio.springbootstudy.dto.user; - -import lombok.Getter; - -@Getter -public class UserNameReqDto { - private String userName; -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java index c3119dc..d18064b 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java @@ -1,33 +1,21 @@ package org.dailystudio.springbootstudy.dto.user; -import io.swagger.annotations.ApiModelProperty; import lombok.Getter; +import org.dailystudio.springbootstudy.domain.Team; import org.dailystudio.springbootstudy.domain.User; @Getter public class UserSaveReqDto { - private static final String USER_AUTH = "USER"; + private String userEmail; + private String userName; + private String userPass; - @ApiModelProperty(example = "example@gmail.com", position = 1) - private String email; - - @ApiModelProperty(example = "박찬인", position = 2) - private String name; - - @ApiModelProperty(example = "q1w2e3r4!", position = 3) - private String pass; - - @ApiModelProperty(example = "010-1234-1234", position = 4) - private String phone; - - - public User toEntity() { + public User toEntity(Team team){ return User.builder() - .userEmail(this.email) - .userName(this.name) - .userPass(this.pass) - .userPhone(this.phone) - .userAuth(USER_AUTH) + .team(team) + .email(this.userEmail) + .name(this.userName) + .pass(this.userPass) .build(); } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java deleted file mode 100644 index 678653c..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSimpleInfoResDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.dailystudio.springbootstudy.dto.user; - -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.User; -import org.dailystudio.springbootstudy.domain.UserImg; - -import java.util.List; - -@Getter -public class UserSimpleInfoResDto { - private String email; - private String name; - private List userImgs; - - public UserSimpleInfoResDto(User user) { - this.email = user.getUserEmail(); - this.name = user.getUserName(); - this.userImgs = user.getUserImgs(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java deleted file mode 100644 index 3b748dc..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/repository/UserImgRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.dailystudio.springbootstudy.repository; - -import org.dailystudio.springbootstudy.domain.UserImg; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserImgRepository extends JpaRepository { -} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java index 219a861..75d301d 100644 --- a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java +++ b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java @@ -2,8 +2,16 @@ import org.dailystudio.springbootstudy.domain.User; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; public interface UserRepository extends JpaRepository { User findByUserIdx(Long idx); + +// @EntityGraph(attributePaths = "userImgs") +// @Query("SELECT a FROM users a") +// List findAllEntityGraph(); } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java index 9d60748..50f54f0 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java @@ -2,12 +2,11 @@ import lombok.RequiredArgsConstructor; import org.dailystudio.springbootstudy.domain.Team; -import org.dailystudio.springbootstudy.dto.team.TeamInfoResDto; +import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; import org.dailystudio.springbootstudy.repository.TeamRepository; import org.springframework.stereotype.Service; import java.util.List; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -15,11 +14,13 @@ public class TeamService { private final TeamRepository teamRepository; - public List getAllTeam() { + public void save(TeamSaveReqDto teamSaveReqDto){ + Team team = teamSaveReqDto.toEntity(); + teamRepository.save(team); + } + + public List getTeams(){ List teams = teamRepository.findAll(); - List teamInfoResDtos = teams.stream() - .map(team -> new TeamInfoResDto(team)) - .collect(Collectors.toList()); - return teamInfoResDtos; + return teams; } } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java index eafda6b..472f839 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java @@ -1,63 +1,17 @@ package org.dailystudio.springbootstudy.service; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.User; -import org.dailystudio.springbootstudy.domain.UserImg; -import org.dailystudio.springbootstudy.dto.user.UserInfoResDto; -import org.dailystudio.springbootstudy.dto.user.UserNameReqDto; import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; -import org.dailystudio.springbootstudy.repository.UserImgRepository; import org.dailystudio.springbootstudy.repository.UserRepository; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; - private final UserImgRepository userImgRepository; - @Transactional public void save(UserSaveReqDto userSaveReqDto) { - User user = userSaveReqDto.toEntity(); - user = userRepository.save(user); - UserImg userImg = new UserImg(user); - userImgRepository.save(userImg); - } - - public List getAll() { - List users = userRepository.findAll(); - List userInfoResDtos; - userInfoResDtos = users.stream() - .map(user -> new UserInfoResDto(user)) - .collect(Collectors.toList()); - return userInfoResDtos; - } - - public UserInfoResDto findUserByIdx(String idx) { - Long userIdx = Long.valueOf(idx); - UserInfoResDto userInfoResDto; - User user = userRepository.findByUserIdx(userIdx); - userInfoResDto = new UserInfoResDto(user); - return userInfoResDto; - } - - @Transactional - public void changeUserName(String idx, UserNameReqDto userNameReqDto) { - Long userIdx = Long.valueOf(idx); - User user = userRepository.findByUserIdx(userIdx); - //유저 정보를 수정하는 과정 - user.updateName(userNameReqDto); - } - @Transactional - public void deleteUser(String idx) { - Long userIdx = Long.valueOf(idx); - User user = userRepository.findByUserIdx(userIdx); - userRepository.delete(user); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a7f77e7..d1efbce 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,17 +7,22 @@ spring.datasource.password=saul2449 spring.datasource.url=jdbc:mysql://localhost/ds?useSSL=false&serverTimezone=UTC ## Ǵ SQL մϴ. spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true + ## α մϴ -logging.level.org.hibernate.type=trace -logging.level.org.hibernate=info +#logging.level.org.hibernate.type=trace +#logging.level.org.hibernate=info + ##ҹ ̽ ذ -spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + ##ī̽ ھ ̸ ϱ ## #spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy # ## #spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy -#MYSQL + +##MYSQL spring.jpa.database=mysql spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect \ No newline at end of file From cebe4c464e6e8543585d544f7559f2fa03f95f82 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sun, 31 Mar 2019 02:35:21 +0900 Subject: [PATCH 12/28] =?UTF-8?q?CRUD=20=EC=98=88=EC=A0=9C=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TEAM 엔티티를 이용하여 CRUD 예제 작성 --- ...serController.java => MemberController.java} | 12 ++++++------ .../controller/TeamController.java | 15 +++++++++++++++ .../domain/{User.java => Member.java} | 6 +++--- .../springbootstudy/domain/Team.java | 10 +++++++++- .../MemberSaveReqDto.java} | 10 +++++----- .../dto/team/TeamDeleteReqDto.java | 8 ++++++++ .../dto/team/TeamNameChangeReqDto.java | 9 +++++++++ .../dto/team/TeamSaveReqDto.java | 2 ++ .../repository/MemberRepository.java | 8 ++++++++ .../repository/UserRepository.java | 17 ----------------- .../springbootstudy/service/MemberService.java | 17 +++++++++++++++++ .../springbootstudy/service/TeamService.java | 17 +++++++++++++++++ .../springbootstudy/service/UserService.java | 17 ----------------- src/main/resources/application.properties | 17 ++++++++--------- 14 files changed, 107 insertions(+), 58 deletions(-) rename src/main/java/org/dailystudio/springbootstudy/controller/{UserController.java => MemberController.java} (77%) rename src/main/java/org/dailystudio/springbootstudy/domain/{User.java => Member.java} (84%) rename src/main/java/org/dailystudio/springbootstudy/dto/{user/UserSaveReqDto.java => member/MemberSaveReqDto.java} (62%) create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/service/MemberService.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/service/UserService.java diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java similarity index 77% rename from src/main/java/org/dailystudio/springbootstudy/controller/UserController.java rename to src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java index 8abad08..9b15682 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java @@ -4,8 +4,8 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; -import org.dailystudio.springbootstudy.service.UserService; +import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; +import org.dailystudio.springbootstudy.service.MemberService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -21,9 +21,9 @@ @RestController @RequestMapping("api/user") @RequiredArgsConstructor -public class UserController { +public class MemberController { - private final UserService userService; + private final MemberService memberService; @ApiOperation(value = "유저 정보 저장하기", notes = "유저 정보를 저장합니다.") @@ -32,8 +32,8 @@ public class UserController { @ApiResponse(code = 500, message = "서버에러") }) @PostMapping("/save") - public ResponseEntity saveUser(@RequestBody UserSaveReqDto userSaveReqDto) { - userService.save(userSaveReqDto); + public ResponseEntity saveUser(@RequestBody MemberSaveReqDto memberSaveReqDto) { + memberService.save(memberSaveReqDto); return ResponseEntity.ok().build(); } diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java index 4ab9c77..8b73a75 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java @@ -2,6 +2,8 @@ import lombok.RequiredArgsConstructor; import org.dailystudio.springbootstudy.domain.Team; +import org.dailystudio.springbootstudy.dto.team.TeamDeleteReqDto; +import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; import org.dailystudio.springbootstudy.service.TeamService; import org.springframework.http.ResponseEntity; @@ -29,4 +31,17 @@ public ResponseEntity> findAll(){ return ResponseEntity.ok(teams); } + @PutMapping + public ResponseEntity changeTeamName(@RequestBody TeamNameChangeReqDto teamNameChangeReqDto){ + teamService.changeTeamName(teamNameChangeReqDto); + + return ResponseEntity.ok().build(); + } + + @DeleteMapping + public ResponseEntity DeleteTeam(@RequestBody TeamDeleteReqDto teamDeleteReqDto){ + teamService.deleteTeam(teamDeleteReqDto); + + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java similarity index 84% rename from src/main/java/org/dailystudio/springbootstudy/domain/User.java rename to src/main/java/org/dailystudio/springbootstudy/domain/Member.java index 3d937ef..33765fb 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/User.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java @@ -10,8 +10,8 @@ @Getter @NoArgsConstructor @Entity -@Table(name = "users") -public class User { +@Table(name = "member") +public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -32,7 +32,7 @@ public class User { private Team team; @Builder - public User(String email, String name, String pass, Team team){ + public Member(String email, String name, String pass, Team team){ this.email=email; this.name=name; this.pass=pass; diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java index 3ebcdc1..5c84ab8 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java @@ -3,8 +3,10 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; import javax.persistence.*; +import javax.validation.constraints.NotNull; import java.util.List; @Entity @@ -15,15 +17,21 @@ public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "team_id") private Long id; + @NotNull private String name; @OneToMany(mappedBy = "team") - private List users; + private List members; @Builder public Team(String name) { this.name = name; } + + public void changeName(TeamNameChangeReqDto teamNameChangeReqDto) { + this.name = teamNameChangeReqDto.getName(); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java similarity index 62% rename from src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java rename to src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java index d18064b..2362a2e 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/user/UserSaveReqDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java @@ -1,17 +1,17 @@ -package org.dailystudio.springbootstudy.dto.user; +package org.dailystudio.springbootstudy.dto.member; import lombok.Getter; import org.dailystudio.springbootstudy.domain.Team; -import org.dailystudio.springbootstudy.domain.User; +import org.dailystudio.springbootstudy.domain.Member; @Getter -public class UserSaveReqDto { +public class MemberSaveReqDto { private String userEmail; private String userName; private String userPass; - public User toEntity(Team team){ - return User.builder() + public Member toEntity(Team team){ + return Member.builder() .team(team) .email(this.userEmail) .name(this.userName) diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java new file mode 100644 index 0000000..b0f4a65 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java @@ -0,0 +1,8 @@ +package org.dailystudio.springbootstudy.dto.team; + +import lombok.Getter; + +@Getter +public class TeamDeleteReqDto { + private Long id; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java new file mode 100644 index 0000000..536b64d --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java @@ -0,0 +1,9 @@ +package org.dailystudio.springbootstudy.dto.team; + +import lombok.Getter; + +@Getter +public class TeamNameChangeReqDto { + private Long id; + private String name; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java index 17d930f..88648d5 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java @@ -1,7 +1,9 @@ package org.dailystudio.springbootstudy.dto.team; +import lombok.Getter; import org.dailystudio.springbootstudy.domain.Team; +@Getter public class TeamSaveReqDto { private String teamName; diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java new file mode 100644 index 0000000..0773043 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java @@ -0,0 +1,8 @@ +package org.dailystudio.springbootstudy.repository; + + +import org.dailystudio.springbootstudy.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java deleted file mode 100644 index 75d301d..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.dailystudio.springbootstudy.repository; - - -import org.dailystudio.springbootstudy.domain.User; -import org.springframework.data.jpa.repository.EntityGraph; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import java.util.List; - -public interface UserRepository extends JpaRepository { - User findByUserIdx(Long idx); - -// @EntityGraph(attributePaths = "userImgs") -// @Query("SELECT a FROM users a") -// List findAllEntityGraph(); -} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java b/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java new file mode 100644 index 0000000..7c6f3fc --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java @@ -0,0 +1,17 @@ +package org.dailystudio.springbootstudy.service; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; +import org.dailystudio.springbootstudy.repository.MemberRepository; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MemberService { + + private final MemberRepository memberRepository; + + public void save(MemberSaveReqDto memberSaveReqDto) { + + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java index 50f54f0..7331b72 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java @@ -2,9 +2,12 @@ import lombok.RequiredArgsConstructor; import org.dailystudio.springbootstudy.domain.Team; +import org.dailystudio.springbootstudy.dto.team.TeamDeleteReqDto; +import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; import org.dailystudio.springbootstudy.repository.TeamRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -14,13 +17,27 @@ public class TeamService { private final TeamRepository teamRepository; + @Transactional public void save(TeamSaveReqDto teamSaveReqDto){ Team team = teamSaveReqDto.toEntity(); teamRepository.save(team); } + @Transactional(readOnly = true) public List getTeams(){ List teams = teamRepository.findAll(); return teams; } + + @Transactional + public void changeTeamName(TeamNameChangeReqDto teamNameChangeReqDto) { + Team team = teamRepository.getOne(teamNameChangeReqDto.getId()); + team.changeName(teamNameChangeReqDto); + } + + @Transactional + public void deleteTeam(TeamDeleteReqDto teamDeleteReqDto) { + Team team = teamRepository.getOne(teamDeleteReqDto.getId()); + teamRepository.delete(team); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java b/src/main/java/org/dailystudio/springbootstudy/service/UserService.java deleted file mode 100644 index 472f839..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/service/UserService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.dailystudio.springbootstudy.service; - -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.dto.user.UserSaveReqDto; -import org.dailystudio.springbootstudy.repository.UserRepository; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class UserService { - - private final UserRepository userRepository; - - public void save(UserSaveReqDto userSaveReqDto) { - - } -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d1efbce..eb1dd49 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,26 +2,25 @@ 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 + + ## Ǵ SQL մϴ. spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true + +## ̸ ϱ + + ## α մϴ #logging.level.org.hibernate.type=trace #logging.level.org.hibernate=info -##ҹ ̽ ذ -#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - -##ī̽ ھ ̸ ϱ -## -#spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy -# -## -#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy ##MYSQL spring.jpa.database=mysql From 768abea00c8df97db32ab048b5dbf59c7f24bfef Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sun, 31 Mar 2019 03:04:15 +0900 Subject: [PATCH 13/28] =?UTF-8?q?=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=9E=90?= =?UTF-8?q?=EB=A3=8C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 순환참조 문제 2. 직접 작성 유도 --- .../controller/MemberController.java | 22 ++++++++++++------- .../controller/TeamController.java | 19 +++++++++++++--- .../springbootstudy/domain/Member.java | 1 + .../springbootstudy/domain/Team.java | 14 ++++++++++++ .../dto/member/MemberSaveReqDto.java | 12 ++++++++-- .../springbootstudy/dto/team/TeamResDto.java | 13 +++++++++++ .../dto/team/TeamSaveReqDto.java | 2 ++ .../service/MemberService.java | 9 +++++++- .../springbootstudy/service/TeamService.java | 17 ++++++++++++-- src/main/resources/application.properties | 3 --- 10 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java index 9b15682..36a23fb 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java @@ -4,13 +4,13 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Member; import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; import org.dailystudio.springbootstudy.service.MemberService; import org.springframework.http.ResponseEntity; -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; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /* UserService의 메소드는 현재 깡통이야. @@ -25,17 +25,23 @@ public class MemberController { private final MemberService memberService; - @ApiOperation(value = "유저 정보 저장하기", - notes = "유저 정보를 저장합니다.") + @ApiOperation(value = "멤버 정보 저장하기", + notes = "멤버 정보를 저장합니다.") @ApiResponses(value = { - @ApiResponse(code = 201, message = "유저 저장 성공"), + @ApiResponse(code = 201, message = "멤버 저장 성공"), @ApiResponse(code = 500, message = "서버에러") }) @PostMapping("/save") - public ResponseEntity saveUser(@RequestBody MemberSaveReqDto memberSaveReqDto) { + public ResponseEntity saveMember(@RequestBody MemberSaveReqDto memberSaveReqDto) { memberService.save(memberSaveReqDto); return ResponseEntity.ok().build(); } + /* + 요구사항 + 1. 모든 멤버의 정보를 가져오기 + * 순환참조가 발생하지 않게 할 것 + */ + } diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java index 8b73a75..0a9fff2 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java @@ -4,6 +4,7 @@ import org.dailystudio.springbootstudy.domain.Team; import org.dailystudio.springbootstudy.dto.team.TeamDeleteReqDto; import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; +import org.dailystudio.springbootstudy.dto.team.TeamResDto; import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; import org.dailystudio.springbootstudy.service.TeamService; import org.springframework.http.ResponseEntity; @@ -25,12 +26,24 @@ public ResponseEntity saveTeam(@RequestBody TeamSaveReqDto teamSaveReqDto) return ResponseEntity.ok().build(); } - @GetMapping - public ResponseEntity> findAll(){ - List teams = teamService.getTeams(); + @GetMapping("/dont") + public ResponseEntity> dontGetAll(){ + List teams = teamService.dontGetTeams(); return ResponseEntity.ok(teams); } + @GetMapping + public ResponseEntity> getAll(){ + List teamResDtos = teamService.getTeams(); + return ResponseEntity.ok(teamResDtos); + } + + /* + 요구사항 + 1. 한 개의 팀의 정보만 불러오도록 할것 + * 순환참조가 발생하지 않도록 할 것. + */ + @PutMapping public ResponseEntity changeTeamName(@RequestBody TeamNameChangeReqDto teamNameChangeReqDto){ teamService.changeTeamName(teamNameChangeReqDto); diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Member.java b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java index 33765fb..55369cb 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Member.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java @@ -15,6 +15,7 @@ public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "member_id") private Long id; @NotNull diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java index 5c84ab8..73225e3 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; +import org.dailystudio.springbootstudy.dto.team.TeamResDto; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -31,7 +32,20 @@ public Team(String name) { this.name = name; } + public Team(Long id, String name) { + this.id = id; + this.name = name; + } + public void changeName(TeamNameChangeReqDto teamNameChangeReqDto) { this.name = teamNameChangeReqDto.getName(); } + + public static Team getBasic(){ + return new Team(1L,"기본팀"); + } + + public TeamResDto toDto(){ + return new TeamResDto(this); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java index 2362a2e..7725b4b 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java @@ -1,21 +1,29 @@ package org.dailystudio.springbootstudy.dto.member; +import io.swagger.annotations.ApiModelProperty; import lombok.Getter; -import org.dailystudio.springbootstudy.domain.Team; import org.dailystudio.springbootstudy.domain.Member; +import org.dailystudio.springbootstudy.domain.Team; @Getter public class MemberSaveReqDto { + + @ApiModelProperty(example = "example@gmail.com", position = 1) private String userEmail; + + @ApiModelProperty(example = "박찬인", position = 2) private String userName; + + @ApiModelProperty(example = "q1w2e3", position = 3) private String userPass; - public Member toEntity(Team team){ + public Member toEntity(Team team) { return Member.builder() .team(team) .email(this.userEmail) .name(this.userName) .pass(this.userPass) + .team(team) .build(); } } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java new file mode 100644 index 0000000..3d32743 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java @@ -0,0 +1,13 @@ +package org.dailystudio.springbootstudy.dto.team; + +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.Team; + +@Getter +public class TeamResDto { + private String teamName; + + public TeamResDto(Team team) { + this.teamName = team.getName(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java index 88648d5..750e840 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java @@ -1,11 +1,13 @@ package org.dailystudio.springbootstudy.dto.team; +import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import org.dailystudio.springbootstudy.domain.Team; @Getter public class TeamSaveReqDto { + @ApiModelProperty(example = "팀 스부스", position = 1) private String teamName; public Team toEntity(){ diff --git a/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java b/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java index 7c6f3fc..5198c9d 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java @@ -1,10 +1,14 @@ package org.dailystudio.springbootstudy.service; import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Member; +import org.dailystudio.springbootstudy.domain.Team; import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; import org.dailystudio.springbootstudy.repository.MemberRepository; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class MemberService { @@ -12,6 +16,9 @@ public class MemberService { private final MemberRepository memberRepository; public void save(MemberSaveReqDto memberSaveReqDto) { - + Team basicTeam = Team.getBasic(); + Member member = memberSaveReqDto.toEntity(basicTeam); + memberRepository.save(member); } + } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java index 7331b72..44044b0 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java @@ -4,12 +4,14 @@ import org.dailystudio.springbootstudy.domain.Team; import org.dailystudio.springbootstudy.dto.team.TeamDeleteReqDto; import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; +import org.dailystudio.springbootstudy.dto.team.TeamResDto; import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; import org.dailystudio.springbootstudy.repository.TeamRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -18,17 +20,28 @@ public class TeamService { private final TeamRepository teamRepository; @Transactional - public void save(TeamSaveReqDto teamSaveReqDto){ + public void save(TeamSaveReqDto teamSaveReqDto) { Team team = teamSaveReqDto.toEntity(); teamRepository.save(team); } @Transactional(readOnly = true) - public List getTeams(){ + public List dontGetTeams() { List teams = teamRepository.findAll(); return teams; } + @Transactional(readOnly = true) + public List getTeams() { + List teams = teamRepository.findAll(); + + List teamResDtos = teams.stream() + .map(team -> team.toDto()) + .collect(Collectors.toList()); + + return teamResDtos; + } + @Transactional public void changeTeamName(TeamNameChangeReqDto teamNameChangeReqDto) { Team team = teamRepository.getOne(teamNameChangeReqDto.getId()); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index eb1dd49..308448d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,9 +14,6 @@ spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true -## ̸ ϱ - - ## α մϴ #logging.level.org.hibernate.type=trace #logging.level.org.hibernate=info From b1d410e60230002441ea7eb485944c4ca2da1e69 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sun, 31 Mar 2019 03:12:32 +0900 Subject: [PATCH 14/28] =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/dailystudio/springbootstudy/domain/Team.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java index 73225e3..97bbcd1 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java @@ -32,7 +32,7 @@ public Team(String name) { this.name = name; } - public Team(Long id, String name) { + private Team(Long id, String name) { this.id = id; this.name = name; } From c59e669cda29492b29801477dbd34c764266c25e Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sun, 31 Mar 2019 03:16:57 +0900 Subject: [PATCH 15/28] =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 순환참조 피하기 2. 일부정보만 불러오기 --- .../springbootstudy/controller/MemberController.java | 1 + .../dailystudio/springbootstudy/controller/TeamController.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java index 36a23fb..cbd473c 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java @@ -41,6 +41,7 @@ public ResponseEntity saveMember(@RequestBody MemberSaveReqDto memberSaveR 요구사항 1. 모든 멤버의 정보를 가져오기 * 순환참조가 발생하지 않게 할 것 + * 멤버가 속한 팀의 이름을 포함할 것 */ diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java index 0a9fff2..6eae7b4 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java @@ -41,7 +41,9 @@ public ResponseEntity> getAll(){ /* 요구사항 1. 한 개의 팀의 정보만 불러오도록 할것 + 2. 팀에 속한 멤버의 정보를 포함할 것. * 순환참조가 발생하지 않도록 할 것. + * 멤버의 정보중 비밀번호를 제외한 정보를 포함할 것 */ @PutMapping From 7fd7d013e56e9db959586347bfd3f12d2d366c33 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Sun, 31 Mar 2019 03:19:00 +0900 Subject: [PATCH 16/28] =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootstudy/controller/MemberController.java | 7 +++++++ .../springbootstudy/controller/TeamController.java | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java index cbd473c..5ac36df 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java @@ -40,8 +40,15 @@ public ResponseEntity saveMember(@RequestBody MemberSaveReqDto memberSaveR /* 요구사항 1. 모든 멤버의 정보를 가져오기 + * 순환참조가 발생하지 않게 할 것 * 멤버가 속한 팀의 이름을 포함할 것 + + 2. 멤버의 이름을 바꿀 것 + + * setter를 사용하지 말 것 + + 3. 멤버의 정보를 삭제 할 것 */ diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java index 6eae7b4..e01159c 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java @@ -41,7 +41,9 @@ public ResponseEntity> getAll(){ /* 요구사항 1. 한 개의 팀의 정보만 불러오도록 할것 + 2. 팀에 속한 멤버의 정보를 포함할 것. + * 순환참조가 발생하지 않도록 할 것. * 멤버의 정보중 비밀번호를 제외한 정보를 포함할 것 */ From ae839fddcf21ba552c0c59ba5dc3a6431b38380c Mon Sep 17 00:00:00 2001 From: pci2676 Date: Mon, 1 Apr 2019 01:24:36 +0900 Subject: [PATCH 17/28] =?UTF-8?q?JPA=20=EC=98=88=EC=A0=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 단뱡향맵핑 ManyToOne 2. 단뱡향맵핑 OneToMany --- .../controller/FamilyController.java | 47 +++++++++++ .../springbootstudy/domain/Child.java | 29 +++++++ .../springbootstudy/domain/Parent.java | 29 +++++++ .../springbootstudy/dto/parent/ParentDto.java | 21 +++++ .../repository/ChildRepository.java | 7 ++ .../repository/ParentRepository.java | 7 ++ .../service/FamilyService.java | 80 +++++++++++++++++++ src/main/resources/application.properties | 2 +- 8 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Child.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Parent.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java new file mode 100644 index 0000000..9a3fa29 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java @@ -0,0 +1,47 @@ +package org.dailystudio.springbootstudy.controller; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Child; +import org.dailystudio.springbootstudy.domain.Parent; +import org.dailystudio.springbootstudy.dto.parent.ParentDto; +import org.dailystudio.springbootstudy.service.FamilyService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("api/family") +@RequiredArgsConstructor +public class FamilyController { + + private final FamilyService familyService; + + @PostMapping("/mto") + public ResponseEntity> manyToOne(){ + //부모저장 + familyService.saveParentForManyToOne(); + //자식저장 + familyService.saveChildForManyToOne(); + //자식 불러오기 + List children = familyService.getAllChild(); + + return ResponseEntity.ok(children); + } + +// @PostMapping("/otm") +// public ResponseEntity oneToMany() { +// //부모, 자식 저장 +// familyService.saveParentForOneToMany(); +// return ResponseEntity.ok().build(); +// } +// +// @GetMapping("/otm") +// public ResponseEntity oneToManyGet(Long id) { +// Parent parent = familyService.getParent(id); +// return ResponseEntity.ok(new ParentDto(parent)); +// } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Child.java b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java new file mode 100644 index 0000000..0d9bf0c --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java @@ -0,0 +1,29 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "child") +@Getter +@Setter +public class Child { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "child_id") + private Long id; + + @NotNull + private String name; + + @ManyToOne + @JoinColumn(name = "parent_id") + private Parent parent; + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java new file mode 100644 index 0000000..20a3437 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java @@ -0,0 +1,29 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "parent") +@Getter +@Setter +public class Parent { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "parent_id") + private Long id; + + @NotNull + private String name; + +// @OneToMany(cascade = CascadeType.ALL) +// @JoinColumn(name = "parent_id") +// private List children = new ArrayList<>(); + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java new file mode 100644 index 0000000..3b343c0 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java @@ -0,0 +1,21 @@ +package org.dailystudio.springbootstudy.dto.parent; + +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.Child; +import org.dailystudio.springbootstudy.domain.Parent; + +import java.util.List; + +@Getter +public class ParentDto { + private Long id; + private String name; + + private List children; + + public ParentDto(Parent parent){ + this.id=parent.getId(); + this.name=parent.getName(); + this.children=parent.getChildren(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java new file mode 100644 index 0000000..06d24ee --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.Child; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChildRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java new file mode 100644 index 0000000..92930a7 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.Parent; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ParentRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java new file mode 100644 index 0000000..dac004d --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java @@ -0,0 +1,80 @@ +package org.dailystudio.springbootstudy.service; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Child; +import org.dailystudio.springbootstudy.domain.Parent; +import org.dailystudio.springbootstudy.repository.ChildRepository; +import org.dailystudio.springbootstudy.repository.ParentRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class FamilyService { + + private final ParentRepository parentRepository; + private final ChildRepository childRepository; + + @Transactional(readOnly = true) + public List getAllChild(){ + List children = childRepository.findAll(); + return children; + } + + @Transactional + public void saveParentForManyToOne() { + Parent parent1 = new Parent(); + parent1.setName("부모님1"); + Parent parent2 = new Parent(); + parent2.setName("부모님2"); + + parentRepository.save(parent1); + parentRepository.save(parent2); + } + + @Transactional + public void saveChildForManyToOne() { + Parent parent1 = parentRepository.getOne(1L); + + Child child1 = new Child(); + Child child2 = new Child(); + + child1.setName("자식1"); + child1.setParent(parent1); + + child2.setName("자식2"); + child2.setParent(parent1); + + childRepository.save(child1); + childRepository.save(child2); + } + + +// @Transactional(readOnly = true) +// public Parent getParent(Long id) { +// Parent parent = parentRepository.getOne(id); +// return parent; +// } +// +// @Transactional +// public void saveParentForOneToMany() { +// Parent parent3 = new Parent(); +// parent3.setName("부모님3"); +// +// Child child1 = new Child(); +// Child child2 = new Child(); +// +// child1.setName("자식3"); +// child2.setName("자식4"); +// +// +// parent3.getChildren().add(child1); +// parent3.getChildren().add(child2); +// +// parentRepository.save(parent3); +// } + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 308448d..a7c6543 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -15,7 +15,7 @@ spring.jpa.properties.hibernate.format_sql=true ## α մϴ -#logging.level.org.hibernate.type=trace +logging.level.org.hibernate.type=trace #logging.level.org.hibernate=info From 93cc439717c9bb496ce281806a575f1157e9e936 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Mon, 1 Apr 2019 01:26:11 +0900 Subject: [PATCH 18/28] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=A3=BC=EC=84=9D=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dailystudio/springbootstudy/dto/parent/ParentDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java index 3b343c0..b22fd94 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java @@ -16,6 +16,6 @@ public class ParentDto { public ParentDto(Parent parent){ this.id=parent.getId(); this.name=parent.getName(); - this.children=parent.getChildren(); +// this.children=parent.getChildren(); } } From 5bc7a4862bfdd5a633da3dff6b7696a91bfbd35c Mon Sep 17 00:00:00 2001 From: pci2676 Date: Tue, 2 Apr 2019 18:04:47 +0900 Subject: [PATCH 19/28] =?UTF-8?q?H2=20=EB=82=B4=EC=9E=A5=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. H2를 사용하기 위한 의존성 추가 2. properties 분할 하여 사용하기 --- build.gradle | 3 + .../controller/FamilyController.java | 55 ++++++----- .../springbootstudy/domain/Child.java | 6 +- .../springbootstudy/domain/Parent.java | 6 +- .../dto/child/ChildResDto.java | 15 +++ .../springbootstudy/dto/parent/ParentDto.java | 2 +- .../service/FamilyService.java | 92 +++++++++---------- .../resources/application-local.properties | 5 + .../resources/application-prod.properties | 14 +++ src/main/resources/application.properties | 18 +--- 10 files changed, 124 insertions(+), 92 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java create mode 100644 src/main/resources/application-local.properties create mode 100644 src/main/resources/application-prod.properties diff --git a/build.gradle b/build.gradle index 24e56a3..07a0afc 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,9 @@ repositories { } dependencies { + runtimeOnly('com.h2database:h2') + compile("org.springframework.boot:spring-boot-devtools") + runtimeOnly 'mysql:mysql-connector-java' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java index 9a3fa29..63e8310 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java @@ -1,7 +1,6 @@ package org.dailystudio.springbootstudy.controller; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Child; import org.dailystudio.springbootstudy.domain.Parent; import org.dailystudio.springbootstudy.dto.parent.ParentDto; import org.dailystudio.springbootstudy.service.FamilyService; @@ -11,8 +10,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RestController @RequestMapping("api/family") @RequiredArgsConstructor @@ -20,28 +17,38 @@ public class FamilyController { private final FamilyService familyService; - @PostMapping("/mto") - public ResponseEntity> manyToOne(){ - //부모저장 - familyService.saveParentForManyToOne(); - //자식저장 - familyService.saveChildForManyToOne(); - //자식 불러오기 - List children = familyService.getAllChild(); - - return ResponseEntity.ok(children); - } - -// @PostMapping("/otm") -// public ResponseEntity oneToMany() { -// //부모, 자식 저장 -// familyService.saveParentForOneToMany(); -// return ResponseEntity.ok().build(); +// @PostMapping("/mto") +// public ResponseEntity> manyToOne(){ +// //부모저장 +// familyService.saveParentForManyToOne(); +// //자식저장 +// familyService.saveChildForManyToOne(); +// //자식 불러오기 +// List children = familyService.getAllChild(); +// +// return ResponseEntity.ok(children); // } // -// @GetMapping("/otm") -// public ResponseEntity oneToManyGet(Long id) { -// Parent parent = familyService.getParent(id); -// return ResponseEntity.ok(new ParentDto(parent)); +// @GetMapping("mto") +// public ResponseEntity> manyToOneLazy(){ +// //자식 불러오기 +// List children = familyService.getAllChild(); +// List childResDtos = children.stream() +// .map(child -> new ChildResDto(child)) +// .collect(Collectors.toList()); +// return ResponseEntity.ok(childResDtos); // } + + @PostMapping("/otm") + public ResponseEntity oneToMany() { + //부모, 자식 저장 + familyService.saveParentForOneToMany(); + return ResponseEntity.ok().build(); + } + + @GetMapping("/otm") + public ResponseEntity oneToManyGet(Long id) { + Parent parent = familyService.getParent(id); + return ResponseEntity.ok(new ParentDto(parent)); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Child.java b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java index 0d9bf0c..6eeaff1 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Child.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java @@ -22,8 +22,8 @@ public class Child { @NotNull private String name; - @ManyToOne - @JoinColumn(name = "parent_id") - private Parent parent; +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "parent_id") +// private Parent parent; } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java index 20a3437..fccd8b6 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java @@ -22,8 +22,8 @@ public class Parent { @NotNull private String name; -// @OneToMany(cascade = CascadeType.ALL) -// @JoinColumn(name = "parent_id") -// private List children = new ArrayList<>(); + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "parent_id") + private List children = new ArrayList<>(); } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java new file mode 100644 index 0000000..6a13d9a --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java @@ -0,0 +1,15 @@ +//package org.dailystudio.springbootstudy.dto.child; +// +//import lombok.Getter; +//import org.dailystudio.springbootstudy.domain.Child; +// +//@Getter +//public class ChildResDto { +// private String name; +// private String parentName; +// +// public ChildResDto(Child child) { +// this.name = child.getName(); +// this.parentName = child.getParent().getName(); +// } +//} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java index b22fd94..3b343c0 100644 --- a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java +++ b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java @@ -16,6 +16,6 @@ public class ParentDto { public ParentDto(Parent parent){ this.id=parent.getId(); this.name=parent.getName(); -// this.children=parent.getChildren(); + this.children=parent.getChildren(); } } diff --git a/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java index dac004d..ae1f168 100644 --- a/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java +++ b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java @@ -17,64 +17,64 @@ public class FamilyService { private final ParentRepository parentRepository; private final ChildRepository childRepository; - @Transactional(readOnly = true) - public List getAllChild(){ - List children = childRepository.findAll(); - return children; - } +// @Transactional(readOnly = true) +// public List getAllChild(){ +// List children = childRepository.findAll(); +// return children; +// } +// +// @Transactional +// public void saveParentForManyToOne() { +// Parent parent1 = new Parent(); +// parent1.setName("부모님1"); +// Parent parent2 = new Parent(); +// parent2.setName("부모님2"); +// +// parentRepository.save(parent1); +// parentRepository.save(parent2); +// } +// +// @Transactional +// public void saveChildForManyToOne() { +// Parent parent1 = parentRepository.getOne(1L); +// +// Child child1 = new Child(); +// Child child2 = new Child(); +// +// child1.setName("자식1"); +// child1.setParent(parent1); +// +// child2.setName("자식2"); +// child2.setParent(parent1); +// +// childRepository.save(child1); +// childRepository.save(child2); +// } - @Transactional - public void saveParentForManyToOne() { - Parent parent1 = new Parent(); - parent1.setName("부모님1"); - Parent parent2 = new Parent(); - parent2.setName("부모님2"); - parentRepository.save(parent1); - parentRepository.save(parent2); + @Transactional(readOnly = true) + public Parent getParent(Long id) { + Parent parent = parentRepository.getOne(id); + return parent; } @Transactional - public void saveChildForManyToOne() { - Parent parent1 = parentRepository.getOne(1L); + public void saveParentForOneToMany() { + Parent parent3 = new Parent(); + parent3.setName("부모님3"); Child child1 = new Child(); Child child2 = new Child(); - child1.setName("자식1"); - child1.setParent(parent1); + child1.setName("자식3"); + child2.setName("자식4"); - child2.setName("자식2"); - child2.setParent(parent1); - childRepository.save(child1); - childRepository.save(child2); - } + parent3.getChildren().add(child1); + parent3.getChildren().add(child2); - -// @Transactional(readOnly = true) -// public Parent getParent(Long id) { -// Parent parent = parentRepository.getOne(id); -// return parent; -// } -// -// @Transactional -// public void saveParentForOneToMany() { -// Parent parent3 = new Parent(); -// parent3.setName("부모님3"); -// -// Child child1 = new Child(); -// Child child2 = new Child(); -// -// child1.setName("자식3"); -// child2.setName("자식4"); -// -// -// parent3.getChildren().add(child1); -// parent3.getChildren().add(child2); -// -// parentRepository.save(parent3); -// } + parentRepository.save(parent3); + } } diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..79c4cd0 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,5 @@ +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=update \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 0000000..0e6aef9 --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -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 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a7c6543..059cf2a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,12 +1,5 @@ -## ͺ̽ ⺻ -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 +## properties մϴ. +spring.profiles.active=local ## Ǵ SQL մϴ. @@ -16,9 +9,4 @@ spring.jpa.properties.hibernate.format_sql=true ## α մϴ logging.level.org.hibernate.type=trace -#logging.level.org.hibernate=info - - -##MYSQL -spring.jpa.database=mysql -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect \ No newline at end of file +#logging.level.org.hibernate=info \ No newline at end of file From 3388e8963f75c3cb3c3b086ad2a235c448e9b5c4 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Tue, 2 Apr 2019 18:28:21 +0900 Subject: [PATCH 20/28] =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberController.java | 14 ++++---------- .../dailystudio/springbootstudy/domain/Member.java | 10 +++++----- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java index 5ac36df..9ad5170 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java @@ -4,19 +4,13 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Member; import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; import org.dailystudio.springbootstudy.service.MemberService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/* - UserService의 메소드는 현재 깡통이야. - 디비와 연결을 하지 않았기 때문에 실제로 불러오는 값이 존재하지않아. - 이번 소스코드에서는 swagger의 기능들을 살펴보고 넘어가자. - */ +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 @RequestMapping("api/user") diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Member.java b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java index 55369cb..f263085 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Member.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java @@ -33,10 +33,10 @@ public class Member { private Team team; @Builder - public Member(String email, String name, String pass, Team team){ - this.email=email; - this.name=name; - this.pass=pass; - this.team=team; + public Member(String email, String name, String pass, Team team) { + this.email = email; + this.name = name; + this.pass = pass; + this.team = team; } } From cd2e7edaa8463a5073798c0312fbf95f268bfd7a Mon Sep 17 00:00:00 2001 From: pci2676 Date: Tue, 2 Apr 2019 20:29:09 +0900 Subject: [PATCH 21/28] =?UTF-8?q?QueryDSL=20=EC=84=A4=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=99=98=EA=B2=BD=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. QueryDSL 의존성설정 2. test core 의존성 설정 3. Q클래스 설정 4. test 코드 추가 --- build.gradle | 75 +++++++++++++---- .../springbootstudy/domain/QStore.java | 41 ++++++++++ .../config/QueryDSLConfig.java | 20 +++++ .../controller/FamilyController.java | 54 ------------- .../controller/MemberController.java | 49 ------------ .../controller/StoreController.java | 17 ++++ .../controller/TeamController.java | 64 --------------- .../springbootstudy/domain/Child.java | 29 ------- .../springbootstudy/domain/Member.java | 42 ---------- .../springbootstudy/domain/Parent.java | 29 ------- .../springbootstudy/domain/Store.java | 30 +++++++ .../springbootstudy/domain/Team.java | 51 ------------ .../dto/child/ChildResDto.java | 15 ---- .../dto/member/MemberSaveReqDto.java | 29 ------- .../springbootstudy/dto/parent/ParentDto.java | 21 ----- .../dto/team/TeamDeleteReqDto.java | 8 -- .../dto/team/TeamNameChangeReqDto.java | 9 --- .../springbootstudy/dto/team/TeamResDto.java | 13 --- .../dto/team/TeamSaveReqDto.java | 18 ----- .../repository/MemberRepository.java | 8 -- .../repository/ParentRepository.java | 7 -- ...ldRepository.java => StoreRepository.java} | 4 +- .../repository/TeamRepository.java | 7 -- .../querydsl/StoreRepositorySupport.java | 28 +++++++ .../service/FamilyService.java | 80 ------------------- .../service/MemberService.java | 24 ------ .../springbootstudy/service/TeamService.java | 56 ------------- .../controller/StoreControllerTest.java | 52 ++++++++++++ 28 files changed, 251 insertions(+), 629 deletions(-) create mode 100644 src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/config/QueryDSLConfig.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Child.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Member.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Parent.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Store.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Team.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java rename src/main/java/org/dailystudio/springbootstudy/repository/{ChildRepository.java => StoreRepository.java} (51%) delete mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/service/MemberService.java delete mode 100644 src/main/java/org/dailystudio/springbootstudy/service/TeamService.java create mode 100644 src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java diff --git a/build.gradle b/build.gradle index 07a0afc..3309015 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,16 @@ -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' @@ -11,27 +21,64 @@ group = 'org.dailystudio' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + + configurations { compileOnly { extendsFrom annotationProcessor } } -repositories { - mavenCentral() -} + dependencies { - runtimeOnly('com.h2database:h2') + + 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' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - - implementation('io.springfox:springfox-swagger2:+') + + 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:+" + + compile "org.projectlombok:lombok:+"//lombok implementation 'org.springframework.boot:spring-boot-starter-web' 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 } diff --git a/src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java b/src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java new file mode 100644 index 0000000..ac6b8d0 --- /dev/null +++ b/src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java @@ -0,0 +1,41 @@ +package org.dailystudio.springbootstudy.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; + + +/** + * QStore is a Querydsl query type for Store + */ +@Generated("com.querydsl.codegen.EntitySerializer") +public class QStore extends EntityPathBase { + + private static final long serialVersionUID = 850959364L; + + public static final QStore store = new QStore("store"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath name = createString("name"); + + public final StringPath phone = createString("phone"); + + public QStore(String variable) { + super(Store.class, forVariable(variable)); + } + + public QStore(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QStore(PathMetadata metadata) { + super(Store.class, metadata); + } + +} + diff --git a/src/main/java/org/dailystudio/springbootstudy/config/QueryDSLConfig.java b/src/main/java/org/dailystudio/springbootstudy/config/QueryDSLConfig.java new file mode 100644 index 0000000..2406904 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/config/QueryDSLConfig.java @@ -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); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java deleted file mode 100644 index 63e8310..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dailystudio.springbootstudy.controller; - -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Parent; -import org.dailystudio.springbootstudy.dto.parent.ParentDto; -import org.dailystudio.springbootstudy.service.FamilyService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("api/family") -@RequiredArgsConstructor -public class FamilyController { - - private final FamilyService familyService; - -// @PostMapping("/mto") -// public ResponseEntity> manyToOne(){ -// //부모저장 -// familyService.saveParentForManyToOne(); -// //자식저장 -// familyService.saveChildForManyToOne(); -// //자식 불러오기 -// List children = familyService.getAllChild(); -// -// return ResponseEntity.ok(children); -// } -// -// @GetMapping("mto") -// public ResponseEntity> manyToOneLazy(){ -// //자식 불러오기 -// List children = familyService.getAllChild(); -// List childResDtos = children.stream() -// .map(child -> new ChildResDto(child)) -// .collect(Collectors.toList()); -// return ResponseEntity.ok(childResDtos); -// } - - @PostMapping("/otm") - public ResponseEntity oneToMany() { - //부모, 자식 저장 - familyService.saveParentForOneToMany(); - return ResponseEntity.ok().build(); - } - - @GetMapping("/otm") - public ResponseEntity oneToManyGet(Long id) { - Parent parent = familyService.getParent(id); - return ResponseEntity.ok(new ParentDto(parent)); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java b/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java deleted file mode 100644 index 9ad5170..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/controller/MemberController.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.dailystudio.springbootstudy.controller; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; -import org.dailystudio.springbootstudy.service.MemberService; -import org.springframework.http.ResponseEntity; -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 -@RequestMapping("api/user") -@RequiredArgsConstructor -public class MemberController { - - private final MemberService memberService; - - @ApiOperation(value = "멤버 정보 저장하기", - notes = "멤버 정보를 저장합니다.") - @ApiResponses(value = { - @ApiResponse(code = 201, message = "멤버 저장 성공"), - @ApiResponse(code = 500, message = "서버에러") - }) - @PostMapping("/save") - public ResponseEntity saveMember(@RequestBody MemberSaveReqDto memberSaveReqDto) { - memberService.save(memberSaveReqDto); - return ResponseEntity.ok().build(); - } - - /* - 요구사항 - 1. 모든 멤버의 정보를 가져오기 - - * 순환참조가 발생하지 않게 할 것 - * 멤버가 속한 팀의 이름을 포함할 것 - - 2. 멤버의 이름을 바꿀 것 - - * setter를 사용하지 말 것 - - 3. 멤버의 정보를 삭제 할 것 - */ - - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java b/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java new file mode 100644 index 0000000..27f058b --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java @@ -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; + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java b/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java deleted file mode 100644 index e01159c..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/controller/TeamController.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.dailystudio.springbootstudy.controller; - -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Team; -import org.dailystudio.springbootstudy.dto.team.TeamDeleteReqDto; -import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; -import org.dailystudio.springbootstudy.dto.team.TeamResDto; -import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; -import org.dailystudio.springbootstudy.service.TeamService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("api/team") -@RequiredArgsConstructor -public class TeamController { - - private final TeamService teamService; - - @PostMapping("/save") - public ResponseEntity saveTeam(@RequestBody TeamSaveReqDto teamSaveReqDto){ - teamService.save(teamSaveReqDto); - - return ResponseEntity.ok().build(); - } - - @GetMapping("/dont") - public ResponseEntity> dontGetAll(){ - List teams = teamService.dontGetTeams(); - return ResponseEntity.ok(teams); - } - - @GetMapping - public ResponseEntity> getAll(){ - List teamResDtos = teamService.getTeams(); - return ResponseEntity.ok(teamResDtos); - } - - /* - 요구사항 - 1. 한 개의 팀의 정보만 불러오도록 할것 - - 2. 팀에 속한 멤버의 정보를 포함할 것. - - * 순환참조가 발생하지 않도록 할 것. - * 멤버의 정보중 비밀번호를 제외한 정보를 포함할 것 - */ - - @PutMapping - public ResponseEntity changeTeamName(@RequestBody TeamNameChangeReqDto teamNameChangeReqDto){ - teamService.changeTeamName(teamNameChangeReqDto); - - return ResponseEntity.ok().build(); - } - - @DeleteMapping - public ResponseEntity DeleteTeam(@RequestBody TeamDeleteReqDto teamDeleteReqDto){ - teamService.deleteTeam(teamDeleteReqDto); - - return ResponseEntity.ok().build(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Child.java b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java deleted file mode 100644 index 6eeaff1..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Child.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dailystudio.springbootstudy.domain; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.Setter; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -@Entity -@Table(name = "child") -@Getter -@Setter -public class Child { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "child_id") - private Long id; - - @NotNull - private String name; - -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "parent_id") -// private Parent parent; - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Member.java b/src/main/java/org/dailystudio/springbootstudy/domain/Member.java deleted file mode 100644 index f263085..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Member.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.dailystudio.springbootstudy.domain; - -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -@Getter -@NoArgsConstructor -@Entity -@Table(name = "member") -public class Member { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "member_id") - private Long id; - - @NotNull - @Column - private String email; - - @NotNull - private String name; - - @NotNull - private String pass; - - @ManyToOne - @JoinColumn(name = "team_id") - private Team team; - - @Builder - public Member(String email, String name, String pass, Team team) { - this.email = email; - this.name = name; - this.pass = pass; - this.team = team; - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java deleted file mode 100644 index fccd8b6..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dailystudio.springbootstudy.domain; - -import lombok.Getter; -import lombok.Setter; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.List; - -@Entity -@Table(name = "parent") -@Getter -@Setter -public class Parent { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "parent_id") - private Long id; - - @NotNull - private String name; - - @OneToMany(cascade = CascadeType.ALL) - @JoinColumn(name = "parent_id") - private List children = new ArrayList<>(); - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Store.java b/src/main/java/org/dailystudio/springbootstudy/domain/Store.java new file mode 100644 index 0000000..69bf5bf --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Store.java @@ -0,0 +1,30 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "store") +@Getter +@NoArgsConstructor +public class Store { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + private String name; + + @NotNull + private String phone; + + @Builder + public Store(String name, String phone){ + this.name=name; + this.phone=phone; + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java b/src/main/java/org/dailystudio/springbootstudy/domain/Team.java deleted file mode 100644 index 97bbcd1..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Team.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dailystudio.springbootstudy.domain; - -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; -import org.dailystudio.springbootstudy.dto.team.TeamResDto; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.util.List; - -@Entity -@Table(name = "team") -@Getter -@NoArgsConstructor -public class Team { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "team_id") - private Long id; - - @NotNull - private String name; - - @OneToMany(mappedBy = "team") - private List members; - - @Builder - public Team(String name) { - this.name = name; - } - - private Team(Long id, String name) { - this.id = id; - this.name = name; - } - - public void changeName(TeamNameChangeReqDto teamNameChangeReqDto) { - this.name = teamNameChangeReqDto.getName(); - } - - public static Team getBasic(){ - return new Team(1L,"기본팀"); - } - - public TeamResDto toDto(){ - return new TeamResDto(this); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java deleted file mode 100644 index 6a13d9a..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java +++ /dev/null @@ -1,15 +0,0 @@ -//package org.dailystudio.springbootstudy.dto.child; -// -//import lombok.Getter; -//import org.dailystudio.springbootstudy.domain.Child; -// -//@Getter -//public class ChildResDto { -// private String name; -// private String parentName; -// -// public ChildResDto(Child child) { -// this.name = child.getName(); -// this.parentName = child.getParent().getName(); -// } -//} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java deleted file mode 100644 index 7725b4b..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/member/MemberSaveReqDto.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dailystudio.springbootstudy.dto.member; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.Member; -import org.dailystudio.springbootstudy.domain.Team; - -@Getter -public class MemberSaveReqDto { - - @ApiModelProperty(example = "example@gmail.com", position = 1) - private String userEmail; - - @ApiModelProperty(example = "박찬인", position = 2) - private String userName; - - @ApiModelProperty(example = "q1w2e3", position = 3) - private String userPass; - - public Member toEntity(Team team) { - return Member.builder() - .team(team) - .email(this.userEmail) - .name(this.userName) - .pass(this.userPass) - .team(team) - .build(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java deleted file mode 100644 index 3b343c0..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dailystudio.springbootstudy.dto.parent; - -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.Child; -import org.dailystudio.springbootstudy.domain.Parent; - -import java.util.List; - -@Getter -public class ParentDto { - private Long id; - private String name; - - private List children; - - public ParentDto(Parent parent){ - this.id=parent.getId(); - this.name=parent.getName(); - this.children=parent.getChildren(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java deleted file mode 100644 index b0f4a65..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamDeleteReqDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.dailystudio.springbootstudy.dto.team; - -import lombok.Getter; - -@Getter -public class TeamDeleteReqDto { - private Long id; -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java deleted file mode 100644 index 536b64d..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamNameChangeReqDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.dailystudio.springbootstudy.dto.team; - -import lombok.Getter; - -@Getter -public class TeamNameChangeReqDto { - private Long id; - private String name; -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java deleted file mode 100644 index 3d32743..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamResDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dailystudio.springbootstudy.dto.team; - -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.Team; - -@Getter -public class TeamResDto { - private String teamName; - - public TeamResDto(Team team) { - this.teamName = team.getName(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java deleted file mode 100644 index 750e840..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/dto/team/TeamSaveReqDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dailystudio.springbootstudy.dto.team; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import org.dailystudio.springbootstudy.domain.Team; - -@Getter -public class TeamSaveReqDto { - - @ApiModelProperty(example = "팀 스부스", position = 1) - private String teamName; - - public Team toEntity(){ - return Team.builder() - .name(this.teamName) - .build(); - } -} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java deleted file mode 100644 index 0773043..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/repository/MemberRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.dailystudio.springbootstudy.repository; - - -import org.dailystudio.springbootstudy.domain.Member; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MemberRepository extends JpaRepository { -} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java deleted file mode 100644 index 92930a7..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.dailystudio.springbootstudy.repository; - -import org.dailystudio.springbootstudy.domain.Parent; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ParentRepository extends JpaRepository { -} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/StoreRepository.java similarity index 51% rename from src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java rename to src/main/java/org/dailystudio/springbootstudy/repository/StoreRepository.java index 06d24ee..03152ac 100644 --- a/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java +++ b/src/main/java/org/dailystudio/springbootstudy/repository/StoreRepository.java @@ -1,7 +1,7 @@ package org.dailystudio.springbootstudy.repository; -import org.dailystudio.springbootstudy.domain.Child; +import org.dailystudio.springbootstudy.domain.Store; import org.springframework.data.jpa.repository.JpaRepository; -public interface ChildRepository extends JpaRepository { +public interface StoreRepository extends JpaRepository { } diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java deleted file mode 100644 index 2133266..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/repository/TeamRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.dailystudio.springbootstudy.repository; - -import org.dailystudio.springbootstudy.domain.Team; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TeamRepository extends JpaRepository { -} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java b/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java new file mode 100644 index 0000000..a4a6e37 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java @@ -0,0 +1,28 @@ +package org.dailystudio.springbootstudy.repository.querydsl; + +import com.querydsl.jpa.impl.JPAQueryFactory; +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 findByName(String name){ + return jpaQueryFactory + .selectFrom(store) + .where(store.name.eq(name)) + .fetch(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java deleted file mode 100644 index ae1f168..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.dailystudio.springbootstudy.service; - -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Child; -import org.dailystudio.springbootstudy.domain.Parent; -import org.dailystudio.springbootstudy.repository.ChildRepository; -import org.dailystudio.springbootstudy.repository.ParentRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class FamilyService { - - private final ParentRepository parentRepository; - private final ChildRepository childRepository; - -// @Transactional(readOnly = true) -// public List getAllChild(){ -// List children = childRepository.findAll(); -// return children; -// } -// -// @Transactional -// public void saveParentForManyToOne() { -// Parent parent1 = new Parent(); -// parent1.setName("부모님1"); -// Parent parent2 = new Parent(); -// parent2.setName("부모님2"); -// -// parentRepository.save(parent1); -// parentRepository.save(parent2); -// } -// -// @Transactional -// public void saveChildForManyToOne() { -// Parent parent1 = parentRepository.getOne(1L); -// -// Child child1 = new Child(); -// Child child2 = new Child(); -// -// child1.setName("자식1"); -// child1.setParent(parent1); -// -// child2.setName("자식2"); -// child2.setParent(parent1); -// -// childRepository.save(child1); -// childRepository.save(child2); -// } - - - @Transactional(readOnly = true) - public Parent getParent(Long id) { - Parent parent = parentRepository.getOne(id); - return parent; - } - - @Transactional - public void saveParentForOneToMany() { - Parent parent3 = new Parent(); - parent3.setName("부모님3"); - - Child child1 = new Child(); - Child child2 = new Child(); - - child1.setName("자식3"); - child2.setName("자식4"); - - - parent3.getChildren().add(child1); - parent3.getChildren().add(child2); - - parentRepository.save(parent3); - } - - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java b/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java deleted file mode 100644 index 5198c9d..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/service/MemberService.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.dailystudio.springbootstudy.service; - -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Member; -import org.dailystudio.springbootstudy.domain.Team; -import org.dailystudio.springbootstudy.dto.member.MemberSaveReqDto; -import org.dailystudio.springbootstudy.repository.MemberRepository; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class MemberService { - - private final MemberRepository memberRepository; - - public void save(MemberSaveReqDto memberSaveReqDto) { - Team basicTeam = Team.getBasic(); - Member member = memberSaveReqDto.toEntity(basicTeam); - memberRepository.save(member); - } - -} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java b/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java deleted file mode 100644 index 44044b0..0000000 --- a/src/main/java/org/dailystudio/springbootstudy/service/TeamService.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.dailystudio.springbootstudy.service; - -import lombok.RequiredArgsConstructor; -import org.dailystudio.springbootstudy.domain.Team; -import org.dailystudio.springbootstudy.dto.team.TeamDeleteReqDto; -import org.dailystudio.springbootstudy.dto.team.TeamNameChangeReqDto; -import org.dailystudio.springbootstudy.dto.team.TeamResDto; -import org.dailystudio.springbootstudy.dto.team.TeamSaveReqDto; -import org.dailystudio.springbootstudy.repository.TeamRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class TeamService { - - private final TeamRepository teamRepository; - - @Transactional - public void save(TeamSaveReqDto teamSaveReqDto) { - Team team = teamSaveReqDto.toEntity(); - teamRepository.save(team); - } - - @Transactional(readOnly = true) - public List dontGetTeams() { - List teams = teamRepository.findAll(); - return teams; - } - - @Transactional(readOnly = true) - public List getTeams() { - List teams = teamRepository.findAll(); - - List teamResDtos = teams.stream() - .map(team -> team.toDto()) - .collect(Collectors.toList()); - - return teamResDtos; - } - - @Transactional - public void changeTeamName(TeamNameChangeReqDto teamNameChangeReqDto) { - Team team = teamRepository.getOne(teamNameChangeReqDto.getId()); - team.changeName(teamNameChangeReqDto); - } - - @Transactional - public void deleteTeam(TeamDeleteReqDto teamDeleteReqDto) { - Team team = teamRepository.getOne(teamDeleteReqDto.getId()); - teamRepository.delete(team); - } -} diff --git a/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java b/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java new file mode 100644 index 0000000..03fd609 --- /dev/null +++ b/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java @@ -0,0 +1,52 @@ +package org.dailystudio.springbootstudy.controller; + +import org.dailystudio.springbootstudy.domain.Store; +import org.dailystudio.springbootstudy.repository.StoreRepository; +import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class StoreControllerTest { + + @Autowired + private StoreRepository storeRepository; + + @Autowired + private StoreRepositorySupport storeRepositorySupport; + + @After + public void tearDown() throws Exception { + storeRepository.deleteAllInBatch(); + } + + @Test + public void 쿼리디에셀_작동테스트() { + //given + String name = "김밥천국"; + String phone = "010-1234-5678"; + + String name1 = "천국김밥"; + String phone1 = "010-5678-1234"; + storeRepository.save(new Store(name, phone)); + storeRepository.save(new Store(name1, phone1)); + + //when + List stores = storeRepositorySupport.findByName(name); + + //then + assertThat(stores.size()).isEqualTo(1); + assertThat(stores.get(0).getName()).isEqualTo(name); + } + +} \ No newline at end of file From eaf2d5fbd62292cd7876faf77d2593ae3cfb9a85 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Tue, 2 Apr 2019 20:57:31 +0900 Subject: [PATCH 22/28] =?UTF-8?q?ignore=20=EC=9E=AC=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ .../springbootstudy/domain/QStore.java | 41 ------------------- 2 files changed, 3 insertions(+), 41 deletions(-) delete mode 100644 src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java diff --git a/.gitignore b/.gitignore index 63177e3..e2dda84 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +##QueryDSL +generated + HELP.md .gradle /build/ diff --git a/src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java b/src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java deleted file mode 100644 index ac6b8d0..0000000 --- a/src/main/generated/org/dailystudio/springbootstudy/domain/QStore.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.dailystudio.springbootstudy.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.Generated; -import com.querydsl.core.types.Path; - - -/** - * QStore is a Querydsl query type for Store - */ -@Generated("com.querydsl.codegen.EntitySerializer") -public class QStore extends EntityPathBase { - - private static final long serialVersionUID = 850959364L; - - public static final QStore store = new QStore("store"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath name = createString("name"); - - public final StringPath phone = createString("phone"); - - public QStore(String variable) { - super(Store.class, forVariable(variable)); - } - - public QStore(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QStore(PathMetadata metadata) { - super(Store.class, metadata); - } - -} - From 94b9e79c92a530b96830df86070915680c572960 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Thu, 4 Apr 2019 17:49:11 +0900 Subject: [PATCH 23/28] commit --- .../springbootstudy/controller/StoreControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java b/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java index 03fd609..570b6d9 100644 --- a/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java +++ b/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java @@ -11,7 +11,6 @@ import org.springframework.test.context.junit4.SpringRunner; import java.util.List; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; From 268792e83861438f29efa73adab236d63502c7e4 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 5 Apr 2019 04:03:57 +0900 Subject: [PATCH 24/28] =?UTF-8?q?=EC=96=91=EB=B0=A9=ED=96=A5=20h2=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootstudy/domain/Clerk.java | 23 + .../springbootstudy/domain/Store.java | 6 + .../repository/ClerkRespository.java | 7 + .../resources/application-local.properties | 4 +- src/main/resources/application.properties | 9 +- src/main/resources/import.sql | 452 ++++++++++++++++++ .../controller/StoreControllerTest.java | 19 +- .../springbootstudy/domain/ClerkTest.java | 50 ++ .../springbootstudy/domain/StoreTest.java | 33 ++ 9 files changed, 590 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/repository/ClerkRespository.java create mode 100644 src/main/resources/import.sql create mode 100644 src/test/java/org/dailystudio/springbootstudy/domain/ClerkTest.java create mode 100644 src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java b/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java new file mode 100644 index 0000000..4d708e4 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java @@ -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; +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Store.java b/src/main/java/org/dailystudio/springbootstudy/domain/Store.java index 69bf5bf..c1f0717 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Store.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Store.java @@ -6,6 +6,8 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name = "store") @@ -14,6 +16,7 @@ public class Store { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "store_id") private Long id; @NotNull @@ -22,6 +25,9 @@ public class Store { @NotNull private String phone; + @OneToMany(mappedBy = "store") + private List clerks = new ArrayList<>(); + @Builder public Store(String name, String phone){ this.name=name; diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ClerkRespository.java b/src/main/java/org/dailystudio/springbootstudy/repository/ClerkRespository.java new file mode 100644 index 0000000..f37bc8e --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/ClerkRespository.java @@ -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 { +} diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 79c4cd0..9808e8e 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -2,4 +2,6 @@ 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=update \ No newline at end of file +spring.jpa.hibernate.ddl-auto=create + +spring.jpa.hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 059cf2a..e3b6313 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,12 +1,11 @@ ## properties մϴ. spring.profiles.active=local - -## Ǵ SQL մϴ. +# Database spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true -## α մϴ -logging.level.org.hibernate.type=trace -#logging.level.org.hibernate=info \ No newline at end of file +# Log +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type=TRACE \ No newline at end of file diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql new file mode 100644 index 0000000..501e7ee --- /dev/null +++ b/src/main/resources/import.sql @@ -0,0 +1,452 @@ +--상점 50개 더미 데이터 + 점원 400개 더미 데이터 +INSERT INTO store (name, phone) VALUES ('name 001', 'phone 001'); +INSERT INTO store (name, phone) VALUES ('name 002', 'phone 002'); +INSERT INTO store (name, phone) VALUES ('name 003', 'phone 003'); +INSERT INTO store (name, phone) VALUES ('name 004', 'phone 004'); +INSERT INTO store (name, phone) VALUES ('name 005', 'phone 005'); +INSERT INTO store (name, phone) VALUES ('name 006', 'phone 006'); +INSERT INTO store (name, phone) VALUES ('name 007', 'phone 007'); +INSERT INTO store (name, phone) VALUES ('name 008', 'phone 008'); +INSERT INTO store (name, phone) VALUES ('name 009', 'phone 009'); +INSERT INTO store (name, phone) VALUES ('name 010', 'phone 010'); +INSERT INTO store (name, phone) VALUES ('name 011', 'phone 011'); +INSERT INTO store (name, phone) VALUES ('name 012', 'phone 012'); +INSERT INTO store (name, phone) VALUES ('name 013', 'phone 013'); +INSERT INTO store (name, phone) VALUES ('name 014', 'phone 014'); +INSERT INTO store (name, phone) VALUES ('name 015', 'phone 015'); +INSERT INTO store (name, phone) VALUES ('name 016', 'phone 016'); +INSERT INTO store (name, phone) VALUES ('name 017', 'phone 017'); +INSERT INTO store (name, phone) VALUES ('name 018', 'phone 018'); +INSERT INTO store (name, phone) VALUES ('name 019', 'phone 019'); +INSERT INTO store (name, phone) VALUES ('name 020', 'phone 020'); +INSERT INTO store (name, phone) VALUES ('name 021', 'phone 021'); +INSERT INTO store (name, phone) VALUES ('name 022', 'phone 022'); +INSERT INTO store (name, phone) VALUES ('name 023', 'phone 023'); +INSERT INTO store (name, phone) VALUES ('name 024', 'phone 024'); +INSERT INTO store (name, phone) VALUES ('name 025', 'phone 025'); +INSERT INTO store (name, phone) VALUES ('name 026', 'phone 026'); +INSERT INTO store (name, phone) VALUES ('name 027', 'phone 027'); +INSERT INTO store (name, phone) VALUES ('name 028', 'phone 028'); +INSERT INTO store (name, phone) VALUES ('name 029', 'phone 029'); +INSERT INTO store (name, phone) VALUES ('name 030', 'phone 030'); +INSERT INTO store (name, phone) VALUES ('name 031', 'phone 031'); +INSERT INTO store (name, phone) VALUES ('name 032', 'phone 032'); +INSERT INTO store (name, phone) VALUES ('name 033', 'phone 033'); +INSERT INTO store (name, phone) VALUES ('name 034', 'phone 034'); +INSERT INTO store (name, phone) VALUES ('name 035', 'phone 035'); +INSERT INTO store (name, phone) VALUES ('name 036', 'phone 036'); +INSERT INTO store (name, phone) VALUES ('name 037', 'phone 037'); +INSERT INTO store (name, phone) VALUES ('name 038', 'phone 038'); +INSERT INTO store (name, phone) VALUES ('name 039', 'phone 039'); +INSERT INTO store (name, phone) VALUES ('name 040', 'phone 040'); +INSERT INTO store (name, phone) VALUES ('name 041', 'phone 041'); +INSERT INTO store (name, phone) VALUES ('name 042', 'phone 042'); +INSERT INTO store (name, phone) VALUES ('name 043', 'phone 043'); +INSERT INTO store (name, phone) VALUES ('name 044', 'phone 044'); +INSERT INTO store (name, phone) VALUES ('name 045', 'phone 045'); +INSERT INTO store (name, phone) VALUES ('name 046', 'phone 046'); +INSERT INTO store (name, phone) VALUES ('name 047', 'phone 047'); +INSERT INTO store (name, phone) VALUES ('name 048', 'phone 048'); +INSERT INTO store (name, phone) VALUES ('name 049', 'phone 049'); +INSERT INTO store (name, phone) VALUES ('name 050', 'phone 050'); + +INSERT INTO clerk (name, store_id) VALUES ('name 0001', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0002', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0003', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0004', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0005', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0006', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0007', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0008', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0009', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0010', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0011', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0012', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0013', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0014', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0015', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0016', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0017', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0018', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0019', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0020', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0021', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0022', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0023', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0024', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0025', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0026', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0027', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0028', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0029', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0030', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0031', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0032', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0033', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0034', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0035', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0036', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0037', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0038', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0039', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0040', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0041', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0042', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0043', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0044', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0045', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0046', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0047', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0048', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0049', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0050', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0051', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0052', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0053', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0054', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0055', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0056', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0057', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0058', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0059', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0060', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0061', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0062', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0063', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0064', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0065', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0066', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0067', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0068', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0069', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0070', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0071', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0072', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0073', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0074', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0075', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0076', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0077', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0078', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0079', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0080', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0081', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0082', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0083', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0084', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0085', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0086', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0087', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0088', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0089', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0090', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0091', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0092', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0093', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0094', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0095', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0096', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0097', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0098', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0099', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0100', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0101', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0102', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0103', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0104', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0105', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0106', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0107', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0108', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0109', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0110', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0111', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0112', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0113', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0114', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0115', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0116', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0117', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0118', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0119', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0120', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0121', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0122', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0123', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0124', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0125', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0126', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0127', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0128', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0129', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0130', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0131', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0132', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0133', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0134', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0135', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0136', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0137', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0138', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0139', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0140', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0141', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0142', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0143', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0144', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0145', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0146', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0147', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0148', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0149', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0150', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0151', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0152', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0153', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0154', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0155', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0156', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0157', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0158', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0159', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0160', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0161', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0162', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0163', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0164', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0165', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0166', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0167', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0168', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0169', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0170', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0171', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0172', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0173', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0174', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0175', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0176', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0177', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0178', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0179', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0180', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0181', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0182', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0183', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0184', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0185', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0186', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0187', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0188', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0189', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0190', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0191', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0192', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0193', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0194', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0195', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0196', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0197', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0198', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0199', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0200', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0201', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0202', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0203', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0204', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0205', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0206', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0207', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0208', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0209', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0210', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0211', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0212', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0213', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0214', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0215', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0216', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0217', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0218', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0219', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0220', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0221', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0222', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0223', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0224', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0225', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0226', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0227', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0228', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0229', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0230', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0231', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0232', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0233', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0234', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0235', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0236', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0237', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0238', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0239', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0240', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0241', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0242', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0243', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0244', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0245', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0246', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0247', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0248', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0249', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0250', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0251', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0252', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0253', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0254', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0255', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0256', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0257', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0258', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0259', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0260', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0261', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0262', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0263', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0264', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0265', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0266', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0267', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0268', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0269', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0270', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0271', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0272', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0273', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0274', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0275', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0276', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0277', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0278', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0279', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0280', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0281', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0282', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0283', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0284', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0285', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0286', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0287', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0288', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0289', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0290', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0291', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0292', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0293', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0294', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0295', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0296', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0297', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0298', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0299', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0300', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0301', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0302', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0303', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0304', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0305', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0306', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0307', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0308', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0309', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0310', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0311', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0312', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0313', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0314', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0315', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0316', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0317', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0318', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0319', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0320', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0321', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0322', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0323', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0324', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0325', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0326', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0327', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0328', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0329', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0330', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0331', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0332', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0333', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0334', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0335', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0336', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0337', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0338', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0339', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0340', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0341', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0342', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0343', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0344', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0345', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0346', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0347', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0348', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0349', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0350', 50); +INSERT INTO clerk (name, store_id) VALUES ('name 0351', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0352', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0353', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0354', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0355', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0356', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0357', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0358', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0359', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0360', 10); +INSERT INTO clerk (name, store_id) VALUES ('name 0361', 11); +INSERT INTO clerk (name, store_id) VALUES ('name 0362', 12); +INSERT INTO clerk (name, store_id) VALUES ('name 0363', 13); +INSERT INTO clerk (name, store_id) VALUES ('name 0364', 14); +INSERT INTO clerk (name, store_id) VALUES ('name 0365', 15); +INSERT INTO clerk (name, store_id) VALUES ('name 0366', 16); +INSERT INTO clerk (name, store_id) VALUES ('name 0367', 17); +INSERT INTO clerk (name, store_id) VALUES ('name 0368', 18); +INSERT INTO clerk (name, store_id) VALUES ('name 0369', 19); +INSERT INTO clerk (name, store_id) VALUES ('name 0370', 20); +INSERT INTO clerk (name, store_id) VALUES ('name 0371', 21); +INSERT INTO clerk (name, store_id) VALUES ('name 0372', 22); +INSERT INTO clerk (name, store_id) VALUES ('name 0373', 23); +INSERT INTO clerk (name, store_id) VALUES ('name 0374', 24); +INSERT INTO clerk (name, store_id) VALUES ('name 0375', 25); +INSERT INTO clerk (name, store_id) VALUES ('name 0376', 26); +INSERT INTO clerk (name, store_id) VALUES ('name 0377', 27); +INSERT INTO clerk (name, store_id) VALUES ('name 0378', 28); +INSERT INTO clerk (name, store_id) VALUES ('name 0379', 29); +INSERT INTO clerk (name, store_id) VALUES ('name 0380', 30); +INSERT INTO clerk (name, store_id) VALUES ('name 0381', 31); +INSERT INTO clerk (name, store_id) VALUES ('name 0382', 32); +INSERT INTO clerk (name, store_id) VALUES ('name 0383', 33); +INSERT INTO clerk (name, store_id) VALUES ('name 0384', 34); +INSERT INTO clerk (name, store_id) VALUES ('name 0385', 35); +INSERT INTO clerk (name, store_id) VALUES ('name 0386', 36); +INSERT INTO clerk (name, store_id) VALUES ('name 0387', 37); +INSERT INTO clerk (name, store_id) VALUES ('name 0388', 38); +INSERT INTO clerk (name, store_id) VALUES ('name 0389', 39); +INSERT INTO clerk (name, store_id) VALUES ('name 0390', 40); +INSERT INTO clerk (name, store_id) VALUES ('name 0391', 41); +INSERT INTO clerk (name, store_id) VALUES ('name 0392', 42); +INSERT INTO clerk (name, store_id) VALUES ('name 0393', 43); +INSERT INTO clerk (name, store_id) VALUES ('name 0394', 44); +INSERT INTO clerk (name, store_id) VALUES ('name 0395', 45); +INSERT INTO clerk (name, store_id) VALUES ('name 0396', 46); +INSERT INTO clerk (name, store_id) VALUES ('name 0397', 47); +INSERT INTO clerk (name, store_id) VALUES ('name 0398', 48); +INSERT INTO clerk (name, store_id) VALUES ('name 0399', 49); +INSERT INTO clerk (name, store_id) VALUES ('name 0400', 50); \ No newline at end of file diff --git a/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java b/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java index 570b6d9..b28d178 100644 --- a/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java +++ b/src/test/java/org/dailystudio/springbootstudy/controller/StoreControllerTest.java @@ -4,6 +4,7 @@ import org.dailystudio.springbootstudy.repository.StoreRepository; import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -24,13 +25,8 @@ public class StoreControllerTest { @Autowired private StoreRepositorySupport storeRepositorySupport; - @After - public void tearDown() throws Exception { - storeRepository.deleteAllInBatch(); - } - - @Test - public void 쿼리디에셀_작동테스트() { + @Before + public void setUp() throws Exception{ //given String name = "김밥천국"; String phone = "010-1234-5678"; @@ -39,7 +35,16 @@ public void tearDown() throws Exception { String phone1 = "010-5678-1234"; storeRepository.save(new Store(name, phone)); storeRepository.save(new Store(name1, phone1)); + } + @After + public void tearDown() throws Exception { + storeRepository.deleteAllInBatch(); + } + + @Test + public void 쿼리디에셀_작동테스트() { + String name = "김밥천국"; //when List stores = storeRepositorySupport.findByName(name); diff --git a/src/test/java/org/dailystudio/springbootstudy/domain/ClerkTest.java b/src/test/java/org/dailystudio/springbootstudy/domain/ClerkTest.java new file mode 100644 index 0000000..1b20fc8 --- /dev/null +++ b/src/test/java/org/dailystudio/springbootstudy/domain/ClerkTest.java @@ -0,0 +1,50 @@ +package org.dailystudio.springbootstudy.domain; + +import org.dailystudio.springbootstudy.repository.ClerkRespository; +import org.dailystudio.springbootstudy.repository.StoreRepository; +import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ClerkTest { + + + @Autowired + private StoreRepository storeRepository; + + @Autowired + private StoreRepositorySupport storeRepositorySupport; + + @Autowired + private ClerkRespository clerkRespository; + + @Before + public void setUp() throws Exception { + + } + + @Test + public void 모든_점원정보_가져오기() { + List clerks = clerkRespository.findAll(); + int size = clerks.size(); + assertThat(size).isEqualTo(400); + } + + @After + public void tearDown() throws Exception { + clerkRespository.deleteAllInBatch(); + storeRepository.deleteAllInBatch(); + } +} \ No newline at end of file diff --git a/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java b/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java new file mode 100644 index 0000000..fdaa2cc --- /dev/null +++ b/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java @@ -0,0 +1,33 @@ +package org.dailystudio.springbootstudy.domain; + +import org.dailystudio.springbootstudy.repository.StoreRepository; +import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; +import org.junit.After; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class StoreTest { + + @Autowired + private StoreRepository storeRepository; + + @Autowired + private StoreRepositorySupport storeRepositorySupport; + + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + } +} \ No newline at end of file From e07b2614d52b983606b7702c7ca05c3575f547eb Mon Sep 17 00:00:00 2001 From: pci2676 Date: Fri, 5 Apr 2019 05:17:35 +0900 Subject: [PATCH 25/28] =?UTF-8?q?querydsl=EC=9D=84=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20n+1=20=EB=A1=9C=EB=94=A9=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EA=B7=B9=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 더미 데이터 추가 2. 예제 추가 --- .../springbootstudy/domain/Clerk.java | 2 +- .../springbootstudy/dto/ClerkNameDto.java | 14 + .../querydsl/StoreRepositorySupport.java | 12 + src/main/resources/application.properties | 6 +- src/main/resources/import.sql | 786 ++++++++---------- .../springbootstudy/domain/StoreTest.java | 59 +- 6 files changed, 441 insertions(+), 438 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/dto/ClerkNameDto.java diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java b/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java index 4d708e4..07e45f7 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Clerk.java @@ -17,7 +17,7 @@ public class Clerk { @NotNull private String name; - @ManyToOne(fetch = FetchType.LAZY ) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "store_id") private Store store; } diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/ClerkNameDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/ClerkNameDto.java new file mode 100644 index 0000000..4c73846 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/ClerkNameDto.java @@ -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(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java b/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java index a4a6e37..968dd01 100644 --- a/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java +++ b/src/main/java/org/dailystudio/springbootstudy/repository/querydsl/StoreRepositorySupport.java @@ -1,6 +1,8 @@ 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; @@ -25,4 +27,14 @@ public List findByName(String name){ .where(store.name.eq(name)) .fetch(); } + + public List findAllEager(){ + QStore store = QStore.store; + QClerk clerk = QClerk.clerk; + + return from(store) + .leftJoin(store.clerks,clerk).fetchJoin() + .distinct() + .fetch(); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e3b6313..43730c6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,9 +3,9 @@ spring.profiles.active=local # Database spring.jpa.show-sql=true -spring.jpa.properties.hibernate.format_sql=true +#spring.jpa.properties.hibernate.format_sql=true # Log -logging.level.org.hibernate.SQL=DEBUG -logging.level.org.hibernate.type=TRACE \ No newline at end of file +#logging.level.org.hibernate.SQL=debug +logging.level.org.hibernate.type=debug \ No newline at end of file diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql index 501e7ee..4772f7c 100644 --- a/src/main/resources/import.sql +++ b/src/main/resources/import.sql @@ -1,4 +1,4 @@ ---상점 50개 더미 데이터 + 점원 400개 더미 데이터 +--상점 10개 더미 데이터 + 점원 360개 더미 데이터 = 1상가 36점원 INSERT INTO store (name, phone) VALUES ('name 001', 'phone 001'); INSERT INTO store (name, phone) VALUES ('name 002', 'phone 002'); INSERT INTO store (name, phone) VALUES ('name 003', 'phone 003'); @@ -8,47 +8,7 @@ INSERT INTO store (name, phone) VALUES ('name 006', 'phone 006'); INSERT INTO store (name, phone) VALUES ('name 007', 'phone 007'); INSERT INTO store (name, phone) VALUES ('name 008', 'phone 008'); INSERT INTO store (name, phone) VALUES ('name 009', 'phone 009'); -INSERT INTO store (name, phone) VALUES ('name 010', 'phone 010'); -INSERT INTO store (name, phone) VALUES ('name 011', 'phone 011'); -INSERT INTO store (name, phone) VALUES ('name 012', 'phone 012'); -INSERT INTO store (name, phone) VALUES ('name 013', 'phone 013'); -INSERT INTO store (name, phone) VALUES ('name 014', 'phone 014'); -INSERT INTO store (name, phone) VALUES ('name 015', 'phone 015'); -INSERT INTO store (name, phone) VALUES ('name 016', 'phone 016'); -INSERT INTO store (name, phone) VALUES ('name 017', 'phone 017'); -INSERT INTO store (name, phone) VALUES ('name 018', 'phone 018'); -INSERT INTO store (name, phone) VALUES ('name 019', 'phone 019'); -INSERT INTO store (name, phone) VALUES ('name 020', 'phone 020'); -INSERT INTO store (name, phone) VALUES ('name 021', 'phone 021'); -INSERT INTO store (name, phone) VALUES ('name 022', 'phone 022'); -INSERT INTO store (name, phone) VALUES ('name 023', 'phone 023'); -INSERT INTO store (name, phone) VALUES ('name 024', 'phone 024'); -INSERT INTO store (name, phone) VALUES ('name 025', 'phone 025'); -INSERT INTO store (name, phone) VALUES ('name 026', 'phone 026'); -INSERT INTO store (name, phone) VALUES ('name 027', 'phone 027'); -INSERT INTO store (name, phone) VALUES ('name 028', 'phone 028'); -INSERT INTO store (name, phone) VALUES ('name 029', 'phone 029'); -INSERT INTO store (name, phone) VALUES ('name 030', 'phone 030'); -INSERT INTO store (name, phone) VALUES ('name 031', 'phone 031'); -INSERT INTO store (name, phone) VALUES ('name 032', 'phone 032'); -INSERT INTO store (name, phone) VALUES ('name 033', 'phone 033'); -INSERT INTO store (name, phone) VALUES ('name 034', 'phone 034'); -INSERT INTO store (name, phone) VALUES ('name 035', 'phone 035'); -INSERT INTO store (name, phone) VALUES ('name 036', 'phone 036'); -INSERT INTO store (name, phone) VALUES ('name 037', 'phone 037'); -INSERT INTO store (name, phone) VALUES ('name 038', 'phone 038'); -INSERT INTO store (name, phone) VALUES ('name 039', 'phone 039'); -INSERT INTO store (name, phone) VALUES ('name 040', 'phone 040'); -INSERT INTO store (name, phone) VALUES ('name 041', 'phone 041'); -INSERT INTO store (name, phone) VALUES ('name 042', 'phone 042'); -INSERT INTO store (name, phone) VALUES ('name 043', 'phone 043'); -INSERT INTO store (name, phone) VALUES ('name 044', 'phone 044'); -INSERT INTO store (name, phone) VALUES ('name 045', 'phone 045'); -INSERT INTO store (name, phone) VALUES ('name 046', 'phone 046'); -INSERT INTO store (name, phone) VALUES ('name 047', 'phone 047'); -INSERT INTO store (name, phone) VALUES ('name 048', 'phone 048'); -INSERT INTO store (name, phone) VALUES ('name 049', 'phone 049'); -INSERT INTO store (name, phone) VALUES ('name 050', 'phone 050'); + INSERT INTO clerk (name, store_id) VALUES ('name 0001', 1); INSERT INTO clerk (name, store_id) VALUES ('name 0002', 2); @@ -59,394 +19,354 @@ INSERT INTO clerk (name, store_id) VALUES ('name 0006', 6); INSERT INTO clerk (name, store_id) VALUES ('name 0007', 7); INSERT INTO clerk (name, store_id) VALUES ('name 0008', 8); INSERT INTO clerk (name, store_id) VALUES ('name 0009', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0010', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0011', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0012', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0013', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0014', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0015', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0016', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0017', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0018', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0019', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0020', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0021', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0022', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0023', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0024', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0025', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0026', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0027', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0028', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0029', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0030', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0031', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0032', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0033', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0034', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0035', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0036', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0037', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0038', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0039', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0040', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0041', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0042', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0043', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0044', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0045', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0046', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0047', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0048', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0049', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0050', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0051', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0052', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0053', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0054', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0055', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0056', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0057', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0058', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0059', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0060', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0061', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0062', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0063', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0064', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0065', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0066', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0067', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0068', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0069', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0070', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0071', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0072', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0073', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0074', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0075', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0076', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0077', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0078', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0079', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0080', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0081', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0082', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0083', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0084', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0085', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0086', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0087', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0088', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0089', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0090', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0091', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0092', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0093', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0094', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0095', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0096', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0097', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0098', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0099', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0100', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0101', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0102', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0103', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0104', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0105', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0106', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0107', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0108', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0109', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0110', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0111', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0112', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0113', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0114', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0115', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0116', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0117', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0118', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0119', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0120', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0121', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0122', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0123', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0124', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0125', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0126', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0127', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0128', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0129', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0130', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0131', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0132', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0133', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0134', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0135', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0136', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0137', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0138', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0139', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0140', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0141', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0142', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0143', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0144', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0145', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0146', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0147', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0148', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0149', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0150', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0151', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0152', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0153', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0154', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0155', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0156', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0157', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0158', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0159', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0160', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0161', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0162', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0163', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0164', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0165', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0166', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0167', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0168', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0169', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0170', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0171', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0172', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0173', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0174', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0175', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0176', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0177', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0178', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0179', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0180', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0181', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0182', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0183', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0184', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0185', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0186', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0187', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0188', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0189', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0190', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0191', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0192', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0193', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0194', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0195', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0196', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0197', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0198', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0199', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0200', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0201', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0202', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0203', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0204', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0205', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0206', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0207', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0208', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0209', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0210', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0211', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0212', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0213', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0214', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0215', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0216', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0217', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0218', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0219', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0220', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0221', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0222', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0223', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0224', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0225', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0226', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0227', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0228', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0229', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0230', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0231', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0232', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0233', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0234', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0235', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0236', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0237', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0238', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0239', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0240', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0241', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0242', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0243', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0244', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0245', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0246', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0247', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0248', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0249', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0250', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0251', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0252', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0253', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0254', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0255', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0256', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0257', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0258', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0259', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0260', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0261', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0262', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0263', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0264', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0265', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0266', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0267', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0268', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0269', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0270', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0271', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0272', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0273', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0274', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0275', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0276', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0277', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0278', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0279', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0280', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0281', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0282', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0283', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0284', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0285', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0286', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0287', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0288', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0289', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0290', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0291', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0292', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0293', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0294', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0295', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0296', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0297', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0298', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0299', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0300', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0301', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0302', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0303', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0304', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0305', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0306', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0307', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0308', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0309', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0310', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0311', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0312', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0313', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0314', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0315', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0316', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0317', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0318', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0319', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0320', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0321', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0322', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0323', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0324', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0325', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0326', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0327', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0328', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0329', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0330', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0331', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0332', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0333', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0334', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0335', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0336', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0337', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0338', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0339', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0340', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0341', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0342', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0343', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0344', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0345', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0346', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0347', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0348', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0349', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0350', 50); -INSERT INTO clerk (name, store_id) VALUES ('name 0351', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0352', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0353', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0354', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0355', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0356', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0357', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0358', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0359', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0360', 10); -INSERT INTO clerk (name, store_id) VALUES ('name 0361', 11); -INSERT INTO clerk (name, store_id) VALUES ('name 0362', 12); -INSERT INTO clerk (name, store_id) VALUES ('name 0363', 13); -INSERT INTO clerk (name, store_id) VALUES ('name 0364', 14); -INSERT INTO clerk (name, store_id) VALUES ('name 0365', 15); -INSERT INTO clerk (name, store_id) VALUES ('name 0366', 16); -INSERT INTO clerk (name, store_id) VALUES ('name 0367', 17); -INSERT INTO clerk (name, store_id) VALUES ('name 0368', 18); -INSERT INTO clerk (name, store_id) VALUES ('name 0369', 19); -INSERT INTO clerk (name, store_id) VALUES ('name 0370', 20); -INSERT INTO clerk (name, store_id) VALUES ('name 0371', 21); -INSERT INTO clerk (name, store_id) VALUES ('name 0372', 22); -INSERT INTO clerk (name, store_id) VALUES ('name 0373', 23); -INSERT INTO clerk (name, store_id) VALUES ('name 0374', 24); -INSERT INTO clerk (name, store_id) VALUES ('name 0375', 25); -INSERT INTO clerk (name, store_id) VALUES ('name 0376', 26); -INSERT INTO clerk (name, store_id) VALUES ('name 0377', 27); -INSERT INTO clerk (name, store_id) VALUES ('name 0378', 28); -INSERT INTO clerk (name, store_id) VALUES ('name 0379', 29); -INSERT INTO clerk (name, store_id) VALUES ('name 0380', 30); -INSERT INTO clerk (name, store_id) VALUES ('name 0381', 31); -INSERT INTO clerk (name, store_id) VALUES ('name 0382', 32); -INSERT INTO clerk (name, store_id) VALUES ('name 0383', 33); -INSERT INTO clerk (name, store_id) VALUES ('name 0384', 34); -INSERT INTO clerk (name, store_id) VALUES ('name 0385', 35); -INSERT INTO clerk (name, store_id) VALUES ('name 0386', 36); -INSERT INTO clerk (name, store_id) VALUES ('name 0387', 37); -INSERT INTO clerk (name, store_id) VALUES ('name 0388', 38); -INSERT INTO clerk (name, store_id) VALUES ('name 0389', 39); -INSERT INTO clerk (name, store_id) VALUES ('name 0390', 40); -INSERT INTO clerk (name, store_id) VALUES ('name 0391', 41); -INSERT INTO clerk (name, store_id) VALUES ('name 0392', 42); -INSERT INTO clerk (name, store_id) VALUES ('name 0393', 43); -INSERT INTO clerk (name, store_id) VALUES ('name 0394', 44); -INSERT INTO clerk (name, store_id) VALUES ('name 0395', 45); -INSERT INTO clerk (name, store_id) VALUES ('name 0396', 46); -INSERT INTO clerk (name, store_id) VALUES ('name 0397', 47); -INSERT INTO clerk (name, store_id) VALUES ('name 0398', 48); -INSERT INTO clerk (name, store_id) VALUES ('name 0399', 49); -INSERT INTO clerk (name, store_id) VALUES ('name 0400', 50); \ No newline at end of file +INSERT INTO clerk (name, store_id) VALUES ('name 0010', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0011', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0012', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0013', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0014', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0015', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0016', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0017', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0018', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0019', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0020', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0021', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0022', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0023', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0024', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0025', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0026', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0027', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0028', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0029', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0030', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0031', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0032', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0033', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0034', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0035', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0036', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0037', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0038', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0039', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0040', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0041', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0042', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0043', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0044', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0045', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0046', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0047', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0048', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0049', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0050', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0051', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0052', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0053', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0054', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0055', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0056', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0057', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0058', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0059', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0060', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0061', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0062', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0063', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0064', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0065', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0066', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0067', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0068', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0069', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0070', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0071', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0072', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0073', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0074', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0075', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0076', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0077', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0078', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0079', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0080', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0081', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0082', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0083', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0084', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0085', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0086', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0087', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0088', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0089', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0090', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0091', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0092', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0093', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0094', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0095', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0096', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0097', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0098', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0099', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0100', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0101', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0102', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0103', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0104', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0105', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0106', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0107', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0108', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0109', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0110', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0111', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0112', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0113', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0114', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0115', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0116', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0117', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0118', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0119', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0120', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0121', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0122', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0123', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0124', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0125', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0126', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0127', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0128', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0129', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0130', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0131', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0132', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0133', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0134', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0135', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0136', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0137', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0138', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0139', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0140', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0141', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0142', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0143', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0144', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0145', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0146', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0147', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0148', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0149', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0150', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0151', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0152', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0153', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0154', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0155', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0156', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0157', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0158', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0159', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0160', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0161', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0162', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0163', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0164', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0165', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0166', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0167', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0168', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0169', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0170', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0171', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0172', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0173', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0174', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0175', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0176', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0177', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0178', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0179', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0180', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0181', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0182', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0183', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0184', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0185', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0186', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0187', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0188', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0189', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0190', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0191', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0192', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0193', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0194', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0195', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0196', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0197', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0198', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0199', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0200', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0201', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0202', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0203', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0204', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0205', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0206', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0207', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0208', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0209', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0210', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0211', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0212', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0213', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0214', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0215', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0216', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0217', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0218', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0219', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0220', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0221', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0222', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0223', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0224', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0225', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0226', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0227', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0228', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0229', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0230', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0231', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0232', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0233', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0234', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0235', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0236', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0237', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0238', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0239', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0240', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0241', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0242', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0243', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0244', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0245', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0246', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0247', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0248', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0249', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0250', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0251', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0252', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0253', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0254', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0255', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0256', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0257', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0258', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0259', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0260', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0261', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0262', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0263', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0264', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0265', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0266', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0267', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0268', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0269', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0270', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0271', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0272', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0273', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0274', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0275', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0276', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0277', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0278', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0279', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0280', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0281', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0282', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0283', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0284', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0285', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0286', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0287', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0288', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0289', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0290', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0291', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0292', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0293', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0294', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0295', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0296', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0297', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0298', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0299', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0300', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0301', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0302', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0303', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0304', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0305', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0306', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0307', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0308', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0309', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0310', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0311', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0312', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0313', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0314', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0315', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0316', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0317', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0318', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0319', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0320', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0321', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0322', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0323', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0324', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0325', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0326', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0327', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0328', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0329', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0330', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0331', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0332', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0333', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0334', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0335', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0336', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0337', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0338', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0339', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0340', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0341', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0342', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0343', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0344', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0345', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0346', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0347', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0348', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0349', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0350', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0351', 9); +INSERT INTO clerk (name, store_id) VALUES ('name 0352', 1); +INSERT INTO clerk (name, store_id) VALUES ('name 0353', 2); +INSERT INTO clerk (name, store_id) VALUES ('name 0354', 3); +INSERT INTO clerk (name, store_id) VALUES ('name 0355', 4); +INSERT INTO clerk (name, store_id) VALUES ('name 0356', 5); +INSERT INTO clerk (name, store_id) VALUES ('name 0357', 6); +INSERT INTO clerk (name, store_id) VALUES ('name 0358', 7); +INSERT INTO clerk (name, store_id) VALUES ('name 0359', 8); +INSERT INTO clerk (name, store_id) VALUES ('name 0360', 9); diff --git a/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java b/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java index fdaa2cc..d02b126 100644 --- a/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java +++ b/src/test/java/org/dailystudio/springbootstudy/domain/StoreTest.java @@ -1,15 +1,23 @@ package org.dailystudio.springbootstudy.domain; +import org.dailystudio.springbootstudy.dto.ClerkNameDto; +import org.dailystudio.springbootstudy.repository.ClerkRespository; import org.dailystudio.springbootstudy.repository.StoreRepository; import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; import org.junit.After; import org.junit.Before; +import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; -import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest @@ -18,6 +26,9 @@ public class StoreTest { @Autowired private StoreRepository storeRepository; + @Autowired + private ClerkRespository clerkRespository; + @Autowired private StoreRepositorySupport storeRepositorySupport; @@ -27,7 +38,53 @@ public void setUp() throws Exception { } + @Test + @Transactional + public void 상점에서_점원들_불러오기_엔플러스일문제발생() { + List stores = storeRepository.findAll(); + + + List names = new ArrayList<>(); + + for(Store store : stores){ + List eachNames = store.getClerks() + .stream() + .map(Clerk::getName) + .collect(Collectors.toList()); + names.addAll(eachNames); + } + + + int size = names.size(); + + assertThat(size).isEqualTo(360); + } + + @Test + @Transactional + public void 상점에서_점원들_불러오기() { + List stores = storeRepositorySupport.findAllEager(); +// Store store = storeRepository.getOne(1L); + + List names = new ArrayList<>(); + + for(Store store : stores){ + List eachNames = store.getClerks() + .stream() + .map(Clerk::getName) + .collect(Collectors.toList()); + names.addAll(eachNames); + } + + + int size = names.size(); + + assertThat(size).isEqualTo(360); + } + @After public void tearDown() throws Exception { + clerkRespository.deleteAllInBatch(); + storeRepository.deleteAllInBatch(); } } \ No newline at end of file From 681cf30107e9612de240137ecab3d46a05144798 Mon Sep 17 00:00:00 2001 From: pci2676 Date: Mon, 8 Apr 2019 18:03:05 +0900 Subject: [PATCH 26/28] =?UTF-8?q?aop=20=EB=B0=8F=20jwt=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 24 +- .../SpringbootstudyApplication.java | 2 + .../springbootstudy/auth/jwt/JwtAuth.java | 10 + .../auth/jwt/JwtAuthAspect.java | 41 + .../springbootstudy/auth/jwt/JwtFactory.java | 50 ++ .../springbootstudy/auth/jwt/JwtInfo.java | 28 + .../controller/LoginController.java | 25 + .../controller/StoreController.java | 20 + .../springbootstudy/util/LogAspect.java | 95 +++ src/main/resources/import.sql | 744 +++++++++--------- 10 files changed, 656 insertions(+), 383 deletions(-) create mode 100644 src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtFactory.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtInfo.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/controller/LoginController.java create mode 100644 src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java diff --git a/build.gradle b/build.gradle index 3309015..08ae433 100644 --- a/build.gradle +++ b/build.gradle @@ -37,21 +37,23 @@ configurations { dependencies { - compile("com.querydsl:querydsl-jpa") // querydsl - compile("com.querydsl:querydsl-apt") // querydsl + 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('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 + 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:+') + 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' - testImplementation 'org.springframework.boot:spring-boot-starter-test' + compile "org.projectlombok:lombok:+"//lombok + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation('com.auth0:java-jwt:3.3.0') //jwt + compile('org.springframework.boot:spring-boot-starter-aop') // aop + testImplementation 'org.springframework.boot:spring-boot-starter-test' testCompile('org.assertj:assertj-core:3.9.0')//test용 } diff --git a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java index 44a039e..934e1dc 100644 --- a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java +++ b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication +@EnableAspectJAutoProxy public class SpringbootstudyApplication { public static void main(String[] args) { diff --git a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java new file mode 100644 index 0000000..9f5473c --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java @@ -0,0 +1,10 @@ +package org.dailystudio.springbootstudy.auth.jwt; + +import java.lang.annotation.*; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface JwtAuth { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java new file mode 100644 index 0000000..5afacf9 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java @@ -0,0 +1,41 @@ +package org.dailystudio.springbootstudy.auth.jwt; + +import com.auth0.jwt.interfaces.DecodedJWT; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +@Component +@Aspect +@RequiredArgsConstructor +public class JwtAuthAspect { + + private final HttpServletRequest httpServletRequest; + + + @Around("@annotation(org.dailystudio.springbootstudy.auth.jwt.JwtAuth)") + public Object around(final ProceedingJoinPoint pjp) throws Throwable { + final String token = httpServletRequest.getHeader(JwtInfo.HEADER_NAME); + //토큰 존재 여부 확인 + if (token == null) { + throw new RuntimeException("토큰없음."); + } + //토큰 검사 + if (!JwtFactory.isValid(token)) { + throw new RuntimeException("유효성 작살."); + } + //토큰 해독 + final DecodedJWT decodedJWT = JwtFactory.decode(token); + + //토큰기반 디비에서 사용자 불러오기 + // + //사용자 제대로됨? +// if (user == null) return RES_RESPONSE_ENTITY; + return pjp.proceed(pjp.getArgs()); + + } +} \ No newline at end of file diff --git a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtFactory.java b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtFactory.java new file mode 100644 index 0000000..1a0d2b3 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtFactory.java @@ -0,0 +1,50 @@ +package org.dailystudio.springbootstudy.auth.jwt; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.exceptions.JWTCreationException; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.interfaces.DecodedJWT; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.Date; + +public class JwtFactory { + + private static final LocalDateTime NOW = LocalDateTime.now(); + + public static String create(final Long idx) { + final Date expiredDate = Date.from(NOW.plusDays(JwtInfo.EXPIRES_LIMIT).toInstant(ZoneOffset.ofHours(9))); + return create(idx, expiredDate); + } + + public static String create(final Long idx, final Date expiredDate) throws JWTCreationException { + return JWT.create() + .withClaim(JwtInfo.USER_IDX, idx.toString()) + .withIssuer(JwtInfo.ISSUER) + .withExpiresAt(expiredDate) + .sign(JwtInfo.getAlgorithm()); + } + + public static Boolean isValid(final String token) { + try { + JWTVerifier jwtVerifier = JWT.require(JwtInfo.getAlgorithm()).build(); + jwtVerifier.verify(token); + + return true; + } catch (JWTVerificationException verificationException) { + + return false; + } + } + + public static DecodedJWT decode(final String token) { + try { + return JWT.decode(token); + } catch (JWTDecodeException decodeException) { + return null; + } + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtInfo.java b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtInfo.java new file mode 100644 index 0000000..12e68cd --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtInfo.java @@ -0,0 +1,28 @@ +package org.dailystudio.springbootstudy.auth.jwt; + +import com.auth0.jwt.algorithms.Algorithm; + +import java.io.UnsupportedEncodingException; + +public class JwtInfo { + + public static final String HEADER_NAME = "JWT"; + + public static final String ISSUER = "daily-studio"; + + public static final String TOKEN_KEY = "pci"; + + public static final Long EXPIRES_LIMIT = 100L; + + public static final String USER_IDX = "idx"; + + public static final String USER_AUTHORITY = "authority"; + + public static Algorithm getAlgorithm() { + try { + return Algorithm.HMAC256(JwtInfo.TOKEN_KEY); + } catch (IllegalArgumentException | UnsupportedEncodingException e) { + return Algorithm.none(); + } + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/LoginController.java b/src/main/java/org/dailystudio/springbootstudy/controller/LoginController.java new file mode 100644 index 0000000..db56a3b --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/LoginController.java @@ -0,0 +1,25 @@ +package org.dailystudio.springbootstudy.controller; + +import org.dailystudio.springbootstudy.auth.jwt.JwtFactory; +import org.dailystudio.springbootstudy.auth.jwt.JwtInfo; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; + +@RestController +@RequestMapping("api/login") +public class LoginController { + + @PostMapping + public String createToken(HttpServletResponse res, Long idx) { + final String token = JwtFactory.create(idx); + + res.addHeader(JwtInfo.HEADER_NAME, token); + res.setCharacterEncoding("UTF-8"); + res.setContentType("application/json"); + + return token; + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java b/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java index 27f058b..a3f6c74 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java @@ -1,11 +1,18 @@ package org.dailystudio.springbootstudy.controller; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.auth.jwt.JwtInfo; import org.dailystudio.springbootstudy.repository.StoreRepository; import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; + @RestController @RequiredArgsConstructor @RequestMapping("api/test") @@ -13,5 +20,18 @@ public class StoreController { private final StoreRepository storeRepository; private final StoreRepositorySupport storeRepositorySupport; + private final HttpServletRequest request; + + @GetMapping("/get") + @ApiImplicitParams({@ApiImplicitParam(name = "JWT", value = "JWT Token", required = true, dataType = "string", paramType = "header")}) + public void getMapping(){ + String token = request.getHeader(JwtInfo.HEADER_NAME); + System.out.println(token); + } + + @PostMapping("/post") + public void postMapping(int i){ + + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java b/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java new file mode 100644 index 0000000..8a9b7bd --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java @@ -0,0 +1,95 @@ +package org.dailystudio.springbootstudy.util; + +import com.auth0.jwt.interfaces.DecodedJWT; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.dailystudio.springbootstudy.auth.jwt.JwtFactory; +import org.dailystudio.springbootstudy.auth.jwt.JwtInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +/* +@Component로 이 클래스를 Bean으로 등록한다. +@Aspect로 해당 빈이 Aspect로 동작하게 한다. +@Order로 @Aspect 빈간의 우선순위를 정할 수 있다. 가장 낮을 레벨로 설정했다. +int값을 우선순위로 가지는데 값이 낮을 수록 우선순위가 높아진다. + */ +@Component +@Aspect +@Order(Ordered.LOWEST_PRECEDENCE) +public class LogAspect { + + private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); + + private final HttpServletRequest httpServletRequest; + + public LogAspect(HttpServletRequest httpServletRequest) { + this.httpServletRequest = httpServletRequest; + } + /* + + 이제 Advice 메소드를 작성할 수 있다. + Advice 메소드는 빈이 호출에 끼어드는 시기를 정해줄 수 있다. + @Before : 메소드 실행 전에 끼어든다. + @After : 메소드 실행 후 끼어든다. + @AfterThrowing : 메소드의 실행 후 값을 반환할 때 끼어든다. + @Around : 실행 전후 어느 시점에든 끼어들 수 있다. + + */ + + /* + + Advice메소드의 파라미터는 PointCut이라 불리우며 + 끼어들 메소드의 범위를 지정해 줄 수 있다. + + execution(* org.dailystudio.spingbootstudy.*.*(..)) + 앞에서 부터 각각의 의미를 설명하면 + + * : 모든 리턴 타입을 의미한다. + org.dailystudio.spingbootstudy : 특정 패키지 + * : 모든 클래스 + * : 모든 메소드 + (..) : 모든 Argument + + 를 의미한다. + + */ + + // @Before("execution(* org.dailystudio.spingbootstudy.*.*(..))") + // public void doSomethingBefore(ProceedingJoinPoint joinPoint){ + // + // } + @Pointcut("execution(public * org.dailystudio.springbootstudy.controller.StoreController.*(..))") + public void controllerClassMethod() { + } + + @Before(value = "controllerClassMethod()") + public void logStartController(JoinPoint joinPoint) { + logger.info("start - " + joinPoint.getSignature().getDeclaringTypeName() + " / " + joinPoint.getSignature().getName()); + String token = httpServletRequest.getHeader(JwtInfo.HEADER_NAME); + if (!JwtFactory.isValid(token)) { + throw new RuntimeException(); + } else { + DecodedJWT decodedJWT = JwtFactory.decode(token); + logger.info(decodedJWT.getClaims().toString()); + logger.info("Payload - " + decodedJWT.getPayload()); + String idx = decodedJWT.getClaim("idx").asString(); + logger.info("get Claim - " + idx); + } + } + + @After(value = "controllerClassMethod()") + public void logEndController(JoinPoint joinPoint) { + logger.info("finished - " + joinPoint.getSignature().getDeclaringTypeName() + " / " + joinPoint.getSignature().getName()); + } + + +} diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql index 4772f7c..85060d4 100644 --- a/src/main/resources/import.sql +++ b/src/main/resources/import.sql @@ -1,372 +1,372 @@ ---상점 10개 더미 데이터 + 점원 360개 더미 데이터 = 1상가 36점원 -INSERT INTO store (name, phone) VALUES ('name 001', 'phone 001'); -INSERT INTO store (name, phone) VALUES ('name 002', 'phone 002'); -INSERT INTO store (name, phone) VALUES ('name 003', 'phone 003'); -INSERT INTO store (name, phone) VALUES ('name 004', 'phone 004'); -INSERT INTO store (name, phone) VALUES ('name 005', 'phone 005'); -INSERT INTO store (name, phone) VALUES ('name 006', 'phone 006'); -INSERT INTO store (name, phone) VALUES ('name 007', 'phone 007'); -INSERT INTO store (name, phone) VALUES ('name 008', 'phone 008'); -INSERT INTO store (name, phone) VALUES ('name 009', 'phone 009'); - - -INSERT INTO clerk (name, store_id) VALUES ('name 0001', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0002', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0003', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0004', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0005', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0006', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0007', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0008', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0009', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0010', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0011', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0012', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0013', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0014', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0015', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0016', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0017', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0018', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0019', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0020', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0021', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0022', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0023', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0024', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0025', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0026', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0027', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0028', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0029', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0030', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0031', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0032', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0033', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0034', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0035', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0036', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0037', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0038', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0039', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0040', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0041', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0042', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0043', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0044', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0045', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0046', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0047', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0048', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0049', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0050', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0051', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0052', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0053', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0054', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0055', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0056', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0057', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0058', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0059', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0060', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0061', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0062', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0063', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0064', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0065', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0066', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0067', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0068', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0069', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0070', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0071', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0072', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0073', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0074', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0075', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0076', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0077', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0078', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0079', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0080', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0081', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0082', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0083', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0084', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0085', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0086', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0087', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0088', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0089', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0090', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0091', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0092', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0093', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0094', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0095', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0096', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0097', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0098', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0099', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0100', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0101', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0102', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0103', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0104', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0105', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0106', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0107', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0108', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0109', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0110', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0111', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0112', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0113', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0114', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0115', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0116', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0117', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0118', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0119', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0120', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0121', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0122', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0123', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0124', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0125', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0126', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0127', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0128', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0129', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0130', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0131', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0132', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0133', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0134', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0135', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0136', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0137', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0138', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0139', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0140', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0141', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0142', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0143', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0144', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0145', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0146', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0147', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0148', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0149', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0150', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0151', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0152', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0153', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0154', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0155', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0156', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0157', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0158', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0159', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0160', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0161', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0162', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0163', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0164', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0165', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0166', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0167', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0168', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0169', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0170', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0171', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0172', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0173', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0174', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0175', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0176', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0177', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0178', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0179', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0180', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0181', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0182', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0183', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0184', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0185', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0186', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0187', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0188', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0189', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0190', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0191', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0192', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0193', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0194', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0195', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0196', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0197', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0198', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0199', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0200', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0201', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0202', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0203', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0204', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0205', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0206', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0207', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0208', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0209', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0210', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0211', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0212', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0213', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0214', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0215', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0216', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0217', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0218', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0219', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0220', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0221', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0222', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0223', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0224', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0225', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0226', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0227', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0228', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0229', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0230', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0231', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0232', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0233', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0234', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0235', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0236', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0237', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0238', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0239', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0240', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0241', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0242', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0243', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0244', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0245', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0246', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0247', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0248', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0249', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0250', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0251', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0252', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0253', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0254', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0255', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0256', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0257', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0258', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0259', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0260', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0261', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0262', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0263', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0264', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0265', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0266', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0267', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0268', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0269', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0270', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0271', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0272', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0273', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0274', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0275', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0276', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0277', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0278', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0279', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0280', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0281', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0282', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0283', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0284', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0285', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0286', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0287', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0288', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0289', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0290', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0291', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0292', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0293', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0294', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0295', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0296', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0297', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0298', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0299', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0300', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0301', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0302', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0303', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0304', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0305', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0306', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0307', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0308', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0309', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0310', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0311', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0312', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0313', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0314', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0315', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0316', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0317', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0318', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0319', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0320', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0321', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0322', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0323', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0324', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0325', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0326', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0327', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0328', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0329', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0330', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0331', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0332', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0333', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0334', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0335', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0336', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0337', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0338', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0339', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0340', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0341', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0342', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0343', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0344', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0345', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0346', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0347', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0348', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0349', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0350', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0351', 9); -INSERT INTO clerk (name, store_id) VALUES ('name 0352', 1); -INSERT INTO clerk (name, store_id) VALUES ('name 0353', 2); -INSERT INTO clerk (name, store_id) VALUES ('name 0354', 3); -INSERT INTO clerk (name, store_id) VALUES ('name 0355', 4); -INSERT INTO clerk (name, store_id) VALUES ('name 0356', 5); -INSERT INTO clerk (name, store_id) VALUES ('name 0357', 6); -INSERT INTO clerk (name, store_id) VALUES ('name 0358', 7); -INSERT INTO clerk (name, store_id) VALUES ('name 0359', 8); -INSERT INTO clerk (name, store_id) VALUES ('name 0360', 9); +-- --상점 10개 더미 데이터 + 점원 360개 더미 데이터 = 1상가 36점원 +-- INSERT INTO store (name, phone) VALUES ('name 001', 'phone 001'); +-- INSERT INTO store (name, phone) VALUES ('name 002', 'phone 002'); +-- INSERT INTO store (name, phone) VALUES ('name 003', 'phone 003'); +-- INSERT INTO store (name, phone) VALUES ('name 004', 'phone 004'); +-- INSERT INTO store (name, phone) VALUES ('name 005', 'phone 005'); +-- INSERT INTO store (name, phone) VALUES ('name 006', 'phone 006'); +-- INSERT INTO store (name, phone) VALUES ('name 007', 'phone 007'); +-- INSERT INTO store (name, phone) VALUES ('name 008', 'phone 008'); +-- INSERT INTO store (name, phone) VALUES ('name 009', 'phone 009'); +-- +-- +-- INSERT INTO clerk (name, store_id) VALUES ('name 0001', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0002', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0003', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0004', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0005', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0006', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0007', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0008', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0009', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0010', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0011', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0012', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0013', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0014', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0015', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0016', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0017', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0018', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0019', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0020', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0021', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0022', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0023', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0024', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0025', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0026', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0027', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0028', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0029', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0030', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0031', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0032', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0033', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0034', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0035', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0036', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0037', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0038', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0039', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0040', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0041', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0042', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0043', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0044', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0045', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0046', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0047', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0048', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0049', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0050', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0051', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0052', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0053', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0054', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0055', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0056', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0057', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0058', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0059', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0060', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0061', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0062', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0063', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0064', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0065', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0066', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0067', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0068', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0069', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0070', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0071', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0072', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0073', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0074', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0075', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0076', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0077', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0078', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0079', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0080', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0081', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0082', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0083', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0084', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0085', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0086', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0087', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0088', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0089', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0090', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0091', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0092', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0093', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0094', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0095', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0096', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0097', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0098', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0099', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0100', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0101', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0102', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0103', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0104', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0105', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0106', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0107', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0108', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0109', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0110', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0111', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0112', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0113', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0114', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0115', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0116', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0117', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0118', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0119', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0120', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0121', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0122', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0123', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0124', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0125', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0126', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0127', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0128', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0129', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0130', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0131', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0132', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0133', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0134', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0135', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0136', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0137', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0138', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0139', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0140', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0141', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0142', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0143', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0144', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0145', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0146', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0147', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0148', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0149', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0150', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0151', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0152', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0153', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0154', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0155', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0156', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0157', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0158', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0159', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0160', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0161', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0162', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0163', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0164', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0165', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0166', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0167', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0168', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0169', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0170', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0171', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0172', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0173', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0174', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0175', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0176', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0177', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0178', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0179', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0180', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0181', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0182', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0183', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0184', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0185', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0186', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0187', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0188', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0189', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0190', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0191', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0192', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0193', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0194', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0195', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0196', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0197', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0198', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0199', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0200', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0201', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0202', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0203', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0204', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0205', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0206', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0207', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0208', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0209', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0210', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0211', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0212', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0213', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0214', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0215', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0216', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0217', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0218', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0219', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0220', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0221', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0222', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0223', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0224', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0225', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0226', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0227', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0228', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0229', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0230', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0231', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0232', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0233', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0234', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0235', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0236', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0237', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0238', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0239', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0240', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0241', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0242', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0243', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0244', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0245', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0246', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0247', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0248', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0249', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0250', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0251', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0252', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0253', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0254', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0255', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0256', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0257', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0258', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0259', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0260', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0261', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0262', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0263', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0264', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0265', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0266', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0267', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0268', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0269', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0270', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0271', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0272', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0273', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0274', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0275', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0276', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0277', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0278', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0279', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0280', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0281', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0282', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0283', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0284', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0285', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0286', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0287', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0288', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0289', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0290', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0291', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0292', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0293', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0294', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0295', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0296', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0297', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0298', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0299', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0300', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0301', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0302', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0303', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0304', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0305', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0306', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0307', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0308', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0309', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0310', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0311', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0312', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0313', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0314', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0315', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0316', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0317', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0318', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0319', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0320', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0321', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0322', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0323', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0324', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0325', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0326', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0327', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0328', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0329', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0330', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0331', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0332', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0333', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0334', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0335', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0336', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0337', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0338', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0339', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0340', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0341', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0342', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0343', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0344', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0345', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0346', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0347', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0348', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0349', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0350', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0351', 9); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0352', 1); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0353', 2); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0354', 3); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0355', 4); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0356', 5); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0357', 6); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0358', 7); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0359', 8); +-- INSERT INTO clerk (name, store_id) VALUES ('name 0360', 9); From 5d491425fb8fd143e5dcf7d48437680340cdd10a Mon Sep 17 00:00:00 2001 From: pci2676 Date: Mon, 8 Apr 2019 23:38:10 +0900 Subject: [PATCH 27/28] =?UTF-8?q?jwt=20auth=20aspect=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootstudy/auth/jwt/JwtAuth.java | 1 - .../auth/jwt/JwtAuthAspect.java | 34 ++++++++++++------- .../controller/StoreController.java | 19 ++++------- .../springbootstudy/domain/Store.java | 9 ++--- .../springbootstudy/util/LogAspect.java | 21 +++--------- 5 files changed, 37 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java index 9f5473c..4e0e7a9 100644 --- a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java +++ b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuth.java @@ -5,6 +5,5 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented -@Inherited public @interface JwtAuth { } diff --git a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java index 5afacf9..d20c35e 100644 --- a/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java +++ b/src/main/java/org/dailystudio/springbootstudy/auth/jwt/JwtAuthAspect.java @@ -5,6 +5,9 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; +import org.dailystudio.springbootstudy.util.LogAspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @@ -14,28 +17,35 @@ @RequiredArgsConstructor public class JwtAuthAspect { + private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); private final HttpServletRequest httpServletRequest; @Around("@annotation(org.dailystudio.springbootstudy.auth.jwt.JwtAuth)") - public Object around(final ProceedingJoinPoint pjp) throws Throwable { + public Object validateJWT(final ProceedingJoinPoint pjp) throws Throwable { final String token = httpServletRequest.getHeader(JwtInfo.HEADER_NAME); //토큰 존재 여부 확인 - if (token == null) { - throw new RuntimeException("토큰없음."); - } + checkToken(token); //토큰 검사 - if (!JwtFactory.isValid(token)) { - throw new RuntimeException("유효성 작살."); - } + validateToken(token); //토큰 해독 final DecodedJWT decodedJWT = JwtFactory.decode(token); - - //토큰기반 디비에서 사용자 불러오기 - // - //사용자 제대로됨? -// if (user == null) return RES_RESPONSE_ENTITY; + logger.info("Authorized Token Access - " + decodedJWT.getClaim(JwtInfo.USER_IDX).asString()); return pjp.proceed(pjp.getArgs()); } + + private void checkToken(String token) { + if (token == null) { + logger.info("비어있는 토큰 접근."); + throw new RuntimeException("토큰없음"); + } + } + + private void validateToken(String token) { + if (!JwtFactory.isValid(token)) { + logger.info("유효하지 않은 토큰 접근."); + throw new RuntimeException("유효성 작살."); + } + } } \ No newline at end of file diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java b/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java index a3f6c74..c7cf944 100644 --- a/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java +++ b/src/main/java/org/dailystudio/springbootstudy/controller/StoreController.java @@ -1,17 +1,11 @@ package org.dailystudio.springbootstudy.controller; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.auth.jwt.JwtAuth; import org.dailystudio.springbootstudy.auth.jwt.JwtInfo; import org.dailystudio.springbootstudy.repository.StoreRepository; import org.dailystudio.springbootstudy.repository.querydsl.StoreRepositorySupport; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -20,17 +14,16 @@ public class StoreController { private final StoreRepository storeRepository; private final StoreRepositorySupport storeRepositorySupport; - private final HttpServletRequest request; @GetMapping("/get") - @ApiImplicitParams({@ApiImplicitParam(name = "JWT", value = "JWT Token", required = true, dataType = "string", paramType = "header")}) - public void getMapping(){ - String token = request.getHeader(JwtInfo.HEADER_NAME); + @JwtAuth + public void getMapping(@RequestHeader(JwtInfo.HEADER_NAME) String token) { + System.out.println(token); } @PostMapping("/post") - public void postMapping(int i){ + public void postMapping(int i) { } diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Store.java b/src/main/java/org/dailystudio/springbootstudy/domain/Store.java index c1f0717..c35ced9 100644 --- a/src/main/java/org/dailystudio/springbootstudy/domain/Store.java +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Store.java @@ -15,7 +15,8 @@ @NoArgsConstructor public class Store { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "store_id") private Long id; @@ -29,8 +30,8 @@ public class Store { private List clerks = new ArrayList<>(); @Builder - public Store(String name, String phone){ - this.name=name; - this.phone=phone; + public Store(String name, String phone) { + this.name = name; + this.phone = phone; } } diff --git a/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java b/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java index 8a9b7bd..44b1df7 100644 --- a/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java +++ b/src/main/java/org/dailystudio/springbootstudy/util/LogAspect.java @@ -1,13 +1,10 @@ package org.dailystudio.springbootstudy.util; -import com.auth0.jwt.interfaces.DecodedJWT; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; -import org.dailystudio.springbootstudy.auth.jwt.JwtFactory; -import org.dailystudio.springbootstudy.auth.jwt.JwtInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; @@ -67,26 +64,16 @@ public LogAspect(HttpServletRequest httpServletRequest) { // public void doSomethingBefore(ProceedingJoinPoint joinPoint){ // // } - @Pointcut("execution(public * org.dailystudio.springbootstudy.controller.StoreController.*(..))") - public void controllerClassMethod() { + @Pointcut("execution(public * org.dailystudio.springbootstudy.controller.*.*(..))") + public void controllerLogMethod() { } - @Before(value = "controllerClassMethod()") + @Before(value = "controllerLogMethod()") public void logStartController(JoinPoint joinPoint) { logger.info("start - " + joinPoint.getSignature().getDeclaringTypeName() + " / " + joinPoint.getSignature().getName()); - String token = httpServletRequest.getHeader(JwtInfo.HEADER_NAME); - if (!JwtFactory.isValid(token)) { - throw new RuntimeException(); - } else { - DecodedJWT decodedJWT = JwtFactory.decode(token); - logger.info(decodedJWT.getClaims().toString()); - logger.info("Payload - " + decodedJWT.getPayload()); - String idx = decodedJWT.getClaim("idx").asString(); - logger.info("get Claim - " + idx); - } } - @After(value = "controllerClassMethod()") + @After(value = "controllerLogMethod()") public void logEndController(JoinPoint joinPoint) { logger.info("finished - " + joinPoint.getSignature().getDeclaringTypeName() + " / " + joinPoint.getSignature().getName()); } From ec6b4ef46a37fae6b10f6c59457ce622160d934b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=B0=AC=EC=9D=B8?= Date: Fri, 3 May 2019 00:39:15 +0900 Subject: [PATCH 28/28] Add files via upload --- JWT + AOP.pptx | Bin 0 -> 164510 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 JWT + AOP.pptx diff --git a/JWT + AOP.pptx b/JWT + AOP.pptx new file mode 100644 index 0000000000000000000000000000000000000000..53c9080cde113aa59a506498d53722c45096d43e GIT binary patch literal 164510 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 z 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 P@XrbOb0~%&_yGAoEL literal 0 HcmV?d00001