개발을 하다보면 한 번씩 문자가 깨지는 경우가 발생한다.

생각보다 빈번하게 발생하는 문제이기에 보통 자주 발생하는 문제점을 확인해도 해결이 되지 않는 경우가 있다.

특히 같은 코드로 실운영 환경에서는 문제가 없는데, 로컬에서만 문제가 생기는 경우가 있다.


이 경우 서버단에서 문제가 발생한 것은 아닌지 확인을 해야한다.

tomcat의 Server.xml의 커넥터 설정으로 인한 문제일 확률이 있다.


기본적으로 커넥터 부분에 작성이 되어있는 내용은 아래와 같다.


<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />


여기에 URIEncoding만 추가해주면 간단히 문제를 해결할 수 있다.


<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />


위의 커넥터 뿐만 아니라 아래에 커넥터 부분이 하나 더 있는데,


<Connector port="8080" protocol="AJP/1.3" redirectPort="8443" />


이 부분이다.


나는 위의 커넥터 부분에만 URIEncoding을 넣었을 때 문제가 해결되지 않았었고 아래의 커넥터 부분에도 URIEncoding을 넣었었다.

이 부분은 프로젝트마다 차이가 있는지 정확히는 모르겠다.

그래서 해당 커넥터도 아래와 같이 수정.


<Connector port="8080" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />


요즘에는 몇 번 같은 문제를 해결하고 난 뒤부터는 큰 문제가 없어보이면 server.xml에서 인코딩을 먼저 확인해본다.




IE8에서 빈 텍스트 노드가 생성되어 공간을 차지하면서 점(.)이 보여지는 버그가 생겼다.

빈 텍스트 노드가 생기는 이전 객체에 div를 이용하여 style을 줘서 해결했다.


만일 input 뒤에 빈텍스트 노드가 생겼다면 아래와 같이 해결했다.

<div style="display: block;"><input type="text"></div>



IE8과 chrome에서 px로 사이즈를 잡아서 배치를 하면 일치하지 않는 경우가 존재한다.

나의 경우 chrome에서는 top:10px; 가 적당한데, IE8에서는 top:3px; 가 적당한 값이었다.

적정선에서 타협할 수 있는 차이면 괜찮겠지만 너무 눈에 딱 보이는 부분이라 따로 적용을 할 수 밖에 없었다.


class명이 .basic-btn 일 경우 아래와 같이 적용하면 IE8의 top은 3px, 그 외의 브라우저에는 10px로 적용할 수 있다.

.basic-btn {top:10px; top:3px\0/ !important!; /*IE8에서만 top:3px; 적용*/}


원하는 속성 뒤에 '\0/ !important'를 붙여주면 간단히 해결 할 수 있다.



script에서 작성한 내용 중

$('#id').val().trim(); 

해당 부분이 IE8에서 작동이 되지 않는 것을 확인했다 문제는 다름아닌 trim()

IE8 이하 버전에서는 trim()이 사용이 되지 않는다.


trim()을 사용하기 위한 방법을 찾아보니 두가지 방법이 나왔다.


첫번째 방법은 javascript를 이용하여 사용하는 방법으로 아래와 같이 함수형식으로 사용하는 것이다.

if(typeof String.prototype.trim !== 'function') {

    String.prototype.trim = function() {

        return this.replace(/^\s+|\s+$/g, '');

    };

}


두번째 방법은 jQuery를 이용한 방법으로, 기존 소스에서 jQuery를 사용하고 있었기에 개인적으로 아래와 같은 방법을 이용하여 변경하였다.

$.trim($('#id').val());



MySQL을 외부 IP에서 접속할 수 있도록 하기 위해서는 설정이 필요하다.

아래에 각각 모든 IP에서 접속 / 특정 IP에서 접속 / 원래상태로 복구하는 방법에 대한 정리를 하도록 하겠다.


1. 모든 IP에서 접속

use mysql;

INSERT INTO mysql.user(host, user, password) VALUES('%', 'root', password('패스워드'));

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

FLUSH PRIVILEGES;

기본적으로 위의 내용을 차례대로 입력할 경우 root라는 계정으로 접속할 경우 모든 외부 IP에서 접속이 가능하다.

하지만 MySQL의 버전에 높아지면서 위의 내용을 입력할 경우 보안 관련 오류가 발생할 수 있다.

이 경우 오류 메세지는 두 가지가 발생할 수 있는데 각각 아래의 두 가지의 방법으로 해결이 가능하다.


- ERROR 1364(HY000): Field 'ssl_cipheer' doesn't have a default value 

use mysql;

INSERT INTO mysql.user(host, user, password, ssl_cipher, x509_issuer, x509_subject) VALUES('%', 'root', password('패스워드'), '', '', '');

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

FLUSH PRIVILEGES;


- ERROR 1364(HY000): Field 'authentication_string' doesn't have a default value 

use mysql;

INSERT INTO mysql.user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES('%', 'root', password('패스워드'), '', '', '');

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

FLUSH PRIVILEGES;

참고로 authentication_string로 password를 변경한 경우 VALUES에서 password('패스워드')에 변경이 일어나지 않는다.




2. 특정 IP에서 접속

  이 경우에는 VALUES에서 HOST값을 변경하면 된다. 아래의 예제는 111.222.xxx.xxx의 IP에 접속이 가능하며 한 IP만 접속이 가능하게 하려면 해당 IP를 정확히 적어주면 된다.

use mysql;

INSERT INTO mysql.user(host, user, password) VALUES('111.222.%', 'root', password('패스워드'));

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

FLUSH PRIVILEGES;




2. 원래 상태로 복구

  외부에서 접속하지 못하도록 하기 위해서는 입력한 내용을 아래와 같이 삭제하면 된다.

use mysql;

DELETE FROM mysql.user WHERE HOST = '%' AND User = 'root';

FLUSH PRIVILEGES;


정렬을 할 때, 단순히 오름차순이나 내림차순이 아닌 특정 조건을 기준으로 정렬을 해야하는 경우가 있다.

이런 경우에 ORDER BY부분에서 DECODE나 CASE를 이용하여 표현할 수 있다.


1. CASE 사용방법

SELECT *

  FROM 테이블명

 ORDER BY (

 CASE 컬럼명

 WHEN 조건A THEN 1

 WHEN 조건B THEN 2

 ELSE 3

 END

 )


사실 SELECT 부분에서 많이 사용하는 형태로 익숙한 형태이긴 한데, 정렬부분에서 사용한 적이 없어서 익숙하지 않은 느낌이 들었다.

THEN과 ELSE뒤에 숫자는 출력 순서를 나타낸다.


2. DECODE 사용방법

SELECT *

  FROM 테이블명

 ORDER BY DECODE(컬럼명, 조건A, 1, 조건B, 2, 3)


위의 CASE로 정렬한 것과 같은 내용이며, 역시 숫자는 출력 순서를 나타낸다.

오라클에 데이터를 넣을 때, 다양한 데이터가 들어갈 수 있지만 textarea와 같은 곳에 들어간 내용은 줄바꿈이 필요할 경우가 있다.

기본적으로 개행을 삽입하기 위해서 아래와 같이 표현할 수 있다.


UPDATE 테이블 명

SET '안녕'||CHR(13)||CHR(10)||'하세요'

WHERE 조건


결과값 : 

안녕

하세요


*) CHR()은 숫자를 아스키코드로 변환해주는 함수이며,

CHR(13) : carriage return(캐리지 리턴) > 현재 라인의 첫 번째 자리에 커서를 위치

CHR(10) : new line(라인 피트) > 커서 위치를 아래쪽으로 이동

각각 위와 같은 의미를 가지고 있으므로 현재 라인 첫번째 자리에서 아래로 커서가 이동하여 '\n'과 같은 줄바꿈을 확인할 수 있다.



반대로 개행을 제거하기 위해서는 아래와 같이 replace를 이용하여 처리할 수 있다.


replace(컬럼명, CHR(13) || CHR(10), '')

replace(replace(컬럼명, CHR(10), ''), CHR(13), '')



크롬을 새로 설치하여 사용할 경우 늘 검색시 새 탭으로 여는 설정을 하려고 찾는다.

매번 같은 작업을 하는데도 매번 헷갈려서 헤맨다.

기본적으로 크롬을 이용할 경우 링크 된 걸 클릭하면 새탭에서 뜨는 것이 아니라 검색했던 화면에서 바로 이동이 된다.

이 경우 그 탭을 실수로 꺼버리거나 검색된 사이트에서 많은 페이지 이동이 있으면 검색 목록으로 돌아가는데 어려움이 있다.

새 탭에서 창을 띄우기 위해 컨트롤 키(CTRL)를 누르고 링크를 누르면 새 탭에서 창이 뜬다.

하지만 매번 컨트롤 키를 누르고 링크를 누르는 수고로움을 감수할 필요는 없다.


새 탭으로 열기를 하기 위해서 일단 구글에서 아무 단어로든 검색을 하면 검색 목록을 확인할 수 있다.

이때 검색 창 우측 방향에 보면 설정을 확인 할 수 있다.

설정을 누르면 아래로 리스트가 뜨는데 여기서 '검색 환경설정'을 눌러 들어가면 된다.



화면에 들어가면 아래와 같은 화면이 보이게 된다.



검색 설정 하단에 검색결과 여는 창이라는 목록을 확인 할 수 있다. 여기서 하단에 있는 선택한 검색결과를 새 브라우저 창에서 열기로 선택(기본적으로 체크가 되어있지 않다.)하여 저장을 누르면 설정이 끝난다. 이 후, 검색을 해서 링크를 클릭해보면 새 탭에서 그 링크가 뜨는 것을 확인할 수 있다.



+ Recent posts