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
-
-
-
-
- | name |
- Id |
- major |
- email |
- password |
-
-
- |
- |
- |
- |
- |
-
-
-
-
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
-
-
-회원 목록
-
-
- | name |
- Id |
- major |
- email |
- password |
- 상세조회 |
- 삭제 |
-
-
- |
- |
- |
- |
- |
-
- 조회
- |
-
- 삭제
- |
-
-
-
-
\ 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
-
-
-
-
- | name |
- Id |
- major |
- email |
- password |
-
-
- |
- |
- |
- |
- |
-
-
- 비밀번호 변경
- 회원탈퇴
- 로그아웃
-
-
\ 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 @@
이름:
학번:
학과:
- 아이디:
+ 아이디: 중복확인
비밀번호: