https://zuminternet.github.io/OAuth2-Social/

https://github.com/young891221/spring-boot-social-comment

https://ethankang.tistory.com/6

https://blusky10.tistory.com/324

https://github.com/cheese10yun/spring-security-oauth2-social



https://gdtbgl93.tistory.com/73

http://sai.world/?p=229

http://wonwoo.ml/index.php/post/2078




https://springboot.tistory.com/37

http://www.nextree.co.kr/p1886/

https://progmaton.blogspot.com/2019/02/dolphin-2.html

https://seongilman.tistory.com/51

https://github.com/ihoneymon/translate-spring-boot-reference



https://stackoverflow.com/questions/30855252/how-do-i-enable-logging-for-spring-security

https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow



Spring Boot Spring Security 회원가입/로그인 구현한기


Facebook 로그인 구현하기



https://jojoldu.tistory.com/171



https://github.com/cheese10yun/spring-security-oauth2-social/blob/master/doc/step-01.md



https://www.popit.kr/spring-security-oauth2-%EC%86%8C%EC%85%9C-%EC%9D%B8%EC%A6%9D/



https://jojoldu.tistory.com/168

https://leeyongjin.tistory.com/entry/Spring-Boot-And-oAuth2

https://gdtbgl93.tistory.com/74

https://gdtbgl93.tistory.com/75




http://lorenzo-dee.blogspot.com/2016/08/spring-security-oauth2-with-google.html

https://github.com/lorenzodee/spring-security-oauth2-google

'FrameWork' 카테고리의 다른 글

Spring Boot 에서 Servlet 과 필터 사용하기  (0) 2019.04.18
Model 영역  (0) 2018.10.20
Struts 자동가입방지 simplecaptcha 사용하기  (0) 2018.10.20
ActionServlet의 동작방식  (0) 2018.10.20
스트럿츠 프레임워크 구조  (0) 2018.10.20
블로그 이미지

클라인STR

,


스프링 부트에서는 web.xml을 사용하지 않는다. 

스프링 부트에서 필터를 사용할 경우

 org.springframework.boot.web.servlet.FilterRegistrationBean 등록해서 사용한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     ...
 
    @Bean
    public FilterRegistrationBean oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter);
        registration.setOrder(-100);
        return registration;
    }
 
}
cs


자바 설정파일인 SecurityConfig 에서 FilterRegistrationBean을 등록하였다.



또 다른 방법으로는  @ServletComponentScan , @WebFilter 어노테이션을 사용하여 필터를 등록하는 방법이 있다.



1
2
3
4
5
6
7
@ServletComponentScan
@SpringBootApplication
public class BootWebApplication extends WebMvcConfigurerAdapter {
 
     . . .
 
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@WebFilter(urlPatterns = "/test")
public class FilterTest implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 
        filterChain.doFilter(servletRequest,servletResponse);
    }
 
    @Override
    public void destroy() {
        
    }
}
 
 
cs


'FrameWork' 카테고리의 다른 글

Spring Boot OAuth2 설정 링크  (0) 2019.04.19
Model 영역  (0) 2018.10.20
Struts 자동가입방지 simplecaptcha 사용하기  (0) 2018.10.20
ActionServlet의 동작방식  (0) 2018.10.20
스트럿츠 프레임워크 구조  (0) 2018.10.20
블로그 이미지

클라인STR

,

Model 영역

FrameWork 2018. 10. 20. 13:09


Model 
영역은 애플리케이션에서 비즈니스 로직을 구현하는 부분이다. 즉 특정 업무 처리를 위한 비즈니스 서비스 코드와데이터의 생성, 조회, 수정, 삭제하는 역할을 담당한다.

Model 영역은 비즈니스 데이터에 대한 실제적인 접근이 이루어지는 영역이기 때문에 기업의 업무용 시스템에서 무엇보다 중요한 영역이며 한번 확정되면 좀처럼 변경되기 어려운 영역이다. 또한 클라이언트의 종류와는 무관하게 재사용될 수 있도록 하기 위해 Controller View 영역에 최대한 독립적이어야 한다
.

Model 영역은 다시 
비스니스 서비스 계층과 퍼시스턴스 계층, EIS(Enterprise Information System) 계층으로 구분할 수 있다. 



l  EIS 계층

EIS 계층은 비즈니스 데이터가 저장되어 있는 영역으로 경우에 따라 XML 파일이나 웹서비스(Web Services)가 될 수 있지만 주로 Oracle과 같은 DBMS(Database Management System)를 통해 관리되는 데이터베이스를 지칭한다.

 

l  Persistance 계층
EIS 계층에 저장되어 있는 비즈니스 데이터는 애플리케이션에서 데이터를 표현하기 위해 사용하는 개체와는 다른 구조가 다를 수 있으므로 두 가지의 데이터를 서로 매핑해주는 계층이 퍼시스턴스(Persistance) 계층이다. 퍼시스턴스 계층은 비즈니스 서비스 계층에서 데이터의 생성, 조회, 수정, 삭제를 위한 로직에 신경 쓰지 않고 비즈니스 로직을 구현할 수 있도록 해준다.

 

l  Business Service 계층
비즈니스 서비스 계층은 업무 처리를 위한 로직을 캡슐화하여 컨트롤에서 쉽게 호출할 수 있도록 해준다.

 

블로그 이미지

클라인STR

,



http://sourceforge.net/projects/simplecaptcha/files/ 에서 jar파일을 다운로드 받는다. 
프로젝트에서 사용시 JVM 버전으로인해 simplecaptcha-1.1.1-jdk1.5.jar   다운받아서 적용하였다.

public class CaptchaServlet extends HttpServlet {

 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  try {
    
   Captcha captcha = new Captcha.Builder(250, 60).addText(new DefaultTextProducer(6)).gimp(new DropShadowGimpyRenderer()).build();
   
  //  200 * 50 에해당하는 이미지 사이즈를 지정하고, 자동가입방지 문자 길이를 설정한다.
   response.setHeader("Cache-Control", "no-store");
   response.setHeader("Pragma", "no-cache");
   response.setDateHeader("Expires", 0);
   //   캐쉬를 지우기 위해 헤더값을 설정 
   response.setContentType("image/jpeg");
   // 리턴값을 image형태로 설정 
   CaptchaServletUtil.writeImage(response, captcha.getImage());
   //Image 를 write 한다
   request.getSession().setAttribute("CorrectAnswer",captcha.getAnswer());
   //세션에 자동가입방지 문자를 저장한다.
   } catch (Exception e) {
    System.out.println(e.getMessage());
    System.out.println(e.getStackTrace());
   response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
   return;
   }


 }

 
}

다양한 형태의 이미지 변형은 http://simplecaptcha.sourceforge.net/extending.html 참조한다.!!

web.xml 에 서블릿 설정을 추가한다.

              
 
		CaptchaServlet
		x1.com.ctl.CaptchaServlet		
		1
	
	
	 
                               CaptchaServlet
                               /captcha
   	 





<tr>
            <th></th>
            <td class="attach">
             <img id="captchaImg" name="captchaImg" src="/captcha" alt="Captcha Image" height="45" />                 
             <a onclick="document.inputForm.captchaImg.src='/captcha?id='+Math.random();" id="refresh" style="cursor:pointer">이미지 새로고침</a>
             
            </td>
           </tr>

           <tr>
            <th></th>
            <td class="td">
            <input type="text" size="10"  style="width:152px;;height:10px;border:1px solid #A5ACB2;height:13px;line-height:13px;padding:3px 0 0 4px;"  name="captchaText" id="captchaText"  />
            </td>
           </tr>



'FrameWork' 카테고리의 다른 글

Spring Boot 에서 Servlet 과 필터 사용하기  (0) 2019.04.18
Model 영역  (0) 2018.10.20
ActionServlet의 동작방식  (0) 2018.10.20
스트럿츠 프레임워크 구조  (0) 2018.10.20
스트럿츠(Struts) 소개  (0) 2018.10.20
블로그 이미지

클라인STR

,


ActionServlet은 클라이언트의 요청이 있으면, 요청을 처리해줄 RequestProcessor를 찾아 클라이언트의 요청을 전달한다.

RequestProcessor는 클라이언트에서 전달된 파라미터를 설정 파일에 지정된 ActionForm을 생성하여 필드에 저장한다. 그리고 나서 RequestProcessor는 클라이언트의 요청 URL에 따라 Action을 선택하여 execute() 메소드를 호출한다. 이때 앞서 생성한 ActionForm을 매개 변수로 전달한다.


Action은 클라이언트의 요청을 수행하기 위해 Model 영역의 비즈니스 서비스 로직을 수행하고, 수행한 결과 값을 ActionFrom 개체나, DTO 개체를 요청 스코프, 세션 스코프 중 한 곳에 저장한다. 그리고 수행한 결과에 따라 ActionForward를 생성한 후, RequestProcessor로 리턴한다.

 

RequestProcessor는 Action에서 리턴한 ActionForward에 따라 View 영역의 JSP를 호출한다. JSP는 프리젠테이션 로직을 수행하고 수행 결과(주로 HTML)을 사용자에게 전달한다.



public void process(HttpServletRequest request,
                        HttpServletResponse response)
        throws IOException, ServletException {

        // 특정 래퍼로 다중 요청을 래핑한다.
        request = processMultipart(request);

        // 매핑을 선택하기 위한 path 컴포넌트를 정의한다.
        String path = processPath(request, response);
        if (path == null) {
            return;
        }
        if (log.isInfoEnabled()) {
            log.info("Processing a '" + request.getMethod() +
                     "' for path '" + path + "'");
        }

        // 현재 사용자 요청의 Locale을 결정한다.
        processLocale(request, response);

        // 컨텐츠 타입과 no-caching 헤더를 설정한다.
        processContent(request, response);
        processNoCache(request, response);

        // 범용 전처리 후크(hook)
        if (!processPreprocess(request, response)) {
            return;
        }

        // 매핑을 정의한다.
        ActionMapping mapping = processMapping(request, response, path);
        if (mapping == null) {
            return;
        }

        // action을 실행하는 데 요구되는 규칙이 있는지를 확인한다.
        if (!processRoles(request, response, mapping)) {
            return;
        }

        // 요청과 관련 있는 ActionForm 빈즈를 처리한다.
        ActionForm form = processActionForm(request, response, mapping);
        processPopulate(request, response, form, mapping);
        if (!processValidate(request, response, form, mapping)) {
            return;
        }

        // 매핑에 의해 정의된 포워드(forward)나 인클루드(include)를 처리한다.
        if (!processForward(request, response, mapping)) {
            return;
        }
        if (!processInclude(request, response, mapping)) {
            return;
        }

        //  요청을 처리하는 Action 인스턴스를 생성하거나 얻는다.
        Action action = processActionCreate(request, response, mapping);
        if (action == null) {
            return;
        }

        // Action 인스턴스 자신을 호출한다.
        ActionForward forward =
            processActionPerform(request, response,
                                 action, form, mapping);

        // 반환되는 ActionForward 인스턴스를 처리한다. 
        processActionForward(request, response, forward);

    }

 

※ 자카르타 스트럿츠 프로그래밍 참조

'FrameWork' 카테고리의 다른 글

Model 영역  (0) 2018.10.20
Struts 자동가입방지 simplecaptcha 사용하기  (0) 2018.10.20
스트럿츠 프레임워크 구조  (0) 2018.10.20
스트럿츠(Struts) 소개  (0) 2018.10.20
MVC 디자인 패턴  (0) 2018.10.20
블로그 이미지

클라인STR

,


스트럿츠는 MVC 모델을 지원하는 다른 어떤 웹 애플리케이션 프레임워크보다도 뛰어난 컨트롤러를 제공한다. 우선 개발자에게 드러나는 스트럿츠의 컨트롤러는 ActionServlet, RequestProcessor, Action, ActionForm을 들 수 있고 이들 사이의 제어의 흐름을 이해하는 것이 스트럿츠를 이해하는데 가장 중요한 요소라고 할 수 있다.



—  ActionServlet

       웹 클라이언트의 요청을 직접 받는 창구 역할

       웹 클라이언트의 요청을 처리해줄 RequestProcessor를    찾아 요청을 전달 


—  RequestProcessor

       ActionForm을 생성하고 요청 파라미터를 ActionForm에 저장

       요청 URL에 따라 Action을 선택하여 실행

       Action이 반환환 ActionForward 정보를 이용해서 View 선택하고 실행


—  Action

       요청을 처리하기 위해 Model 영역의 Business Service Object을 이용

       수행 결과를 ActionForm  또는 DTO 저장

       이동할 View 정보를 가지고 있는 ActionForward를 RequestProcessor로 반환 

   ActionForm

       웹 클라이언트의 입력 데이터를 사용자와 비즈니스 계층들  사이로 전달한다.

       Action 인스턴스에 폼 빈(form bean)을  통해서 입력한 값들을 전달할 수 있다.

       ActionForm을 비즈니스 계층으로 직접 전달하는거 보다는 적절한 DTO를 생성하는게 좋다. 

'FrameWork' 카테고리의 다른 글

Struts 자동가입방지 simplecaptcha 사용하기  (0) 2018.10.20
ActionServlet의 동작방식  (0) 2018.10.20
스트럿츠(Struts) 소개  (0) 2018.10.20
MVC 디자인 패턴  (0) 2018.10.20
DTO 란?  (0) 2015.12.10
블로그 이미지

클라인STR

,

스트럿츠는 크레이그 맥클레너헌(Graig R.McClanahan)에 의해 개발되어 2000 ASF(The Apache Software Foundation)에 기증되면서 아파치 프로젝트의 일부로 진행되고 있는 MVC 모델2에 기반한 웹 프레임워크이다. 아파치 자바 솔루션 프로젝트인 자카르타 프로젝트(Jakarta Project)의 일부로 있다가 지금은 별도 프로젝트로 독립하여 많은 개발자들이 자발적으로 스트럿츠의 개선을 위해 노력하고 있다.

 

스트럿츠는 Model View를 연결해 주기 위한 잘 디자인되고 유연한 서블릿 기반의 컨트롤러를 제공한다. 스트럿츠의 컨트롤러는 클라이언트의 요청을 받아 요청을 수행하기 위한 Model 영역의 비즈니스 로직을 호출하고 수행 결과에 따라 View 영역의 JSP를 선택하여 포워드하는 역할을 한다. 그래서 스트럿츠는 View 영역보다는 Controller 영역에 좀 더 초점을 맞추고 있는 프레임워크이다.

 

Model 영역에서 어떤 기술을 사용해 비즈니스 로직을 수행하든 스트럿츠는 간섭하지 않는다. JDBC, EJB, Hibernate, iBTAIS등 어떤 기술이든 스트럿츠와 함께 사용하는데 아무런 제약이 없다. 스트럿츠는 View 영역에서 프레젠테이션 로직을 구현하기 위해 JSP에서 사용할 수 있는 유용한 태그 라이브러리를 제공한다.

 

스트럿츠 기반의 웹 애플리케이션에서는 프레젠테이션 로직의 구현을 위해 스트럿츠 태그 라이브러리 이외에도 JSTL(Java Standard Tag Library)을 활용할 수 있다. JSTL은 어떤 JSP/Servlet 컨테이너에서 어떤 자바 웹 프레임워크를 사용하든 관계없이 표준적인 태그 라이브러리를 제공하기 위한 목적으로 만들어졌다. 따라서 JSTL의 많은 태그들이 스트럿츠 태그 라이브러리의 태그들과 많이 중복된다. 중복되는 태그들은 JSTL 태그를 사용하는 것이 보다 권장된다.

 

스트럿츠는 MVC 모델2 아키텍처의 웹 애플리케이션을 위한 사실상의 표준 프레임워크라고 해도 과언이 아니다. 많은 솔루션 업체들이 자신들의 프레임워크를 제작할 때 스트럿츠 기반하에서 이를 확장하는 방식을 채택하고 있으며, 수많은 웹 애플리케이션이 스트럿츠 기반으로 작성되고 있다.

 

스트럿츠 홈페이지(http://struts.apache.org)를 방문하면 많은 참고 문서를 조회할 수 있으며, 최신 버전의 스트럿츠 설치 파일을 다운로드 받을 수 있다. 현재 스트럿츠 2.x 버전과 1.x 버전을 동시에 내놓고 있다. 2.x 버전은 WebWork2 프레임워크를 내부적으로 채택한 버전이다. WebWork2는 인터셉터(Intercepter), IoC(Inversion of Control)등의 기능을 가지고 있다. 현재 현업에서 가장 많이 사용되는 버전은 1.x 버전으로 1.x 버전과 2.x 버전은 호환되지 않는다. 


참초: 인터넷 , 자카르타 스트러츠 프로그래밍(한빛미디어)



'FrameWork' 카테고리의 다른 글

ActionServlet의 동작방식  (0) 2018.10.20
스트럿츠 프레임워크 구조  (0) 2018.10.20
MVC 디자인 패턴  (0) 2018.10.20
DTO 란?  (0) 2015.12.10
프레임워크(Framework)와 라이브러리  (0) 2015.12.10
블로그 이미지

클라인STR

,

MVC 디자인 패턴

FrameWork 2018. 10. 20. 12:58


MVC 패턴이란 애플리케이션을 크게 모델(Model,View, Controller)의 세 영역으로 구분하고 영역 간의 결합도를 최소화 패턴이다. 주로 Web Application에서 사용되며, 일반 애플리케이션에서도 널리 사용된다. 
MVC 패턴의 가장 중요한 장점 중 하나는 비즈니스 로직과 프리젠테이션 로직의 분리이다. 이로서 디자이너와 개발자들이 각자의 영역에 집중할수 있게 되었다.(효율성 극대화)

■ Model 영역 
애플리케이션에 비즈니스 로직과 사용되는 데이터를 다루는 영역이다. 
일반적으로 비즈니스 데이터는 데이터베이스에 의해 관리되고, 그 데이터를 다루는 연산은 SQL문을 통해서 구현된다.

■ View 영역 
최종 사용자에게 보여줄 프리젠테이션 로직을 담당하는 영역이다.(화면)
일반적으로 자바 웹 애플리케이션에서는 JSP를 통해서 구현된다.

■ Controller 영역
컨트롤러는 흐름을 관리하는 역할을 하며, 모델과 뷰 영역간의 조정 역할을 한다. 
사용자의 요청을 받아 이를 수행하기 위한 비즈니스 로직을 선택하고 호출하며, 수행한 비즈니스 로직의 결과를 보여주기 위해
뷰를 선택하여 포워드 해주는 역할을 한다. 


MVC 모델1 아키텍처 

* DTO(Data Transfer Object ) : 데이터 전송을 위한 개체


요청 흐름을 제어하기 위한 Controller 가 특별히 존재하지 않는다. MVC로 굳이 구분하자면 클라이언트의 요청을 받은 JSP가 Model 영역을 선택해서 호출하므로 Controller 역할을 수행한다고 볼 수 있다. JSP는 JavaBean을 이용하여 데이터베이스를 연동하여 Model 영역의 수행 결과를 받아 클라이언트에게 보내줄 UI(User Interface)를 생성하므로 View 역할도 수행한다. 
프리젠테이션로직과 비즈니스로직의 분리가 어렵고 그로인해 뷰의 재활용성이 떨어진다.

하지만 개발기간이 짧은 소규모 Project나 변경사항이나 요구사항이 적을경우 빠르게 개발할수 있다는 이점이 있다. 



MVC 모델 2 아키텍처 



모델2에서는 서블릿이 흐름을 제어하는 Controller 역할을 수행한다. 모든 클라이언트에 요청은 서블릿에 전달되어 서블릿이 클라이언트의 요청에 따라 비즈니스 로직을 호출하고 그결과에 따라 View에 해당하는 JSP를 호출하는 방식이다.

모델2가 모델1에 비해 개발 초기의 부하가 비교적 높고아키텍처에 대한 수준 높은 이해를 요구하지만재사용성이 높고 확장이 모델1에 비해 용이하다는 장점이 있다무엇보다모델2는 그 구조적 특징으로 인해 자연스럽게 MVC각 영역의 역할이 구분되도록 해준다.

 

모델2 Controller 역할을 하는 서블릿의 역할이 매우 중요하며서블릿이 잘못 개발된 경우 애플리케이션 전체에 미치는 영향이 매우 크다. 초기에 모델2를 적용한 웹 애플리케이션 중에는 서블릿 구현시 Model 영역과 View 영역을 호출해주는 부분이 하드 코딩되어 있거나 비효율적으로 구현되어 애플리케이션의 효율을 떨어뜨리고 구조만 복잡하게 되어버리는 경우가 많았다그러나 수많은 시행착오 끝에 잘 구축된 Controller들이 재활용되기 시작하면서 웹 프레임워크(Framework) 형태로 보급되기 시작하였다.



'FrameWork' 카테고리의 다른 글

스트럿츠 프레임워크 구조  (0) 2018.10.20
스트럿츠(Struts) 소개  (0) 2018.10.20
DTO 란?  (0) 2015.12.10
프레임워크(Framework)와 라이브러리  (0) 2015.12.10
Spring 이란 ?  (0) 2015.12.10
블로그 이미지

클라인STR

,