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
사용자가 회원가입시 입력한 아이디와 이메일이
이미 데이터베이스에 존재했을 때 에러를 발생시키고 관련 메세지를 뷰에
전송하는 클래스
(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>
테이블에 데이터를 저장한다
각각 아이디, 비밀번호, 이메일, 전화번호를 저장
비밀번호 확인
비밀번호 확인은 간단한 자바스크립트로 만들었다
비밀번호 폼에 입력한 값을 읽고
비밀번호 확인 폼과 비교를 해서 같은 값이 아니면
비밀번호가 일치하지 않는다는 문구가 출력이 된다
'프로젝트' 카테고리의 다른 글
파이널 프로젝트_ @Scheduler를 활용한 통계 저장 기능 (0) | 2024.05.01 |
---|---|
파이널 프로젝트_로그인, 로그아웃(Spring Boot, Session ) (0) | 2024.04.20 |
세미프로젝트_견적요청(서비스 페이지) (0) | 2024.02.08 |
세미프로젝트_마이페이지, 개인정보 수정 (0) | 2024.02.07 |
세미프로젝트_로그인, 회원가입 정리 (0) | 2024.02.04 |