<context:property-placeholder location="classpath:/db-config/email.properties"/>
<!-- 이메일 인증 관련 빈 등록 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com"/>
<property name="port" value="587"/>
<property name="username" value="${email.account}"/>
<property name="password" value="${email.password}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<!-- gmail의 경우 보안문제 업데이트로 인해 SSLSocketFactory를 추가해야 smtp 사용 가능. -->
<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
<prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
</props>
</property>
</bean>
민감한 정보를 담고있는 계정 정보는 .properties 파일을 생성한다.
email.account = abc1234@gmail.com
email.password = aaaa1111!!
web.xml에서 DispatherServlet이 실행될때 email-config.xml도 추가.
controller에서 이메일 인증 관련 로직을 실행하면 비대해지므로 service,component 로 따로 만들어준다
ex: MailSendService
package com.spring.myweb.controller;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.spring.myweb.command.UserVO;
import com.spring.myweb.user.service.IUserService;
import com.spring.myweb.util.MailSendService;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService service;
@Autowired
private MailSendService mailService;
//주소 api 신청키
// devU01TX0FVVEgyMDIyMDIxNjExMzAxNjExMjI1MTE=
//회원가입 페이지 이동
//userJoin 창 띄우기
@GetMapping("/userJoin")
public void userJoin() {}
//아이디 중복 체크(비동기)
@PostMapping("/idCheck")
@ResponseBody //Rest Controller가 아닌 경웅에는 아노테이션을 붙여야 비동기 통신이 가능하다
public String idCheck(@RequestBody String userId) {
int result = service.idCheck(userId);
if(result == 1) {
return "duplicated";
} else return "Success";
}
//이메일 인증
@GetMapping("/mailCheck")
@ResponseBody
public String mailCheck(String email) {
System.out.println("이메일 인증 요청이 들어옴");
System.out.println("인증 이메일: " + email);
return mailService.joinEmail(email);
}
//회원 가입 처리
@PostMapping("/join")
public String join(UserVO vo,RedirectAttributes ra) {
System.out.println("params:" + vo);
// 요청하는 jsp 파일안에 파라미터 변수명 name을 지어주지 않아서 error가 터짐;
//userId - > null이라서 (pk) 터짐.
service.join(vo);
ra.addFlashAttribute("msg","JoinSuccess");
return "redirect:/user/userLogin";
}
//로그인 페이지 이동 요청
@GetMapping("/userLogin")
public void userLogin() {}
//로그인 요청
@PostMapping("/login")
public String login(String userId, String userPw, Model model) {
UserVO vo = service.login(userId, userPw);
model.addAttribute("user",vo);
return "/user/userLogin";
}
@GetMapping("/userMyPage")
public void userMyPage(HttpSession session, Model model) {
//현재 로그인중인 사람만 요청이 가능하므로 session달라고한다
//세션 데이터에서 id를 뽑아야 sql문을 돌릴 수 있겟죠?
String id = ((UserVO)session.getAttribute("login")).getUserId();
UserVO userInfo = service.getInfo(id);
model.addAttribute("userInfo",userInfo);
}
@PostMapping("/userUpdate")
public String update(UserVO vo,RedirectAttributes ra) {
System.out.println("param: " +vo);
service.updateUser(vo);
ra.addFlashAttribute("msg","수정이 완료되었습니다");
return "redirect:/";
}
}
//비동기와 동기를 적절히 섞어가면서 통신한다.
메일인증 폼에서 실제로 수신되는지 확인한다.