본문 바로가기
프로젝트

파이널 프로젝트_회원가입(Spring Boot, @Valid , MySQL)

by 유서담 2024. 4. 20.

 


 

 

Admin.class

 

 

회원가입 화면에서 사용자가 값을 입력한 내용을 

데이터 베이스에 저장하기 위한 Admin 클래스

 


 

 

AdminController

 

 

GET 방식 호출 : AdminRegisterForm 을 모델 객체에 담아서 뷰에 전송

(AdminRegisterForm 이 무엇인지는 아래에 설명)

 

 

POST 방식 호출 : 

 

@Valid 어노테이션을 활용해서 모델 객체의 유효성 검사를 수행

BindingResult  데이터를 바인딩할 때 발생할 수 있는 오류들을 담는 객체

RedirectAttributes  리다이렉션을 수행할 때 파라미터를 URL에 붙여 넘기는 것이 아닌 세션을 통해

데이터를 임시로 전달하는 방법을 제공

 

 // 폼 입력값 유효성 체크를 통과하지 못한 경우
        if(error.hasErrors()){
            // 회원가입 실패시 입력 데이터 유지
            return "admin/signup";
}

 

hasErrors( ) 

유효성 체크를 통과하지 못했는지 체크하기 위한 메소드

오류가 있으면 true 값을 반환. 오류가 없으면 false 값을 반환

위 코드에선 true 값을 반환했을 경우 회원가입 페이지에 머무르게 한다

 

 

try{
	// 유효성 체크를 통과한 경우
	Admin admin = adminService.join(form);
	redirect.addFlashAttribute("admin", admin);
	return "redirect:/admin/home";

} catch (AlreadyAdminIdException ex){
	error.rejectValue("id", null, ex.getMessage());
	return "admin/signup";
} catch (AlreadyAdminEmailException ex){
	error.rejectValue("email", null, ex.getMessage());
	return "admin/signup";
}

 

try 블록

Admin admin = adminService.join(form)

유효성 체크를 통과한 데이터들을 기반으로 Admin 객체 생성

 

redirect.addFlashAttribute("admin", admin);

리다이렉트 시 Admin 객체를 Flash 속성으로 추가

(페이지에서 한 번 사용할 수 있는 데이터를 전달)

 

성공시  admin/home 으로 이동한다

 

 

catch 블록

 

AlreadyAdminIdException / AlreadyAdminEmailException 발생시

오류가 발생한 필드의 이름을 반환하고, 오류의 메세지를 반환한다

그리고 다시 회원가입 페이지로 이동 ( 두 Exception 클래스는 아래에 설명)

 

 

 

AdminRegisterForm 

 

 

AdminRegisterForm 클래스는 

회원가입시 사용자가 입력한 내용이 형식에 맞는 내용인지 

유효성 검사를 한다

 

 

 

AlreadyAdminIdException / AlreadyAdminEmailException

AlreadyAdminIdException

 

 

AlreadyAdmionEmailException

 

 

사용자가 회원가입시 입력한 아이디와 이메일이

이미 데이터베이스에 존재했을 때 에러를 발생시키고 관련 메세지를 뷰에 

전송하는 클래스

(RuntimeException 을 상속받아서 사용했다)

 


Admin Service - join 메소드

 

 

회원가입의 비즈니스를 담당하는 join 메소드

AdminRegisterForm 클래스를 매개변수로 받는다

 

 

 // DB에서 중복되는 아이디가 있는지 확인
Admin saveAdmin = adminMapper.getAdminId(form.getId());
if(saveAdmin != null){
	throw new AlreadyAdminIdException("[" + form.getId() +"]는 이미 사용중인 아이디입니다");
}
// DB에 중복되는 이메일이 있는지 확인
saveAdmin = adminMapper.getAdminEmail(form.getEmail());
if(saveAdmin != null){
	throw new AlreadyAdminEmailException("[" + form.getEmail() +"]는 이미 사용중인 이메일입니다");
}

Admin admin = form.toAdmin();

 

 

Admin saveAdmin = adminMapper.getAdminId(form.getId());

폼에 입력된 아이디를 saveAdmin에 저장

데이터 베이스에 저장된 아이디와 saveAdmin 비교

만약 null이 아니라면 AlreadyAdminIdException 예외를 발생시켜서 메세지를 전송

 

Admin saveAdmin = adminMapper.getAdminEmail(form.getEmail());

위 아이디 비교하는 가정과 마찬가지로

데이터 베이스에 저장된 이메일과 입력된 이메일을 비교

만약 null이 아니라면 AlreadyAdminEmailException 예외를 발생시켜서 메세지를 전송

 

위 과정을 다 통과하면

입력된 폼 데이터를 기반으로 새로운 Admin 객체를 생성

 

 

 

// 비밀번호 암호화과정
String encodePassword = passwordEncoder.encode(admin.getPassword());
admin.setPassword(encodePassword);
adminMapper.join(admin);

return admin;

 

 

 

PasswordEncoder encode()메소드

Spring Security에서 제공하는 메소드다.

단방향 해시 함수를 사용해서 비밀번호를 암호화한다.

(단방향 해시는 복호화할 수 없는 데이터로 변환을 한다)

 

String encodePassword = passwordEncoder.encode(admin.getPassword());

폼에서 받은 비밀번호를 암호화해서 

encodePassword에 저장을 한다

 

admin.setPassword(encodePassword)

암호화된 비밀번호를 admin 객체의 비밀번호로 설정한다

 

adminMapper.join(admin);

생성하고 수정한 관리자 객체를 DB에 저장

 

 


 

 

매퍼파일들 - Mapper 인터페이스 ,  xml

 

 

getAdminId(String id)

 <select id="getAdminId" resultMap="AdminResultMap" parameterType="String">
        SELECT
            ADMIN_ID, ADMIN_PW, ADMIN_EMAIL, ADMIN_TEL
        FROM
            ADMIN
        WHERE
            ADMIN_ID = #{value}
    </select>

 

아이디를 입력해서 해당하는 아이디의

아이디, 비밀번호, 이메일, 전화번호를 불러온다

 

 

getAdminEmail(String email)

<select id="getAdminEmail" resultMap="AdminResultMap" parameterType="String">
        SELECT
            ADMIN_EMAIL
        FROM
            ADMIN
        WHERE
            ADMIN_EMAIL = #{value}
    </select>

 

이메일을 입력해서 해당하는 이메일의 이메일을 불러온다

 

 

void join(Admin admin)

 

 <insert id="join" parameterType="com.example.bookhub.admin.vo.Admin">
        INSERT INTO ADMIN(ADMIN_ID, ADMIN_PW, ADMIN_EMAIL, ADMIN_TEL)
        VALUES
        (#{id}, #{password}, #{email}, #{tel})
    </insert>

 

테이블에 데이터를 저장한다

각각 아이디, 비밀번호, 이메일, 전화번호를 저장

 

 


 

비밀번호 확인

 

 

 

 

비밀번호 확인은 간단한 자바스크립트로 만들었다

비밀번호 폼에 입력한 값을 읽고

비밀번호 확인 폼과 비교를 해서 같은 값이 아니면

비밀번호가 일치하지 않는다는 문구가 출력이 된다