'어장 프로그래밍'에 해당되는 글 32건

테이블의 데이터를 다른 테이블로 그대로 옮겨야 할 때가 있다.

Excel Export / Inport를 통한 방법이나 기타 여러 방법들이 있긴 한데 아무래도 귀찮은 방법이기도 하고. 그래서 Select Insert Query를 주로 사용한다.


1
2
INSERT INTO A_TABLE a
SELECT * FROM B_TABLE b WHERE b.no = '1'
cs


가장 기본적으로 위와 같은 구성으로 시작할 수 있다. A_TABLE에 B_TABLE의 데이터 중, no가 1인 항목만을 넣는 쿼리이다.


만약, 특정 컬럼에 대해서만 select insert를 한다면? 다음과 같다.


1
2
3
4
5
6
7
8
INSERT INTO A_TABLE a
    ( no , title , content , insert_date , insert_user )
SELECT 
    no , title , content , insert_date , insert_user
FROM
    B_TABLE
WHERE
    no = '1'
cs


위와 별개로, 다른 user에 할당된 테이블에 넣기 위해서는? 

회사에서는 하나의 DB에 user 단위로 운용/개발 DB가 분리되어있다. 당연하게도 dba 권한으로 아래의 쿼리를 이용해주면 된다.


1
2
3
4
5
6
7
8
INSERT INTO user_1.A_TABLE a
    ( no , title , content , insert_date , insert_user )
SELECT 
    no , title , content , insert_date , insert_user
FROM
    user_2.B_TABLE
WHERE
    no = '1'
cs


user_1은 user_2에 접근할 수 없기에 dba 권한으로 둘 다 접속이 가능한 상태에서 select / insert를 수행해주면 된다.


블로그 이미지

김생선

어장에서 바라보는 세상

시스템에서 하나의 Unique Value를 여러테이블에 Insert 하는 경우가 생긴다. 간단하게 게시판을 예로 들 수 있는데, 글 작성과 첨부파일이 있는 경우다.

글 내용과 제목, 작성자 정보등을 담는 board_table과 첨부파일만을 저장하는 file_table 이라고 예시를 들어보자. board_table은 글 번호(PK)가 있을 것이고 이 글 번호로 join이 걸리는 file_table의 key_column 이 있다. 하나의 글에는 여러개의 파일이 첨부가 될 수 있다.


board_table의 글번호는 아주 특수한 경우가 아니고서야 Unique로 가져간다. 그리고 글을 작성할 때, Insert 쿼리를 쓰며, 일일히 글번호를 만들어주기 귀찮고 무엇보다 크나큰 오류가 생기는 경우가 있을 수 있으므로 아래와 같이 대부분 sql의 sequence를 이용해 글번호를 유일하게 가져간다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<insert id="QID_INSERT_BOARD" parameterType="hashMap">
    INSERT INTO board_table
    ( 
        board_no -- 글 번호
        , title    -- 글 제목        
        , content -- 글 내용
        , insert_date -- 작성일시
        , insert_user -- 작성자
    )
    VALUES
    (
        seq_board_no.NEXTVAL -- 글번호를 가져오는 시퀀스
        , #{TITLE}
        , #{CONTENT}
        , #{INSERT_DATE}
        , #{INSERT_USER}
    )
</insert>
cs


이 때, 해당 글번호로 작성된 파일들의 파일첨부는 어떻게 Key를 가져와야 할까? 위의 쿼리는 글이 작성되는 시점(insert query가 commit이 되는 시점)에서 글 번호를 생성한다. 쿼리를 날리기 직전에 sequence를 호출, 이를 board_table과 file_table에 key_parameter로 insert 하는 방법도 있겠지만 권장하는 방법은 아니다. 만약, 랜덤키를 쿼리 내에서 생성하는 경우에는? 그렇다면 Key를 쿼리 수행 전에 가져올 수도 없다. 이럴 때 사용하는 것이 ibatis(mybatis)의 펑션인 select key 이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<insert id="QID_INSERT_BOARD" parameterType="hashMap">
    INSERT INTO board_table
    ( 
        board_no -- 글 번호
        , title    -- 글 제목        
        , content -- 글 내용
        , insert_date -- 작성일시
        , insert_user -- 작성자
    )
    VALUES
    (
        seq_board_no.NEXTVAL -- 글번호를 가져오는 시퀀스
        , #{TITLE}
        , #{CONTENT}
        , #{INSERT_DATE}
        , #{INSERT_USER}
    )
    <selectKey keyProperty="BOARD_NO" resultType="int" order="AFTER">
        SELECT seq_board_no.CURRVAL FROM dual
    </selectKey>
</insert>
cs


사용법은 심플하다. insert 쿼리를 실행하기 전에 가져올 것인지 혹은 후에 가져올 것인지에 따라 selectKey의 위치가 Insert 쿼리의 앞 혹은뒤로 옮겨진다. 이 쿼리에서는 Insert를 수행 후에 가장 최근 sequence를 가져올 것이므로, Insert 쿼리의 뒤에 배치했다.

Insert 쿼리가 수행된 후에 selectKey 구문이 실행될 것이고, 조회된 sequence 값이 BOARD_NO 에 세팅, 이후에 사용할 수 있게 된다. 파라미터는 다음과 같다.


Parameter 

설명 

 keyProperty

selectKey가 수행된 이후에 결과값이 세팅되는 key값. 

 resultType

selectKey가 수행된 결과값의 type. string 이라거나 int 라거나...

 order

BEFORE 혹은 AFTER로 설정 가능. selectKey 구문을 먼저(BEFORE) 실행 할 것인지 혹은 나중에(AFTER) 실행할 것인지를 지정한다.


위의 쿼리는 종합적으로 Insert 구문이 실행된 후, sequence가 nextVal이 된 상태이며, 이 상태값을 바로 selectKey가 currval을 통회 최근 sequence 값을 조회, 이후 이 리턴값을 받아 쓰면 되는 구조이다.


덕분에 board_table에 Insert를 수행한 이후, 해당 board_no를 바로 리턴받고 file_table에 Insert를 하게 되었다.

블로그 이미지

김생선

어장에서 바라보는 세상

DB에서 데이터를 가져온 후, TextArea에 value 값을 지정할 때 줄바꿈 문자열을 넣어줘야 하는 경우가 있다.

<br>이라거나 \r\n 이라거나 잔뜩 있긴 하지만서도, jsp 안에서 html로 그려질 때에는 먹히지 않는다.


가볍게 &#10; 를 넣어주면 해결된다.

블로그 이미지

김생선

어장에서 바라보는 세상

tomcat을 포함한 WAS 들은 root로 구동하게 되면 해킹당했을 때 root 권한에 대해 보안취약점이 발생하게 된다. 기본 웹포트는 80이며, SSL이 적용되는 포트는 443 포트를 사용하게 되는데, 리눅스에서는 1000 포트 이하의 경우에는 root 에서만 제어할 수 있다.

그래서 80포트를 8080 포트로, 443 포트를 8443 포트로 routing 설정을 해줘야한다. 


여기까지는 기본적인 설정인데, 요사이 보안이슈로 인하여 기본적으로 널리 알려진 8080 같은 포트는 사용하지 말라는 권고가 떨어지곤 한다. 그래서 나는 58080과 같은 포트로 변경함.

iptables 에서만 변경할 부분이 아니라, was에서도 변경을 해야한다. tomcat의 경우에는 conf/server.xml 에서 수정 가능하다.


1. iptables 설정 확인

iptables -t nat -L


2. iptables 포트 삭제

iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080


3. iptables 포트 등록

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 58080


4. iptables 포트 저장

# service iptables save


5. iptables 재시작

# service iptables restart


위의 순서로 작업을 해야한다. 인터넷에서는 삭제/저장 절치 없이 등록/재시작을 하라고 나오는데 내가 뭔가 잘못한건지 정상동작이 안되길래 전형적인 순서로 작업함.

결과는 대성공.


참고로, iptables 에서 80->8080 routing 설정을 하지 않거나 혹은 tomcat/conf/server.xml 에서 8080 관련 redirect 설정을 삭제한다면 해당 포트로 접속하는 모든 방법은 차단될 수 있다.

SSL을 씌운 상태였는데 http://URL 이라거나... 혹은 서버 IP:8080 이라거나...


블로그 이미지

김생선

어장에서 바라보는 세상

Java 에서 PrintWriter 를 사용하여 한글 출력할 때 한글이 깨지는 경우가 존재한다.

한글인코딩이 맞지 않아서 생기는 일.


1
2
3
4
5
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter outs = response.getWriter();
outs.println"<script>alert('로그인 권한이 존재하지 않습니다..');history.back();</script>" );
return;
cs


주의할 점은, PrintWriter 에서 out 으로 꺼내기 전에 response의 인코딩 타입을 미리 정해줘야 한다는 것. 


블로그 이미지

김생선

어장에서 바라보는 세상

티스토리 툴바