728x90
300x250

[운영관리(Operation Mgt)] 공정관리 - 생산 공정의 이해


이번에 소개할 내용은 생산운영관리의 공정관리에 대해서 소개하려고 한다.

제품은 인력이 바로 투입된다고 해서 생산되는 것이 아니고, 많은 과정을 거쳐서 생산이 된다고 보면 된다.


The content to be introduced this time is to introduce the process management of production operation management.

Products are not produced just because human resources are put in right away, but can be seen as being produced through many processes.



1. 프로젝트의 이해(Understanding of the project)


제품은 크게 수많은 단위 프로젝트들이 모여서 하나의 제품이 된다고 보면 된다.

프로젝트는 크게 도면으로 된 단위일 수도 있고, 프로그래밍, 문서, 협업 등 다양할 수 있다.


A product can be viewed as a single product by gathering a large number of unit projects.

Projects can be largely in units of drawings, and can be diverse, such as programming, documentation, and collaboration.



그림 1. 프로젝트의 이해



[첨부(Attachments)]

201225_guide_project.pptx




2. 공정별 생산 관리(Production management by process)


생산은 크게 프로젝트를 수립한 이후에 단계별 공정으로 세분화하여 생산 업무를 진행하게 된다.

작업을 하게 되면, 소요시간이라는 게 발생한다.


기계셋팅 작업에 어느 정도 시간이 소요되고 있는지, 재료 투입에는 어느 정도인지, 불량품인지, 양산인지 등 파악하는 것이 중요하다.

이런 형태로 윤곽을 잡고 작업을 하게 되면, 어디에서 어떻게 문제가 생기는지 파악하는데 용이할 수 있다.


Production is largely subdivided into step-by-step processes after the project is established, and the production work is carried out.

When you work, there is a time required.

It is important to understand how long it takes to set up the machine, how much time it takes for material input, whether it is a defective product or mass production.

If you outline and work in this form, it can be easier to figure out where and how the problem occurs.




그림 2. 공정별 생산관리




3. 공구소모 생산 관리(Tool consumption production management)


공정을 운영하면, 공구나 재료가 어떻게 소모되고 있는지 추정할 수 있어야 한다.

잉크는 몇 개 소모되고 있는지, 연필은 몇 개 소모되고 있는지 갯수 파악이 되면 이점이 많다.


재료를 계속 투입했는데 불구하고, 어디에서 불량이 나는지 문제 파악을 할 수 있기 때문이다.


When you run the process, you should be able to estimate how the tool or material is being consumed.

There are many advantages to knowing how many ink and how many pencils are being consumed.

This is because the problem can be identified where the defect occurs even though the material is continuously added.




그림 3. 공구소모 생산관리




4. 첨부(Attachments)


201224_공정관리_생산관리_학습자용.zip


[GNU/GPL v3 Licenses)를 적용받는다.




* 맺음글(Conclusion)


제조 시스템에 대해서 알기 쉽게 살펴보았다.

We looked at the manufacturing system in an easy-to-understand manner.

반응형
728x90
300x250

[JSP] 29. 프로젝트 구성 방법 - Eclipse로 살펴보는 보안 프로젝트 구성


오랜만에 글을 작성한다.

이번에 소개할 내용은 시큐어코딩에 대해서 몇 가지 주제를 가지고 소개하려고 한다.

프로젝트 생성 방법에 대해서 몇 가지 소개하려고 한다.


장점: 정보를 보호할 수 있음.

단점: 정보를 보호하는 대신에 개발 메뉴얼 등이 요구됨.

       오류가 나면, 코어 소스를 가지고 있는 인원에 대응해야 하는 한계가 있음.


* 규모가 큰 프로젝트에 적합할 수 있다.

* 갈등이 많은 작은 규모에서도 고려할 수 있다.



1. 프로젝트 생성 방법


기존의 코딩 방법과는 몇 가지 차이가 있을 수 있다.


 


그림 1. 프로젝트 구성의 예1) 보안이 적용된 모습

그림 2. 프로젝트 구성의 예2 - 보안이 적용되지 않는 모습


일반적인 경우라고 하면, 그림 2처럼 프로젝트를 생성하고 개발할 것이다.

그림 1의 방법으로 하면 무엇이 장점이 되는지 소개하도록 하겠다.



2. 불필요한 정보 - 은닉하기


예를 들어서 개발자가 있다고 가정하자.

개발자와 DBA의 권한은 또 한 차원 다른 문제가 된다.

불필요하게 개발자가 DBMS에 접근하여 정보를 조작하는 행위를 가급적 안 하는 것이 좋을 수 있다.

이러한 문제에 직면했을 때, 실질적인 이론 말고 코드와 프로젝트 구성으로서 어떻게 방어해야 할지 알아두면 좋을 듯싶다.


 


그림 3. 정보 은닉이 완료된 시큐어코드


그림 3은 정보 은닉이 완료된 시큐어코드이다.

무슨 이야기인지 그림 4를 살펴 보면서 소개하도록 하겠다.


 

그림 4. jar 파일로 컴파일하기


그림 4는 jar 파일로 공통 함수를 컴파일된 Library를 불러온 것이다.

이렇게 해버리면, 개발자는 제공된 공통함수만 가지고 코딩을 해야 하므로, "서버 계정", "DB 정보" 등 불필요한 요소들에 대해서

접근할 필요가 없어진다.


개발자는 설계된 테이블에 대해서 SELECT, INSERT, DELETE, UPDATE 기능만 구현해주면 된다.


물론 이게 전부 시큐어코딩이라고는 볼 수 없다. 해독하는 프로그램도 종종 있을 수 있기 때문이다.

다만, 정보 노출을 최소화하는 역할을 한다고 보면 된다.



3. 사용 방법(Jar - Export하기)


"Dodo_SmartCoreWeb" 프로젝트를 마우스 오른쪽 버튼을 누른다.

"Export"를 클릭한다.


 

 그림 5. Export 하기


그리고 Jar 파일로 Export할 대상을 선택한다.


 

 그림 6. Jar 파일 - Export하기


JAR file 경로를 "Browse"를 눌러서 지정해준 다음에 "Finish"를 누른다.



4. 사용 방법(Jar - Properties의 Java Build-Path의 Libraries에 User Libraries 등록하기)


프로젝트를 마우스 오른쪽 버튼으로 클릭한다.



그림 7. 프로젝트 속성 - Properties


프로젝트를 클릭한다.

마우스 오른쪽 버튼을 누른다.

Properties를 클릭한다.



그림 8. 프로젝트 속성 - Properties


Java Build Path를 클릭한다.

Libraries 탭을 클릭한다.

Add Library를 클릭한다.



그림 9. Add Library


User Library를 선택한다.

Next를 누른다.




그림 10. Add Library - User Libraries...


User Library를 선택한다.

Next를 누른다.



그림 11. Properties의 User Libraries


New를 클릭한다.



그림 12. New User Library


예를 들면 "HelloCore"라고 입력한다.

OK를 누른다.



그림 13. JAR Selection 모습


Add Jars를 누른다.

예를 들면, SmartWorkJar.jar를 선택한다.

OK를 누른다.



그림 14. Preferences의 모습


등록된 HelloCore의 User Libraries 모습을 확인할 수 있다.

Apply and Close를 누른다.



그림 15. Add Library 창


HelloCore를 선택하고 Finish를 누른다.



그림 16. Java Build Path에 등록된 Hello Core


Java Build Path에 등록된 "HelloCore"를 살펴볼 수 있다.



5. 기대효과


불필요한 소스 코드를 줄이고, 개발자, 관리자, DBA 등 업무 분담 형태의 개발을 구성할 수 있다.

물론, 보안코드를 요구하는 곳에는 이런 형태로 구성할 수 있다.

반응형
728x90
300x250

[JSP] 16. 쿠키(Cookie) - 프로젝트(생성, 조회, 삭제)


쿠키에 대해서 소개하려고 한다.

쿠키라는 부분은 조작을 해버리면, 보안 자체가 매우 취약해서 사용 안 하는 것을 권장한다.

물론 전혀 사용 안 하는 것은 아니다.


쿠키는 서버 측으로부터 세션을 클라이언트로부터 내려받아서 세션 유지를 처리해주는 기술 중 하나이다.

서버와의 연결이 끊어져도 쿠키를 통해서 정보를 유지할 수 있다.


인터넷 검색을 시도 해보면, "특정 쿠키 변경"도 종종 검색되긴 하지만, 수 차례 태스트 결과로는 변경 작업은 시도 할 수 없다.

시도하려면, 쿠키를 전체 제거하고 다시 생성하는 방법 말고는 딱히 없다고 본다.



1. Cookie란?


쿠키란, 서버가 클라이언트에 저장하는 정보로써 클라이언트 쪽에 필요한 정보를 저장해놓고 필요할 때 추출하는 것을 지원하는 기술이다.


쿠키는 간단하게 구현할 수 있어서 "사용자 인증", "쇼핑몰 구축" 등에도 사용할 수 있지만, 브라우저에 저장되는 한계, 클라이언트가 직접 쿠키를 조작할 수 있기 때문에 보안에 취약해지는 단점이 있다.


- Cookie 생성 = new Cookie(String name, String value)

- 유효시간 설정 = setMaxAge(int expiry) 

- 쿠키 경로 설정 = setPath(String uri)

- 쿠키 도메인 설정 = setDomain(String domain)

- 쿠키 전송 = addCookie(Cookie cookie)


...... 쿠키는 직접 코드를 보는 게 훨씬 이해되는 데 도움된다고 주장한다.



2. Project 생성하기


이번 프로젝트는 꼭 반드시 Maven Project로 생성해야만 동작하는 건 아니다.

pom.xml을 사용하면, 라이브러리 관리가 수월해져서 그렇다.



그림 1. Maven Project 생성하기


org.apache.maven.archetypes  |   maven-archetype-webapp를 선택한 후 Next를 누른다.




그림 2. Maven Project 생성하기


Group ID와 Artifact Id를 입력한다.

Finish를 누른다.



3. pom.xml - 설정하기


이 글에서는 javax.servlet만을 추가하였다.



그림 3. Maven Project 생성하기




4. Servlet 생성하기


몇 가지 Servlet을 생성한다.



Java Resources에서 오른쪽 버튼을 누른다.

New->Servlet을 클릭한다.



그림 4. Servlet 생성 방법1


Java package명과 Class name명을 입력한다.

Finish를 누른다.




그림 5. Servlet 생성 방법2~4(반복)


그림 4의 동일한 방법으로 생성해준다.



5. web.xml - 설정하기


크게 많은 것을 작성한 건 아니다.

servlet 부분은 자동생성된 부분이다.

web-app, init-param 등 몇 가지를 수정, 추가하였다.


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">

 

  <display-name>Archetype Created Web Application</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.do</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.do</welcome-file>

  </welcome-file-list>

  

  <servlet>

  <servlet-name>CookieTest1Servlet</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieTest1Servlet</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet>

  <servlet-name>CookieExtract</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieExtract</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet>

  <servlet-name>CookieAllRemove</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieAllRemove</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet>

  <servlet-name>CookieModify</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieModify</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  

  <servlet-mapping>

  <servlet-name>CookieTest1Servlet</servlet-name>

  <url-pattern>/CookieTest1Servlet</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>CookieExtract</servlet-name>

  <url-pattern>/CookieExtract</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>CookieAllRemove</servlet-name>

  <url-pattern>/CookieAllRemove</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>CookieModify</servlet-name>

  <url-pattern>/CookieModify</url-pattern>

  </servlet-mapping>

</web-app>



파일명: web.xml


[첨부(Attachments)]

web.zip




6. index.jsp


index.jsp 파일이다.

확인 기능을 손쉽게 할 수 있도록 구현하였다.


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

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8"></meta>

<title>Cookie 태스트</title>

<style>

a{

text-decoration:none;

}

</style>

</head>

<body>


<h2>Hello World!</h2>


<h3>이클립스 웹에서는 확인 불가</h3>

<a href="CookieTest1Servlet">쿠키 생성</a><br/>

<a href="CookieExtract">쿠키 추출</a><br/>

<a href="CookieAllRemove">쿠키 전체 삭제</a><br/>

<a href="CookieModify">쿠키 변경(결론: 불가능)</a><br/>

<div style="width:400px; height:200px; background-color:#e2e2e2">

<h5>참고로 웹 브라우저에서 쿠키를 제거하는 옵션을 켜버리면 유지 자체에 의미가 없어짐.</h5>


</div>

</body>

</html>



파일명: insert.jsp


[첨부(Attachments)]

index.zip




7. Servlet - CookieTest1Servlet


쿠키 생성 방법에 대한 소스이다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class CookieTest1Servlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public CookieTest1Servlet() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

// 1. 쿠키 생성 - 기본 시간(브라우저 종료시 전송받은 쿠키 사라짐)

Cookie c1 = new Cookie("id", "userID");

c1.setPath("/");

res.addCookie(c1);

// 2. 쿠키 생성 - 쿠키 3시간 설정(60sec * 60Min * 3Hour)

Cookie c2 = new Cookie("mymy", "1234");

c2.setMaxAge(60 * 60 * 3);

c2.setPath("/");

res.addCookie(c2);

// 3. 쿠키 생성 - 쿠키 5일 설정(60sec * 60Min * 24Hour * 5Day)

Cookie c3 = new Cookie("subject", "zaza");

c3.setMaxAge(60 * 60 * 24 * 5);

c3.setPath("/"); // 경로는 루트로 지정함.

res.addCookie(c3);

out.println("쿠키 전송 완료<br/>");

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieTest1Servlet.java


[첨부(Attachments)]

CookieTest1Servlet.zip




8. Servlet - CookieExtract


쿠키 내용을 조회하는 방법에 관한 것이다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class CookieExtract extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public CookieExtract() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

Cookie[] list = req.getCookies();


// 삭제 여부 - 판별

if ( list != null ) {

out.print("유지 상태<br/>");

}else

{

out.print("삭제 완료<br/>");

}

// 쿠키 찾기(seq방식)

out.println("쿠키 검색1<br/>");

for ( int i = 0; list != null && i < list.length; i++ ) {

out.println( list[i].getName() + ":value=" + list[i].getValue() + "<br/>" );

}

// for 문 - 응용2

out.println("쿠키 검색2<br/>");

int i = 0;

for( Cookie cookie : list) {

out.println( list[i].getName() + ":value=" + list[i].getValue() + "<br/>" );

i++;

}

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieExtract.java


[첨부(Attachments)]

CookieExtract.zip



9. Servlet - CookieAllRemove


쿠키를 전체 삭제하는 방법이다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class CookieAllRemove extends HttpServlet {

private static final long serialVersionUID = 1L;


    public CookieAllRemove() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

Cookie[] list = req.getCookies();

for ( int i = 0; list != null && i < list.length; i++ ) {

// 만료처리 전

out.print( "이전 list[" + i + "]: " + list[i].getName() );

out.print( "<br/>" );

// 유효시간 0으로 설정하면 만료처리됨.

Cookie kc = new Cookie(list[i].getName(), null) ;

    kc.setMaxAge(0) ;

    kc.setPath("/");


// 응답에 쿠키 추가

res.addCookie(kc);

kc = null;

}

out.println("<br/>");

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieAllRemove.java


[첨부(Attachments)]

CookieAllRemove.zip



10. Servlet - CookieModify(안 되는 코드)


안 된다고 표기를 해둔 이유는 setValue 등으로 수정 후 넘기면 될 것 같지만, 전혀 되지 않는다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


/**

 * Servlet implementation class CookieModify

 */

public class CookieModify extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public CookieModify() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

Cookie[] list = req.getCookies();

for ( Cookie cookie : list  ) {

if ( cookie.getName().equals("id")) {

cookie.setValue("haha");

res.addCookie(cookie);

}

}


out.println("<br/>");

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieModify.java


[첨부(Attachments)]

CookieModify.zip



* 맺음글(Conclusion)


쿠키 프로젝트로 가볍게 쿠키 사용 방법에 대해서 살펴보았다.

반응형
728x90
300x250

[JSP] 12. Jsp/Servlet(MVC) Maven 기반의 다중 파일 업로드, 다운로드 구현(1)


조금 실질적으로 도움이 되는 프로젝트라고 주장한다.

다중 파일 업로드, 다운로드 프로젝트를 조금 실용적으로 유용하게 사용할 수 있도록 특화하여 따로 만들어보게 되었다.


사용하는 것은 쉽지만, 구현하는 것은 다소 많은 시간이 소요된다고 본다.

현재 시중에 판매되는 교제 등의 내용이 공개 비판하면 그렇지만, 품질이 매우 낮다는 점이다.


최신 버전에 가까운 프로젝트를 위주로 직접 태스트를 엄선해서 수차례 검증하고, 작성하였다.


* apache-tomcat-9.0.37-windows-x64

* Maven - 3.6.3/1.16.0.20200610-1735   - http://maven.apache.org/download.cgi

  (pom.xml)

   - javax.servlet-api 4.0.1

   - commons-io 2.8.0 (apache project)   -  http://commons.apache.org/

   - commons-fileupload 1.4 (apache project)   - http://commons.apache.org/


적용한 모델은 MVC2 모델을 적용하였으니 참고하면 도움이 되겠다.



1. 결과


다운로드, 업로드 기능에 많은 시간이 소요된 프로젝트였다.



그림 1. 결과 



그림 2. 결과 




그림 3. 결과


그림 4. 결과




그림 5. 결과




2. 프로젝트 구성


작업을 해야하는 양이 조금 된다. 하나 잘 만들어놓으면 활용하거나 개선을 해서 사용해보는 것도 좋은 방법인 거 같다.



그림 6. 프로젝트 구성도



3. 프로젝트 초기 설정


새 프로젝트 만들기를 누른다.



그림 7. 새 프로젝트 만들기


Maven의 Maven Project를 클릭한다.

Next를 누른다.



그림 8. New Maven Project


"org.apache.maven.archetypes   | maven-archetype-webapp"를 선택하고 Next를 누른다.




그림 9. New Maven Project(2)


패키지명과 Artifact Id를 입력하고, Finish를 누른다.



그림 10. New Maven Project(3)


톰캣 서버 설정 등을 완료한다. 그리고 빌드를 시도하면, 이런 화면을 볼 수 있다.



4. 프로젝트 속성 - Java Build Path, Project Facets


14버전으로 변경해준다.



그림 11. Java Build Path -> Libraries 탭의 JRE System Library 버전


버전을 깔맞춤해줘야 한다.

14버전이면, 14로 일관성있게 설정 해준다.



그림 12. Project Facets -> Java 버전확인


마찬가지로 버전을 14로 맞춰준다.


비고: 대략 초기 Maven Project를 생성하면, 1.6? 1.7 버전으로 셋팅되어 있음.



5. Controller 생성하기(Servlet 만들기)


프로젝트에서 오른쪽 버튼을 클릭해서 New->Servlet을 클릭해서 하나 만들어준다.



그림 13. Servlet 만들기


패키지: com.fileWeb.controller

클래스명: FrontController(java)



6. pom.xml 설정하기(MvnRepository.com)


pom.xml 설정으로 필요한 라이브러리를 구비해준다.



<?xml version="1.0" encoding="UTF-8"?>


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>


  <groupId>com.mavenUpload</groupId>

  <artifactId>web</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>


  <name>File - Multi Web Upload Project</name>

  <!-- FIXME change it to the project's website -->

  <url>http://www.example.com</url>


  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <maven.compiler.source>1.7</maven.compiler.source>

    <maven.compiler.target>1.7</maven.compiler.target>

  </properties>


  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.11</version>

      <scope>test</scope>

    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->

<dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>2.8.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->

<dependency>

    <groupId>commons-fileupload</groupId>

    <artifactId>commons-fileupload</artifactId>

    <version>1.4</version>

</dependency>

  </dependencies>


  <build>

    <finalName>web</finalName>

    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->

      <plugins>

        <plugin>

          <artifactId>maven-clean-plugin</artifactId>

          <version>3.1.0</version>

        </plugin>

        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->

        <plugin>

          <artifactId>maven-resources-plugin</artifactId>

          <version>3.0.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-compiler-plugin</artifactId>

          <version>3.8.0</version>

        </plugin>

        <plugin>

          <artifactId>maven-surefire-plugin</artifactId>

          <version>2.22.1</version>

        </plugin>

        <plugin>

          <artifactId>maven-war-plugin</artifactId>

          <version>3.2.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-install-plugin</artifactId>

          <version>2.5.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-deploy-plugin</artifactId>

          <version>2.8.2</version>

        </plugin>

      </plugins>

    </pluginManagement>

  </build>

</project>



파일명: pom.xml


[첨부(Attachments)]

pom.zip



7. web.xml 설정하기


web.xml 설정에 관한 것이다.

jsp가 아닌 *.do로 처리하는 프로젝트에 대한 내용으로 작성되었다.

UTF-8 한글 언어셋도 정의하였다.


<?xml version="1.0" encoding="UTF-8"?>


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">


  <display-name>Archetype Created Web Application</display-name>

  

  <welcome-file-list>


    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.do</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.do</welcome-file>

  </welcome-file-list>

  

  <servlet>

  <servlet-name>FrontController</servlet-name>

  <servlet-class>com.fileWeb.controller.FrontController</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet-mapping>

  <servlet-name>FrontController</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

</web-app>



파일명: web.xml


[첨부(Attachments)]

web.zip



8. Controller - HttpUtil.java


패키지명: com.fileWeb.controller

클래스명: HttpUtil (java)



package com.fileWeb.controller;


import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.PrintWriter;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class HttpUtil extends HttpServlet {

private static final long serialVersionUID = 1L;

private static String charset = null;


public static void forward(HttpServletRequest req, HttpServletResponse res,

String path) throws ServletException, IOException {

try {

RequestDispatcher dispatcher = req.getRequestDispatcher(path);

dispatcher.forward(req, res);

}catch(Exception e) {

e.printStackTrace();

}

}

public static void fileUpload(HttpServletRequest req, HttpServletResponse res,

String path) throws ServletException, IOException {


charset = (String) req.getAttribute("charset");

System.out.println(charset);

PrintWriter out = res.getWriter();

// 파일 업로드된 경로

String root = req.getSession().getServletContext().getRealPath("/");

String savePath = root + "upload" + File.separator + "upload";

// 서버에 실제 저장된 파일명

String filename = "1600955663095" ;

System.out.println("파일 실제 폴더경로:" + savePath);

// 실제 내보낼 파일명

String orgfilename = "license한글.txt" ;

req.setCharacterEncoding(charset);

res.setCharacterEncoding(charset);

InputStream in = null;

OutputStream os = null;

File file = null;

boolean skip = false;

String client = "";

try{

    // 파일을 읽어 스트림에 담기

    try{

        file = new File(savePath, filename);

        in = new FileInputStream(file);

    }catch(FileNotFoundException fe){

        skip = true;

    }

    client = req.getHeader("User-Agent");

    // 파일 다운로드 헤더 지정

    res.reset() ;

    res.setContentType("application/octet-stream");

    res.setHeader("Content-Description", "JSP Generated Data");

    if(!skip){

        // IE

        if(client.indexOf("MSIE") != -1){

            res.setHeader ("Content-Disposition", "attachment; filename="+new String(orgfilename.getBytes("KSC5601"),"ISO8859_1"));

        }else{

            // 한글 파일명 처리

            orgfilename = new String(orgfilename.getBytes("KSC5601"),"iso-8859-1");

            res.setHeader("Content-Disposition", "attachment; filename=\"" + orgfilename + "\"");

            res.setHeader("Content-Type", "application/octet-stream; charset=utf-8");

        }  

        res.setHeader ("Content-Length", ""+file.length() );

        os = res.getOutputStream();

        

        byte b[] = new byte[(int)file.length()];

        int leng = 0;

        while( (leng = in.read(b)) > 0 ){

            os.write(b,0,leng);

        }

    }else{

    // 한글 깨짐 - 해결

    res.setContentType("text/html;charset=" + charset);

        out.println("<html><head>");

        out.println("<script language='javascript'>alert('파일을 찾을 수 없습니다.');history.back();</script>");

        out.println("</head><body></body></html>");

    }

    in.close();

    os.close();

}catch(Exception e){

e.printStackTrace();

}

    

}


}



파일명: HttpUtil.java


[첨부(Attachments)]

HttpUtil.zip



9. Controller의 인터페이스 (Controller.java)


Controller.java 파일이다.

인터페이스로 설계되었다.


package com.fileWeb.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {

public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;

}



파일명: Controller.java


[첨부(Attachments)]

Controller.zip




10. Controller - FrontController와 Command 패턴 적용으로 구성함. 


설명도 중요하지만, 코드로 살펴보도록 하겠다.


package com.fileWeb.controller;


import java.io.IOException;

import java.util.HashMap;

import java.util.Map;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;


/**

 * Servlet implementation class HomeController

 */

public class FrontController extends HttpServlet {

private static final long serialVersionUID = 1L;

       

private String charset = null;

    public FrontController() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doAction(req, res);

}

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doAction(req, res);

}

// FrontController 패턴 & Command 패턴

protected void doAction(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

charset = sc.getInitParameter("charset");

req.setAttribute("charset", charset);

req.setCharacterEncoding(charset);

res.setContentType("text/html; charset=" + charset);

System.out.println(charset);

String uri = req.getRequestURI();

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

String conPath = req.getContextPath();

System.out.println("conPath : " + conPath);

String command = uri.substring(conPath.length());

System.out.println("command : " + command);

Controller subController = null;

System.out.println("reqMapSize : " + req.getParameterMap().size());


if(command.equals("/board/insert.do")){

System.out.println("insert");

System.out.println("----------------");


    subController = new BoardInsertController();

    subController.execute(req, res);

   

}else if (command.equals("/board/insertResult.do")) {

System.out.println("insertResult");

System.out.println("----------------");


    subController = new BoardInsertResultController();

subController.execute(req, res);

}

else if(command.equals("/board/insertMultiResult.do")){

System.out.println("insertResult");

System.out.println("----------------");


    subController = new BoardInsertMultiResultController();

subController.execute(req, res);

}else if(command.equals("/board/download.do")) {

System.out.println("download");

System.out.println("----------------");

    HttpUtil.fileUpload(req, res, null);

}else if(command.equals("/board/update.do")){

System.out.println("update");

System.out.println("----------------");

}else if(command.equals("/board/select.do")){

System.out.println("select");

System.out.println("----------------");

}else if(command.equals("/board/delete.do")){

System.out.println("delete");

System.out.println("----------------");

}

}

}



파일명: FrontController.java


[첨부(Attachments)]

FrontController.zip



11. Controller - BoardInsertController.java


BoardInsertController의 핵심 내용은 "insert.jsp" 파일을 불러오는 데 있다.

없어도 된다고 생각했는데, 기능이 많아질 경우를 대비한다면, 있는 것이 낫다고 생각했다.


package com.fileWeb.controller;


import java.io.IOException;

import java.util.HashMap;

import java.util.Map;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class BoardInsertController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws

ServletException, IOException {

HttpUtil.forward(req, res, "/WEB-INF/view/board/insert.jsp");

}


}



파일명: BoardInsertController.java


[첨부(Attachments)]

BoardInsertController.zip



12. View - board/insert.jsp


삽입 페이지에 대한 것이다.

구현 목표는 두 가지에 대한 실험이다.


하나는 순수한 POST 처리 방식이고, 하나는 POST기반의 multipart/form-data 방식에 관한 것이다.


실험 결과를 먼저 소개하면, 

1. multipart/form-data를 정의해버리면, 기본 정의된 request로는 parameter를 전송받을 수가 없다.


* com.oreilly.servlet   (결과: 오래된 프로젝트 / 서블릿 버전 충돌 발생)

  - http://www.servlets.com/cos/


다양한 검색을 통해서 MultipartRequest 정의를 활용해서 이 문제를 oreilly.Servlet으로 해결할 수 있다는 글을 봐서 적용하였으나 
서블릿 충돌 문제가 발생하였다. (사용할 수 없는 오래된 라이브러리)

2. Apache Common-io, Apache Common-FileUpload를 적용하면, 해결할 수 있다. (2020-09-24일 기준)



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

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>삽입</title>

</head>

<body>

<h3>삽입</h3>


<!-- 파일 업로드 화면 -->

<!-- 일반적으로 Multipart form으로 전송된 데이터는

      일반 request 메서드로 받아올 수 없습니다.  enctype="multipart/form-data" -->

<form method="post" action="insertResult.do" >

<table style="width:700px;border:1px solid #e2e2e2;">

<tr>

<td style="width:20%">

파일명

</td>

<td>

<input type="text" name="usrID" size="10">

<input type="file" name="uploadFile" multiple>

</td>

</tr>

<tr>

<td colspan="2">

<input type="submit" value="전송">

</td>

</tr>

</table>

</form>



<!-- 멀티파트/데이터 전송 -->

<form method="post" action="insertMultiResult.do" enctype="multipart/form-data" >

<table style="width:700px;border:1px solid #e2e2e2;">

<tr>

<td style="width:20%">

파일명

</td>

<td>

<input type="text" name="usrID" size="10">

<input type="password" name="usrPasswd" size="10">

<input type="file" name="uploadFile" multiple>

<input type="file" name="uploadFile" multiple>

<input type="file" name="uploadFile" multiple>

</td>

</tr>

<tr>

<td colspan="2">

<input type="submit" value="전송">

</td>

</tr>

</table>

</form>


</body>

</html>


파일명: insert.jsp


[첨부(Attachments)]

insert.zip




13. Controller - BoardInsertResultController


multipart/form-data를 미지원하는 타입으로 결과를 출력하는 방법에 대하여 작성하였다.


package com.fileWeb.controller;


import java.io.IOException;

import java.util.HashMap;

import java.util.Map;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class BoardInsertResultController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws

ServletException, IOException {


Map<String, Object> reqMap = new HashMap<String, Object>();

reqMap.put("usrID", req.getParameter("usrID"));

reqMap.put("usrPasswd", req.getParameter("filename"));


            req.setAttribute("reqMap", reqMap);

        

HttpUtil.forward(req, res, "/WEB-INF/view/board/insertResult.jsp");

}


}


파일명: BoardInsertResultController.jsp


[첨부(Attachments)]

BoardInsertResultController.zip



2부에서 만나요.


양이 조금 많아서 2부에서 글을 이어서 소개하려고 한다.


- [JSP] 12. Jsp/Servlet(MVC) Maven 기반의 다중 파일 업로드, 다운로드 구현(2), 2020-09-24

   https://yyman.tistory.com/1415


반응형
728x90
300x250

[컴퓨터 - PC활용] Eclipse에서 git 프로젝트 import하기(가져오기)


Eclipse에서 git 프로젝트를 가져오는 방법에 대해서 소개하려고 한다.

git 프로젝트 등에서 좋은 아이디어 등을 얻을 수도 있고, 개선 작업을 할 수도 있다.

또는 오픈소스를 활용하는 프로젝트를 진행할 수도 있다.

이럴 때 유용하게 프로젝트를 가져오는 방법에 대해서 논하고자 한다.


적용대상: Eclipse 기반의 IDE(STS 4 포함) 





1. 프로젝트 가져오기


File에서 Import를 누른다.



그림 1. 프로젝트 가져오기(1)


Git의 Projects from git을 선택하고 "Next(다음)"을 누른다.



그림 2. 프로젝트 가져오기(2)


Clone URI를 선택하고 "Next"를 누른다.




그림 3. 프로젝트 가져오기(3)


가져오고 싶은 프로젝트의 git 사이트 URL을 찾아야 한다.

프로젝트에서 Code를 클릭한 후 URL 주소를 복사한다.




그림 4. 프로젝트 가져오기(4)


이클립스 화면으로 가서 "Import Projects from Git" 창을 활성화 한다.

그리고 URI에 복사했던 URL주소를 붙여넣는다.

그리고 "Next"를 누른다.





그림 5. 프로젝트 가져오기(5)


특별한 사항이 없다면, "Next"를 누른다.



그림 6. 프로젝트 가져오기(6)


로컬 저장소 경로에 관한 것이다.

원하는 경로가 있다면, Browse를 클릭하여 지정해도 좋다.


설정을 완료하였다면, Next를 누른다.




그림 7. 프로젝트 가져오기(7)


아래의 모습은 프로젝트가 원격 저장소에서 로컬 저장소로 전송되고 있는 모습이다.



그림 8. 프로젝트 가져오기(8)


Import existing Eclipse projects를 클릭하고 Next를 누른다. 



그림 9. 프로젝트 가져오기(9)


프로젝트에 대한 사항을 확인하고, "Finish"를 누른다.




그림 10. 프로젝트 가져오기(10)


아래의 그림 11처럼 프로젝트를 가져온 모습을 확인할 수 있다.




그림 11. 프로젝트 가져오기(11)



반응형
728x90
300x250

[PC활용, GNU(리눅스)] Eclipse(이클립스) - 프로젝트 소개 및 우분투 18.04.01 설치하기(Jee Photon)

 

이번에 소개하는 것은 Eclipse 프로젝트 소개 및 설치하기(Eclipse Jee Photon)에 대해서 소개하겠다.

 


1. 소개

 

Eclipse Foundation에 대해서 소개하겠다.

 

http://www.eclipse.org에 접속하면 아래처럼 사이트 접속을 할 수 있다.

 

그림 1-1. Eclipse Foundation - Eclipse.org

 

아래는 Eclipse 재단에 대해서 소개하고 있다.

http://www.eclipse.org/org

 

 

그림 1-2. About Eclipse Foundation - Eclipse.org

 


2. 설치하기

 

http://www.eclipse.org에 접속한다.

 

 

그림 2-1. Eclipse 수동 설치하기 - 도도(Dodo)

 

"Download(다운로드)"를 클릭한다.

 

 

 

그림 2-2. Eclipse 수동 설치하기 - 도도(Dodo)

 

Get Eclipse Photon 아래에 "Download 64 bit(다운로드 64비트)"를 클릭한다.

 

 

그림 2-3. Eclipse 수동 설치하기 - 도도(Dodo)

 

그림 2-3에서 "Download(다운로드)"를 클릭한다.

 

 

그림 2-4. Eclipse 수동 설치하기 - 도도(Dodo)

 

그림 2-4는 다운로드가 완료되었다.

 


2-1. Eclipse 설치하기

 

다음은 Eclipse(이클립스)를 설치하는 방법에 대해서 소개하겠다.

 

실제 사용된 명령어는 몇 가지 되지 않는다.

 

번호

명령어

소개

비고(Remark)

1

cd /home/article/다운로드

폴더 이동

 

2

tar xvfz eclips-inst-linux64.tar.gz

압축 풀기

 

3

cd eclipse-installer

이동 하기

 

4

./eclipse-inst

설치하기

 

 

 

 

 

그림 2-5. Eclipse 수동 설치하기 - 도도(Dodo)

 

 

그림 2-6. Eclipse 수동 설치하기 - 도도(Dodo)

 

 

그림 2-6. Eclipse 수동 설치하기 - 도도(Dodo)

 

 

그림 2-7. Eclipse 수동 설치하기 - 도도(Dodo)

 

 

 

그림 2-8. Eclipse 수동 설치하기 - 도도(Dodo)

 

 

그림 2-9. Eclipse 수동 설치하기 - 도도(Dodo)

 

그림 2-9에서 "Install(인스톨)"을 클릭한다.

설치 경로를 변경하고 싶다면, "Installation Folder(설치 폴더)"의 폴더 아이콘을 클릭하여 변경할 수 있다.

 

 

그림 2-10. Eclipse 수동 설치하기 - 도도(Dodo)

 

기다린다.

 

 

그림 2-11. Eclipse 수동 설치하기 - 도도(Dodo)

 

기다린다.

 

 

그림 2-12. Eclipse 수동 설치하기 - 도도(Dodo)

 

설치에 관한 인증서 등에 대한 것이다.

"Select All(실릭트 올)"을 클릭하고 "Accept selected(어셉트 셀렉티드 / 이하 선택 동의)"를 클릭한다.

 

 

그림 2-13. Eclipse 수동 설치하기 - 도도(Dodo)

 

기다린다.

 

 

그림 2-14. Eclipse 수동 설치하기 - 도도(Dodo)

 

그림 2-14이다.

"Lanuch(런치, 이하 실행을 의미)"을 클릭한다.

 


3. 시연하기

 

아래의 영상은 시연에 관한 것이다.

 

영상 1. 시연하기 / 이클립스 - 도도(Dodo)

 


4. 라이선스(License)

 

아래의 링크를 클릭하면, 이클립스의 라이선스에 대해서 살펴볼 수 있다.

http://www.eclipse.org/legal/epl-2.0/

 

 

그림 4-1. Eclipse Public License - Eclipse.org

 


5. 맺음글(Conclusion)

 

이상으로 이클립스를 우분투에서 설치하기 및 실행에 대해서 소개하였다.

 


6. 참고자료(Reference)

 

1. Enabling Open Innovation & Collaboration | The Eclipse Foundation, Last Modified, Accessed by 2018-09-06, http://www.eclipse.org/

2. About the Eclipse Foundation | The Eclipse Foundation, Last Modified, Accessed by 2018-09-06, http://www.eclipse.org/org/

3. Eclipse Downloads | The Eclipse Foundation, Last Modified, Accessed by 2018-09-06, http://www.eclipse.org/downloads/

4. Eclipse Project Handbook | The Eclipse Foundation, Last Modified, Accessed by 2018-09-06, http://www.eclipse.org/projects/handbook

반응형
728x90
300x250

[PHP/GPLv2] PHP SysInfo 프로젝트 - Sysinfo

저번에 올렸던 한국 LinuxChannel.net 의 sysinfo 프로그램보다 더 역사가 깊고 지금 현재까지 최신버전으로 릴리즈가 되고 있는 PHP SysInfo 프로젝트의 Sysinfo라는 프로그램이 있습니다.

사용환경 : Apache, PHP
운영체제 : 거의 모든 기종 지원
언어지원 : 한국을 비롯한 세계 주요 나라의 언어 지원.

http://phpsysinfo.sourceforge.net/

파일 첨부 :
phpSysInfo-3.0-RC8.tar.gz

스크린샷 :

반응형

+ Recent posts