일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 함수
- 비교 연산자
- @PreAuthorize("isAuthenticated()")
- 친절한 SQL 튜닝
- 자바의정석
- 인텔리제이 Web 애플리케이션
- 산술 연산자
- 배열
- java
- 객체지향
- 오버라이딩
- SpringSecurity 로그아웃
- 식별자
- 상속
- 예약어
- 스프링시큐리티 로그아웃
- SpringSecurity 로그인
- 오버로딩
- 연산자
- SQL 튜닝
- 이클립스 설치
- 객체
- spring 게시판 삭제
- 논리 연산자
- 반복문
- SQL
- StringBuffer
- SQL튜닝
- 친절한 SQL
- join
- Today
- Total
gi_dor
회원탈퇴 - SpringSecurity, MySQL , MyBatis 본문
ON DELETE CASCADE 설정 ?
Delete Cascade 는 부모 테이블의 행이 삭제될 때 연관된 자식 테이블의 행이 자동으로 삭제되는 기능
외래 키(Foreign Key) 관계에 적용되는 경우가 많다
예를 들어, 사용자(User)와 그 사용자가 작성한 댓글(Comment)이라는 두 개의 테이블이 있다면.
댓글 테이블은 사용자 테이블을 참조하는 외래 키 FK 를 가지고 있습니다.
이 때, delete Cascade가 설정되어 있다면 사용자 테이블의 특정 사용자의 행이 삭제되면 그 사용자가 작성한
모든 댓글 또한 자동으로 삭제됩니다.
delete Cascade 는 데이터 일관성을 유지하는 데 도움이 될 수 있지만 주의해야 할게 있습니다
예를 들어, 부모 테이블의 레코드를 실수로 삭제했을 때 그와 연관된 모든 자식 레코드가 함께 삭제되므로
데이터의 손실이 발생할 수 있습니다.
또한, delete Cascade 는 대규모 데이터베이스에서 사용할 때 성능 문제를 발생할 수 있습니다
이것을 방치하고자 회원 테이블에 사용자를 on delete cascade 설정하지 않고 String userDelYn 을 사용 하겠습니다.
테이블에 컬럼 설정에 Default 값을 'N' 으로 설정하겠습니다
<!-- 회원탈퇴 -->
<update id="deleteUserById" parameterType="string">
UPDATE USER
SET user_del_yn = 'Y'
WHERE user_id = #{id}
</update>
<select id="selectUserById" parameterType="string" resultType="com.example.bookhub.user.vo.User">
SELECT
u.user_no as no,
u.user_id as id,
u.user_password as password,
u.user_name as name,
u.user_email as email ,
u.user_tel as tel ,
u.user_zip_code as zipCode ,
u.user_address as address ,
u.user_address_detail as addressDetail ,
u.user_created_date as createdDate,
u.user_updated_date as updatedDate ,
u.user_del_yn as delYn ,
u.user_point as point,
g.grade_no as "userGrade.no",
g.grade_name as "userGrade.name"
FROM USER u , USER_GRADE g
WHERE user_id = #{id}
and u.grade_no = g.grade_no
</select>
@Mapper
public interface MyPageMapper {
void deleteUserById(String id);
}
public void deleteUserById(String id, String password) {
// 사용자 아이디로 정보 가져오기
User user = userService.selectUserById(id);
// 사용자가 입력한 비밀번호를 암호화하여 검증
if (passwordEncoder.matches(password, user.getPassword())) {
// deletedYn 'N' -> 'Y'
myPageMapper.deleteUserById(user.getId());
} else {
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}
}
(passwordEncoder.matches(password, user.getPassword()))
사용자가 입력한 비밀번호와 데이터베이스에 저장된 암호화된 비밀번호를 비교합니다.
비밀번호 비교 후 일치 한다면 deletedYn 의 값을 'Y' 으로
@GetMapping("/deleteForm")
public String deleteForm(Model model , Principal principal ) {
String userId = principal.getName();
User user = userService.selectUserById(userId);
model.addAttribute("user",user);
return "user/deleteUserForm";
}
@PostMapping("/deleteUser")
public String deleteAccount(Principal principal , String password) {
try{
// 사용자 탈퇴 처리
myPageService.deleteUserById(principal.getName(), password);
// 로그아웃
return "redirect:/user/logout";
} catch (IllegalArgumentException ex) {
return "redirect:/mypage/deleteForm?error"; // 비밀번호 오류 페이지로 리다이렉트
}
}
return "redirect:/user/logout";
//SpringConfig
http.logout(logout -> logout.logoutUrl("/user/logout")
.logoutSuccessUrl("/").invalidateHttpSession(true));
confirm 안내문
form 태그내에 button 태그의 type을 submit 이 아닌 button 으로 변경후 Javascript 코드를 추가하겠습니다
<form method="post" action="/mypage/deleteUser" id="deleteUserForm">
<input type="text" class="form-control" th:value="${user.id}" th:name="id" readonly/>
<input type="password" class="form-control" id="password" th:name="password" />
</form>
<script layout:fragment="script">
function confirmDelete() {
let result = confirm("회원 탈퇴를 진행하시겠습니까?");
if (result) {
document.getElementById("deleteUserForm").submit();
}
}
</script>
비밀번호 일치 하지 않을 때
let urlSearch = new URLSearchParams(location.search);
if (urlSearch.has("error")) {
alert(" 비밀번호가 올바르지 않습니다.");
}
https://developer.mozilla.org/ko/docs/Web/API/URLSearchParams
https://sentry.io/answers/how-to-get-values-from-urls-in-javascript/
@Override
public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException {
// 사용자 아이디를 기준으로 데이터베이스에서 사용자 정보를 가져옵니다. 이 정보는 user 객체에 저장
User user = userMapper.selectUserById(id);
// 데이터베이스에서 가져온 사용자 정보가 없다면(null이면) 예외를 발생시킵니다.
if(user == null) {
throw new UsernameNotFoundException("등록되지 않은 사용자이거나 탈퇴처리된 사용자입니다. : " +id);
}
if ("Y".equals(user.getDelYn())) {
throw new UsernameNotFoundException("회원탈퇴 처리된 계정입니다 : " +id);
}
// UserDetailsImpl 클래스의 객체를 생성합니다. 이 객체는 사용자의 인증 및 권한 정보를 제공하기위해 사용한다
UserDetailsImpl userDetails = new UserDetailsImpl();
// 객체에서 가져온 사용자 아이디와 비밀번호를 userDetails 객체에 설정
userDetails.setId(user.getId());
userDetails.setPassword(user.getPassword());
userDetails.setAuthorities(List.of(new SimpleGrantedAuthority("ROLE_USER")));
System.out.println("로그인한 아이디 : " +user.getId());
return userDetails;
}
'Back_End > SpringBoot' 카테고리의 다른 글
암호화된 비밀번호 변경 (비동기) (0) | 2024.04.24 |
---|---|
회원가입 - 이메일 , 전화번호 <select> (0) | 2024.04.23 |
마이페이지 ver.1- SpringSecurity, MySQL , MyBatis @PreAuthorize("isAuthenticated()") (0) | 2024.04.22 |
시큐리티로 로그인한 회원 정보 조회 , 수정 - SpringSecurity, MySQL , MyBatis (0) | 2024.04.17 |
로그아웃 - SpringSecurity, MySQL , MyBatis (0) | 2024.04.17 |