본문 바로가기
SPRINGBOOT

[spring security] 6. 회원가입 로직

by 정공자씨 2024. 1. 10.

 

 

 

register.html ( 회원 가입 페이지)

  • tyymeleaf 사용
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>register.html</title>
</head>
<body>
	<h2> 회원가입 하기</h2> <hr>

	<form action="/saveRegister" method="post" name="registerForm">
		<input type="text" name="username" placeholder="username"> <br>
		<input type="password" name="password" placeholder="password">
		<input type="submit" value="register">
	</form>
</body>
</html>

 

 

 

userDto

  • 회원 가입 시에 전달받은 회원 데이터를 담는 객체
package com.example.securitytest.dto;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class UserDto { // 회원 가입한 회원 데이터를 받음

    private String username;
    private String password;

}

 

 

 

RegisterController

  • 회원 가입 정보를 userDto를 통해 매개변수로 받아서 registerService로 전달
package com.example.securitytest.controller;

import com.example.securitytest.dto.UserDto;
import com.example.securitytest.service.RegisterService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import lombok.RequiredArgsConstructor;

@Controller
@RequiredArgsConstructor
public class RegisterController {

    // 생성자 주입 방식으로 의존성 주입 권장
    private final RegisterService registerService;


    // 회원 가입 데이터 저장
    @PostMapping("/saveRegister")
    public String saveRegister(UserDto userDto) {

        registerService.register(userDto);

        return "redirect:/";  // main 화면
    }
      
    // 회원 가입 화면
    @GetMapping("/register")
    public String register() {

        return "register";
    }
}

 

 

RegisterService

package com.example.securitytest.service;

import com.example.securitytest.dto.UserDto;
import com.example.securitytest.entity.UserEntity;
import com.example.securitytest.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class RegisterService {

    private final UserRepository userRepository;
    private final BCryptPasswordEncoder bCryptPasswordEncoder; // 암호화 관련

    public void register(UserDto userDto) {

        // 1.db에 이미 동일한 username을 가진 회원이 존재하는지를 DB애서 검증

        boolean isUser = userRepository.existsByUsername(userDto.getUsername());
        if( isUser ) {
            System.out.println("이미 가입된 정보가 있어 회원가입이 진행되지 않음");

            return; // 아래의 코드를 실행하지 않고 돌아감
        }


        // 2.동일한 회원이 없을 때는 회원가입을 진행

        //회원 정보인dto를 DB에 저장하기 위해 entity로 변경
        UserEntity entityData = new UserEntity(); // 빈 객체 생성

        entityData.setUsername(userDto.getUsername());
        entityData.setPassword(bCryptPasswordEncoder.encode(userDto.getPassword())); // 비밀번호 암호화 진행
        entityData.setRole("ROLE_USER"); // 역할 : ROLE_USER, ROLE_ADMIN (사용자, 관리자)

        userRepository.save(entityData);

    }

}

 

[ registerService ] 

- DB에 회원가입 정보를 저장하는 메서드를 작성할 때,
  전달받은 매개변수인 userDto내의 password는 암호화 되어있지 않는 상태

- DB에 저장하기 위해 userEntity로 변환하는 과정에서, 비밀번호 암호화 진행 필요
entityData.setPassword( bCryptPasswordEncoder.encode( userDto.getPassword() ) );​


- bCryptPasswordEncoder : 이전에 security Config 클래스에서 설정 완료
package com.example.test.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity 
public class SecurityConfig {

  // 1.암호화 메서드 등록: 회원 가입 시, 호출하여 암호화 사용 가능
  @Bean
  public BCryptPasswordEncoder bCryptPasswordEncoder() {
  
      return new BCryptPasswordEncoder();
  }

}​


 

 

UserEntity

package com.example.securitytest.entity;

import jakarta.persistence.*;
import lombok.Data;

@Entity // Entity를 기반으로 DB테이블을 만들어주는 hibernate 설정 필요
@Data
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // id값(고유번호) 자동으로 생성 
    private int id;

    @Column(unique = true) // username이 중복되지 않도록 unique 설정(아이디 중복 금지)
    private String username;

    private String password;

    private String role; // 권한 저장: 일반인(USER), 관리자(ADMIN)


}

 

 

 

 

 

RegisterRepository

  • DB와 연결
  • userEntity라는 데이터를 가지고 DB에 접근할 인터페이스
package com.example.securitytest.repository;

import com.example.securitytest.dto.UserDto;
import com.example.securitytest.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Integer> { 

    // 커스텀 jpa 구문
    boolean existsByUsername(String username);
 
}