회원가입 시 이메일 인증처리

2020-08-25

회원 가입 시 email을 받고 인증 코드를 생성,
해당 email 계정으로 인증 처리 메일을 보내보자!
관리자가 보낸 인증코드가 맞다면 인증 완료처리까지-

먼저 mySQL에서 컬럼 추가해준다.

-- 인증코드와 verify 확인 코드 
ALTER TABLE `project_01`.`memberinfo` 
ADD COLUMN `code` VARCHAR(25) NULL AFTER `REGDATE`,
ADD COLUMN `verify` CHAR(1) NULL DEFAULT 'N' AFTER `code`,
ADD COLUMN `email` VARCHAR(45) NULL AFTER `verify`;



DAO 변경

DAO 변경

//verify
public int updateVerify(String id, String code);
public int updateEmail(Member member);

Mapper. xml 변경

<!-- result map 설정 추가 -->
<resultMap type="com.ny.mm.model.Member" id="MemberVO">
    <result property="idx" column="idx"/>
    <result property="id" column="id"/>
    <result property="pw" column="pw"/>
    <result property="name" column="name"/>
    <result property="photo" column="photo"/>
    <result property="regDate" column="regdate"/>
    <result property="code" column="code"/>
    <result property="verify" column="verify"/>
    <result property="email" column="email"/>
</resultMap>

<!-- 회원가입시 code, email도 DB에 연결해주기 -->
<insert id="insertMember" parameterType="com.ny.mm.model.Member">
    insert into project_01.memberinfo (ID, PW, NAME, PHOTO, CODE, EMAIL) 
    values (#{id}, #{pw}, #{name}, #{photo}, #{code}, #{email})
</insert>
	
<!-- 인증 확인 처리 -->
<update id="updateVerify">
    update project_01.memberinfo 
    set verify = 'Y'
    where id = #{param1} 
    and code = #{param2}
</update>						



model에 변수 추가

변경해야 할 java 파일 :
-Member.java
-JoinRestApiRequest.java //회원 가입 시 받는 객체
-LoginInfo.java //로그인 할 때 생성하는 객체
-VerifyMember.java : 새로 생성하는 파일


Member.java

@JsonIgnore
private String code;
private char verify;
private String email;

public Member(String id, String email) {
    this.id = id;
    this.email = email;
    randomCode();
}

	//영대소문자+숫자 난수
public void randomCode() {

    StringBuffer temp = new StringBuffer();

    Random rnd = new Random();
    String str = String.valueOf( (char) (rnd.nextInt(26) + 97) );

    for(int i = 0; i < 10; i++) { //10자리 난수발생
        int index = rnd.nextInt(3); //숫자 012 중에서 난수 발생시킴

        switch (index) {
        case 0:
            //97~122 a-z의 아스키코드
            temp.append((char)(rnd.nextInt(26) + 97)); 
            break;
        case 1:

            temp.append((char)(rnd.nextInt(26) + 65)); 
            break;
        case 2:
            temp.append(rnd.nextInt(10));
            break;

        }
    }

    System.out.println("난수코드생성: " + temp);
    setCode(temp.toString());
}

다른 파일들은 변수 추가하고 getter, setter 설정과 toString 오버라이딩 정도로 하면 됨.



Service 단:

MailSenderService.java 파일 생성

JoinService 파일 변경

MailSenderService.java 생성

@Service("mailSenderService")
public class MailSenderService {

	@Autowired
	private JavaMailSender sender;
	
	public int send(Member member) {
		
		int result = 0;
		MimeMessage message = sender.createMimeMessage();
		
		String name = member.getName() + " 님";
		String email = member.getEmail();
		String id = member.getId();
		String code = member.getCode();
		
		try {
			message.setSubject("[info] Welcome TO Our WEBSITE", "utf-8");
			
			String htmlMsg = "<h1>회원가입을 축하합니다~</h1>";
			htmlMsg += "<h1>사랑합니다 "+name+"!</h1>";
			htmlMsg += "<a href = \"http://localhost:8080/mm/join/verify?id="+id+"&code="+code+"\">인증하기 클릭</a>";
			
			message.setText(htmlMsg, "utf-8", "html");
			message.addRecipient(RecipientType.TO, 
                                 new InternetAddress(email, name, "utf-8"));

			sender.send(message);
		
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return 1;
	}
}

id를 이메일 계정으로 받지 않고 이메일 계정을 따로 만들었으므로, 보낼 때 id, name, email 등등 여러가지를 parameter로 넘기는게 번거로워서 Member객체로 바로 넘겨버림.

인증을 할 때 <a>태그에 가입한 사람의 아이디와 코드를 보내준다.

mail 보내는 설정을 자세하게 알고싶다면 여기



JoinService 변경

@Autowired
private MailSenderService mailService;

//가입 서비스 rest + email 사용
public int joinMember( HttpServletRequest request,
                        JoinRestApiRequest joinMember
        ) {

/*생략*/
		//파일 올렸을 때
        if(joinMember.getPhoto() != null) {
            //file을 서버의 지정 경로에 저장.
            newFileName = System.nanoTime() + "_" + joinMember.getId();
            joinMember.getPhoto().transferTo(new File(dir, newFileName));

            //데이터베이스 저장을 하기위한 파일이름 세팅
            memberinfo.setPhoto(newFileName);
        }
        result = dao.insertMember(memberinfo);
        mailService.send(memberinfo);
/*생략*/

    return result;
}

join을 하면서 바로 같이 mailServicesend메서드를 통해 인증메일 보냄.



Controller: 이메일 인증 처리해주기

@Controller
public class VerifyController {
	
	@Autowired
	private VerifyService verifyService;
	
	@RequestMapping("/join/verify")
	public String verify(@RequestParam("id")String id, 
                         @RequestParam("code")String code) {
		return "join/verify_" + verifyService.verify(id, code);
	}
}

인증처리가 제대로 되었다면 join/verify_Y로, 아니라면 join/verify_N 이라는 이름의 view로 들어가게 설정

메일함을 열어본다면 이렇게 나온다

이메일


결과화면: 인증완료

인증완료

결과화면: 인증미완료

인증미완료