팀프로젝트/SpringBoot

스프링부트 팀플) 20240401 외부API가입자 안내 / 비밀번호 바꾸기 메일

일일일코_장민기 2024. 4. 2. 00:23
728x90
오늘 한 작업은 크게 3가지

1. userId를 username으로, userPw를 password로 바꾸기
조만간 Spring Security를 적용할 예정인데,
그때 아이디를 username, 비밀번호를 password로 바꾸어야 한다는 것을 알게 되었다.
어차피 나중에 DB바꿀 거라면 지금 바꾸는 편이 나을 것이라는 생각에 바꾸게 되었다.

현재 userId를 Primary Key로 쓰고 있는데, Sequence로 바꿀지도 고민중이다.
다만, 그럴 경우 일이 너무 커질 것 같아서...
아무튼 일단 username, password로 수정


2. 외부API가입자 안내
현재 외부API가입자는 관리의 편의성을 위해 회원가입 처리를 하게 된 상태이다.
그래서 외부API로 가입을 한 사람은 내부API로 가입할 수가 없는데, 이걸 명시하기 위한 안내이다.
외부API로 가입하고 깜빡하고 비밀번호 찾기를 누르거나, 회원가입을 누를 수 있기 때문이다.

외부API가입자가 회원가입을 시도할 경우


비밀번호 찾기를 시도할 경우



	<h2>찾은 유저 정보</h2>
	<p>${dto.getNickname()}님은 기존 회원이십니다.<br>
	<c:if test="${dto.getGoogleConnected() == 1}">
	&nbsp;&nbsp;- 구글 로그인 연결됨<br>
	</c:if>
	<c:if test="${dto.getNaverConnected() == 1}">
	&nbsp;&nbsp;- 네이버 로그인 연결됨<br>
	</c:if>
	<c:if test="${dto.getKakaoConnected() == 1}">
	&nbsp;&nbsp;- 카카오 로그인 연결됨<br>
	</c:if>
		아이디:	${dto.getUsername()}<br>
		가입일:	${dto.getUserSignDate()}
	</p>
	<div>
		<a href="<c:url value='/Login'/>">로그인</a> | 
		<a href="<c:url value='/FindInfo'/>">회원정보 찾기</a>
	</div>​

 

정렬이 이상하긴 한데 jstl을 써서 연동 여부가 True일 때만 출력되도록 만들었다.

 

 

3. 비밀번호 바꾸기 메일
기존에는 전체 비밀번호를 출력하는 메일을 보냈는데, 이제는 비밀번호 바꾸기 메일로 변경하고자 한다.
 //비밀번호 변경 메일 전송
    public void sendEmail(String userEmail, MemberDTO dto) throws Exception {

    		Map<String, String> changeData = new HashMap<>();
    		
    		//******************복사 후 수정하는 부분******************
    		String emailPath = "static/emailFiles/PWEmail.html";				
	    	
    		String EMAIL_SUBJECT = "[회원정보알림] 문화인의 밤을 이용해주셔서 감사합니다.";		
    		
    		changeData.put("##유저_링크##", "http://localhost:8090/acorn/UpdatePasswordPage?username=##유저_아이디##");
			changeData.put("##유저_아이디##", dto.getUsername());					
    		changeData.put("##유저_닉네임##", dto.getNickname());

	    	String innerImageName = "FindPW";
    		String innerImagePath = "/static/images/email/FindPW.png";
	    	//******************복사 후 수정하는 부분******************
    	
    		String TO_EMAIL = userEmail;
        	//StringBuilder를 String으로 전환하고 이메일 본문으로 저장
        	String EMAIL_BODY = serv.EmailBody(emailPath, changeData);
        	serv.sendEmail(FROM_EMAIL, TO_EMAIL, EMAIL_SUBJECT, EMAIL_BODY, innerImageName, innerImagePath);
    }​

해당 코드 순서상, 윗코드에서 HTML을 쭉 읽으면서 치환을 하기 때문에
링크에 넣고 싶은 값을 넣으면 parameter로 데이터를 전송하는 메일을 만들 수 있다.

 

//이메일 하이퍼링크를 통해 들어오는 비밀번호 변경 페이지
	@GetMapping("/UpdatePasswordPage")
	public ModelAndView UpdatePasswordPage(String username) {
		ModelAndView mav = new ModelAndView();
			mav.addObject("username", username);
			mav.setViewName("member/Find_Info/updatePassword");
		return mav;
	}
	
	//비밀번호 변경
	@PostMapping("/UpdatePassword")
	public String UpdatePassword(String username, String password) {
		
		String realPassword = sc.encrypt(password);
		
		Map<String, String> map = new HashMap<>();
			map.put("username", username);
			map.put("password", realPassword);
			serv.updatePassword(map);
		return "redirect:/UpdateComplete";
	}
	
	//비밀번호 변경 완료
	@GetMapping("UpdateComplete")
	public String UpdateComplete() {
		return "member/Find_Info/updateComplete";
	}
이번에 새로 만든 컨트롤러의 메소드들...

이 다음에는
1. Application.properties에 입력했던 보안코드를 따로 만들고 gitIgnore 처리 + 값 사용하기
2. 회원가입 시 로딩창 구현
정도 진행할 듯 싶다.