회원 가입 시 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 변경
//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>						
변경해야 할 java 파일 : 
-Member.java
-JoinRestApiRequest.java //회원 가입 시 받는 객체
 
-LoginInfo.java //로그인 할 때 생성하는 객체 
-VerifyMember.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 오버라이딩 정도로 하면 됨.
MailSenderService.java 파일 생성
JoinService 파일 변경 
@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 보내는 설정을 자세하게 알고싶다면 여기 로
@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을 하면서 바로 같이 mailService의 send메서드를 통해 인증메일 보냄.
@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로 들어가게 설정
메일함을 열어본다면 이렇게 나온다


