페이지

2020. 8. 12.

PowerMockup 스토리보드 만들기

 

화면 설계랑 스토리 보드작성을 위해 노가다 아닌 노가다를 하다가 PowerMockup를 사용하게된 내용을 적음.


1. 트라이얼 버전 다운로드

http://www.powermockup.com

첫페이지와 다운로드 페이지에서 다운로드 가능하다.



2. 설치

다운로드 받은 파일을 설치한다.


3. 설치완료

설치완료가 되었다는 내용을 파워포인트로 보여준다.


4. 사용해보기



기본적인 쉐입들은 사용할 수가 있었지만 더좋은? 더 편한 쉐입들을 사용하기 위해서는 라이센스 발급이 필요함


etc. 무료 라이센스 발급


트라이얼 버전 사용으로 만족할 수도 있지만, 더 편한 쉐입들을 사용하기위해선 정식 라이센스 키가 필요하다.


powermockup에서는 블로그 포스팅을 통해 무료 정식 라이센스를 발급해준다.


참고 할 것!

2019. 1. 2.

크롬(chrome)에서 나오는 이미지가 익스플로러(ie)에서 나오지 않았던 경우

결론부터 말하면 내 잘못이였음

디자이너에게 전달받은 jpg 파일을 png 파일로 강제로 내가 바꾸면서 파일이 깨짐

이름만 바꾸면 상관없었지만, 확장자까지 변경해서 생긴일.

디자이너가 준 파일로 했을땐 갠춘했음

크롬에서 깨진 파일도 잘나와서 확인하지 않았던 내 탓임.

ie에선 나오지 못하더라...

이 것 떄문에 파일 접근 권한때문인지 디렉토리 접근 권한 때문인지 아니면 WAS 접근 권한인지 엄청 찾아 다님.




그리고 새로 알았던 사실인데, ie에 이미지가 RGB가 아닌 CMYK 형식으로 만들어진 경우 이미지가 정상적으로 랜더링 되지 못하는 이슈가 있음.

참조 : http://www.happyjung.com/lecture/1390

2015. 2. 25.

[struts2] 인터셉터- servletConfig

servletConfig


mvc패턴처럼 사용할수 있도록 해주는 것이 servletconfig임

session, uri, ip 와 같은 정보를 꺼내올수 있도록 도움

interceptor로부터 주입 받아야함

기존에 jsp에서는 session setAtribute.. getAtribute...

mvc에서는 HttpSession session = ~~ 이런 식으로 사용해왔음





servletConfig은 총 7개의 인터페이스가 있다.

ServletContextAware : ServletContext 객체를 받을 수 있다.
ServletRequestAware : HttpServeltRequest 객체를 받을 수 있다.
ServletResponseAware : HttpServeltResponse 객체를 받을 수 있다.
ParameterAware : Parameter Map을 받을 수 있다. DTO쓰면 되서 거의 쓰이지 않음
RequestAware : Request Map을 받을 수 있다.
SessionAware : Session Map을 받을 수 있다.
ApplicationAware : Application Map을 받을 수 있다.

이 중에 ServletRequestAware랑 SessionAware만 거의 쓰인다.





SessionAware

[HelloWorld.java]
public class HelloWorld implements SessionAware{
    private Map sessionMap = null;
    public String execute(){
        sessionMap.put("memId", "test");
        //sessionMap.get("memId"); // 세션 확인
        //sessionMap.remove("memId"); // 로그아웃

        return "success";
    }

    public void setSession(Map arg0) {
        this.sessionMap = arg0;
        //session.setArrtibute("memId",id); 기존에 이렇게 사용했었음
    }   
}

[result.jsp]
<h2>세션(memId) = ${sessionScope.memId}</h2>

결과 : 세션(memId) = test
















ServletRequestAware




[HelloWorld.java]
public class HelloWorld implements ServletRequestAware{
    private HttpServletRequest request = null;
   
    public String execute(){
        String id = request.getParameter("id");
        HttpSession session = request.getSession();
        session.setAttribute("memId", "test");

        return "success";
    }

    public void setServletRequest(HttpServletRequest arg0) {
        this.request = arg0;
        //이렇게 설정해두면 MVC패턴과 동일하게 사용할 수 있다.
    }   
}





servletConfig을 이용해서 로그인 폼을 만들어 보자

우선 인터셉터 설정부터




[HelloWorld .java]
public class HelloWorld implements Preparable, ModelDriven, DAOSuper, SessionAware{
    private DAO dao = null;
    private DTO dto = null;
    private Map sessionMap = null;
    public String execute(){
        int check = dao.userCheck(dto.getId(), dto.getPw());
        if(check ==1){
            sessionMap.put("memId", dto.getId());
        }
        return "success";
    }
    public void setSession(Map arg0) {this.sessionMap = arg0;}
    public void setDAO(DAO dao) {this.dao = dao;}
    public Object getModel() {return dto;}
    public void prepare() throws Exception {dto = new DTO();
}
  
}






[struts.xml]
<struts>
    <package name="test" extends="struts-default">
        <interceptors>
            <interceptor name="hello" class="test.interceptor.HelloInterceptor" />  
            <interceptor name="dao" class="test.interceptor.DAOInterceptor" />  
        </interceptors>
      
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="params"/>
            <interceptor-ref name="dao"/>
            <interceptor-ref name="servletConfig" />

            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
폼에서 전달하기 위해서 3개 사용 (DTO)

<interceptor-ref name="dao"/>
dao사용

<interceptor-ref name="servletConfig" />
세션 사용


[DAO.java]
public class DAO {
    public int userCheck(String id, String pw){
        // ...이하 생략
        return 1;
    }
}










[form.jsp]
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>

<form action="/struts/hello2.action">
    id : <input type="text" name="id"/>
    pw : <input type="password" name="pw"/>
   
    <input type="submit" value="전송"/>
</form>






















[result.jsp]
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>

<h2>세션(memId) = ${sessionScope.memId}</h2>

[struts2] DI(dependency injection)를 구성하기 위한 메뉴얼

DI(dependency injection)개념

의존성 주입!!

객체를 직접적으로 만들어서 사용하는 것이 아니고 얻어서 사용하는 것을 말함
(다르게 말하면 코드 의존성 제거 - 수정 사항이 있을 떄 손이 덜 가게 하고 싶다.)

기존에 우리도

싱클톤패턴 인스턴스 생성을 사용했었다!! DAO dao = DAO.getInstance(); << 이런 형태


public class DAO {
    private static DAO dao = new DAO();
    public static DAO getInstance(){
        return dao;
    }
    private DAO(){
        //변수들은  DATABASE로 처리할 것이기때문에 필요한 변수들은 private로 처리한다.
        //따라서 다른곳에서 객체를 생성할 이유가 없어진다.
        //즉, 하나의 메모리를 만들어 놓고 같이 사용하는 것과 같다.
    }
}



어떻게 사용하면 될까?

init메서드가 호출될떄 필요한 모든 변수를 생성시켜버린다!!

    public void init() {
        DAO dao = new DAO();
    }
    public String intercept(ActionInvocation arg0) throws Exception {
        String result = arg0.invoke();
        return result;
    }



DI를 구성하기 위해 필요한것!(DI를 구성하기 위한 메뉴얼)
4단계

1. 범용성을 위한 interface 작성 (Superinterface)
2. Action 클래스는 슈퍼인터페이스 구현
3. 인터셉터 init 메서드에서 객체 생성
4. 인터셉터 intercept 메서드에서 객체 action에게 주입..!!!




1. 범용성을 위한 interface 작성 (Superinterface)

[DAOSuper.java]
package test.interceptor;

import test.action.DAO;

public interface DAOSuper {
    public void setDAO(DAO dao);
}




2. Action 클래스는 슈퍼인터페이스 구현

[HelloWorld.java]
package test.action;

import test.interceptor.DAOSuper;

public class HelloWorld implements DAOSuper{
    private DAO dao = null;
    public String execute(){
        return "success";
    }
    public void setDAO(DAO dao){
        this.dao = dao;
    }

}

이전에 인터셉터에서 add를 호출한것처럼 setDAO를 호출하는 것을 DI 형태라고 한다?





3. 인터셉터 init 메서드에서 객체 생성
package test.interceptor;

import test.action.DAO;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class DAOInterceptor implements Interceptor{
    private DAO dao = null;
    public void destroy() {    }

    public void init() {
        dao = new DAO();
    }

    public String intercept(ActionInvocation arg0) throws Exception {
        //DAOSuper를 구현했는 지를 검사한다.
        Object obj = arg0.getAction();
        if(obj instanceof DAOSuper){
            //instanceof true false를 반환(좌우가 상속관계인지 확인 후)
            //즉, helloworld가 DAOSuper를 구현 했는지?를 알아봄
            //따라서, 조상 자손 관계를 맽고 있다면,
            DAOSuper su = (DAOSuper)obj;  //기존객체를 형변환후 주입시킴
          su.setDAO(dao);  //이런 방식을 DI(의존성 주입)이라고함

        }
        return arg0.invoke();
    }
   
}



4. 인터셉터 intercept 메서드에서 객체 action에게 주입..!!!(3번 intercept 코드와 동일함)


public String intercept(ActionInvocation arg0) throws Exception {
        //DAOSuper를 구현했는 지를 검사한다.
        Object obj = arg0.getAction();
        if(obj instanceof DAOSuper){
            //instanceof true false를 반환(좌우가 상속관계인지 확인 후)
            //즉, helloworld가 DAOSuper를 구현 했는지?를 알아봄
            //따라서, 조상 자손 관계를 맽고 있다면,
            DAOSuper su = (DAOSuper)obj;//기존객체를 형변환후 주입시킴
            su.setDAO(dao);//이런 방식을 DI(의존성 주입)이라고함
        }
        return arg0.invoke();
    }


struts.xml 설정
<struts>
    <package name="test" extends="struts-default">
        <interceptors>
            <interceptor name="hello" class="test.interceptor.HelloInterceptor" />   
            <interceptor name="dao" class="test.interceptor.DAOInterceptor" />   
        </interceptors>
       
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="dao" />
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


[콘솔 내용]

정보: Server startup in 1588 ms
insert

정상적으로 출력되는 것 볼수 있음


[struts2] 인터셉터 만들기

interface를 구현 받아서 만들수 있다.

public class HelloInterceptor implements Interceptor{
    public void destroy() {
        //서버가 종료될때 동작
        //별로 필요 없음
    }
    public void init() {
        //최초 호출될때 1번
        //서블릿과 다른점은 서버를 재실행 하면 바로 실행이 됨
    }
    public String intercept(ActionInvocation arg0) throws Exception {
        //이후 여기서만 동작함
        //서블릿의 서비스와 같은 개념
        return null;
    }
}





[HelloInterceptor.java]
public class HelloInterceptor implements Interceptor{
    public void destroy() {
    }
    public void init() {
        System.out.println("init");
    }
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("interceptor");
        return null;
    }
}

이후 인터셉터를 설정해야 한다.

[struts.xml]
<struts>
    <package name="test" extends="struts-default">
        <interceptors>
            <interceptor name="hello" class="test.interceptor.HelloInterceptor" />       
        </interceptors>
       
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="hello" />
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


저장하고 서버를 재실행하면 콘솔창에서 init이 출력되는 것을 볼 수 있다.
서버가 재실행될떄 init메서드가 호출되기 때문


[콘솔 내용]
2월 25, 2015 4:06:16 오후 org.apache.struts2.config.Settings getLocale
경고: Settings: Could not parse struts.locale setting, substituting default VM locale
init
2월 25, 2015 4:06:17 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...








http://localhost:8080/struts/hello2.action를 요청하면
interceptor이 출력되는 것을 확인 할 수 있다.





현재까지는 controll  -  interceptor  -  action 모델에서
interceptor에서 action으로 가지 않음..
(execute가 출력되는지 확인해 보면됨)


이제 intercept에서 매개변수를 보내는 과정을 진행하자

[HelloInterceptor.java]
public String intercept(ActionInvocation arg0) throws Exception {
    System.out.println("interceptor");
    return arg0.invoke();
}



서버 재실행후 콘솔을 확인하면 execute가 출력되는 것을 확인 할 수 있음

[콘솔 내용]
2월 25, 2015 4:14:38 오후 org.apache.struts2.config.Settings getLocale
경고: Settings: Could not parse struts.locale setting, substituting default VM locale
init
2월 25, 2015 4:14:38 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...
interceptor
execute




즉, invoke()메서드는 execute()메서드를 호출하는 역할임

따라서 controller와 action사이를 연결을 돕도록하는 것이 invoke메서드이다.







갈때를 전 인터셉터
올때를 후 인터셉터 라고 하자.

[HelloInterceptor.java]public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("전 interceptor");
        String result = arg0.invoke();
        System.out.println("후 interceptor");
        return result;
    }

[콘솔 내용]
init
2월 25, 2015 4:20:00 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...
전 interceptor
execute
후 interceptor


즉, 전 interceptor를 거친후 execute를 실행하고 돌아오면서 후 interceptor를 거치게 된다.




기존의 interceptor들은 대부분 전인터셉터만 존재한다.


컨트롤러가 엑션에 보내려는 매개변수를 인터셉터가 모두 가로챈다.

이것은 ActionInvocation arg0에는 어느 액션으로 가는 것인지 목적지가 들어있다.

즉, HelloWorld에 모든 정보를 가로챈것!!


[HelloInterceptor.java]public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("intercept Action : " + arg0.getAction());
        String result = arg0.invoke();
        return result;
    }


init
2월 25, 2015 4:26:42 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...
intercept Action : test.action.HelloWorld@74ad4e7f
execute

즉, test.action.HelloWorld@74ad4e7f 이곳으로 보내려고 했던 것임




[HelloWorld.java]를 수정하고 인터셉터에서 add메서드를 불러보자

[HelloWorld.java]
public class HelloWorld {
    private int x = 0;
    public String execute(){
        System.out.println("execute x = " + x);
        return "success";
    }
    public void add(int x){
        this.x = x;
    }

}

[HelloInterceptor.java]
public String intercept(ActionInvocation arg0) throws Exception {
        HelloWorld hw = (HelloWorld)arg0.getAction();
       hw.add(1000);

        String result = arg0.invoke();
        return result;
    }









2015. 2. 24.

[struts2] 인터셉트

Struts2 인터셉터(initerceptor) – workflow
workflow인터셉터는 Action이 Validatable인터페이스를 구현했다면 Action의 validate()메소드를 호출한다.

Struts2 인터셉터(initerceptor) – prepare
prepare인터셉터는 com.opensymphony.xwork2.Preparable인터페이스를 구현한 Action의 prepare() 메소드를 실행 하는데 이 인터셉터는 Action을 실행하기 전에 다른 메소드를 실행 시킬 때 유용하게 사용될 수 있다

struts2 인터셉터(initerceptor) – staticParams
즉 staticParams Interceptor에서 세팅하는 값은 default value의 성격을 갖게 된다.

struts2 인터셉터(initerceptor) – checkbox
Struts2의 checkbox인터셉터는 체크하지 않은 checkbox에 대해 기본값을 지정해서 파라미터로 사용가능 하도록 지원한다. Checkbox 인터셉터의 uncheckedValue값을 설정하여 체크하지 않은 경우의 파라미터 값을 지정할 수 있다(default는 false)

struts2 인터셉터(initerceptor) – exception
다른 Interceptor나 Action에서 에러가 발생하면 그것을 잡아 예외에 매핑된 result로 응답을 만든다.

struts2 인터셉터(initerceptor) – interceptor-stack
이렇게 자주 사용되는 인터셉터 리스트를 모아서 지정한 것을 interceptor stack이라고 한다.
물론 interceptor-stack 내에 다른 interceptor-stack을 포함하는 것도 가능하다.


C ----- DTO ----- A


prepare : 객체생성
modeldriven : DTO에 넣음
params : 집어넣음



[HelloWorld.java]
public class HelloWorld extends ActionSupport implements Preparable, ModelDriven{

    public String execute() throws Exception {
        System.out.println("execute");
        return SUCCESS;
    }
   
    public void prepare() throws Exception {
   
    }
   
    public Object getModel() {
        return null;
    }


구현 : implements Preparable, ModelDriven

오버라이딩 : prepare(), getModel()

DTO가 prepare로 바뀌었음


[struts.xml]
<action name="hello2" class="test.action.HelloWorld">
    <interceptor-ref name="prepare" />
    <interceptor-ref name="modelDriven" />
    <interceptor-ref name="params" />
    <result>/0223/result.jsp</result>
</action>





[interceptor-stack]
인터셉터 스택!
자주 사용되는 인터셉터들을 하나로 묶어 놓은것!
<struts>
    <package name="test" extends="struts-default">
        <interceptors>
            <interceptor-stack name="dto">
                <interceptor-ref name="prepare" />
                <interceptor-ref name="modelDriven" />
                <interceptor-ref name="params" />
            </interceptor-stack> 
     
 
        </interceptors>
        <action name="hello1" class="test.action.HelloWorld1">
            <interceptor-ref name="dto" />
            <result>/0223/result.jsp</result>
        </action>
        <action name="hello2" class="test.action.HelloWorld2">
            <interceptor-ref name="dto" />
            <result>/0223/result.jsp</result>
        </action>
        <action name="hello3" class="test.action.HelloWorld3">
            <interceptor-ref name="dto" />
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>




[static params]

parameter가 들어가기전에 해당폼에 입력되고 만약 입력값이 없는 null이라면
설정한 값이 들어간다.

<struts>
    <package name="test" extends="struts-default">
        <action name="hello2" class="test.action.HelloWorld">
            <param name="id">guest</param>
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


package test.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport{
    private String id;
   
    public void setId(String id){
        this.id = id;
    }
       
    public String execute() throws Exception {
        System.out.println(id);
        return SUCCESS;
    }
}



즉, 사용자가 널값을입력하면 id에 quest가 들어간당
http://localhost:8080/struts/hello2.action로 바로 들어오면
quest가 출력





checkbox
인터셉트 체크박스
채크가 안 된경우 널값을 전달하지 않고 지정된 값을 전달하도록 함

파라미터중 채크박스를 선별하는 과정이 필요함

이름이 중요함
[form.jsp]
<input type="checkbox" name="ch" value="java"/>java
<input type="hidden" name="__checkbox_ch"/>

채크를 하지 않으면 널이 아니고 false로 됨


<struts>
    <package name="test" extends="struts-default">
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="params"/>

            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>



<struts>
    <package name="test" extends="struts-default">
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="checkbox">
                <param name="unCheckedValue">test</param>
            </interceptor-ref>

            <interceptor-ref name="params"/>
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


채크 하지 않았을 경우 값을 false가 아닌 다른값으로 변경할수도 있다.
<param name="unCheckedValue">test</param>