'프로그래밍 > 디자인패턴' 카테고리의 다른 글
쉽게 배우는 Iterator 패턴 (이터레이터 패턴) (0) | 2017.01.29 |
---|---|
쉽게 배우는 Factory 패턴 (팩토리 패턴) (0) | 2017.01.28 |
디자인 패턴의 간략한 암기 (0) | 2017.01.21 |
자바 에서 쓰이는 디자인 패턴들 (0) | 2016.08.26 |
디자인 패턴 기반 웹 어플리케이션 (0) | 2016.08.22 |
쉽게 배우는 Iterator 패턴 (이터레이터 패턴) (0) | 2017.01.29 |
---|---|
쉽게 배우는 Factory 패턴 (팩토리 패턴) (0) | 2017.01.28 |
디자인 패턴의 간략한 암기 (0) | 2017.01.21 |
자바 에서 쓰이는 디자인 패턴들 (0) | 2016.08.26 |
디자인 패턴 기반 웹 어플리케이션 (0) | 2016.08.22 |
빌드 방법은 maven을 이용해 war 생성 후 tomcat manager를 통해 war를 업로드 하는 식이다.
1.
먼저 Jenkins를 설치한 후 웹 사이트에 접속한다.
2.
시스템 설정
Jenkins 관리 > 시스템 설정 메뉴 접속 후 다음과 같이 JDK, Maven, 이메일, SVN 버전 설정을 한다.
이메일 서버는 gmail을 이용하였다.
3.
새로운 Job을 클릭
Job 이름 입력 후 Build a maven2/3 project 라디오 버튼 클릭
4.
소스 코드 관리 설정은 다음과 같이 한다.
나는 naver SVN 저장소를 이용했다. 사실 우리 회사 SVN 서버가 가끔씩 말썽을 일으키는 경우가 있는데 회사 프로젝트도 네이버의 SVN 서버를 이용하여 형상 관리를 하면 좋을 것 같다는 생각이 든다.
5.
빌드 트리거 설정
매일 매시 49분에 자동 빌드가 되도록 설정
6.
빌드 설정
maven Root POM 지정 후 Goals을 넣어준다.
clean 으로 target 디렉토리를 정리한 후 install을 이용하여 war를 생성한다.
7.
Post-build Actions 지정
톰켓의 webapps 디렉토리에 war를 배포하기 위한 설정이다. (Deploy Plugin을 설치해야 war를 tomcat으로 배포할 수 있다.)
여기서 manager 아이디와 패스워드는 TOMCAT_HOME/conf/tomcat-users.xml 파일에서 셋팅한다.
<role rolename=”tomcat”/>
<role rolename=”role1″/>
<role rolename=”manager”/>
<user username=”tomcat” password=”tomcat” roles=”tomcat”/>
<user username=”both” password=”tomcat” roles=”tomcat,role1″/>
<user username=”role1″ password=”tomcat” roles=”role1″/>
<user username=”lng1982″ password=”********” roles=”manager”/>
기본적으로 위와 같이 설정하면 Jenkins를 이용하여 지속적인 통합을 할 수 있다.
Jenkins 프로젝트 job 히스토리 삭제 방법
1. ${JENKINS_HOME}/jobs/프로젝트명/builds 이동
2. 삭제하고자 하는 히스토리 디렉토리를 삭제
3. Jenkins 관리 메뉴에서 Reload Configuration from Disk 선택
SSH를 이용한 배포
위에서 설명한 tomcat manager를 통한 배포 방식 외에 SSH를 이용하여 배포하는 방법도 있다.
먼저 jenkins 플러그인 화면으로 이동 후 “Publish Over SSH”를 설치한다.
Job > 설정으로 이동 후 Post-build Actions에 다음과 같이 설정하면 끝
실제 war 파일을 SSH 프로토콜을 이용하여 서버에 업로드 하는 것이다.
FTP를 이용한 배포
FTP를 이용한 배포를 위해선 “Publish Over FTP” 플러그인을 설치 후 Jenkins 관리 페이지 > 시스템 설정 페이지로 이동한다.
Publish over FTP 에 다음과 같이 설정
적용하고자 하는 프로젝트의 Job > 설정 페이지 이동 후 업로드 하고자 하는 파일에 대한 정보를 입력하면 끝
http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
java.lang.StringBuilder#append()
(unsynchronized)java.lang.StringBuffer#append()
(synchronized)java.nio.ByteBuffer#put()
(also on CharBuffer
, ShortBuffer
, IntBuffer
, LongBuffer
, FloatBuffer
and DoubleBuffer
)javax.swing.GroupLayout.Group#addComponent()
java.lang.Appendable
java.util.stream.Stream.Builder
java.util.Calendar#getInstance()
java.util.ResourceBundle#getBundle()
java.text.NumberFormat#getInstance()
java.nio.charset.Charset#forName()
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(Returns singleton object per protocol)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
and other similar methodsjava.lang.Object#clone()
(the class has to implement java.lang.Cloneable
)java.util.Arrays#asList()
java.util.Collections#list()
java.util.Collections#enumeration()
java.io.InputStreamReader(InputStream)
(returns a Reader
)java.io.OutputStreamWriter(OutputStream)
(returns a Writer
)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
and #unmarshal()
new LinkedHashMap(LinkedHashSet<K>, List<V>)
which returns an unmodifiable linked map which doesn't clone the items, but usesthem. The java.util.Collections#newSetFromMap()
and singletonXXX()
methods however comes close.java.awt.Container#add(Component)
(practically all over Swing thus)javax.faces.component.UIComponent#getChildren()
(practically all over JSF UI thus)java.io.InputStream
, OutputStream
, Reader
and Writer
have a constructor taking an instance of same type.java.util.Collections
, the checkedXXX()
, synchronizedXXX()
and unmodifiableXXX()
methods.javax.servlet.http.HttpServletRequestWrapper
and HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
, it internally uses among others the abstract/interface types LifeCycle
, ViewHandler
, NavigationHandler
and many more without that the enduser has to worry about it (which are however overrideable by injection).javax.faces.context.ExternalContext
, which internally uses ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
, etc.java.lang.Integer#valueOf(int)
(also on Boolean
, Byte
, Character
, Short
, Long
and BigDecimal
)java.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
(explanation here)javax.inject.Inject
(explanation here)javax.persistence.PersistenceContext
java.lang.Runnable
javax.swing.Action
java.util.Pattern
java.text.Normalizer
java.text.Format
javax.el.ELResolver
java.util.Iterator
(thus among others also java.util.Scanner
!).java.util.Enumeration
java.util.Timer
(all scheduleXXX()
methods)java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService
(the invokeXXX()
and submit()
methods)java.util.concurrent.ScheduledExecutorService
(all scheduleXXX()
methods)java.lang.reflect.Method#invoke()
java.util.Date
(the setter methods do that, Date
is internally represented by a long
value)java.io.Serializable
javax.faces.component.StateHolder
java.util.Observer
/java.util.Observable
(rarely used in real world though)java.util.EventListener
(practically all over Swing thus)javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
javax.faces.lifecycle.LifeCycle#execute()
(controlled by FacesServlet
, the behaviour is dependent on current phase (state) of JSF lifecycle)java.util.Comparator#compare()
, executed by among others Collections#sort()
.javax.servlet.http.HttpServlet
, the service()
and all doXXX()
methods take HttpServletRequest
and HttpServletResponse
and the implementor has to process them (and not to get hold of them as instance variables!).javax.servlet.Filter#doFilter()
java.io.InputStream
, java.io.OutputStream
, java.io.Reader
and java.io.Writer
.java.util.AbstractList
, java.util.AbstractSet
and java.util.AbstractMap
.javax.servlet.http.HttpServlet
, all the doXXX()
methods by default sends a HTTP 405 "Method Not Allowed" error to the response. You're free to implement none or any of them.쉽게 배우는 Iterator 패턴 (이터레이터 패턴) (0) | 2017.01.29 |
---|---|
쉽게 배우는 Factory 패턴 (팩토리 패턴) (0) | 2017.01.28 |
디자인 패턴의 간략한 암기 (0) | 2017.01.21 |
factory pattern vs abstract pattern (0) | 2016.09.01 |
디자인 패턴 기반 웹 어플리케이션 (0) | 2016.08.22 |
http://stackoverflow.com/questions/3541077/design-patterns-web-based-applications
번역은 천천히 할생각
A bit decent web application consists of a mix of design patterns. I'll mention only the most important ones. Model View Controller patternThe core (architectural) design pattern you'd like to use is the Model-View-Controller pattern. TheController is to be represented by a Servlet which (in)directly creates/uses a specific Model andView based on the request. The Model is to be represented by Javabean classes. This is often further dividable in Business Model which contains the actions (behaviour) and Data Model which contains the data (information). The View is to be represented by JSP files which have direct access to the (Data) Model by EL (Expression Language). Then there are variations based on how actions and events are handled. The popular ones are:
As a side note, hobbying around with a homegrown MVC framework is a very nice learning exercise, and I do recommend it as long as you keep it for personal/private purposes. But once you go professional, then it's strongly recommended to pick an existing framework rather than reinventing your own. Learning an existing and well-developed framework takes in long term less time than developing and maintaining a robust framework yourself. In the below detailed explanation I'll restrict myself to request based MVC since that's easier to implement. Front Controller pattern (Mediator pattern)First, the Controller part should implement the Front Controller pattern (which is a specialized kind of Mediator pattern). It should consist of only a single servlet which provides a centralized entry point of all requests. It should create the Model based on information available by the request, such as the pathinfo or servletpath, the method and/or specific parameters. The Business Model is called
Executing the action should return some identifier to locate the view. Simplest would be to use it as filename of the JSP. Map this servlet on a specific In case of prefix-patterns as for example When you're using suffix-patterns like Strategy patternThe
You may want to make the Here's an example of a
Factory method patternThe
The
Or configurable based on a properties/XML configuration file in the classpath: (pseudo)
Or dynamically based on a scan in the classpath for classes implementing a certain interface and/or annotation: (pseudo)
Keep in mind to create a "do nothing" Other patternsThose were the important patterns so far. To get a step further, you could use the Facade pattern to create a Then there's the State pattern for the case that you'd like to add an extra abstraction layer to split the tasks of gathering the request parameters, converting them, validating them, updating the model values and execute the actions. In JSF terms, this is what the Then there's the Composite pattern for the case that you'd like to create a component based view which can be attached with the model and whose behaviour depends on the state of the request based lifecycle. In JSF terms, this is what the This way you can evolve bit by bit towards a component based framework. |
쉽게 배우는 Iterator 패턴 (이터레이터 패턴) (0) | 2017.01.29 |
---|---|
쉽게 배우는 Factory 패턴 (팩토리 패턴) (0) | 2017.01.28 |
디자인 패턴의 간략한 암기 (0) | 2017.01.21 |
factory pattern vs abstract pattern (0) | 2016.09.01 |
자바 에서 쓰이는 디자인 패턴들 (0) | 2016.08.26 |
public class Page {
String name;// 이름
//user setting var
int itemTotalCount = 0; //아이템크기
int pageItemCount = 10; //페이지에 한번에 보여줄 아이템크기
int pageCount = 1; //페이지수 보여줄 개수
//user chioce var
int currentItem = 1; //현재 아이템 번호
public Page() {
}
public Page(String name) {
this.name=name;
}
public Page(String name, int itemTotalCount, int pageItemCount, int pageCount, int currentItem) {
setName(name);
setItemTotalCount(itemTotalCount);
setPageCount(pageCount);
setCurrentItem(currentItem);
}
public String getName() {
return name;
}
public Page setName(String name) {
this.name = name;
return this;
}
//아이템크기
public int getItemTotalCount() {
return itemTotalCount;
}
public Page setItemTotalCount(int itemTotalCount) {
if(itemTotalCount < 1){
itemTotalCount = 0;
}
this.itemTotalCount = itemTotalCount;
return this;
}
//페이지에 한번에 보여줄 아이템크기
public int getPageItemCount() {
return pageItemCount;
}
//페이지당 보여줄 아이템개수
public Page setPageItemCount(int pageItemCount) {
this.pageItemCount = pageItemCount;
return this;
}
//페이지수 보여줄 개수
public int getPageCount() {
return pageCount;
}
public Page setPageCount(int pageCount) {
this.pageCount = pageCount;
return this;
}
///////////////////////////settting
//현재 페이지 번호
public int getCurrentPage() {
int currentPage = (currentItem/pageItemCount) + ((currentItem%pageItemCount)>0?1:0); //현재위치 / 페이지에보여줄아이템수 + 나머지0이상있는경우 +1
int pageMax = getPageMax();
int pageMin = getPageMin();
if(currentPage>pageMax){
currentPage=pageMax;
}else if(currentPage < 1){
currentPage = pageMin;
}
return currentPage;
}
public Page setCurrentPage(int currentPage) {
currentItem = (pageItemCount*currentPage - 1) + 1; //바로전페이지로 이동후 +1로 아이템위치셋팅
int totalCont = getItemTotalCount();
if(currentItem>getItemTotalCount()){
currentItem = totalCont;
}else if(currentItem<1){
currentItem=0;
}
int pageMax = getPageMax();
int pageMin = getPageMin();
if(currentPage>pageMax){
currentPage=pageMax;
}else if(currentPage<1){
currentPage = pageMin;
}
return this;
}
//현재 아이템 번호
public int getCurrentItem() {
return currentItem;
}
public Page setCurrentItem(int currentItem) throws IllegalArgumentException {
if(currentItem>getItemTotalCount()){
throw new IllegalArgumentException("max over");
}
this.currentItem = currentItem;
return this;
}
//////auto------
// public int[] getPage() {
// return page;
// }
public int getPageMin() {
return 1;
}
public int getPageMax() {
int max = (itemTotalCount/pageItemCount) + ((itemTotalCount%pageItemCount)>0?1:0);
int pageMin = getPageMin();
if(max<1){
max = pageMin;
}
return max;
}
//현재 페이지의 아이템 최소값
public int getCurrentPageItemMin() {
return (getCurrentPage() - 1 ) * getPageItemCount() + 1; //전페이지
}
//현재 페이지의 아이템 최대값
public int getCurrentPageItemMax() {
int itemTotatCount = getItemTotalCount();
int max = getCurrentPageItemMin()+ getPageItemCount() - 1;
if(max>itemTotatCount){
max = itemTotatCount;
}
return max;
}
//페이징 표시의 처음 페이지 값
public int getCurrentPageMin() {
int currentPage = getCurrentPage();
int currentPageMin = currentPage - (getPageCount() / 2);
if(currentPageMin < 1){
currentPageMin = 1;
}
return currentPageMin;
}
//페이징 표시의 최대 페이지 값
public int getCurrentPageMax() {
int pageMax = getPageMax();
int currentPageMin = getCurrentPageMin() + (getPageCount()) - 1;
if(currentPageMin>pageMax){
currentPageMin = pageMax;
}
return currentPageMin;
}
public void process(){
getName();
getItemTotalCount();
getPageItemCount();
getPageCount();
getCurrentPage();
getCurrentItem();
getPageMin();
getPageMax();
getCurrentPageMin();
getCurrentPageMax();
}
@Override
public String toString() {
process();
return "getName()=" + getName() + ", \r\n getItemTotalCount(총아이템수)="
+ getItemTotalCount() + ",\r\n getPageItemCount(한페이지당 표시 아이템수)="
+ getPageItemCount() + ",\r\n getPageCount(페이징쪽에 페이지표시 보여줄수)=" + getPageCount()
+ ",\r\n getCurrentPage(현재페이지)=" + getCurrentPage()
+ ",\r\n getCurrentItem(현재아이템위치)=" + getCurrentItem() + ",\r\n getPageMin()="
+ getPageMin() + ",\r\n getPageMax(마지막 페이지 번호)=" + getPageMax()
+ ",\r\n getCurrentPageMin(보여질페이지에 처음페이지 번호)=" + getCurrentPageMin()
+ ",\r\n getCurrentPageMax(보여질페이지에 마지막페이지 번호)=" + getCurrentPageMax()
+ ",\r\n getCurrentPageItemMin(현재페이지 처음 아이템 번호)=" + getCurrentPageItemMin()
+ ",\r\n getCurrentPageItemMax(현재페이지 마지막 아이템 번호)=" + getCurrentPageItemMax()
;
}
// public static void main(String[] args) {
// Page page = new Page();
// page.setItemTotalCount(94);//총개수
// //page.setPageCount(1); //페이지수 보여질수
// page.setPageItemCount(10);
// page.setCurrentPage(1);
// System.out.println(page);
// }
}
Rxjava 는 무엇인가? (0) | 2018.06.13 |
---|