diff --git a/.gitignore b/.gitignore index e69de29..a50e99a 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,39 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +src/main/resources/application.yml diff --git a/.gradle/7.5.1/checksums/checksums.lock b/.gradle/7.5.1/checksums/checksums.lock deleted file mode 100644 index c778fac..0000000 Binary files a/.gradle/7.5.1/checksums/checksums.lock and /dev/null differ diff --git a/.gradle/7.5.1/checksums/md5-checksums.bin b/.gradle/7.5.1/checksums/md5-checksums.bin deleted file mode 100644 index a658a3d..0000000 Binary files a/.gradle/7.5.1/checksums/md5-checksums.bin and /dev/null differ diff --git a/.gradle/7.5.1/checksums/sha1-checksums.bin b/.gradle/7.5.1/checksums/sha1-checksums.bin deleted file mode 100644 index 433f302..0000000 Binary files a/.gradle/7.5.1/checksums/sha1-checksums.bin and /dev/null differ diff --git a/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index a18a445..0000000 Binary files a/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock and /dev/null differ diff --git a/.gradle/7.5.1/dependencies-accessors/gc.properties b/.gradle/7.5.1/dependencies-accessors/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/7.5.1/executionHistory/executionHistory.bin b/.gradle/7.5.1/executionHistory/executionHistory.bin deleted file mode 100644 index b5ae1e1..0000000 Binary files a/.gradle/7.5.1/executionHistory/executionHistory.bin and /dev/null differ diff --git a/.gradle/7.5.1/executionHistory/executionHistory.lock b/.gradle/7.5.1/executionHistory/executionHistory.lock deleted file mode 100644 index 622595b..0000000 Binary files a/.gradle/7.5.1/executionHistory/executionHistory.lock and /dev/null differ diff --git a/.gradle/7.5.1/fileChanges/last-build.bin b/.gradle/7.5.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/.gradle/7.5.1/fileChanges/last-build.bin and /dev/null differ diff --git a/.gradle/7.5.1/fileHashes/fileHashes.bin b/.gradle/7.5.1/fileHashes/fileHashes.bin deleted file mode 100644 index f5f16bf..0000000 Binary files a/.gradle/7.5.1/fileHashes/fileHashes.bin and /dev/null differ diff --git a/.gradle/7.5.1/fileHashes/fileHashes.lock b/.gradle/7.5.1/fileHashes/fileHashes.lock deleted file mode 100644 index 9e87d87..0000000 Binary files a/.gradle/7.5.1/fileHashes/fileHashes.lock and /dev/null differ diff --git a/.gradle/7.5.1/fileHashes/resourceHashesCache.bin b/.gradle/7.5.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 8b90588..0000000 Binary files a/.gradle/7.5.1/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/.gradle/7.5.1/gc.properties b/.gradle/7.5.1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index bb7b57b..0000000 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 0deda3f..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sun Mar 12 22:04:46 KST 2023 -gradle.version=7.5.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 5185903..0000000 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and /dev/null differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe deleted file mode 100644 index 8dbf542..0000000 Binary files a/.gradle/file-system.probe and /dev/null differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index f95b03f..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -member \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 08ca039..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 611e7c8..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index fdc392f..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 3e79c5f..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a7e7f96..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/com.member.main.iml b/.idea/modules/com.member.main.iml deleted file mode 100644 index ec81b53..0000000 --- a/.idea/modules/com.member.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/member.main.iml b/.idea/modules/member.main.iml deleted file mode 100644 index ec81b53..0000000 --- a/.idea/modules/member.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 6c643d4..ed142a4 100644 --- a/build.gradle +++ b/build.gradle @@ -21,8 +21,12 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' - + implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-mail:2.7.1' + implementation 'io.springfox:springfox-boot-starter:3.0.0' + implementation 'io.springfox:springfox-swagger-ui:3.0.0' +// implementation 'org.springframework.boot:spring-boot-starter-security' runtimeOnly 'mysql:mysql-connector-java' compileOnly 'org.projectlombok:lombok' diff --git a/build/classes/java/main/com/example/member/MemberApplication.class b/build/classes/java/main/com/example/member/MemberApplication.class deleted file mode 100644 index fae52f4..0000000 Binary files a/build/classes/java/main/com/example/member/MemberApplication.class and /dev/null differ diff --git a/build/classes/java/main/com/example/member/controller/MainController.class b/build/classes/java/main/com/example/member/controller/MainController.class deleted file mode 100644 index 7a604b6..0000000 Binary files a/build/classes/java/main/com/example/member/controller/MainController.class and /dev/null differ diff --git a/build/classes/java/main/com/example/member/controller/MemberController.class b/build/classes/java/main/com/example/member/controller/MemberController.class deleted file mode 100644 index 8635cd5..0000000 Binary files a/build/classes/java/main/com/example/member/controller/MemberController.class and /dev/null differ diff --git a/build/classes/java/main/com/example/member/dto/MemberDTO.class b/build/classes/java/main/com/example/member/dto/MemberDTO.class deleted file mode 100644 index ec7ac1b..0000000 Binary files a/build/classes/java/main/com/example/member/dto/MemberDTO.class and /dev/null differ diff --git a/build/classes/java/main/com/example/member/entity/MemberEntity.class b/build/classes/java/main/com/example/member/entity/MemberEntity.class deleted file mode 100644 index 63bc340..0000000 Binary files a/build/classes/java/main/com/example/member/entity/MemberEntity.class and /dev/null differ diff --git a/build/classes/java/main/com/example/member/repository/MemberRepository.class b/build/classes/java/main/com/example/member/repository/MemberRepository.class deleted file mode 100644 index 212d91a..0000000 Binary files a/build/classes/java/main/com/example/member/repository/MemberRepository.class and /dev/null differ diff --git a/build/classes/java/main/com/example/member/service/MemberService.class b/build/classes/java/main/com/example/member/service/MemberService.class deleted file mode 100644 index 0389bc9..0000000 Binary files a/build/classes/java/main/com/example/member/service/MemberService.class and /dev/null differ diff --git a/build/resources/main/application.yml b/build/resources/main/application.yml deleted file mode 100644 index fa213a1..0000000 --- a/build/resources/main/application.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 8081 - -# database 연동 설정 -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver -# 각자 PC에 만들어놓은 Database이름을 써야 합니다. - url: jdbc:mysql://localhost:3306/jisinDB?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 -# mysql에 생성한 사용자 계정 정보를 써야 합니다. - username: root - password: 1234 - thymeleaf: - cache: false - - # spring data jpa 설정 - jpa: - database-platform: org.hibernate.dialect.MySQL5InnoDBDialect - open-in-view: false - show-sql: true - hibernate: - ddl-auto: update \ No newline at end of file diff --git a/build/resources/main/templates/detail.html b/build/resources/main/templates/detail.html deleted file mode 100644 index ac09dfc..0000000 --- a/build/resources/main/templates/detail.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - detail - - - - - - - - - - - - - - - - - -
nameIdmajoremailpassword
- - diff --git a/build/resources/main/templates/index.html b/build/resources/main/templates/index.html deleted file mode 100644 index cd76253..0000000 --- a/build/resources/main/templates/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - index - - -

UniA

-

AJOU University

- 회원가입 - 로그인 - 회원목록 - - \ No newline at end of file diff --git a/build/resources/main/templates/list.html b/build/resources/main/templates/list.html deleted file mode 100644 index 314ac2e..0000000 --- a/build/resources/main/templates/list.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Title - - -

회원 목록

- - - - - - - - - - - - - - - - - - - -
nameIdmajoremailpassword상세조회삭제
- 조회 - - 삭제 -
- - \ No newline at end of file diff --git a/build/resources/main/templates/login.html b/build/resources/main/templates/login.html deleted file mode 100644 index bd52244..0000000 --- a/build/resources/main/templates/login.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - login - - -
- 아이디:
- 비밀번호:
- -
- - \ No newline at end of file diff --git a/build/resources/main/templates/main.html b/build/resources/main/templates/main.html deleted file mode 100644 index d917ec1..0000000 --- a/build/resources/main/templates/main.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - main - - - Hi!

- 마이페이지 - - \ No newline at end of file diff --git a/build/resources/main/templates/save.html b/build/resources/main/templates/save.html deleted file mode 100644 index e81a0fb..0000000 --- a/build/resources/main/templates/save.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - save - - - -
- 이름:
- 학번:
- 학과:
- 아이디:
- 비밀번호:
- - -
- - - \ No newline at end of file diff --git a/build/resources/main/templates/update.html b/build/resources/main/templates/update.html deleted file mode 100644 index aee46a0..0000000 --- a/build/resources/main/templates/update.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - update - - -
- - - - -
- 변경할 비밀번호: -
- -
- \ No newline at end of file diff --git a/build/resources/main/templates/userdata.html b/build/resources/main/templates/userdata.html deleted file mode 100644 index b07a385..0000000 --- a/build/resources/main/templates/userdata.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - detail - - - - - - - - - - - - - - - - - -
nameIdmajoremailpassword
- 비밀번호 변경 - 회원탈퇴 - 로그아웃 - - \ No newline at end of file diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index f32632b..0000000 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and /dev/null differ diff --git a/src/main/java/com/example/member/config/SwaggerConfig.java b/src/main/java/com/example/member/config/SwaggerConfig.java new file mode 100644 index 0000000..17e24b0 --- /dev/null +++ b/src/main/java/com/example/member/config/SwaggerConfig.java @@ -0,0 +1,39 @@ +package com.example.member.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + /** + * 실행 : http://localhost:8081/swagger-ui/index.html + */ + + @Bean + public Docket api(){ + return new Docket(DocumentationType.OAS_30) + .useDefaultResponseMessages(true) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.example.member")) + .paths(PathSelectors.any()) + .build(); + } + + public ApiInfo apiInfo(){ + return new ApiInfoBuilder() + .title("SpringBoot Rest API Documentation") + .description("uniA Member API") + .version("1.0") + .build(); + } +} diff --git a/src/main/java/com/example/member/controller/MainController.java b/src/main/java/com/example/member/controller/MainController.java index b0133f7..27bab1c 100644 --- a/src/main/java/com/example/member/controller/MainController.java +++ b/src/main/java/com/example/member/controller/MainController.java @@ -1,10 +1,12 @@ package com.example.member.controller; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Controller; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; -@Controller +@RestController @RequiredArgsConstructor public class MainController { @@ -12,7 +14,7 @@ public class MainController { 초기 화면 */ @GetMapping("/") - public String index() { - return "index"; + public ResponseEntity index() { + return new ResponseEntity<>("success", HttpStatus.OK); } } diff --git a/src/main/java/com/example/member/controller/MemberController.java b/src/main/java/com/example/member/controller/MemberController.java index f87535c..da85130 100644 --- a/src/main/java/com/example/member/controller/MemberController.java +++ b/src/main/java/com/example/member/controller/MemberController.java @@ -2,141 +2,135 @@ import com.example.member.dto.MemberDTO; import com.example.member.service.MemberService; + import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpSession; +import javax.validation.Valid; + import java.util.List; +import java.util.stream.Collectors; -@Controller +@RestController @RequiredArgsConstructor @RequestMapping(path = "/member") public class MemberController { private final MemberService memberService; - - /* - 로그인 페이지 GET 요청 - */ - @GetMapping("/login") - public String loginForm() { - return "login"; - } - - /* - 로그인 로직 - POST - 로그인 성공 후 main 페이지로 이동 - (추가 기능 구현 예정 - 승준) + /** + * 회원가입 + * [POST] /member/create + * @param memberDTO + * @param bindingResult + * @return ResponseEntity */ - @PostMapping("/login") - public String login(@ModelAttribute MemberDTO memberDTO, HttpSession session){ - MemberDTO loginResult = memberService.login(memberDTO); - if(loginResult != null) { - // login 성공 - session.setAttribute("loginEmail", loginResult.getMemberEmail()); - return "main"; - } else{ - // login 실패 - return "login"; - } + @PostMapping("/create") + public ResponseEntity create(@Valid @RequestBody MemberDTO memberDTO, BindingResult bindingResult){ + + if (!(memberDTO.getMemberPassword().equals(memberDTO.getMemberConfirmPassword()))){ + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Passwords do not match"); + } + + if (bindingResult.hasErrors()){ + String errorMessage = bindingResult.getAllErrors().stream() + .map(objectError -> { + FieldError fieldError = (FieldError) objectError; + return "Error field : " + fieldError.getField() + "\nError message : " + objectError.getDefaultMessage(); + }) + .collect(Collectors.joining("\n")); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage); + } + + memberService.create(memberDTO); + + return ResponseEntity.status(HttpStatus.CREATED).body(memberDTO); } - - /* - 회원가입 페이지 GET 요청 + /** + * 이메일 중복 확인 + * [GET] /member/email-check/{memberEmail} + * @param memberEmail + * @return ResponseEntity */ - @GetMapping("/save") - public String saveForm(){ - return "save"; - } + @GetMapping("/email-check/{memberEmail}") + public ResponseEntity checkEmailDuplicate(@PathVariable String memberEmail){ - /* - 회원가입 로직 - POST - 회원가입 성공 후 index 페이지로 이동 - (추가 기능 구현 예정 - 민석) - */ - @PostMapping("/save") - public String save(@ModelAttribute MemberDTO memberDTO){ - memberService.save(memberDTO); - return "index"; + if(memberService.checkEmailDuplicate(memberEmail)){ + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("The email already exists"); + } + + return ResponseEntity.status(HttpStatus.OK).body("The email is available"); } - /* - DB에 저장된 회원 전체 조회 - 실제 기능은 아니고 개발할 때 DB 관리를 위해 만들었습니다 - 회원들의 정보가 데이터베이스에 잘 저장되는지 프론트에서 확인 + /** + * DB에 저장된 회원 전체 조회, 실제 기능 아님 + * [GET] /member/list + * @return ResponseEntity> */ @GetMapping("/list") - public String findAll(Model model){ + public ResponseEntity> findAll(){ List memberDTOList = memberService.findAll(); - model.addAttribute("memberList", memberDTOList); - return "list"; + return ResponseEntity.status(HttpStatus.OK).body(memberDTOList); } - /* - DB에 저장된 회원 한 명 조회 - 실제 기능은 아니고 개발할 때 DB 관리를 위해 만들었습니다 + /** + * 마이페이지 조회 + * [GET] /member/{memberId} + * @param memberId + * @return ResponseEntity */ - @GetMapping("/list/{id}") - public String findById(@PathVariable Long id, Model model){ - MemberDTO memberDTO = memberService.findById(id); - model.addAttribute("member", memberDTO); - return "detail"; + @GetMapping("/{memberId}") + public ResponseEntity findByMemberId(@PathVariable Long memberId){ + MemberDTO memberDTO = memberService.findById(memberId); + return ResponseEntity.status(HttpStatus.OK).body(memberDTO); } - /* - 사용자가 조회하는 상세 페이지 (실제 기능) + /** + * 비밀번호 변경 + * [PATCH] /member/{memberId} + * @param memberId + * @param memberDTO + * @return ResponseEntity */ - @GetMapping("/{memberEmail}") - public String findByMemberEmail(@PathVariable String memberEmail, Model model){ - MemberDTO memberDTO = memberService.findByMemberEmail(memberEmail); - model.addAttribute("member", memberDTO); - return "userdata"; - } + @PatchMapping("/{memberId}") + public ResponseEntity update(@PathVariable Long memberId, @RequestBody MemberDTO memberDTO){ - @GetMapping("/update") - public String updateForm(HttpSession session, Model model){ - String myEmail = (String) session.getAttribute("loginEmail"); - MemberDTO memberDTO = memberService.updateForm(myEmail); - model.addAttribute("updateMember", memberDTO); - return "update"; - } + String password = memberDTO.getMemberPassword(); - /* - 사용자 정보 업데이트, 추후 PatchMapping으로 수정 예정 - */ - @PostMapping("/update") - public String update(@ModelAttribute MemberDTO memberDTO){ - memberService.update(memberDTO); - return "redirect:/member/" + memberDTO.getMemberEmail(); - } + if (password == null || password.isEmpty()){ + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); + } + + MemberDTO existMember = memberService.findById(memberId); + + if (existMember == null){ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); + } + + existMember.setMemberPassword(password); + memberService.update(existMember); + return ResponseEntity.status(HttpStatus.OK).body(existMember); - /* - 회원 전체 조회에서의 삭제 기능 (실제 기능 X) - */ - @GetMapping("/list/delete/{id}") - public String deleteById(@PathVariable Long id){ - memberService.deleteById(id); - return "redirect:/member/list"; } - /* - 회원 탈퇴 기능 (DeleteMapping으로 수정 해야함) - 탈퇴 처리 후 index 페이지로 이동 + /** + * 회원 탈퇴 + * [DELETE] /member/{memberId} + * @param memberId + * @return ResponseEntity */ - @GetMapping("/delete/{memberEmail}") - public String deleteByMemberEmail(@PathVariable String memberEmail){ - memberService.deleteByMemberEmail(memberEmail); - return "redirect:/"; + @DeleteMapping("/{memberId}") + public ResponseEntity deleteById(@PathVariable Long memberId){ + memberService.deleteById(memberId); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - @GetMapping("/logout") - public String logout(HttpSession session){ - session.invalidate(); - return "index"; - } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/member/controller/VerificationController.java b/src/main/java/com/example/member/controller/VerificationController.java new file mode 100644 index 0000000..32a3b19 --- /dev/null +++ b/src/main/java/com/example/member/controller/VerificationController.java @@ -0,0 +1,55 @@ +package com.example.member.controller; + +import com.example.member.dto.VerificationDTO; + +import com.example.member.service.VerificationService; +import lombok.RequiredArgsConstructor; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/member") +public class VerificationController { + private final VerificationService verificationService; + + /** + * 인증번호 전송 + * [GET] /member/verify/{memberEmail} + * @param memberEmail + * @return ResponseEntity + */ + @GetMapping("/verify/{memberEmail}") + public ResponseEntity send(@PathVariable String memberEmail){ + + if (memberEmail == null || memberEmail.isEmpty()){ // 자바 17은 StringUtils.isBlank(memberEmail) 사용 가능 + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); + } + + verificationService.sendVerificationCode(memberEmail); + + return ResponseEntity.status(HttpStatus.OK).body(null); + + } + + /** + * 인증번호 확인 + * [POST] /member/verify + * @param verificationDTO + * @return ResponseEntity + */ + @PostMapping("/verify") + public ResponseEntity verify(@RequestBody VerificationDTO verificationDTO){ + String email = verificationDTO.getEmail(); + String verificationCode = verificationDTO.getVerificationCode(); + boolean verified = verificationService.verify(email, verificationCode); + if (verified){ + return ResponseEntity.status(HttpStatus.OK).build(); + } else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + } + } + +} diff --git a/src/main/java/com/example/member/dto/MemberDTO.java b/src/main/java/com/example/member/dto/MemberDTO.java index 386ff88..84935c4 100644 --- a/src/main/java/com/example/member/dto/MemberDTO.java +++ b/src/main/java/com/example/member/dto/MemberDTO.java @@ -3,26 +3,59 @@ import com.example.member.entity.MemberEntity; import lombok.Data; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.util.Objects; + @Data public class MemberDTO { - private String memberName; // 이름 + @NotBlank(message = "Please enter your first name") + private String firstName; // 이름 + + @NotBlank(message = "Please enter your last name") + private String lastName; // 성 + @NotNull(message = "Please enter your student ID") private Long memberId; // 학번 + @NotBlank(message = "Please enter your major") private String memberMajor; // 학과 + @NotBlank(message = "Please enter your email") + @Pattern(regexp = "[a-zA-Z0-9._%+-]+@ajou.ac.kr$", message = "Email format is incorrect") private String memberEmail; // 이메일 + @NotBlank(message = "Please enter password") + @Size(min = 8, max = 12, message = "Password must be between 8 and 12 characters") private String memberPassword; // 비밀번호 + @NotBlank(message = "Please confirm your password") + private String memberConfirmPassword; // 비밀번호 확인 + public static MemberDTO toMemberDTO(MemberEntity memberEntity){ MemberDTO memberDTO = new MemberDTO(); - memberDTO.setMemberName(memberEntity.getMemberName()); + memberDTO.setLastName(memberEntity.getLastName()); + memberDTO.setFirstName(memberEntity.getFirstName()); memberDTO.setMemberId(memberEntity.getMemberId()); memberDTO.setMemberMajor(memberEntity.getMemberMajor()); memberDTO.setMemberEmail(memberEntity.getMemberEmail()); memberDTO.setMemberPassword(memberEntity.getMemberPassword()); return memberDTO; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MemberDTO memberDTO = (MemberDTO) o; + return memberPassword.equals(memberDTO.memberPassword) && memberConfirmPassword.equals(memberDTO.memberConfirmPassword); + } + + @Override + public int hashCode() { + return Objects.hash(memberPassword, memberConfirmPassword); + } } diff --git a/src/main/java/com/example/member/dto/VerificationDTO.java b/src/main/java/com/example/member/dto/VerificationDTO.java new file mode 100644 index 0000000..30e109e --- /dev/null +++ b/src/main/java/com/example/member/dto/VerificationDTO.java @@ -0,0 +1,9 @@ +package com.example.member.dto; + +import lombok.Data; + +@Data +public class VerificationDTO { + private String email; + private String verificationCode; +} diff --git a/src/main/java/com/example/member/entity/MemberEntity.java b/src/main/java/com/example/member/entity/MemberEntity.java index 6206308..e437f5a 100644 --- a/src/main/java/com/example/member/entity/MemberEntity.java +++ b/src/main/java/com/example/member/entity/MemberEntity.java @@ -1,37 +1,36 @@ package com.example.member.entity; - import com.example.member.dto.MemberDTO; +import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import lombok.NoArgsConstructor; +import javax.persistence.*; @Entity @Setter @Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "member_table") public class MemberEntity { - @Column - private String memberName; // 이름 + @Column(nullable = false) + private String firstName; // 이름 + @Column(nullable = false) + private String lastName; // 성 @Id private Long memberId; // 학번 - @Column + @Column(nullable = false) private String memberMajor; // 학과 - @Column(unique = true) + @Column(nullable = false, unique = true) private String memberEmail; // 이메일 - @Column + @Column(nullable = false) private String memberPassword; // 비밀번호 - - public static MemberEntity toMemberEntity(MemberDTO memberDTO) { MemberEntity memberEntity = new MemberEntity(); - memberEntity.setMemberName(memberDTO.getMemberName()); + memberEntity.setFirstName(memberDTO.getFirstName()); + memberEntity.setLastName(memberDTO.getLastName()); memberEntity.setMemberId(memberDTO.getMemberId()); memberEntity.setMemberMajor(memberDTO.getMemberMajor()); memberEntity.setMemberEmail(memberDTO.getMemberEmail()); diff --git a/src/main/java/com/example/member/repository/MemberRepository.java b/src/main/java/com/example/member/repository/MemberRepository.java index d8c380d..27f76bb 100644 --- a/src/main/java/com/example/member/repository/MemberRepository.java +++ b/src/main/java/com/example/member/repository/MemberRepository.java @@ -3,9 +3,6 @@ import com.example.member.entity.MemberEntity; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; - public interface MemberRepository extends JpaRepository { - // 이메일로 회원 정보 조회 (select * from member_table where member_email=?) - Optional findByMemberEmail(String memberEmail); + boolean existsByMemberEmail(String memberEmail); } diff --git a/src/main/java/com/example/member/service/MemberService.java b/src/main/java/com/example/member/service/MemberService.java index d027c1c..d6aa140 100644 --- a/src/main/java/com/example/member/service/MemberService.java +++ b/src/main/java/com/example/member/service/MemberService.java @@ -6,36 +6,20 @@ import com.example.member.repository.MemberRepository; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; @Service @RequiredArgsConstructor public class MemberService { - private final MemberRepository memberRepository; - public void save(MemberDTO memberDTO) { + + public void create(MemberDTO memberDTO) { MemberEntity memberEntity = MemberEntity.toMemberEntity(memberDTO); memberRepository.save(memberEntity); - } - public MemberDTO login(MemberDTO memberDTO) { - - - Optional byMemberEmail = memberRepository.findByMemberEmail(memberDTO.getMemberEmail()); - if (byMemberEmail.isPresent()){ - MemberEntity memberEntity = byMemberEmail.get(); - if (memberEntity.getMemberPassword().equals(memberDTO.getMemberPassword())){ - MemberDTO dto = MemberDTO.toMemberDTO(memberEntity); - return dto; - } else{ - return null; - } - } else { - return null; - } + public boolean checkEmailDuplicate(String memberEmail) { + return memberRepository.existsByMemberEmail(memberEmail); } public List findAll() { @@ -56,25 +40,6 @@ public MemberDTO findById(Long id) { } } - public MemberDTO findByMemberEmail(String memberEmail){ - Optional optionalMemberEntity = memberRepository.findByMemberEmail(memberEmail); - if (optionalMemberEntity.isPresent()){ - return MemberDTO.toMemberDTO(optionalMemberEntity.get()); - } else { - return null; - } - } - - public MemberDTO updateForm(String myEmail){ - Optional optionalMemberEntity = memberRepository.findByMemberEmail(myEmail); - if (optionalMemberEntity.isPresent()){ - return MemberDTO.toMemberDTO(optionalMemberEntity.get()); - } else{ - return null; - } - } - - public void update(MemberDTO memberDTO) { // update라는 메소드가 따로 없기 때문에, save 메소드 사용 memberRepository.save(MemberEntity.toMemberEntity(memberDTO)); @@ -84,10 +49,4 @@ public void deleteById(Long id) { memberRepository.deleteById(id); } - public void deleteByMemberEmail(String memberEmail){ - Optional optionalMemberEntity = memberRepository.findByMemberEmail(memberEmail); - if (optionalMemberEntity.isPresent()){ - memberRepository.deleteById(optionalMemberEntity.get().getMemberId()); - } - } } diff --git a/src/main/java/com/example/member/service/VerificationService.java b/src/main/java/com/example/member/service/VerificationService.java new file mode 100644 index 0000000..3d5b35b --- /dev/null +++ b/src/main/java/com/example/member/service/VerificationService.java @@ -0,0 +1,51 @@ +package com.example.member.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +@Service +@RequiredArgsConstructor +public class VerificationService { + private final JavaMailSender javaMailSender; + private Map verificationCodes = new HashMap<>(); + + public void sendVerificationCode(String memberEmail) { + String verificationCode = generateVerificationCode(); + + try { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(memberEmail); + message.setSubject("Registration verificationCode"); + message.setText("VerificationCode: " + verificationCode); + javaMailSender.send(message); + } catch (Exception e){ + throw new RuntimeException(e); + } + + verificationCodes.put(memberEmail, verificationCode); + } + + public boolean verify(String memberEmail, String verificationCode){ + // savedCode : 발급받은 코드, verificationCode : 사용자가 입력한 코드 + String savedCode = verificationCodes.get(memberEmail); + if(savedCode == null){ + return false; + } + if(savedCode.equals(verificationCode)){ + verificationCodes.remove(memberEmail); + return true; + } + return false; + } + private String generateVerificationCode(){ + Random random = new Random(); + int code = 1000 + random.nextInt(9000); + return String.valueOf(code); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index fa213a1..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,22 +0,0 @@ -server: - port: 8081 - -# database 연동 설정 -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver -# 각자 PC에 만들어놓은 Database이름을 써야 합니다. - url: jdbc:mysql://localhost:3306/jisinDB?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 -# mysql에 생성한 사용자 계정 정보를 써야 합니다. - username: root - password: 1234 - thymeleaf: - cache: false - - # spring data jpa 설정 - jpa: - database-platform: org.hibernate.dialect.MySQL5InnoDBDialect - open-in-view: false - show-sql: true - hibernate: - ddl-auto: update \ No newline at end of file diff --git a/src/main/resources/templates/save.html b/src/main/resources/templates/save.html index e81a0fb..b2e78d4 100644 --- a/src/main/resources/templates/save.html +++ b/src/main/resources/templates/save.html @@ -10,7 +10,7 @@ 이름:
학번:
학과:
- 아이디:
+ 아이디: 중복확인
비밀번호: