**인터셉터 

게시글쓰기, 상세보기, 수정, 삭제 등은 로그인 되어 있지 않은 유저는 작업을 수행할 수 없도록 하고자 하는 경우 이러한 코드를 Controller, Service, Dao 등에 작성하는 것은 이상합니다.

스프링에서는 Interceptor 나 AOP 등을 이용해서 구현 할 수 있습니다.

Interceptor는 URL을 설정해서 URL 요청이 왔을 때 메소드를 호출하도록 할 수 있습니다.


1. 로그인이 되어 있지 않으면 로그인 페이지로 이동시키고 로그인을 하면 작업을 할 수 있는 페이지로 이동하도록 만들어봅시다. 


=> Interceptor : url 요청이 왔을 때 Controller 보내기 전이나 Controller가 작업한 후에 수행할 내용을 작성할 수 있는 Spring이

제공하는 기능 

=>HandlerInterceptor 인터페이스나 HandlerInterceptorAdapter 클래스를 상속받는 클래스를 만들어서 메소드를 재정의 하고 

dispatcher-servlet(Servlet-Context.xml)에 interceptors 태그를 이용해서 설정하면 됩니다.

=> HandlerInterceptorAdapter인터페이스는 모든 메소드가 추상메소드라서 전부 재정의 해야하고 

HandlerInterceptorAdapter 클래스는 모든 메소드가 내용이 없는 상태로 구현되어 있어서 필요한 메소드만 재정의 하면 되는데 

메소드 이름을 기억하기 어려우므로 인터페이스를 이용합시;다. 



2.HandlerInterceptorAdapter를 implements 한 클래스 안의 재정의 된 메소드 설명 

=> com.seunghoo.na.AuthenticationInerceptor


1. preHandle 메소드 : Controller가 처리하기 전에 호출되는 메소드 


2. postHandle 메소드 : Controller가 사용자의 요청을 정상적으로 처리하고 난 후 호출되는 메소드 


3. afterCompletion메소드 :  Controller에서 예외 발생여부에 상관없이 호출되는 메소드 



3.HandlerInterceptorAdapter를 implements 한 클래스를 생성 

@Component

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {


// 로그인을 확인하기 위해서 session 가져오기

HttpSession session = request.getSession();

// 로그인 정보는 session의 user 속성에 저장되어 있습니다.

if (session.getAttribute("user") == null) {

// 사용자의 요청을 session에 dest라는 속성에 저장

// 로그인이 되면 원래의 요청을 처리하기 위해서

// 클라이언트 요청 전체 주소

String requestURI = request.getRequestURI();

// 현재 프로젝트 경로 가져오기

String contextPath = request.getContextPath();

String uri = requestURI.substring(contextPath.length() + 1);

// 주소 뒤에 파라미터를 가져오기

String query = request.getQueryString();

System.out.println("쿼리"+query);

System.out.println("URI"+uri);

// 실제 주소만들기

if (query == null || query.equals("null")) {

query = "";

} else {

query = "?" + query;

}

//세션에 주소 저장하기 

session.setAttribute("dest", uri+query);

//세션에 메시지 저장하기 

session.setAttribute("msg","로그인을 하셔야 이용할 수 있는 서비스 입니다.");


response.sendRedirect(contextPath + "/user/login");

return false;

}

// 로그인된 경우에는 Controller가 처리합니다.


return true;

}

4. UserController 에서 로그인을 처리하는 메소드를 수정 

=> 이전에는 무조건 시작 페이지로 가도록 되어 있었지만 요청이 있는 경우 그페이지로 이동하도록 코드를 수정 

session.setAttribute("user", user);

//이전 요청을 가져오기 

Object dest = session.getAttribute("dest");

//이전 요청이 없으면 시작페이지로 이동 

if(dest==null) {

return "redirect:/";

//이전 요청이 있으면 그 페이지로 이동 

}else {

return "redirect:/"+dest.toString();

}

**게시물 삭제

1.detail.jsp 파일에 삭제를 위한 UI 와 이벤트를 작성

=>jquery ui의 dialog 기능을 이용

1)삭제 버튼(deletebtn)을 눌렀을 때 수행되는 코드가 있으면 제거


2)파일의 하단에 대화상자로 사용할 내용 만들기

<c:if test="${user.email == vo.email}">

<link rel="stylesheet"

href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>


<div id="dialog-confirm" title="정말로 삭제?" style="display: none">

<p>삭제하시면 복구할 수 없습니다. 그래도 삭제하실 건가요?</p>

</div>


<script>

//삭제 버튼을 눌렀을 때 처리

document.getElementById("deletebtn").addEventListener(

"click", function(){

$("#dialog-confirm").dialog({

      resizable: false,

      height: "auto",

      width: 400,

      modal: true,

      buttons: {

        "삭제": function() {

          $(this).dialog("close");

          location.href="delete?bno=${vo.bno}";

        },

        "취소": function() {

          $(this).dialog("close");

        }

      }

    });

});

</script>

</c:if>


2.board.xml 파일에 게시글을 삭제하는 SQL을 작성

<!-- 게시글 삭제를 위한 SQL -->

<delete id="delete" parameterType="java.lang.Integer">

delete from springboard

where bno=#{bno}

</delete>


3.BoardDao 클래스에 게시글을 삭제하는 메소드를 생성

//글번호에 해당하는 데이터를 삭제를 하는 메소드

public void delete(int bno) {

sqlSession.delete("board.delete", bno);

}


4.BoardService 인터페이스에 게시글을 삭제하는 메소드를 선언

//게시글 삭제를 처리해 줄 메소드를 선언

public void delete(HttpServletRequest request);


5.BoardServiceImpl 클래스에 게시글을 삭제하는 메소드를 구현

@Override

public void delete(HttpServletRequest request) {

//파라미터 읽기

String bno = request.getParameter("bno");

//Dao 메소드 호출

boardDao.delete(Integer.parseInt(bno));

}


6.Controller 에 게시물 삭제를 처리해주는 메소드 생성 


@RequestMapping(value = "board/delete", method = RequestMethod.GET)

public String delete(HttpServletRequest request, RedirectAttributes attr) {

boardService.delete(request);

attr.addFlashAttribute("msg", "삭제");

return "redirect:list";

}

















 

[메일보내기]

 


1. 네이버메일 

비밀번호 전송이나 인증받기에 메일 보내는 기능을 많이 사용합니다.

POP3/SMTP 사용이 되야합니다. - 다른 곳에서 메일 받을 수 있음 



1. pom.xml 파일에 의존성 라이브러리 설정


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>${org.springframework-version}</version>

</dependency>


<dependency>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

<version>1.5.6</version>

</dependency>

 

 

 

2.list.jsp 파일의 이름을 출력하는 부분에 이메일 링크를 추가

<a href="../user/sendmail?email=${vo.email}">${vo.nickname}</a>


3.servlet-context.xml 파일에 이메일 서버 설정을 위한 bean을 생성

<!-- 메일 서버 설정 -->

<beans:bean

class="org.springframework.mail.javamail.JavaMailSenderImpl"

id="mailSender">

<beans:property value="smtp.naver.com" name="host" />

<beans:property value="587" name="port" />

<beans:property name="username" value="ggangpae3" />

<beans:property name="password" value="wnddkd"></beans:property>

<beans:property value="utf-8" name="defaultEncoding" />

<beans:property name="javaMailProperties">

<beans:props>

<beans:prop key="mail.transport.protocol">smtp</beans:prop>

<beans:prop key="mail.smtp.auth">true</beans:prop>

<beans:prop key="mail.smtp.starttls.enable">true</beans:prop>

<beans:prop key="mail.debug">true</beans:prop>

</beans:props>

</beans:property>

</beans:bean>


4.UserController 클래스에 user/sendmail 요청이 오면 메일 보내기 화면으로 이동하는 메소드를 생성


//메일 보내기 링크를 눌렀을 때 메일 보내기 화면으로 이동하는 메소드

@RequestMapping(value="user/sendmail", method=RequestMethod.GET)

public String sendmail(@RequestParam("email")String email,

Model model) {

//model에 email 저장

model.addAttribute("email", email);

return "user/sendmail";

}


5.메일 보내기 화면으로 사용할 화면을 user 디렉토리에 sendmail.jsp 파일로 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>


<%@ include file="../include/header.jsp"%>

<div class="container">

<form method="post">

<div class="form-group">

<label for="receiver">받는 사람 이메일</label> 

<input type="email" id="email"

name="receiver" value="${email}" readonly="readonly"

class="form-control" />

</div>


<div class="form-group">

<label for="title">메일 제목</label> 

<input type="text"

name="title"  

class="form-control" />

</div>

<div align="center">

<label for="contents">메일 제목</label>

<textarea class="form-control" rows="5" name="contents"></textarea>

</div>

<div align="center">

<input type="submit" value="메일 보내기" class="btn btn-warning">

</div>

</form>

</div>


<script>

email = document.getElementById("email");

email.addEventListener("click", function(e){

email.removeAttribute("readonly");

});

email.addEventListener("blur", function(e){

email.setAttribute("readonly","readonly")

})


</script>

<%@ include file="../include/footer.jsp"%>








6. userService인터페이스에 메일 보내기를 위한 메소드를 선언 

public void sendEmail(HttpServletRequest request) ;



7.userServiceImple 클래스에 메일 보내기를 위한 메소드를 구현 

@Override

public void sendEmail(HttpServletRequest request) {

String receiver =request.getParameter("receiver");

String title = request.getParameter("title");

String content = request.getParameter("content");

try {

SimpleMailMessage message = new SimpleMailMessage();

message.setFrom("ggangpae3@naver.com");

//받는 사람 설정 

message.setTo(receiver);

//메이제목설정 

message.setSubject(title);

//메일 내용설정 

message.setText(content);

//메일 보내기 

mailSender.send(message);

}catch(Exception e) {

System.out.println("email 예외 "+e.getMessage());

e.printStackTrace();

}

}


8.UserController 클래스에 메일 보내기를 눌렀을 때 처리를 위한 메소드를 생성

@RequestMapping(

value="user/sendmail", method=RequestMethod.POST)

public String sendmail(HttpServletRequest request,

RedirectAttributes attr) {

userService.sendmail(request);

attr.addFlashAttribute("msg", "메일 보내기 성공");

return "redirec:/";

}

 


[Java 코드로만 데이터베이스를 사용 ]

=>Connection, Statement, ResultSet을 이용해서 사용 

=> 프레임워크를 이용하지 않기 때문에 프레임워크의 변화에 아무런 영향도 받지 않습니다. 

=> 디자인 패턴이나 코드 최적화를 하지 않으면 비효율적이 프로그램이 만들어집니다. 

=> 디자인 패턴이나 알고리즘 및 자료구조 공부를 많이 한 경우에 사용합니다. 


[프레임워크를 이용하는 방법 ]

=> 알고리즘이나 디자인 패턴 및 자료구조를 심도있게 공부하지 않아도 무난한 데이터베이스 연동 프로그램을 만들수 있습니다. 


1) SQL Mapper Freamwork : SQL을 별도로 작성하고 실행해서 결과를 가져오는 방식으로 파라미터 매핑이나 결과 매핑은 프레임워크가 대신 해줍니다. 

이 방식의 대표적인 프레임워크는 MyBatis(iBatis)가 있습니다.  

구현 방법이 쉽기 때문에 현재 우리나라 공공기관 프로젝트나 금융기관 프로젝트가 많이 사용하고 있습니다. 


2) Object Relationship Mapping Framework :테이블과 클래스를 매핑시켜서 SQL 없이 데이터 베이스 작업을 수행하는 방식입니다. 

이 방식의 대표적이 프레임워크는 Hibernate - JPA가 있습니다. 

구현은 어렵지만 성능 SQL Mapper보다 우수합니다. 

SI(시스템 통합)에는 부적합하고 일반 application 개발에 주로 이용 

스프링 





스프링이란 무엇인가 ? 

자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스로 경량급 Application 프레임워크입니다. 



스프링의 특징 

=> 가장 강력한 자바 오픈소스 프레임워크 
=> J2EE가 가진 거의 모든 기능을 소유한 프레임워크 

ü복잡함에 반기를 들어서 나온 프레임워크
ü플랫폼 호환성 문제 해결
ü스프링은 JavaEE가 제공하는 다수의 기능을 지원하고 있기 때문에 JavaEE대체
ü스프링은 IoC(제어의 역전) 지원
+> Ioc(제어의 역전) 객체를 내가 만들지 않는 것 클래스 
=> ex ) FIlter, Controller 
ü스프링은 DI(Dependency Injection)패턴을 지원
=> DI : 의존성 주입  Maven의 Pom.xml 

ü스프링은 AOP(Aspect Oriented Programming)지원
=> AOP :  관점 지향프로그래밍 관점에 따라 나누어 작업하자 
ü스프링은 POJO(Plain Old Java Object)지원

=> POJO는 MVC 패턴을 적용한 프로젝트에서 DAO, VO, SERVICE  순순한 자바로부터 상속, 
=> POJO가 아닌 애는 HTTPServlet을 상속받은 Controller가됩니다.  

ü트랜잭션 처리를 위한 일관된 방법을 제공
ü영속성 - MyBatis, Hibernate, JPA등과 같은 프레임워크와의 연동을 지원
ü편리한 MVC 구조를 가지고 있고 WAS에 종속되지 않는 개발 환경
ü2.5버전에서 어노테이션을 이용한 설정 지원
ü3.0에서는 Java 클래스를 이용한 설정 지원
ü4.0에서는 REST 방식의 Controller 지원


v스프링 프로젝트 종류

üSpring Boot를 이용(Spring Starter Project): 최대한 간단하게 실행하고 배포가 가능한 수준의 애플리케이션을 만들 때 사용하는데 WAS 설정없이 실행이 가능하기 때문에 테스트 하기에 편리하지만 기존의 웹 프로젝트 설정과 다른 방법으로 사용하며 JSP 설정은 별도로 수행 <작은 프로젝트에서 사용>

üSpring Template Project 이용(Spring Legacy Project): WAS를 사용하거나 이전에 Spring Project를 만들어본 경우 사용하는 방식인데 WAS로 인한 리소스 소모가 심하다는 단점이 있지만 기존 프로젝트들이 이 방식으로 많이 만들어져 있음 <큰 프로젝트에서 사용>






'Java > 스프링' 카테고리의 다른 글

Spring 2-2 TEST 디렉토리 사용  (0) 2018.04.09
Spring 2-1 Property(속성)  (0) 2018.04.09
Spring 1- 2 DI와 IOC ,@Component @Bean 사용 정리  (0) 2018.04.06
DI(Dependency Injection)  (0) 2018.04.05
Spring 1-1) IOC 제어의 역전  (0) 2018.04.05

출처 : https://programmers.co.kr/learn/challenge_codes/1 사이트 



최근에 알고리즘 공부를 시작했습니다.

사실 너무 어렵기도 해서 포기할까 하다가 

조금씩 하루에 하나씩 풀어보기로 했습니다. 


1.약수의 모든 합을 구하시오 

프로그래머스 사이트에서 출제된 약수의 모든 합을 구하는 문제입니다. 




어떻게 풀까 고민도 많이하다가 

하나씩 생각해보기로 했습니다. 


1. 입력받은 값의 12의 약수를 구하려면, 우선 뭐가 필요한가 ? 

     반복문이 필요하다 

2. 입력받은 값의 num의 약수의합을 구하려면, 나누어 떨어지는 수를 구해야한다는 것을 알 필요가 있었고

3. 반복문 안에 if 문을 넣어 0과 같다면 그 수를 더하는 방식으로 풀면된다는 것을 생각했습니다. 



[내 풀이]






[다른 분의 풀이 방법 ]

이 문제는 약수의 합을 구하는 방식이므로 

num/2를 통해 반복문을 최소화 할 수 있습니다. 






'알고리즘' 카테고리의 다른 글

서울에서김서방찾기  (0) 2018.02.22
수박수박수박수박수박수?  (0) 2018.02.22
가운데 글자 가져오기  (0) 2018.01.23
<공부가 더필요 > 삼각형 출력하기  (0) 2018.01.21
역삼각형 출력하기  (0) 2018.01.14

+ Recent posts