TIL(2023.10.17)

JAKE·2023년 10월 17일

TIL

목록 보기
43/48
post-thumbnail

🏃‍♂️What I learned

1. 인터셉터(Interceptor)

  • 모든 요청과 응답을 가로채는 객체
  • 핸들러 매핑, 뷰 리졸버의 중간에서 작동 : 요청이나 응답 자체를 가공
    (<-> 필터는 클라이언트와 디스패쳐 서블릿 사이)
  • 세부적으로 쓰일 보안/인증, 요청에 대한 데이터 가공

HandlerInterceptor 상속 후 오버라이딩해서 사용
(override/implement methods) - 강제화는 아님

  • interceptor의 사용 이유 (application scope의 값 세팅 예시)

서버를 처음 실행할 때 homeController에서 필요한 값을 application scope에 세팅할 경우, 메인 페이지를 열지 않으면 세팅이 되지않음(ex. 링크를 타고 들어오는 경우)
반면, interceptor를 사용하면 어떠한 경우에도 필요한 값을 application scope에 세팅할 수 있음

  • interceptor의 구조 및 코드 예시
public class BoardTypeInterceptor implements HandlerInterceptor {

	@Autowired
	private BoardService service;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		// application scope 내장 객체 얻어오기
		ServletContext application = request.getServletContext();
		
		// application scope에 BOARD_TYPE이 조회되어 세팅되지 않았다면 
		// == 서버 시작 후 누구도 요청을 한 적이 없을 경우
		if(application.getAttribute("boardTypeList") == null) { 
			
			// 조회 서비스 호출
			List< Map<String, Object>> boardTypeList = service.selectBoardTypeList();
			
			// application scope에 세팅
			application.setAttribute("boardTypeList", boardTypeList);
		}
		
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

	/** controller -> dispatcher servlet 사이
	 *
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {

		
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}

	/** view resolver -> dispatcher servlet 사이
	 *
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {

		
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}

2. SMTP(Simple Mail Transfer Protocol)

  • 이메일 인증

  • 이용 방법(Google 예시)

1) 구글 계정 관리 -> 보안 -> 2단계 인증 -> 앱 비밀번호 -> 비밀번호 생성!

2) 세팅
  2-1) pom.xml 세팅

<!-- 이메일 인증 -->
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>    
<!-- 캐시, 메일, 스케줄링, UI와 관련된 부가적 기능들이 포함되어있는 라이브러리 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

   2-2) email-context.xml에 bean 생성 -> web.xml에도 경로 추가

<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="메일 주소"/>
    <property name="password" value="앱 비밀번호" /> 
    <property name="javaMailProperties">
        <props>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop key="mail.smtp.auth">true</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>

3) 이메일에 대한 밸류값을 ajax로 전달 받아(@ResponseBody)
  3-1) 난수(인증번호) 생성
  3-2) 메일 보내기 객체 생성(MimeMessage mail = mailSender.createMimeMessage();
  3-3) 필요 내용 세팅
        송신자 지정(mail.setFrom),
        수신자 지정(mail.addRecipient),
        제목 세팅(mail.setSubject),
        내용 세팅(mail.setText)
  3-4) 메일 전송(mailSender.send(mail))

4) 해당 인증번호 DB 저장

5) 사용자가 인증번호 입력한 값을 ajax로 전달 받아(@ResponseBody) DB에 저장된 값과 같은지 확인
-> 0,1값 반환

6) 1이면 인증완료, 0이면 인증실패


0개의 댓글