ex) test.sh 1234 > /dev/null 2>&1

 

> /dev/null

표준출력을 /dev/null로 보내라는 뜻 (화면에 출력하지 않도록 일반적으로 사용)

 

2>&1

실행시 발생되는 표준에러를 표준출력으로 보내라는 의미.

 

결국 표준에러를 표준출력으로 보내게 되고 표준출력은 /dev/null로 보내버리니 화면에 아무것도 찍히지 않게 된다.

 

 

 

0 : 표준입력

1 : 표준출력

2 : 표준에러


<          입력 방향을 바꾼다.
>          출력 방향을 바꾼다.
>>        출력에 덧붙인다.
2>        오류의 방향을 바꾼다.
2>>      오류의 방향을 바꾸고 덧붙인다.
&>       출력과 오류를 리다이렉션 한다.
>&       오류와 출력을 리다이렉션 한다.
1>&2    출력을 오류로 내보낸다.
2>&1    오류를 출력으로 내보낸다.
>|         출력을 리다이렉션 할 때 NOCLOBBER 설정을 무시한다
<>        장치 파일(/dev)이면, 표준 출력, 표준 입력 등에 모두 사용한다.

id로 선택시 $("#id")
$("#sample_id")

class로 선택시 $(".class")
$(".sample_class")

name으로 선택시 $("tag_name[name=name]")

$("input[name=sample_name]")

 

다중 선택 시

$("#sample_id, #sample_id2, #sample_id3")

multipart/form-data 통신 시 송수신 소스코드

 

받는쪽 JSP

<%@ page contentType="text/html;charset=euc-kr" %> 
<%@ page import="com.oreilly.servlet.MultipartRequest" %> 
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %> 
<%@ page import="java.util.*" %> 
<%@ page import="java.io.*" %> 
<%@ page import="org.json.*" %>

<% 
      String savePath="C:/data"; //저장경로 
      int sizeLimit = 10 * 1024 * 1024 ; // 용량제한 10MB
      try{ 
           MultipartRequest multi = new MultipartRequest(request, savePath, sizeLimit,"euc-kr",new DefaultFileRenamePolicy());

            String helloText= multi.getParameter("helloText"); 
            String helloFile= multi.getFilesystemName("helloFile"); 
            String originFileName = multi.getOriginalFileName("helloFile"); 
            String mimeType = multi.getContentType("helloFile");
            
            //로직 처리 
            
            out.print("통신 시 결과값");
            
        } catch(Exception e) {
            out.print(e.getMessage());
        }


%>

 

보내는쪽 (JSP version)

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>

	<Form action="받을쪽.jsp" Method="POST" enctype="multipart/form-data">
		<input type="text" name="helloText" value=""/>
		<input type="file" name="helloFile"/>
		<input type="file" name="helloFile2"/>
		<input type="submit" value="전 송"/>
	</Form>
</body>
</html>

보내는쪽 (JAVA version)

 

package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class MultipartTest {
	private final static String boundary = "aJ123Af2318";
	private final static String LINE_FEED = "\r\n";
	private final static String charset = "euc-kr";
	private OutputStream outputStream;
	private PrintWriter writer;

	public void addTextPart(String name, String value) throws IOException  {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\""+name+"\"").append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
	}
	
	public void addFilePart(String name, File file) throws IOException  {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\""+name+"\"; filename=\"" + file.getName() + "\"").append(LINE_FEED);
        writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName())).append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();

        FileInputStream inputStream = new FileInputStream(file);
        byte[] buffer = new byte[(int)file.length()];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();
        writer.append(LINE_FEED);
        writer.flush();
	}
	
	public void sendMultiPart(){
        try{
        	File file = new File("경로");
        	File file2 = new File("경로");
        	
            URL url = new URL("받는쪽 url");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestProperty("Content-Type", "multipart/form-data;charset="+charset+";boundary=" + boundary);
            connection.setRequestMethod("POST");
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setUseCaches(false);
            connection.setConnectTimeout(10000);

            outputStream = connection.getOutputStream();
            writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true);
            
            
            //원하는 데이터 세팅
            addTextPart("helloText","데이터값");
            addFilePart("helloFile", file);
            addFilePart("helloFile2", file2);

            

            writer.append("--" + boundary + "--").append(LINE_FEED);
            writer.close();

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                
            } else {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                
            }

        } catch (ConnectException e) {
            e.printStackTrace();


        } catch (Exception e){
            e.printStackTrace();
        }
	}

}

INSERT INTO [테이블] (column1, colum2, colum3) SELECT column1, colum2, colum3 FROM [테이블] WHERE [조건절];


ex) insert into tbl_board ( title, writer, content ) select '제목은 고정', '아무개', content from tbl_board where bno=42;


위 쿼리를 실행하게되면 글의 제목은 '제목은 고정' 글쓴이는 '아무개'로 42번글의 내용만 가지고 와서 insert가 되게 된다.

'개발 > Mysql' 카테고리의 다른 글

[MySQL] 실행계획 (explain) 보는법  (1) 2018.03.21


일단 영어자체를 해석해보면 mapper에 내가사용한 ~~ 이 없다는 뜻이다.


보통


1. 사용한 mapper id가 틀린 경우

2. mapper가 정의 되어 있지 않은 경우

3. namespace를 잘못 준 경우

4. mapper 경로 설정을 잘못한 경우


나 같은경우는 다 되어있었는데 결국 1번 경우였다

스펠링은 맞았는데 중간에 대소문자 하나가 달라서 였다

MySQL 실행계획 Example


id: 1 select_type: PRIMARY table: t1 type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 4 filtered: 100.00 Extra: Using index        


  • id

쿼리 내의 select 문의 순서


  • select_type

select문의 유형



SIMPLE: 단순 select ( union이나 서브쿼리를 사용하지 않음 )


PRIMARY: 가장 외곽에 있는 select문


UNION: union에서의 두번째 혹은 나중에 따라오는 select문


DEPENDENT UNION: union에서의 두번째 혹은 나중에 따라오는 select문, 외곽 쿼리에 의존적이다.


UNION RESULT: union의 결과물


SUBQUERY: 서브쿼리의 첫번째 select


DEPENDENT SUBQUERY: 서브쿼리의 첫번째 select, 바깥 쪽 쿼리에 의존적이다.


DERIVED: from절의 서브쿼리



  • table

참조하고 있는 테이블명


  • type

조인타입이며 속도와 아주 밀접한 항목이다. 좋은 순서대로 아래로 갈수록 안좋은 형태이다.



system: 테이블에 단 하나의 행만 존재(=시스템 테이블). const 조인의 특별한 형태이다.


const: 하나의 매치되는 행만 존재하는 경우. 하나의 행이기 때문에 상수로 간주되며, 한번만 읽어들이기 때문에 무척 빠르다.


eq_ref: 조인수행을 위해 각 테이블에서 하나의 행만이 읽혀지는 형태. const 타입 외에 가장 훌륭한 조인타입이다.


ref: ref조인에서 키의 가장 왼쪽 접두사 만 사용하거나 키가 a PRIMARY KEY또는 UNIQUE인덱스 가 아닌 경우 (즉, 조인이 키 값을 기반으로 단일 행을 선택할 수없는 경우) 사용된다. 사용되는 키가 몇 개의 행과 만 일치하는 경우 이는 좋은 조인 유형이다.


fulltext: fulltext 색인을 사용하여 수행된다.


ref_or_null: 이 조인 유형은 비슷 ref하지만 MySQL이 NULL값 을 포함하는 행을 추가로 검색한다는 점이 다르다. 이 조인 유형 최적화는 하위 쿼리를 해결하는 데 가장 자주 사용된다.


index_merge: 인덱스 병합 최적화가 적용되는 조인타입. 이 경우, key컬럼은 사용된 인덱스의 리스트를 나타내며 key_len 컬럼은 사용된 인덱스중 가장 긴 key명을 나타낸다.


range: 인덱스를 사용하여 주어진 범위 내의 행들만 추출된다. key 컬럼은 사용된 인덱스를 나타내고 key_len은 사용된 가장 긴 key부분을 나타낸다. ref 컬럼은 이 타입의 조인에서 NULL 이다. range 타입은 키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용된다.


index: 이 타입은 인덱스가 스캔되는걸 제외하면 ALL과 같다. 보통 인덱스 파일이 데이터 파일보다 작기 때문에 ALL보다 빠르다.


ALL: 이전 테이블과의 조인을 위해 풀스캔이 된다. 만약 조인에 쓰인 첫 테이블이 고정이 아니라면 비효율적이다. 그리고 대부분의 경우 아주 느리며, 보통 상수값이나 상수인 컬럼값으로 row를 추출하도록 인덱스를 추가하여 ALL 타입을 피할 수 있다.




  • possible_keys

이 컬럼값은 MySQL이 해당 테이블의 검색에 사용할 수 있는 인덱스들을 나타낸다.


  • key

이 컬럼은 MySQL이 실제 사용한 key(index)를 나타낸다.


  • key_len

이 컬럼은 MySQL이 사용한 인덱스의 길이를 나타낸다. key 컬럼의 값이 NULL이면 이 컬럼의 값도 NULL이다. 이 값으로 MySQL이 실제로 키를 얼마나 사용하였는지 알 수 있다.


  • ref

이 컬럼은 행을 추출하는데 키와 함께 사용된 컬럼이나 상수값을 나타낸다.


  • rows

이 값은 쿼리 수행에서 MySQL이 찾아야하는 데이터행 수의 예상값을 나타낸다. 추정 수치이며 항상 정확하지 않다.


  • filtered

filtered열에 나타난 조건에 의해 필터링 될 테이블 행의 예상 비율을 나타낸다. 즉, rows는 검사 된 행 수를 나타내고 rows x filtered / 100은 이전 테이블과 조인 될 행 수를 표시합니다.


  • Extra

이 칼럼에는 MySQL이 쿼리를 어떻게 해석하는지에 대한 추가 정보가 들어있다.

'개발 > Mysql' 카테고리의 다른 글

[Mysql] select insert 문 사용법  (0) 2018.11.21

+ Recent posts