[기초 API 구현 2] - 회원가입 기능 추가

박성규·2022년 5월 27일
0

[스프링 부트]

목록 보기
24/38
post-thumbnail
  1. Controller
@PostMapping("/user/signup")
    public String signupRequest(SignupRequestDto signupRequestDto){
        userService.signup(signupRequestDto);
        return "redirect:/user/login";
    }

2.Service

package com.spring.loginprac.service;

import com.spring.loginprac.dto.SignupRequestDto;
import com.spring.loginprac.model.UserRoleEnum;
import com.spring.loginprac.model.Users;
import com.spring.loginprac.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class UserService {
    private final UserRepository userRepository;
    private static final String ADMIN_TOKEN = "AAABnv/xRVklrnYxKZ0aHgTBcXukeZygoC";

    public UserService(UserRepository userRepository){
        this.userRepository = userRepository;
    }
    public void signup(SignupRequestDto signupRequestDto) {
        String username = signupRequestDto.getUsername();
        String password = signupRequestDto.getPassword();
        String email = signupRequestDto.getEmail();
        UserRoleEnum role = UserRoleEnum.USER;

        Optional<Users> found = userRepository.findByUsername(username);

        if(found.isPresent()){
            throw new IllegalArgumentException("중복된 ID가 존재합니다.");
        }


        if(signupRequestDto.isAdmin()){
            if(!signupRequestDto.getAdminToken().equals(ADMIN_TOKEN)){
                throw new IllegalArgumentException("관리자 암호가 틀립니다.");
            }
            role = UserRoleEnum.ADMIN;
        }

        Users users = new Users(username, password, email, role);
        userRepository.save(users);

    }
}

3.Entity

package com.spring.loginprac.model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Setter
@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Users {

    // ID가 자동으로 생성 및 증가합니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    // nullable: null 허용 여부
    // unique: 중복 허용 여부 (false 일때 중복 허용)
    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false)
    @Enumerated(value = EnumType.STRING)
    private UserRoleEnum role;

    public Users(String username, String password, String email, UserRoleEnum role) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.role = role;
    }
}
package com.spring.loginprac.model;

public enum UserRoleEnum {
    USER,  // 사용자 권한
    ADMIN  // 관리자 권한
}

4.Repository

package com.spring.loginprac.repository;

import com.spring.loginprac.model.Notice;
import com.spring.loginprac.model.Users;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<Users,Long> {
    Optional<Users> findByUsername(String username);
}

프론트에서 form 태그에 담아서 넘겼기 때문에 Controller 매개변수에 어노테이션을 생략했다.

서비스에선 중복된 이메일이 있는지, 토큰값이 정확한지 확인한다.

이후 User를 객체화 한 후 Repository에 저장한다.

0개의 댓글

관련 채용 정보