ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회원가입
    Spring Boot/회원 관리 2 - 회원 가입 2021. 12. 6. 22:03

    <signup.jsp> 파일

                            <form class="login__input"  action="/auth/signup" method="post">
                                <input type="text" name="username" placeholder="유저네임" required="required"  />
                                <input type="password" name="password" placeholder="패스워드"  required="required" />
                                <input type="email" name="email" placeholder="이메일" required="required" />
                                <input type="text" name="name" placeholder="이름" required="required"/>
                                <button>가입</button>
                            </form>

     

    이러면 웹 사이트상에 

     

     

    이렇게 회원가입 화면이 나온다.

     

    그래서 사용자가 유저네임, 패스워드, 이메일, 이름을 입력하고

    가입 버튼을 누르면

     

    <SignupDto.java> 파일

    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Size;
    import lombok.Data;
    
    @Data
    public class SignupDto {
    
    	@Size(min = 2, max = 20)
    	@NotBlank
    	private String username;
    	@NotBlank
    	private String password;
    	@NotBlank
    	private String email;
    	@NotBlank
    	private String name;

    SignupDto.java 파일에서 사용자가 입력한 값들(username, password, email, name) 을 받는다.

     

     

    스프링은

    form 으로 데이터가 들어오면 (jsp 파일에서 form 태그)

    (x-www-form-urlencoded 방식) 즉, key = value 형식으로 들어옴

     

     

     

     

    (@Size, @NotBlank 는 값 입력시 글자 크기가 최소 2 ~20 사이, 빈칸이 입력되지 않도록 유효성 검사를 한 것으로,

     

    https://happy-fun.tistory.com/152

     

    회원가입 유효성 검사

    회원가입 시 username password email name 값을 받도록 만들었다. 즉, 회원가입 페이지는 아래처럼 되어 있다. 이 모든 값들을 사용자가 입력해야 만 회원가입이 가능하게 하려고 한다. 그러면 2가지 처

    happy-fun.tistory.com

    이 글을 읽어보면 된다.)

     

     

     

    그러면 AuthController.java에서 이를 받아서 회원가입 처리 한다.

    그런데, signupdto.java 는 사용자가 웹 사이트에 입력한 값을 받아오는 오브젝트이고,

    이를 데이터베이스에 저장하려면, 

    User.java 오브젝트를 만들어서 signupdto.java에서 받은 데이터를 이곳(User.java) 에 담아야 한다.

    그리고 이를 repository로 전달해줘서 데이터베이스에 저장하도록 해야 한다.

     

     

     

    즉, 웹 사이트에서 사용자가 회원가입 페이지에 입력한 정보를 받아오는 것은

    SignupDto.java 파일이고,

     

    이렇게 받아온 정보를 데이터 베이스에 저장할 때 사용되는 것은

    User.java 파일이다.

     

     

     

    <User.java> 파일

    import java.time.LocalDateTime;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.PrePersist;
    
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    @Entity
    public class User {
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY) 
    	private int id;
    	
    	@Column(length = 100,  unique = true) 
    	private String username; 
    	@Column(nullable = false)
    	private String password;
    	@Column(nullable = false)
    	private String name;
    	private String website; // 웹 사이트
    	private String bio; // 자기 소개
    	@Column(nullable = false)
    	private String email;
    	private String phone;
    	private String gender;
    	private String role; // 권한
    	
    	
    	private String profileImageUrl;
    	private LocalDateTime createDate;
    	
    	@PrePersist 
    	public void createDate() {
    		this.createDate = LocalDateTime.now();
    	}
    
    }

     

    여기에 보면, 우리는 username, password, email, name 만 사용자로부터 받았지만, website 등 다른 변수가 user.java 오브젝트에 있는 것을 알 수 있다.

    (최종적으로 데이터베이스에는 username, password, name, email, website, bio, phone 등 모든 변수가 테이블로 만들어진다.)

     

     

    아무튼, 그래서 SignupDto.java에 사용자로부터 받은 데이터들을 User.java 오브젝트로 만들기 위해 SignupDto.java 파일에서 toEntity 메서드를 만든다. (빌더 패턴 사용- User.java에서 @Builder 어노테이션 사용)

     

     

     

    어노테이션 설명:

    @PrePersist 

    db 에 값이 insert 되기 직전에 실행

     

    즉, createDate 부분은 자동으로 db에 들어감

     

     

    @Entity

    db에 테이블 생성해줌

     

    @GeneratedValue(strategy = GenerationType.IDENTITY) 

    번호 증가 전략이 데이터베이스를 따라감

     

     

     

     

    <SignupDto.java> 파일

    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Size;
    
    import com.tree.sky.domain.user.User;
    
    import lombok.Data;
    
    @Data
    public class SignupDto {
    
    	@Size(min = 2, max = 20)
    	@NotBlank
    	private String username;
    	@NotBlank
    	private String password;
    	@NotBlank
    	private String email;
    	@NotBlank
    	private String name;
    	
    	
    	public User toEntity() {
    		return User.builder()
    				.username(username)
    				.password(password)
    				.email(email)
    				.name(name)
    				.build();
    	}
    	
    }

     

    그런 다음 AuthController.java에서 

    SignupDto.java의 toEntity로 만들어진 user 오브젝트를 데이터베이스에 저장하도록 코드를 만든다.

     

    <AuthController.java> 파일

    @RequiredArgsConstructor
    @Controller
    public class AuthController {
    
    
    	private final AuthService authService;
    	
        
        	@PostMapping("/auth/signup")
    	public String signup(@Valid SignupDto signupDto, BindingResult bindingResult) {
    
    		
    	
    		if (bindingResult.hasErrors()) {
    			Map<String, String> errorMap = new HashMap<>();
    
    			for (FieldError error : bindingResult.getFieldErrors()) {
    				errorMap.put(error.getField(), error.getDefaultMessage());
    			}
    			throw new CustomValidationException("유효성 검사 실패함", errorMap);
    		}else {
    		
    		User user = signupDto.toEntity();
    		authService.회원가입(user);
    	
    		return "auth/signin";
    
    	   }
    	}
    	
    	
    	
    	
    	
    }

    여기서 보면 signupDto.toEntity로 user 오브젝트를 받고,

    authService 객체의 회원가입 메서드로 회원가입을 완성하는 것을 알 수 있다.

     

    (더불어 이 코드에서 @Valid, BindingResult,  관련한 코드는 회원가입 유효성 관련 코드로, 

    https://happy-fun.tistory.com/152

     

    회원가입 유효성 검사

    회원가입 시 username password email name 값을 받도록 만들었다. 즉, 회원가입 페이지는 아래처럼 되어 있다. 이 모든 값들을 사용자가 입력해야 만 회원가입이 가능하게 하려고 한다. 그러면 2가지 처

    happy-fun.tistory.com

     

    이 글을 읽어 보면 된다.)

     

     

    (또한 AuthController.java에서 AuthService 객체의 회원가입 메서드를 사용할 떄, 의존성 주입이 필요한데 이에 대한 설명은 아래의 글을 참고하면 된다.

    https://happy-fun.tistory.com/156

     

    의존성 주입

    프로젝트에서 회원가입 코드를 만들 때, AuthController.java 에서 AuthService.java의 회원가입 메서드를 사용하려고 한다면 AuthController.java에 AuthService 오브젝트를 의존성 주입해야 한다. 즉, 아래에서..

    happy-fun.tistory.com

     

    )

     

     

     

     

    <AuthService.java> 파일

    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.tree.sky.domain.user.User;
    import com.tree.sky.domain.user.UserRepository;
    
    import lombok.RequiredArgsConstructor;
    
    
    @RequiredArgsConstructor
    @Service
    public class AuthService {
    
    	
    	private final UserRepository userRepository;
    	private final BCryptPasswordEncoder bCryptPasswordEncoder;
    	
    	
    	
    	
    	@Transactional 
    	public User 회원가입(User user) throws RuntimeException{
    		String rawPassword = user.getPassword();
    		String encPassword = bCryptPasswordEncoder.encode(rawPassword);
    		user.setPassword(encPassword);
    		user.setRole("ROLE_USER"); // 관리자 ROLE_ADMIN
    		User userEntity = null;
    		userEntity = userRepository.save(user);
    		
    		
    		return userEntity;
    	}
    	
    	
    }

     

    여기서 회원가입 메서드를 확인할 수 있다.

    특히, 비밀번호 해쉬를 위해 

    일단 AuthController.java에서 받아온 user 객체에서 비밀번호를 

    rawPassword 변수로 받고,

    bCryptPasswordEncoder로 해쉬화 해준다음 다시 user 오브젝트에 넣어주는 것을 알 수 있다.

    그리고 권한은, 관리자 권한을 주기 위해 ROLE_USER 로 넣어주었다.

    그런다음, userEntity User 객체를 만들어줘서, repository에 저장하고 난 다음의 회원 정보를 받는다.

    return userEntity로 받고 있고, 

    AuthController.java에서도 보면 return "auth/signin" 하고 있는 거로 보아,

    signin.jsp 파일에서 이 사용자 정보를 활용해서 signin.jsp 화면에서 사용할 것임을 알 수 있다.

     

     

    @Service

    ioc 관리, 트랜잭션 관리

     

     

     

    <UserRepository.java> 파일

     

    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface UserRepository extends JpaRepository<User,Integer>{
    
    	
    	User findByUsername(String username);
    }

    특히, respotiroy.java의 경우는, JpaRepository를 상속하면 

    어노테이션 없어도 IoC 등록이 자동으로 됨 

     

     

     

    이렇게 하면 회원가입이 완료된다.

     

    -끝-

     

     

     

    <추가 설명>

     

     

    회원가입 시

    username, password, email, name 값을 사용자로부터 받을 건데,

    이렇게 받은 값을 SignupDto.java 파일에 받아서 

    AuthController.java 파일에 회원가입 함수에 매개변수로 넣어줄 거임.

     

    <SignupDto.java> 파일

    @Data
    public class SignupDto {
    
    	
    	private String username;
    	private String password;
    	private String email;
    	private String name;

     

    어노테이션 설명 :

    @Data : Getter, Setter를 만들어주는 어노테이션

     

     

    그런데, 회원정보가 잘 들어오는지 확인하기 위해,

    log를 사용할 수 있음

     

    즉, AuthController.java 파일에서 

     

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @RequiredArgsConstructor
    @Controller
    public class AuthController {
    
    	private static final Logger log = LoggerFactory.getLogger(AuthController.class);
        
        
    	@PostMapping("/auth/signup")
    	public String signup(SignupDto signupDto) {
    
    		log.info(signupDto.toString());
    	
    		return "auth/signin";
    
    	   }
    	}

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

     

    private static final Logger log = LoggerFactory.getLogger(AuthController.class); 선언 후에

    log.info(signupDto.toString()); 

     

     

     

     

    이렇게 사용하면, 이클립스(sts) 콘솔창에 사용자가 입력한 회원가입 정보가 들어옴

     

     

    이런식으로 사용자가 회원가입 때 입력한 username, password, email, name 값을 볼 수 있음

     

     

     

    만약에, SignupDto.java의 toString()메서드로 받아온 User 객체를 확인하고 싶다면,

     

    AuthController.java 에서

     

    1. log.info(signupDto.toString()); 

    이 코드 아래에 

     

    User user = signupDto.toEntity();

    2. log.info(user.toString());

     

    이 코드를 추가하면 된다.

     

     

     

    @PostMapping("/auth/signup")
    	public String signup(SignupDto signupDto) {
    
    		log.info(signupDto.toString()); 	
    		User user = signupDto.toEntity();
    		
    		log.info(user.toString());
    	
    		return "auth/signin";
    
    	   }
    	}

    그러면 아래와 같이 웹사이트상에서 사용자가 회원가입을 하면

    이클립스(sts) 콘솔창에

    1, 2 가 실행된 두 개의 결과를 볼 수 있다.

     

     

    참고 자료 : 이지업 강의 사이트 "스프링부트 SNS프로젝트 - 포토그램 만들기"

     

     

     

     

     

     

     

    'Spring Boot > 회원 관리 2 - 회원 가입' 카테고리의 다른 글

    회원가입 유효성 검사 2  (0) 2021.12.10
    회원가입 전처리, 후처리  (0) 2021.12.07

    댓글

Designed by Tistory.