
package com.mysite.sbb.user;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class SiteUser {
@Id //๊ธฐ๋ณธํค
@GeneratedValue(strategy = GenerationType.IDENTITY) //์๋ ์ฆ๊ฐ
private Long id;//longํ์
(int๋ณด๋ค ํฐ ์ ์)
@Column(unique = true) //์ ๋ํฌํค ์ค์ , ์ค๋ณต ๋ถ๊ฐ
private String username;
private String password;
@Column(unique = true)//์ ๋ํฌํค ์ค์ , ์ค๋ณต ๋ถ๊ฐ
private String email;
}
h2-console์ ํ์ธํ๋ฉด Entity๋ก ์ค์ ํ ํ ์ด๋ธ๋ค์ด ์์ฑ๋๊ฒ์ด ํ์ธ๋๋ค.

ํ์ง๋ง ์ฌ์ฉ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก Repository๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๋ก ํ๋ค.
UserRepository

package com.mysite.sbb.user;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<SiteUser, Long> {
}
๋น๋ฐ๋ฒํธ ์ํธํ

//์ํธํ ๊ฐ์ฒด
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

UserService ์์ฑ
package com.mysite.sbb.user;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepo;
public SiteUser create(String username, String email, String password) {
SiteUser user = new SiteUser();//SiteUser๋ก ๋ฆฌํดํ๊ฒ ํจ
user.setUsername(username);//์์ด๋ ์ ์ฅ
user.setEmail(email);//์ด๋ฉ์ผ ์ ์ฅ
//๋น๋ฐ๋ฒํธ ์ํธํํ๊ธฐ (์ํธํ ๊ฐ์ฒด ํ์ํจ)
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); //์ํธํ
user.setPassword(passEncoder.encode(password));//encode()์ํธํ ๋ฉ์๋
this.userRepo.save(user);//์ ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ
return user;
}
}
User ์๋น์ค์๋ User ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ User ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ create ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
์ด ๋ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ ๋ณด์์ ์ํด ๋ฐ๋์ ์ํธํํ์ฌ ์ ์ฅํด์ผ ํ๋ค.
์ํธํ๋ฅผ ์ํด ์ํ๋ฆฌํฐ์ BCryptPasswordEncoder ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ๋ค.
ํ์๊ฐ์ ํผ(์ ํจ์ฑ ๊ฒ์ฌ)
UserCreateForm ์์ฑ
package com.mysite.sbb.user;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserCreateForm {
@Size(min = 3, max =25, message = "ID๋ 3~25์๊น์ง ์ฌ์ฉ๊ฐ๋ฅ!")
@NotEmpty(message = "์ฌ์ฉ์ID๋ ํ์ ํญ๋ชฉ์
๋๋ค.")
private String username;
@NotEmpty(message = "๋น๋ฐ๋ฒํธ๋ ํ์ ํญ๋ชฉ์
๋๋ค.")
private String password1;
@NotEmpty(message = "๋น๋ฐ๋ฒํธ ํ์ธ์ ํ์ ํญ๋ชฉ์
๋๋ค.")
private String password2;
@NotEmpty(message = "์ด๋ฉ์ผ์ ํ์ํญ๋ชฉ์
๋๋ค.")
@Email
private String email;
}
email ์์ฑ์๋ @Email ์ด ์ ์ฉํ์ฌ ํด๋น ์์ฑ์ ๊ฐ์ด ์ด๋ฉ์ผํ์๊ณผ ์ผ์นํ๋์ง๋ฅผ ๊ฒ์ฆํ๋ค.
๊ณต๋ฐฑ์ผ ๊ฒฝ์ฐ์๋ ์๋ฌ ๋ฉ์ธ์ง ์ถ๋ ฅ
min ์ต์๊ธธ์ด , max ์ต๋๊ธธ์ด
UserController ์์ฑ

package com.mysite.sbb.user;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/signup")
public String signup(UserCreateForm userCreateForm) {
return "signup_form";
}
}
signup_form.html์์ฑ ํ ๋ด์ฉ ์์ฑ

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="layout::head"></head>
<body>
<nav th:replace="layout::nav"></nav>
<div class="my-3 border-bottom">
<div>
<h4>ํ์๊ฐ์
</h4>
</div>
</div>
<form
th:action="@{/user/signup}"
th:object="${userCreateForm}"
method="post"
>
<div th:replace="layout::formErrors"></div>
<div class="mb-3">
<label for="username" class="form-label">์ฌ์ฉ์ID</label>
<input type="text" th:field="*{username}" class="form-control" />
</div>
<div class="mb-3">
<label for="password1" class="form-label">๋น๋ฐ๋ฒํธ</label>
<input type="password" th:field="*{password1}" class="form-control" />
</div>
<div class="mb-3">
<label for="password2" class="form-label">๋น๋ฐ๋ฒํธ ํ์ธ</label>
<input type="password" th:field="*{password2}" class="form-control" />
</div>
<div class="mb-3">
<label for="email" class="form-label">์ด๋ฉ์ผ</label>
<input type="email" th:field="*{email}" class="form-control" />
</div>
<button type="submit" class="btn btn-primary">ํ์๊ฐ์
</button>
</form>
</body>
</html>
์๋ฌ์์ด ์ถ๋ ฅ๋๋์ง ํ์ธํ๊ธฐ

์ปจํธ๋กค๋ฌ์์ userCreateForm๊ฐ์ฒด๊ฐ signup์ผ๋ก๋์ด๊ฐ๋ ๋ฐ

ํผ์ ํ๋ ๋ณ์ ๊ฐ์ด ๋ค์ด๊ฐ

๊ทธ๋ฆฌ๊ณ ๋ค๋ธ๋ฐ์ ํ์๊ฐ์ ์ถ๊ฐํ๋ค

<li class="nav-item">
<a class="nav-link" href="#">๋ก๊ทธ์ธ</a>
</li>
<li class="nav-item">
<a class="nav-link" th:href="@{/user/signup}">ํ์๊ฐ์
</a>
</li>

UserController - ํ์๊ฐ์ ์ฒ๋ฆฌ ์์
//ํ์๊ฐ์
์ฒ๋ฆฌ
@PostMapping("/signup")
public String signup(@Valid UserCreateForm userCreateForm,BindingResult result) {
if (result.hasErrors()) {
return "signup_form";
}
//ํจ์ค์๋ ํ์ธ (๊ฐ์ง ์์ ๊ฒฝ์ฐ)
if(!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
result.rejectValue("password2", "passwordInCorrect","2๊ฐ์ ํจ์ค์๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค");
return "signup_form";
}
//DB์ ์ ์ฅํ๊ธฐ
userService.create(userCreateForm.getUsername(),
userCreateForm.getEmail(),
userCreateForm.getPassword1());
return "redirect:/"; //๊ธฐ๋ณธํ์ด์ง๋ก ์ด๋
}
password2์ ํ๋ ๋ณ์ ์๋ฌ์
passwordInCorrect๋ ์ด๋ฆ
2๊ฐ์ ํจ์ค์๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค ์ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค

ํ ์คํธํ๊ธฐ
1. ๊ณต๋ฐฑ์ผ๋ก ์์ฑ ์

2. ๋น๋ฐ๋ฒํธ 1๊ณผ 2๊ฐ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ

3. ์ ์์ ์ผ๋ก ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ๋ ฅํ์ ๊ฒฝ์ฐ
-> ๊ธฐ๋ณธํ์ด์ง๋ก ์ด๋
-> DB์ ์ฅ๊น์ง ํ์ธ

ํจ์ค์๋๋ ์ ์ฅํ ๋ ์ํธํ๋ฅผ ํด์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒ ๋์ด
ํ ๋ช ๋ ํ์๊ฐ์ ํ hong๊ณผ ๋์ผํ๊ธฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํด๋ด

๋น๋ฐ๋ฒํธ๋ ๋์ผํด๋ ์ํธํ๋ ๋ค๋ฅด๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ง ์ฒ๋ฆฌ๋์ง ์์๊ฒ ์์.
์ด๋ฏธ ๊ฐ์ ๋์ด์๋ id๋ ๊ฐ์ email๋ก ํ์๊ฐ์ ์๋ํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.

๋ ธ๋ ๋ถ๋ถ์ด ์ด๋ค ์๋ฌ์ธ์ง ๋งํด์ค

trycatch๋ฌธ ์ถ๊ฐ๋ก ์๋ฌ ๋ฐ์ ์ ์๋ฌ ๋ฉ์ธ์ง ์ถ๋ ฅํ๊ฒ ์ฝ๋ ์์ ํจ
//ํ์๊ฐ์
์ฒ๋ฆฌ
@PostMapping("/signup")
public String signup(@Valid UserCreateForm userCreateForm,BindingResult result) {
if (result.hasErrors()) {
return "signup_form";
}
//ํจ์ค์๋ ํ์ธ (๊ฐ์ง ์์ ๊ฒฝ์ฐ)
if(!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
result.rejectValue("password2", "passwordInCorrect","2๊ฐ์ ํจ์ค์๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค");
return "signup_form";
}
//DB์ ์ ์ฅํ๊ธฐ
try {
userService.create(userCreateForm.getUsername(),
userCreateForm.getEmail(),
userCreateForm.getPassword1());
} catch (DataIntegrityViolationException e) {
result.reject("signupFailed","์ด๋ฏธ ๋ฑ๋ก๋ ์ฌ์ฉ์์
๋๋ค.");
return "signup_form";
} catch (Exception e) {
e.printStackTrace(); //์ฝ์์ ์๋ฌ ๋ฉ์ธ์ง ์ถ๋ ฅ
result.reject("signupFailed","์์์น ๋ชปํ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
return "signup_form";
}
return "redirect:/"; //๊ธฐ๋ณธํ์ด์ง๋ก ์ด๋
}
ํ ์คํธํ๊ธฐ
์ด๋ฏธ ๊ฐ์ ๋์ด์๋ ์ฌ์ฉ์๋ก ํ์๊ฐ์ ์๋ ์


'BACKEND > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ก๊ทธ์์ ์ฒ๋ฆฌ (0) | 2023.11.10 |
|---|---|
| ๋ก๊ทธ์ธ ๊ตฌํ (0) | 2023.11.10 |
| ์คํ๋ง ์ํ๋ฆฌํฐ (0) | 2023.11.10 |
| ๋ต๋ณ ๊ฐ์ ํ์ (1) | 2023.11.09 |
| ๊ฒ์๋ฌผ์ ์ผ๋ จ๋ฒํธ ์ถ๊ฐํ๊ธฐ (1) | 2023.11.09 |
