Web Programming/Java Spring

Java Spring Security를 이용해서 회원가입 구현하기

jinmc 2021. 2. 7. 14:40
반응형

저번 포스팅까지 해서 로그인 기능을 구현하는데 성공했습니다.

Spring Security와 JPA, H2 Database를 사용해서 로그인 기능을 구현했는데요,

이번 포스팅에서는 회원가입 기능을 구현해 보도록 하겠습니다.

다행인 건, 회원가입 기능은 로그인 기능보다 구현하기 간단하다는 것입니다.

서비스나 DAO, DTO 등도 사용하지 않고 구현을 해보도록 하겠습니다.

 

일단 register.html 페이지를 만듭니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
</head>

<body class="bg-gradient-primary">

    <div class="container">

        <div class="card o-hidden border-0 shadow-lg my-5">
            <div class="card-body p-0">
                <!-- Nested Row within Card Body -->
                <div class="row">
                    <div class="col-lg-5 d-none d-lg-block bg-register-image"></div>
                    <div class="col-lg-7">
                        <div class="p-5">
                            <div class="text-center">
                                <h1 class="h4 text-gray-900 mb-4">회원 가입 </h1>
                            </div>
                            <form class="user" th:action="@{/register}" th:object="${user}" method="post">
                                <div class="form-group row">
                                    <div class="col-sm-12">
                                        <input type="text" class="form-control form-control-user" id="user_name" name="userName"
                                            placeholder="id">
                                    </div>
                                </div>
                                <div class="form-group row">
                                    <div class="col-sm-6 mb-3 mb-sm-0">
                                        <input type="password" class="form-control form-control-user" name="password"
                                            id="password" placeholder="비밀번호 ">
                                    </div>
                                    <div class="col-sm-6">
                                        <input type="password" class="form-control form-control-user" name="passwordConfirm"
                                            id="password_confirm" placeholder="비밀번호 확인 ">
                                    </div>
                                </div>
                                <button type="submit" class="btn btn-primary btn-user btn-block">회원 가입하기</button>

                            </form>
                            <hr>
                            <div class="text-center">
                                <a class="small" href="forgot-password.html">비밀번호를 잃어버리셨나요? </a>
                            </div>
                            <div class="text-center">
                                <a class="small" href="login.html">이미 가입하셨나요? 로그인하세요 </a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

    </div>

</body>

</html>

 

html을 만들 때 주의할 점은, 

현재 Thymeleaf를 쓰고 있기 때문에 

head 전에 태그를 붙여줘야 된다는 점입니다.

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">

또, name을 camelcase 형태로 model entity에서 지정해준 대로 작성해야 줘야 된다는 점도 주의할 점입니다.

User Entity를 보면, role, active 등도 있기 때문에 위에서 지정을 해 줘야함을 알 수 있습니다.

 

또 한가지 주의할 점은, strategy = GenerationType.IDENTITY 로 하지 않고 auto로 해 놓았을 때,

그 전에 h2 database를 migration할 때 미리 써 놓았던 data script와 충돌을 일으키기 때문에 

AUTO에서 identity 로 바꿔야 한다는 점입니다.

참고로 generationtype strategy의 대한 글을 첨부합니다.

tech.yangs.kr/entry/JPA02-%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%EC%93%B8%EB%96%BC%EC%9E%88%EB%8A%94-JPA-GeneratedValue-%EC%9D%B4%EC%95%BC%EA%B8%B0

 

package com.myBoard.demo.model;

import javax.persistence.*;

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String userName;
    private String password;
    private String passwordConfirm;
    private String role;
    private boolean active;
    
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getPasswordConfirm() {
		return passwordConfirm;
	}
	public void setPasswordConfirm(String passwordConfirm) {
		this.passwordConfirm = passwordConfirm;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public boolean isActive() {
		return active;
	}
	public void setActive(boolean active) {
		this.active = active;
	}
}

 

 

그 후 controller에 처리 코드를 써 줍니다.

	@GetMapping("register")
	public String showRegister() {
		System.out.println("showing register");
		return "register";
	}
	
	@PostMapping("register")
	public String register(User user) {
		System.out.println(user);
		user.setRole("admin");
		user.setActive(true);
		
		userRepository.save(user);
		System.out.println("hi");
		return "/login";
		
	}

처음 getmapping은 페이지를 보여주기 위한 function이고, 

다음 postmapping은 실제로 저장을 하기 위한 코드 입니다.

print 문을 적절히 추가시켜 줌으로써 디버깅을 할 수 있습니다.

 

 

반응형