diff --git a/README.md b/README.md index 5a3ba1d..e2131cf 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ -# DevitUser -Devit User Domain +# Devit +

+ +

+경험이 많고 실력 있는 개발자에게 도움을 받기 위한 플랫폼입니다.
+기업 또는 개인에게 알맞는 개발자의 스펙과 원하는 직무를 등록하여 구인하고 개발자는 확인 후 지원서를 넣어 서로가 만족하는 상황이 되었을 때 계약이 진행될 수 있도록 중개하는 웹 사이트입니다.
+ + +## Devit User Service +Devit 유저 서비스입니다.
+유저의 회원가입 로직을 인증 서버와 RabbitMQ 비동기 이벤트로 처리합니다.
+유저 프로필, 이력서를 관리합니다.
+이력서로는, 카테고리 직종, 학적, 경력, 수상 등이 있습니다.
+개발 중에 있습니다.
+이력서에 관한 API 완성되면, ERD API 명세서 업로드 예정입니다.
+ +## API List + + +# link to another repo + +- eureka server : https://github.com/ekgpgdi/devit-eureka-server +- gateway : https://github.com/ekgpgdi/devit-gateway +- certification service : https://github.com/ekgpgdi/devit-certification-service +- board : https://github.com/kimziaco/devit-board +- user : https://github.com/eet43/devit-user +- chat : https://github.com/eet43/devit-chat \ No newline at end of file diff --git a/appspec.yml b/appspec.yml new file mode 100644 index 0000000..392b0e1 --- /dev/null +++ b/appspec.yml @@ -0,0 +1,18 @@ +version: 0.0 +os: linux +files: + - source: / + destination: /home/ubuntu/app/ + overwrite: yes + +permissions: + - object: / + pattern: "**" + owner: ubuntu + group: ubuntu + +hooks: + ApplicationStart: + - location: deploy.sh + timeout: 60 + runas: ubuntu \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5319894..b2f790d 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,7 @@ dependencies { // https://mvnrepository.com/artifact/org.json/json implementation group: 'org.json', name: 'json', version: '20160810' + implementation 'com.fasterxml.jackson.core:jackson-databind' } diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100644 index 0000000..86a651d --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +REPOSITORY=/home/ubuntu/app + +echo "> 현재 구동 중인 애플리케이션 pid 확인" + +CURRENT_PID=$(pgrep -fla java | grep hayan | awk '{print $1}') + +echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID" + +if [ -z "$CURRENT_PID" ]; then + echo "현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다." +else + echo "> kill -15 $CURRENT_PID" + kill -15 $CURRENT_PID + sleep 5 +fi + +echo "> 새 애플리케이션 배포" + +JAR_NAME=$(ls -tr $REPOSITORY/*SNAPSHOT.jar | tail -n 1) + +echo "> JAR NAME: $JAR_NAME" + +echo "> $JAR_NAME 에 실행권한 추가" + +chmod +x $JAR_NAME + +echo "> $JAR_NAME 실행" + +nohup java -jar -Duser.timezone=Asia/Seoul $JAR_NAME >> $REPOSITORY/nohup.out 2>&1 & \ No newline at end of file diff --git a/src/main/java/com/devit/user/controller/CategoryController.java b/src/main/java/com/devit/user/controller/CategoryController.java index d755a5a..a15ea87 100644 --- a/src/main/java/com/devit/user/controller/CategoryController.java +++ b/src/main/java/com/devit/user/controller/CategoryController.java @@ -6,9 +6,11 @@ import com.devit.user.entity.Category; import com.devit.user.exception.NoResourceException; import com.devit.user.service.CategoryService; +import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,26 +21,34 @@ * 1. 부모 카테고리 등록 * 2. 자식 카테고리 등록 * 3. 자식 카테고리들 조회 - * 4. 특정 카테고리 객체 조회 */ @RestController @RequiredArgsConstructor +@Slf4j public class CategoryController { private final CategoryService categoryService; - @PostMapping("api/users/categories/parent") //1 + @PostMapping("/categories/parent") //1 + @ApiOperation(value = "부모 카테고리 등록", notes = "부모 카테고리를 등록합니다.") public ResponseEntity saveParentCategory(@RequestBody CreateParentCategoryRequest request) throws NoResourceException { + log.info("category : {} 부모 카테고리를 저장합니다.", request.getName()); + Category category = new Category(); category.setName(request.getName()); category.setDepth(1L); Long saveCategoryId = categoryService.saveCategory(category); + log.info("category : {} 부모 카테고리 Id 를 반환합니다.", saveCategoryId); + + return ResponseEntity.ok().body(saveCategoryId); } - @PostMapping("api/users/categories/children") //2 + @PostMapping("/categories/children") //2 + @ApiOperation(value = "자식 카테고리 등록", notes = "자식 카테고리를 등록합니다.") public ResponseEntity saveChildCategory(@RequestBody CreateChildCategoryRequest request) throws NoResourceException { + log.info("category : {} 자식 카테고리를 저장합니다.", request.getName()); Category findParent = categoryService.findCategoryByName(request.getParentName()); @@ -47,14 +57,23 @@ public ResponseEntity saveChildCategory(@RequestBody CreateChildCategoryReque category.setDepth(2L); category.addParent(findParent); + log.info("category : 부모와 자식 카테고리를 연결합니다."); + + Long saveCategoryId = categoryService.saveCategory(category); + log.info("category : {} 자식 카테고리 id를 반환합니다.", saveCategoryId); + + return ResponseEntity.ok().body(saveCategoryId); } - @GetMapping("api/users/categories") //3 + @GetMapping("/categories") //3 + @ApiOperation(value = "카테고리 조회", notes = "자식 카테고리를 조회합니다.") public ResponseEntity getCategories() { + log.info("category : 카테고리를 조회합니다."); + List findParents = categoryService.findParentCategoires(); List collect = findParents.stream() .map(c -> new GetCategoryResponse(c.getId(), c.getName(), c.getChildren())) diff --git a/src/main/java/com/devit/user/controller/ResumeController.java b/src/main/java/com/devit/user/controller/ResumeController.java index 72a8d4c..726b6ff 100644 --- a/src/main/java/com/devit/user/controller/ResumeController.java +++ b/src/main/java/com/devit/user/controller/ResumeController.java @@ -1,29 +1,30 @@ package com.devit.user.controller; import com.devit.user.dto.EditResumeRequest; -import com.devit.user.entity.Category; -import com.devit.user.entity.Education; -import com.devit.user.entity.User; +import com.devit.user.dto.ResumeDto; +import com.devit.user.dto.SendResumeMessage; +import com.devit.user.dto.response.ResponseDetails; +import com.devit.user.dto.SendResumeRequest; +import com.devit.user.entity.Resume; import com.devit.user.exception.NoResourceException; +import com.devit.user.message.RabbitMqSender; import com.devit.user.service.CategoryService; import com.devit.user.service.ResumeService; import com.devit.user.service.UserService; import com.devit.user.util.HttpStatusChangeInt; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONObject; +import org.springframework.http.HttpStatus; 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.RequestHeader; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import javax.validation.constraints.Null; import java.util.Base64; -import java.util.List; +import java.util.Date; +import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; /** @@ -38,28 +39,71 @@ public class ResumeController { private final ResumeService resumeService; private final CategoryService categoryService; private final UserService userService; + private final RabbitMqSender rabbitMqSender; + + @PutMapping("/resumes") //수정되야함 + @ApiOperation(value = "이력서 수정", notes = "이력서를 수정합니다.") + public ResponseEntity editResume(@RequestHeader("Authorization") String data, @RequestBody EditResumeRequest request) throws NoResourceException { + + log.info("resume : 이력서를 수정합니다. ex) 자기소개 : {}", request.getIntroduce()); + + String[] chunks = data.split("\\."); + Base64.Decoder decoder = Base64.getDecoder(); + String payload = new String(decoder.decode(chunks[1])); + + JSONObject jsonObject = new JSONObject(payload); + String sample = jsonObject.getString("uuid"); + UUID uuid = UUID.fromString(sample); //토큰 복호화 완료 + + // Category findCategory = categoryService.findCategoryByName(request.getCategoryName()); //카테고리 찾아오기 + + + Resume editResume = resumeService.save(request, uuid); + + log.info("resume : 이력서 수정 왼료 {}", editResume); + + int httpStatus = HttpStatusChangeInt.ChangeStatusCode("OK"); + String path = "api/users/resumes"; + + ResponseDetails responseDetails = new ResponseDetails(new Date(), editResume, httpStatus, path); + return new ResponseEntity<>(responseDetails, HttpStatus.CREATED); + } + + @PostMapping("/resumes") + @ApiOperation(value = "이력서 전송", notes = "이력서를 전송합니다.") + public ResponseEntity sendResume(@RequestHeader("Authorization") String data, @RequestBody Map requestObject) { + String[] chunks = data.split("\\."); + Base64.Decoder decoder = Base64.getDecoder(); + String payload = new String(decoder.decode(chunks[1])); + + JSONObject jsonObject = new JSONObject(payload); + String sample = jsonObject.getString("uuid"); + UUID uuid = UUID.fromString(sample); //토큰 복호화 완료 + + String nickName; //조건문 변수 처리를 못 하는거 떄문에 일단 선언 + + if (!jsonObject.has("nickName")) { + Object obj = userService.findUserName(uuid); + nickName = String.valueOf(obj); + } + else { + nickName = jsonObject.getString("nickName"); // 키 값이 없으면 null 값이면 nullPointException + } + + + ResumeDto resumeDto = new ResumeDto(uuid, nickName, UUID.fromString(requestObject.get("boardId"))); + log.info("resume : 이력서를 전송합니다. {}", resumeDto); + String message = rabbitMqSender.send(resumeDto); + + log.info("resume : 이력서 전송 결과를 반환합니다. : {}", message); + + int httpStatus = HttpStatusChangeInt.ChangeStatusCode("OK"); + String path = "api/users/resumes"; + + + ResponseDetails responseDetails = new ResponseDetails(new Date(), message, httpStatus, path); + return new ResponseEntity<>(responseDetails, HttpStatus.CREATED); + } -// @PostMapping("/api/users/resumes") -// public ResponseEntity editResume(@RequestHeader("Authorization") String data, @RequestBody @Valid EditResumeRequest request) throws NoResourceException { -// -// String[] chunks = data.split("\\."); -// Base64.Decoder decoder = Base64.getDecoder(); -// String payload = new String(decoder.decode(chunks[1])); -// -// JSONObject jsonObject = new JSONObject(payload); -// String sample = jsonObject.getString("uuid"); -// UUID uuid = UUID.fromString(sample); -// -// User findUser = userService.findUser(uuid); -// -//// request.getEducations().stream() -//// .filter(e->e!=null) -//// .map(e->{Education.createEducation(e.)}) -// -// Category findCategory = categoryService.findCategoryByName(request.getCategoryName()); //카테고리 찾아오기 -// -// int httpStatus = HttpStatusChangeInt.ChangeStatusCode("Edited"); -// String path = "api/users/resumes"; -// } } diff --git a/src/main/java/com/devit/user/controller/UserController.java b/src/main/java/com/devit/user/controller/UserController.java index 16b154b..7c609a6 100644 --- a/src/main/java/com/devit/user/controller/UserController.java +++ b/src/main/java/com/devit/user/controller/UserController.java @@ -30,11 +30,13 @@ public class UserController { private final UserService userService; private final ResumeService resumeService; - /* - 토큰 파싱해야함. + + /** + * 1. 유저 프로필 조회 (url : /api/users/) + * 2. 특정 유저 조회 */ - @GetMapping("/api/users") + @GetMapping("/") public ResponseEntity getProfile(@RequestHeader("Authorization") String data) throws NoResourceException { String[] chunks = data.split("\\."); @@ -46,13 +48,31 @@ public ResponseEntity getProfile(@RequestHeader("Authorization") String data) UUID uuid = UUID.fromString(sample); User findUser = userService.findUser(uuid); - Resume findResume = resumeService.findByUser(findUser); + + log.info("User : 프로필을 조회합니다. {}", findUser); + int httpStatus = HttpStatusChangeInt.ChangeStatusCode("OK"); String path = "api/users/"; - ResponseProfileDetails responseDetails = new ResponseProfileDetails(new Date(), findUser, findResume, httpStatus, path); + ResponseDetails responseDetails = new ResponseDetails(new Date(), findUser, httpStatus, path); + return new ResponseEntity<>(responseDetails, HttpStatus.CREATED); + } + + @GetMapping("/{uuid}") + public ResponseEntity getProfile(@PathVariable("uuid") UUID userId) throws NoResourceException { + + + User findUser = userService.findUser(userId); + + log.info("User : 해당 이력서를 조회합니다. {}", findUser); + + int httpStatus = HttpStatusChangeInt.ChangeStatusCode("OK"); + String path = "api/users/{uuid}"; + + + ResponseDetails responseDetails = new ResponseDetails(new Date(), findUser, httpStatus, path); return new ResponseEntity<>(responseDetails, HttpStatus.CREATED); } } diff --git a/src/main/java/com/devit/user/dto/EditAwardDto.java b/src/main/java/com/devit/user/dto/EditAwardDto.java new file mode 100644 index 0000000..195ffcc --- /dev/null +++ b/src/main/java/com/devit/user/dto/EditAwardDto.java @@ -0,0 +1,28 @@ +package com.devit.user.dto; + +import com.devit.user.entity.Status; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.Column; +import java.time.LocalDate; +@Getter +@AllArgsConstructor +public class EditAwardDto { + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; //시작 날짜 + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; //종료 날짜 + + private String competition; //대회 이름 최대 15글자 + + private String awards; //수상 내용 최대 10글자 + + private String content; //추가 자기소개 + + public EditAwardDto() { + + } +} diff --git a/src/main/java/com/devit/user/dto/EditCareerDto.java b/src/main/java/com/devit/user/dto/EditCareerDto.java new file mode 100644 index 0000000..089b3e9 --- /dev/null +++ b/src/main/java/com/devit/user/dto/EditCareerDto.java @@ -0,0 +1,38 @@ +package com.devit.user.dto; + +import com.devit.user.entity.Status; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.Column; +import java.time.LocalDate; +import java.util.Arrays; + +@Getter @AllArgsConstructor +public class EditCareerDto { + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; //시작 날짜 + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; //종료 날짜 + + private String careerStatus; //진행 중인지, 종료한 것인지 ? + + private String office; //회사 이름 최대 15글자 + + private String job; //학과 이름 최대 15글자 + + private String content; //추가 자기소개 + + public EditCareerDto() { + + } + + public static Status of(String code) { + return Arrays.stream(Status.values()) + .filter(r -> r.getLabel().equals(code)) + .findAny() + .orElse(Status.ING); + } +} diff --git a/src/main/java/com/devit/user/dto/EditEducationDto.java b/src/main/java/com/devit/user/dto/EditEducationDto.java new file mode 100644 index 0000000..9145f83 --- /dev/null +++ b/src/main/java/com/devit/user/dto/EditEducationDto.java @@ -0,0 +1,42 @@ +package com.devit.user.dto; + +import com.devit.user.entity.Gender; +import com.devit.user.entity.Resume; +import com.devit.user.entity.Status; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.time.LocalDate; +import java.util.Arrays; + +@Getter +@AllArgsConstructor +public class EditEducationDto { + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; //시작 날짜 + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; //종료 날짜 + + private String educationStatus; //진행 중인지, 종료한 것인지 ? + + private String university; //학교 이름 최대 15글자 + + private String department; //학과 이름 최대 20글자 + + private String content; //추가 자기소개 + + public EditEducationDto() { + + } + + public static Status of(String code) { + return Arrays.stream(Status.values()) + .filter(r -> r.getLabel().equals(code)) + .findAny() + .orElse(Status.ING); + } +} diff --git a/src/main/java/com/devit/user/dto/EditResumeRequest.java b/src/main/java/com/devit/user/dto/EditResumeRequest.java index 27324c5..e7d50a7 100644 --- a/src/main/java/com/devit/user/dto/EditResumeRequest.java +++ b/src/main/java/com/devit/user/dto/EditResumeRequest.java @@ -1,30 +1,41 @@ package com.devit.user.dto; import com.devit.user.entity.*; +import lombok.AllArgsConstructor; import lombok.Data; import javax.persistence.*; import javax.validation.constraints.NotNull; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @Data +@AllArgsConstructor public class EditResumeRequest { - @NotNull - private Gender gender; //성별 - @NotNull + private String gender; //성별 + private int year; //출생년도 - @NotNull private String phone_number; //유저 핸드폰 번호 private String introduce; //자기소개 - @NotNull private String categoryName; //현재 직종 카테고리 (서버파트 => 스프링) - private List educations = new ArrayList<>(); //학력사항 추가 가능 일대다 - private List careers = new ArrayList<>(); //경력사항 추가 가능 일대다 - private List awards = new ArrayList<>(); //수상 및 활동 추가 가능 일대다 + private EditEducationDto educations;//학력사항 추가 가능 일대다 + private EditCareerDto careers; //경력사항 추가 가능 일대다 + private EditAwardDto awards; //수상 및 활동 추가 가능 일대다 + + public EditResumeRequest() { + + } + + public static Gender of(String code) { + return Arrays.stream(Gender.values()) + .filter(r -> r.getLabel().equals(code)) + .findAny() + .orElse(Gender.MAN); + } } diff --git a/src/main/java/com/devit/user/dto/ResumeDto.java b/src/main/java/com/devit/user/dto/ResumeDto.java new file mode 100644 index 0000000..79e25f2 --- /dev/null +++ b/src/main/java/com/devit/user/dto/ResumeDto.java @@ -0,0 +1,24 @@ +package com.devit.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; +import java.util.UUID; + +@Data +@AllArgsConstructor +public class ResumeDto implements Serializable { + private UUID userUid; + private String userName; + private UUID boardUid; + + @Override + public String toString() { + return "Resume{" + + "userUid='" + userUid + '\'' + + ", userName='" + userName + '\'' + + ", boardUid='" + boardUid + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/devit/user/dto/SendResumeMessage.java b/src/main/java/com/devit/user/dto/SendResumeMessage.java new file mode 100644 index 0000000..fe010e7 --- /dev/null +++ b/src/main/java/com/devit/user/dto/SendResumeMessage.java @@ -0,0 +1,13 @@ +package com.devit.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.UUID; + +@Data +@AllArgsConstructor +public class SendResumeMessage { + private UUID userId; + private UUID boardId; +} diff --git a/src/main/java/com/devit/user/dto/SendResumeRequest.java b/src/main/java/com/devit/user/dto/SendResumeRequest.java new file mode 100644 index 0000000..128531d --- /dev/null +++ b/src/main/java/com/devit/user/dto/SendResumeRequest.java @@ -0,0 +1,12 @@ +package com.devit.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.UUID; + +@Data +@AllArgsConstructor +public class SendResumeRequest { + private UUID boardId; +} diff --git a/src/main/java/com/devit/user/dto/response/ResponseMessageDetails.java b/src/main/java/com/devit/user/dto/response/ResponseMessageDetails.java new file mode 100644 index 0000000..86a5e2e --- /dev/null +++ b/src/main/java/com/devit/user/dto/response/ResponseMessageDetails.java @@ -0,0 +1,16 @@ +package com.devit.user.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Date; + +@Getter +@AllArgsConstructor +public class ResponseMessageDetails { + + private Date timestamp; + private String message; + private int httpStatus; + private String path; +} \ No newline at end of file diff --git a/src/main/java/com/devit/user/entity/Award.java b/src/main/java/com/devit/user/entity/Award.java index c1deaf2..38e633e 100644 --- a/src/main/java/com/devit/user/entity/Award.java +++ b/src/main/java/com/devit/user/entity/Award.java @@ -1,53 +1,61 @@ package com.devit.user.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Getter; +import lombok.Setter; import org.hibernate.annotations.GenericGenerator; +import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.time.LocalDate; import java.util.UUID; @Entity +@Getter @Setter public class Award { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //고유 식별자 값 - @GeneratedValue(generator = "uuid2") - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(nullable = false, unique = true, columnDefinition = "BINARY(16)", name = "award_id") + @Column(unique = true, columnDefinition = "BINARY(16)", name = "award_id") private UUID awardId; //이력서 고유 id 값 - @ManyToOne(fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "resume_id") + @JsonIgnore private Resume resume; //매칭되는 이력서 다대일 @Column(name = "start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate startDate; //시작 날짜 @Column(name = "end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; //종료 날짜 - @Enumerated(value = EnumType.STRING) - private Status awardStatus; //진행 중인지, 종료한 것인지 ? - @Column(nullable = false, length = 15) + @Column(length = 15) private String competition; //대회 이름 최대 15글자 - @Column(nullable = false, length = 10) + @Column(length = 10) private String awards; //수상 내용 최대 10글자 private String content; //추가 자기소개 + public static Award createDefaultAward(Resume resume) { + Award award = new Award(); + award.awardId = UUID.randomUUID(); + award.resume = resume; + return award; + } + /* 생성 메서드 */ - public static Award createAward(Resume resume, LocalDate startDate, LocalDate endDate, Status awardStatus + public static Award editAward(Award award, LocalDate startDate, LocalDate endDate , String competition, String awards, String content) { - Award award = new Award(); - award.resume = resume; award.startDate = startDate; award.endDate = endDate; - award.awardStatus = awardStatus; award.competition = competition; award.awards = awards; award.content = content; diff --git a/src/main/java/com/devit/user/entity/Career.java b/src/main/java/com/devit/user/entity/Career.java index db853ef..bcc3642 100644 --- a/src/main/java/com/devit/user/entity/Career.java +++ b/src/main/java/com/devit/user/entity/Career.java @@ -1,48 +1,61 @@ package com.devit.user.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Getter; +import lombok.Setter; import org.hibernate.annotations.GenericGenerator; +import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.time.LocalDate; import java.util.UUID; @Entity +@Getter +@Setter public class Career { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //고유 식별자 값 - @GeneratedValue(generator = "uuid2") - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(nullable = false, unique = true, columnDefinition = "BINARY(16)", name = "career_id") + @Column(unique = true, columnDefinition = "BINARY(16)", name = "career_id") private UUID careerId; //이력서 고유 id 값 - @ManyToOne(fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "resume_id") + @JsonIgnore private Resume resume; //매칭되는 이력서 다대일 @Column(name = "start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate startDate; //시작 날짜 @Column(name = "end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; //종료 날짜 @Enumerated(value = EnumType.STRING) private Status careerStatus; //진행 중인지, 종료한 것인지 ? - @Column(nullable = false, length = 15) + @Column(length = 15) private String office; //회사 이름 최대 15글자 - @Column(nullable = false, length = 15) + @Column(length = 15) private String job; //학과 이름 최대 15글자 private String content; //추가 자기소개 - /* 생성 메서드 */ - public static Career createCareer(Resume resume, LocalDate startDate, LocalDate endDate, Status careerStatus - , String office, String job, String content) { + + public static Career createDefaultCareer(Resume resume) { Career career = new Career(); + career.careerId = UUID.randomUUID(); career.resume = resume; + return career; + } + + /* 생성 메서드 */ + public static Career editCareer(Career career, LocalDate startDate, LocalDate endDate, Status careerStatus + , String office, String job, String content) { career.startDate = startDate; career.endDate = endDate; career.careerStatus = careerStatus; diff --git a/src/main/java/com/devit/user/entity/Category.java b/src/main/java/com/devit/user/entity/Category.java index ac18d3e..071c8ef 100644 --- a/src/main/java/com/devit/user/entity/Category.java +++ b/src/main/java/com/devit/user/entity/Category.java @@ -1,5 +1,7 @@ package com.devit.user.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,6 +13,7 @@ @Entity @Getter @Setter +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -20,6 +23,7 @@ public class Category { @Column(nullable = false, unique = true, length = 10) private String name; //카테고리 이름 + @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Category parent; @@ -27,6 +31,7 @@ public class Category { @OneToMany(mappedBy = "parent") private List children = new ArrayList<>(); + @JsonIgnore @OneToMany(mappedBy = "category") private List resumes = new ArrayList<>(); diff --git a/src/main/java/com/devit/user/entity/Education.java b/src/main/java/com/devit/user/entity/Education.java index 2ac5c28..23385e5 100644 --- a/src/main/java/com/devit/user/entity/Education.java +++ b/src/main/java/com/devit/user/entity/Education.java @@ -1,57 +1,65 @@ package com.devit.user.entity; import com.devit.user.util.Timestamped; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; +import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.time.LocalDate; import java.util.UUID; @Entity -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter @Setter public class Education extends Timestamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //고유 식별자 값 - @GeneratedValue(generator = "uuid2") - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(nullable = false, unique = true, columnDefinition = "BINARY(16)", name = "education_id") + @Column(unique = true, columnDefinition = "BINARY(16)", name = "education_id") private UUID educationId; //이력서 고유 id 값 - @ManyToOne(fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "resume_id") + @JsonIgnore private Resume resume; //매칭되는 이력서 다대일 @Column(name = "start_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate startDate; //시작 날짜 @Column(name = "end_date") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; //종료 날짜 @Enumerated(value = EnumType.STRING) private Status educationStatus; //진행 중인지, 종료한 것인지 ? - @Column(nullable = false, length = 15) + @Column(length = 15) private String university; //학교 이름 최대 15글자 - @Column(nullable = false, length = 20) + @Column(length = 20) private String department; //학과 이름 최대 20글자 private String content; //추가 자기소개 + public static Education createDefaultEducation(Resume resume) { + Education education = new Education(); + education.educationId = UUID.randomUUID(); + education.resume = resume; + return education; + } + /* 생성 메서드 */ - public static Education createEducation(Resume resume, LocalDate startDate, LocalDate endDate, Status educationStatus + public static Education editEducation(Education education, LocalDate startDate, LocalDate endDate, Status educationStatus , String university, String department, String content) { - Education education = new Education(); - education.resume = resume; education.startDate = startDate; education.endDate = endDate; education.educationStatus = educationStatus; diff --git a/src/main/java/com/devit/user/entity/Gender.java b/src/main/java/com/devit/user/entity/Gender.java index c1a8b84..531718d 100644 --- a/src/main/java/com/devit/user/entity/Gender.java +++ b/src/main/java/com/devit/user/entity/Gender.java @@ -1,5 +1,20 @@ package com.devit.user.entity; +import lombok.Getter; + +@Getter public enum Gender { - MAN, WOMAN + MAN("MAN"), + WOMAN("WOMAN"); + + private String label; + + Gender(String label) { + this.label = label; + } + + public String label() { + return label; + } + } diff --git a/src/main/java/com/devit/user/entity/Resume.java b/src/main/java/com/devit/user/entity/Resume.java index 65ae7fd..94688c9 100644 --- a/src/main/java/com/devit/user/entity/Resume.java +++ b/src/main/java/com/devit/user/entity/Resume.java @@ -1,6 +1,7 @@ package com.devit.user.entity; import com.devit.user.util.Timestamped; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -14,6 +15,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Resume extends Timestamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -22,9 +24,6 @@ public class Resume extends Timestamped { @Column(nullable = false, unique = true, columnDefinition = "BINARY(16)", name = "resume_id") private UUID resumeId; //이력서 고유 id 값 - @OneToOne(mappedBy = "resume") - private User user; - @Enumerated(value = EnumType.STRING) private Gender gender; //성별 @@ -40,14 +39,14 @@ public class Resume extends Timestamped { @JoinColumn(name = "category_id") private Category category; //현재 직종 카테고리 (서버파트 => 스프링) - @OneToMany(mappedBy = "resume", cascade = CascadeType.ALL) - private List educations = new ArrayList<>(); //학력사항 추가 가능 일대다 + @OneToOne(mappedBy = "resume", cascade = CascadeType.ALL) + private Education educations; //학력사항 추가 가능 일대일 - @OneToMany(mappedBy = "resume", cascade = CascadeType.ALL) - private List careers = new ArrayList<>(); //경력사항 추가 가능 일대다 + @OneToOne(mappedBy = "resume", cascade = CascadeType.ALL) + private Career careers; //경력사항 추가 가능 일대일 - @OneToMany(mappedBy = "resume", cascade = CascadeType.ALL) - private List awards = new ArrayList<>(); //수상 및 활동 추가 가능 일대다 + @OneToOne(mappedBy = "resume", cascade = CascadeType.ALL) + private Award awards; //수상 및 활동 추가 가능 일대일 /*생성 메서드*/ /** @@ -57,15 +56,15 @@ public class Resume extends Timestamped { public static Resume createDefaultResume(User user) { Resume resume = new Resume(); - resume.user = user; + resume.resumeId = UUID.randomUUID(); + user.setResume(resume); return resume; } - public static Resume editResume(User user, Gender gender, int year, String phone_number, String introduce, Category category, - List educations, List careers, List awards) { - Resume resume = new Resume(); - resume.user = user; + + public static Resume editResume(Resume resume, Gender gender, int year, String phone_number, String introduce, Category category, + Education educations, Career careers, Award awards) { resume.gender = gender; resume.year = year; resume.phone_number = phone_number; diff --git a/src/main/java/com/devit/user/entity/Status.java b/src/main/java/com/devit/user/entity/Status.java index b41abb9..4e4a83b 100644 --- a/src/main/java/com/devit/user/entity/Status.java +++ b/src/main/java/com/devit/user/entity/Status.java @@ -1,5 +1,19 @@ package com.devit.user.entity; +import lombok.Getter; + +@Getter public enum Status { - ING, DONE + ING("ING"), + DONE("DONE"); + + private String label; + + Status(String label) { + this.label = label; + } + + public String label() { + return label; + } } diff --git a/src/main/java/com/devit/user/entity/User.java b/src/main/java/com/devit/user/entity/User.java index 6affb71..aba4385 100644 --- a/src/main/java/com/devit/user/entity/User.java +++ b/src/main/java/com/devit/user/entity/User.java @@ -5,6 +5,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @@ -18,7 +19,7 @@ */ @Entity -@Getter +@Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //외부 생성 금지 @Table(name = "user") public class User extends Timestamped { @@ -46,11 +47,11 @@ public class User extends Timestamped { /*생성 메서드 !!!! 반드시 static*/ - public static User signUp(UUID uuid, String email, String name) { + public static User signUp(UUID uuid, String email, String nickName) { User user = new User(); user.userId = uuid; user.email = email; - user.nickName = name; + user.nickName = nickName; return user; } diff --git a/src/main/java/com/devit/user/message/CustomMessage.java b/src/main/java/com/devit/user/message/CustomMessage.java index a19e34c..b8b7a03 100644 --- a/src/main/java/com/devit/user/message/CustomMessage.java +++ b/src/main/java/com/devit/user/message/CustomMessage.java @@ -18,7 +18,7 @@ public class CustomMessage implements Serializable{ public String toString() { return "{" + "email='" + email + '\'' + - ", name='" + nickName + '\'' + + ", nickName='" + nickName + '\'' + ", uuid=" + uuid + '}'; } diff --git a/src/main/java/com/devit/user/message/RabbitMqReceiver.java b/src/main/java/com/devit/user/message/RabbitMqReceiver.java index 7050a35..006eefa 100644 --- a/src/main/java/com/devit/user/message/RabbitMqReceiver.java +++ b/src/main/java/com/devit/user/message/RabbitMqReceiver.java @@ -1,9 +1,7 @@ package com.devit.user.message; -import com.devit.user.entity.Resume; -import com.devit.user.entity.User; -import com.devit.user.repository.ResumeRepository; -import com.devit.user.repository.UserRepository; +import com.devit.user.entity.*; +import com.devit.user.repository.*; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,6 +25,9 @@ public class RabbitMqReceiver implements RabbitListenerConfigurer { private final UserRepository userRepository; private final ResumeRepository resumeRepository; + private final AwardRepository awardRepository; + private final EducationRepository educationRepository; + private final CareerRepository careerRepository; @Override public void configureRabbitListeners(RabbitListenerEndpointRegistrar rabbitListenerEndpointRegistrar) { @@ -34,7 +35,7 @@ public void configureRabbitListeners(RabbitListenerEndpointRegistrar rabbitListe // 소비할 큐를 지정 @Transactional - @RabbitListener(queues = "${spring.rabbitmq.queue}") //유저 큐라고 가정 + @RabbitListener(queues = "${spring.rabbitmq.user.queue}") //유저 큐라고 가정 public void receivedMessage(CustomMessage event) { logger.info("User Details Received is.. " + event); @@ -43,8 +44,18 @@ public void receivedMessage(CustomMessage event) { User user = User.signUp(event.getUuid(), event.getEmail(), event.getNickName()); //유저 디비에 유저 저장 UUID user_uuid = userRepository.save(user); Resume resume = Resume.createDefaultResume(user); //해당 유저에 대한 기본 이력서 생성 + UUID resume_uuid = resumeRepository.save(resume); + Education education = Education.createDefaultEducation(resume); + Award award = Award.createDefaultAward(resume); + Career career = Career.createDefaultCareer(resume); + + Education save_edu = educationRepository.save(education); + Award save_award = awardRepository.save(award); + Career save_car = careerRepository.save(career); + //한번에 수정할 수는 없을까 ? + } } diff --git a/src/main/java/com/devit/user/message/RabbitMqSender.java b/src/main/java/com/devit/user/message/RabbitMqSender.java new file mode 100644 index 0000000..284c302 --- /dev/null +++ b/src/main/java/com/devit/user/message/RabbitMqSender.java @@ -0,0 +1,29 @@ +package com.devit.user.message; + +import com.devit.user.dto.ResumeDto; +import com.devit.user.dto.SendResumeMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class RabbitMqSender { + // RabbitTemplate 클래스를 사용하면 RabbitMQ로 메시지를 보내고 받을 수 있다. + private RabbitTemplate rabbitTemplate; + + @Autowired + public RabbitMqSender(RabbitTemplate rabbitTemplate) { + this.rabbitTemplate = rabbitTemplate; + } + @Value("${spring.rabbitmq.board.exchange}") + private String exchange; + @Value("${spring.rabbitmq.routingkey}") + private String routingkey; + + public String send(ResumeDto resumeDto) { + rabbitTemplate.convertAndSend(exchange, routingkey, resumeDto); + + return "메시지 전송 완료"; + } +} diff --git a/src/main/java/com/devit/user/repository/AwardRepository.java b/src/main/java/com/devit/user/repository/AwardRepository.java index a9c0961..8b259fc 100644 --- a/src/main/java/com/devit/user/repository/AwardRepository.java +++ b/src/main/java/com/devit/user/repository/AwardRepository.java @@ -18,11 +18,4 @@ public Award save(Award award) { return award; } - public Award findAwards(UUID uuid) { - Award findAward = em.createQuery("select a from Award where a.awardId = :awardId", Award.class) - .setParameter("awardId", uuid) - .getSingleResult(); - - return findAward; - } } diff --git a/src/main/java/com/devit/user/repository/CareerRepository.java b/src/main/java/com/devit/user/repository/CareerRepository.java new file mode 100644 index 0000000..52f7411 --- /dev/null +++ b/src/main/java/com/devit/user/repository/CareerRepository.java @@ -0,0 +1,22 @@ +package com.devit.user.repository; + +import com.devit.user.entity.Career; +import com.devit.user.entity.Education; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import java.util.List; +import java.util.UUID; + +@Repository +@RequiredArgsConstructor +public class CareerRepository { + private final EntityManager em; + + public Career save(Career career) { + em.persist(career); + return career; + } + +} diff --git a/src/main/java/com/devit/user/repository/EducationRepository.java b/src/main/java/com/devit/user/repository/EducationRepository.java new file mode 100644 index 0000000..2ee28f8 --- /dev/null +++ b/src/main/java/com/devit/user/repository/EducationRepository.java @@ -0,0 +1,22 @@ +package com.devit.user.repository; + +import com.devit.user.entity.Award; +import com.devit.user.entity.Education; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import java.util.List; +import java.util.UUID; + +@Repository +@RequiredArgsConstructor +public class EducationRepository { + private final EntityManager em; + + public Education save(Education education) { + em.persist(education); + return education; + } + +} diff --git a/src/main/java/com/devit/user/repository/ResumeRepository.java b/src/main/java/com/devit/user/repository/ResumeRepository.java index f10f9d2..85bc7d0 100644 --- a/src/main/java/com/devit/user/repository/ResumeRepository.java +++ b/src/main/java/com/devit/user/repository/ResumeRepository.java @@ -18,10 +18,12 @@ public UUID save(Resume resume) { return resume.getResumeId(); } - public Resume findByUser(User user) { - return em.createQuery("select r from Resume r where r.user = :user", Resume.class) - .setParameter("user", user) + public Resume findByUser(UUID userID) { + return em.createQuery("select r from Resume r join r.user u " + + "where u.userId = :userId", Resume.class) + .setParameter("userId", userID) .getSingleResult(); } + } diff --git a/src/main/java/com/devit/user/repository/UserRepository.java b/src/main/java/com/devit/user/repository/UserRepository.java index 57784ee..3c3ab6c 100644 --- a/src/main/java/com/devit/user/repository/UserRepository.java +++ b/src/main/java/com/devit/user/repository/UserRepository.java @@ -1,5 +1,6 @@ package com.devit.user.repository; +import com.devit.user.entity.Resume; import com.devit.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -31,5 +32,17 @@ public void deleteUser(UUID userId) { .setParameter("userId", userId); } + public Resume findResume(UUID userId) { + return em.createQuery("select u.resume from User u where u.userId = :userId", Resume.class) + .setParameter("userId", userId) + .getSingleResult(); + } + + public Object findUserName(UUID userId) { + return em.createQuery("select u.name from User u where u.userId = :userId") + .setParameter("userId", userId) + .getSingleResult(); + } + } diff --git a/src/main/java/com/devit/user/service/ResumeService.java b/src/main/java/com/devit/user/service/ResumeService.java index dfafe6f..e46c450 100644 --- a/src/main/java/com/devit/user/service/ResumeService.java +++ b/src/main/java/com/devit/user/service/ResumeService.java @@ -1,23 +1,69 @@ package com.devit.user.service; -import com.devit.user.entity.Resume; -import com.devit.user.entity.User; -import com.devit.user.repository.ResumeRepository; +import com.devit.user.dto.EditAwardDto; +import com.devit.user.dto.EditCareerDto; +import com.devit.user.dto.EditEducationDto; +import com.devit.user.dto.EditResumeRequest; +import com.devit.user.entity.*; +import com.devit.user.repository.*; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; @Service @Transactional +@Slf4j @RequiredArgsConstructor public class ResumeService { private final ResumeRepository resumeRepository; -// public UUID saveResume(Resume resume) { -// -// } - public Resume findByUser(User user) { - return resumeRepository.findByUser(user); + private final AwardRepository awardRepository; + private final EducationRepository educationRepository; + private final CareerRepository careerRepository; + + private final CategoryRepository categoryRepository; + private final UserRepository userRepository; + + + public Resume save(EditResumeRequest request, UUID userId) { + + Resume resume = userRepository.findResume(userId); + + log.info("Resume(service) : {} 해당 유저의 이력서를 조회합니다.", resume); + + + EditEducationDto eDto = request.getEducations(); + EditAwardDto aDto = request.getAwards(); + EditCareerDto cDto = request.getCareers(); + + Education education = Education.editEducation(resume.getEducations(), eDto.getStartDate(), eDto.getEndDate(), eDto.of(eDto.getEducationStatus()), + eDto.getUniversity(), eDto.getDepartment(), eDto.getContent()); + + log.info("Education(service) : {} 해당 유저의 교육사항을 조회합니다.", education); + + + Career career = Career.editCareer(resume.getCareers(), cDto.getStartDate(), cDto.getEndDate(), cDto.of(cDto.getCareerStatus()), + cDto.getOffice(), cDto.getJob(), cDto.getContent()); + + log.info("Career(service) : {} 해당 유저의 개발사항을 조회합니다.", career); + + + Award award = Award.editAward(resume.getAwards(), aDto.getStartDate(), aDto.getEndDate(), aDto.getCompetition(), aDto.getAwards(), aDto.getContent()); + //dirty check 가능 + + log.info("Award(service) : {} 해당 유저의 수상사항을 조회합니다.", award); + + + Category findCategory = categoryRepository.findByName(request.getCategoryName()); + Gender gender = EditResumeRequest.of(request.getGender()); + + return Resume.editResume(resume, gender, request.getYear(), request.getPhone_number(), request.getIntroduce(), + findCategory, education, career, award); + } + public Resume findByUser(UUID userId) { + return resumeRepository.findByUser(userId); } } diff --git a/src/main/java/com/devit/user/service/UserService.java b/src/main/java/com/devit/user/service/UserService.java index 2b98358..1c0b096 100644 --- a/src/main/java/com/devit/user/service/UserService.java +++ b/src/main/java/com/devit/user/service/UserService.java @@ -1,14 +1,17 @@ package com.devit.user.service; +import com.devit.user.entity.Resume; import com.devit.user.entity.User; import com.devit.user.repository.UserRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.UUID; @Service +@Slf4j @RequiredArgsConstructor @Transactional(readOnly = true) public class UserService { @@ -17,17 +20,37 @@ public class UserService { @Transactional public UUID saveUser(User user) { + + log.info("User(service) : 새로운 유저를 저장합니다. {}", user); + return userRepository.save(user); } @Transactional public void deleteUser(UUID userId) { + + log.info("User(service) : {} 해당 유저를 삭제합니다.", userId); + userRepository.deleteUser(userId); } public User findUser(UUID userId) { + + log.info("User(service) : {} 해당 유저를 조회합니다.", userId); + return userRepository.findByUUID(userId); } + public Resume findResume(UUID userId) { + + log.info("User(service) : {} 해당 유저의 이력서만 조회합니다.", userId); + + return userRepository.findResume(userId); + } + + public Object findUserName(UUID userId) { + return userRepository.findUserName(userId); + } + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d0ce9d5..7c2920a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,17 +1,19 @@ # jwt secret key jwt: - secret: "50g/NGsxw15SwkKw8f+fxuXw6hBrEVYXCgJwyzItp8I=" + secret: spring: + main: + allow-bean-definition-overriding: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/devit_user?characterEncoding=utf8 - username: devit - password: 1234 + url: + username: + password: rabbitmq: - host: localhost - password: 1234 + host: 52.79.236.81 + password: port: 5672 username: devit routingkey: devit.routingkey @@ -24,7 +26,7 @@ spring: jpa: hibernate: - ddl-auto: create + ddl-auto: update properties: hibernate: format_sql: true diff --git a/src/test/java/com/devit/user/service/ResumeServiceTest.java b/src/test/java/com/devit/user/service/ResumeServiceTest.java new file mode 100644 index 0000000..43a55e8 --- /dev/null +++ b/src/test/java/com/devit/user/service/ResumeServiceTest.java @@ -0,0 +1,86 @@ +package com.devit.user.service; + +import com.devit.user.dto.EditResumeRequest; +import com.devit.user.entity.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.reflect.Array; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) //JUnit 5 테스트 +@SpringBootTest +@Transactional +class ResumeServiceTest { + + @Autowired + CategoryService categoryService; + + @Autowired + UserService userService; + + @Autowired + ResumeService resumeService; + + + @Test + public void 이력서_수정() throws Exception { + + UUID userId = UUID.fromString("ea579e47-fcff-40df-8cf7-1bc3136a584d"); + Resume resume = userService.findResume(userId); + + //given + Category category1 = new Category(); + category1.setName("백엔드"); + category1.setDepth(1L); + categoryService.saveCategory(category1); + + + Category category2 = new Category(); + category2.setName("Spring"); + category2.setDepth(2L); + category2.addParent(category1); + categoryService.saveCategory(category2); + + System.out.println("================카테고리 저장 끝================="); + + + + List educationList = new ArrayList<>(); + List awardList = new ArrayList<>(); + + Education education = Education.createEducation(resume, LocalDate.now(), LocalDate.now(), Status.DONE, "고려대", + "과학기술대학", "졸업"); + Award award1 = Award.createAward(resume, LocalDate.now(), LocalDate.now(), "먹기대회", + "장려상", "얏호"); + Award award2 = Award.createAward(resume, LocalDate.now(), LocalDate.now(), "코딩대회", + "대상", "나이스"); + + educationList.add(education); + awardList.add(award1); + awardList.add(award2); + + System.out.println("================데이터 저장 끝================="); + + EditResumeRequest request = new EditResumeRequest(Gender.MAN, 1998, "01012345678", "", + category2.getName(), educationList, null, awardList); + + + //when + Resume save = resumeService.save(request, userId); + + //then + System.out.println(save); + } +} \ No newline at end of file diff --git a/src/test/java/com/devit/user/service/UserServiceTest.java b/src/test/java/com/devit/user/service/UserServiceTest.java new file mode 100644 index 0000000..5b2e2ac --- /dev/null +++ b/src/test/java/com/devit/user/service/UserServiceTest.java @@ -0,0 +1,38 @@ +package com.devit.user.service; + +import com.devit.user.entity.Resume; +import com.devit.user.entity.User; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + + +@ExtendWith(SpringExtension.class) //JUnit 5 테스트 +@SpringBootTest +@Transactional +class UserServiceTest { + @Autowired + UserService userService; + + @Test + public void 유저_조회() throws Exception { + //given + UUID userId = UUID.fromString("ea579e47-fcff-40df-8cf7-1bc3136a584d"); + + + //when + User user = userService.findUser(userId); + + //then + assertThat(user.getUserId(), is(userId)); + } + +} \ No newline at end of file