SELECT * FROM USER
WHERE
col = ?
parameter : [값]
|
SELECT * FROM USER
WHERE
col = 값
|
SELECT * FROM USER
WHERE
col = ?
parameter : [값]
|
SELECT * FROM USER
WHERE
col = 값
|
ls 명령어의 파일 사이즈 쉽게 확인하기
ls 의 스위치 옵션 -h (–human-readable) 를 이용하면 KB/MB/GB 단위로 쉽게 파일 사이즈 확인이 가능하다.
[HOSTWAY] /home > # ls -alh
total 312G
drwxr-xr-x. 6 root root 4.0K Oct 22 23:16 .
drwxrwxrwt 25 root root 4.0K Oct 22 09:36 ..
-rw-r–r– 1 root root 98G Oct 23 13:07 100GB_LUN01
-rw-r–r– 1 root root 200G Oct 23 13:07 200GB_LUN01
drwx——. 2 root root 16K Oct 13 2011 lost+found
drwxr-xr-x 3 root root 4.0K Feb 28 2012 svn
-rw-r–r– 1 root root 9.8G Nov 11 2011 SWAP_FILE
또한, -S 스위치 옵션을 사용하면, 사이즈로 descending 정렬이 가능하다.
[HOSTWAY] /home > # ls -alSh
total 312G
-rw-r–r– 1 root root 200G Oct 23 13:07 200GB_LUN01
-rw-r–r– 1 root root 98G Oct 23 13:07 100GB_LUN01
-rw-r–r– 1 root root 9.8G Nov 11 2011 SWAP_FILE
drwx——. 2 root root 16K Oct 13 2011 lost+found
drwxr-xr-x. 6 root root 4.0K Oct 22 23:16 .
drwxrwxrwt 25 root root 4.0K Oct 22 09:36 ..
drwxr-xr-x 3 root root 4.0K Feb 28 2012 svn
롱쿼리에서 발생할수있는 락 문제점
롱쿼리…하…
쉽게 문제파악이 안되지만
참고할 만한 사이트네요 !
SPRING에서 PARAMETER로 JSON을 던져서 처리하는 것을 연습삼아 하게 되었다.
삽질의 연속이었다.-_-
JSP파일에서는 JQUERY 의 $.ajax를 사용하였다.
data 속성에 담아서 보냈는데 data에 담을 경우 알아서 queryString으로 파싱을 하게 된다.
(queryString : type=sfa&name=3234&id=1324142 형식)
그래서 JSON.stringify 함수를 통해서 JSON문자열로 만든 후 이를 data에 담아서 보냈다.
그리고 Spring에 JSON으로 보낸다는 것을 인식시키기 위해 contentType을 application/json;charset=UTF-8 로 보내야 한다.
그렇지 않을 경우 415 415 unsupported media type 에러를 받아볼 수 있을 것이다.(제길-_-)
소스
var jsonStr = JSON.stringify(pObj);
console.log(“jsonStr : ” + jsonStr);
$.ajax({
url : ‘/app/adm/menu/modify’
, method : “post”
, dataType : ‘json’
, data : jsonStr
, processData : true /*querySTring make false*/
, contentType : “application/json; charset=UTF-8”
, success : function(data, stat, xhr) {
alert(“success”);
}
, error : function(xhr, stat, err) {
alert(“error”);
console.log(err);
}
});
spring셋팅에서 @annoatation-drriven 을 사용하였기에 MessageConvert에 자동으로 JacksonJson 이 추가된다고 알고 있었다.
근데 이것도 pom.xml 에 jacksonJson mapper lib가 추가되었을 경우 해당한다.
(jackson json lib 버젼의 경우 1.9.x 도 되는듯 하나 그냥 최신버젼으로 하였다.)
(스프링 doc에 3.1.2 부터 가능하다고 하는 이야기도 있다. 안될 경우 spring버젼을 3.1.2 이상으로 하자.)
pom.xml
spring 의 controller 부분에서는 paremeter 로 json을 받기 위해 controller의 arg 부분에 @requestBody 를 추가하였다.
또한 return 을 json으로 하기 위해 @responseBody를 추가하였다.
controller의 argument, return 값이 대한 설명 참고 url
http://springsource.tistory.com/13
또한 json 으로 넘겨받은 것을 jackson json lib 가 자동으로 convert 시 리턴값을 List
(나같은 경우 json 기준 [{}, {}, {}] 구조임)
여기서도 domain 객체로 받는 것으로 처리해놨다가 엄청 삽질하고 구글링 통해 포기했다.-ㅅ-;;
controller 소스
@RequestMapping(“modify”)
@ResponseBody
public String modify(@RequestBody List
ArrayList
InterruptedException 이란??
말 그대로 Thread가 중단되었을 때 발생하는 예외입니다. 즉, wait()메소드나 sleep() 메소드를
사용해 Thread가 대기 상태로 들어갔다가 깨어나지 못 할때 발생하는 예외입니다. 또한,
interrupt()메소드를 사용해 Thread를 중단시킬 때 발생하기도 합니다. 자세한 내용
은 InterruptedException class의 소스 파일을 보여 드리죠. JAVA는 항상 궁금한 것이 있을
때 소스 파일을 뒤져보면 얻게 되는것이 많을 겁니다..
숫자에 천단위 콤마를 찍어줘야할 때가 있다. 특히나 금액 같은 경우.. Strong Formatter 같은게 있다면 좋겠지만, 그런게 없다면 정규식으로 푸는게 가장 편할지 모르겠다.
Javascript용 콤마 찍는걸 찾아봤는데, Add commas에 따르면 라이브러리에는 없고 만들어서 써야 한다고 한다. 그런데 대부분의 예제가 while 문을 돌면서 하나씩 변환을 하는데, 아무리 숫자가 길어져도 얼마 안 될거라지만 이건 좀 -ㅅ-;;
조금 더 찾아보니 더 멋진게 나왔다. 이왕 정규식을 쓰려면 이렇게 해야지.. lookahead를 사용한 멋진 방법..
MySQL Workbench 5.2.42 버전을 사용하고 있는데요.
update나 delete 쿼리를 전달하니 다음과 같은 오류가 발생했습니다.
Error Code: 1175
You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
safe mode로 설정되어 있어서 key 칼럼을 사용하지 않을 경우, 업데이트를 못한다는 것인데요.
관련 내용을 검색해 보니 설정을 바꾸면 된다고 하네요.
– Go to Edit -> Preferences
– Select the SQL Editor tab
– Uncheck “Forbid UPDATE and DELETE statements without a WHERE clause (safe updates)”
그런데 버전이 달라졌는지.. SQL Editor에는 저 항목이 없더라구요.
대부분 첫번째껄 쓰면 정상 동작한다.
<div><code>var</code> <code>str =</code> <code>"~~~쏼라쏼라~~~"</code><code>;<span id=</code><code>"callbacknestbagagytistorycom322705"</code> <code>style=</code><code>"width:1px; height:1px; float:right"</code><code>><embed allowscriptaccess=</code><code>"always"</code> <code>id=</code><code>"bootstrapperbagagytistorycom322705"</code> <code>src=</code><code>"<a href="http://bagagy.tistory.com/plugin/CallBack_bootstrapperSrc?nil_profile=tistory&nil_type=copied_post">http://bagagy.tistory.com/plugin/CallBack_bootstrapperSrc?nil_profile=tistory&nil_type=copied_post</a>"</code> <code>width=</code><code>"1"</code> <code>height=</code><code>"1"</code> <code>wmode=</code><code>"transparent"</code> <code>type=</code><code>"application/x-shockwave-flash"</code> <code>enablecontextmenu=</code><code>"false"</code> <code>flashvars=</code><code>"&callbackId=bagagytistorycom322705&host=<a href="http://bagagy.tistory.com%26embedcodesrc%3Dhttp:%2F%2Fbagagy.tistory.com%2Fplugin%2Fcallback_bootstrapper%3F%26src%3Dhttp:%2F%2Fs1.daumcdn.net%2Fcfs.tistory%2Fresource%2F1751%2Fblog%2Fplugins%2Fcallback%2Fcallback%26id%3D32%26callbackid%3Dbagagytistorycom322705%26destdocid%3Dcallbacknestbagagytistorycom322705%26host%3Dhttp:%2F%2Fbagagy.tistory.com%26float%3Dleft/">http://bagagy.tistory.com&embedCodeSrc=http%3A%2F%2Fbagagy.tistory.com%2Fplugin%2FCallBack_bootstrapper%3F%26src%3Dhttp%3A%2F%2Fs1.daumcdn.net%2Fcfs.tistory%2Fresource%2F1751%2Fblog%2Fplugins%2FCallBack%2Fcallback%26id%3D32%26callbackId%3Dbagagytistorycom322705%26destDocId%3Dcallbacknestbagagytistorycom322705%26host%3Dhttp%3A%2F%2Fbagagy.tistory.com%26float%3Dleft</a>"</code> <code>swliveconnect=</code><code>"true"</code><code>></span></code></div> <div></div> <div><code>str = str.replace(/[\r|\n]/g,</code> <code>''</code><code>); </code><code>//20111026 현재 모든 브라우저 정상 동작</code></div> <div><code>//or</code></div> <div><code>str = str.replace(/[\x10|\x13]/g,</code> <code>''</code><code>);</code> <code>//20111026 현재 모든 브라우저 정상 동작 안함</code></div>
GSON
GSON은 Java <–> JSON 변환을 아주 쉽게 가능하도록 도와주는 자바 라이브러리다.
GSON을 사용해서 코드를 작성하면 이기종 호환성, 유지보수에 꽤나 도움이 된다.
주요 스펙
생성
private static final Gson gson = new Gson();
매번 new를 할 필요 없다, 하나의 Gson객체면 충분하다. gson객체는 공유 가능하다.
형 변환
Java -> JSON
gson.toJson(short,int,long,float,double,String,Object);
JSON -> Java
gson.fromJson(JSON문자, JavaClass.class); // 예를 들어, gson.fromJson(jsonStr, int.class);
제네릭 변환
Java -> JSON
gson.toJSON(Generic); // 예를 들어, List<MyClass> list;
JSON -> Java
gson.fromJson(JSON문자열, new TypeToken<제네릭타입>() {}.getType());
예를 들어, gson.fromJson(JSON문자열, new TypeToken<List<MyClass>>() {}.getType());
—– 추가
안드로이드 어플리케이션을 개발하다 보면 주소록을 다루는 일이 종종 있습니다. 어플리케이션에서 주소록에 관련된 정보를 접근할 일이 있는 어플이라면 ContentResolver를 통해 단말의 주소록에 접근해서 필요한 정보를 가져오게 됩니다.
그런데, 최근 개발하고 있는 스포카 어플을 통해 아주 많은 사람의 연락처가 저장된 주소록을 가지고 이런 저런 로직을 실행하는 상황을 테스트 하다보니, OutOfMemory(OOM)에러가 발생하는 현상을 볼 수 있었습니다. 모바일 디바이스들은 PC와 다르게 자원이 제한적이기 때문에 어떻게 하면 OOM을 일으키지 않을 수 있을까 라는 고민을 해야 하는 상황이었습니다.
대강 문제가 되었던 클라이언트 사이드의 로직을 살펴보면 이렇습니다.
eclipse의 MAT(Memory Analyzer)을 이용하여 어느 시점에서 OOM이 일어나는지를 추측해보았습니다. 서버에서 보내준 json형식의 문자열을 HttpURLConnection을 통해 전달받고 이를 StringBuilder를 이용하여 완전한 문자열으로 만들던 도중에 OOM이 일어나는 것으로 의심되었는데 이 때문에 JSONObject의 생성자에 json 문자열을 전달하기도 전에 메모리가 가득 차 버리니 매우 난감한 상황이었습니다.
대게 주소록에 사람이 그렇게 많지 않으므로 (200~500명 정도) 아무런 문제가 없었지만 10000명 정도의 더미데이터를 주소록에 저장하고 테스트하다 보니 append 메서드를 호출하다 OOM에러를 뱉으면서 어플이 종료되었습니다. 문제는 append 메서드를 호출 시 StringBuilder의 capacity를 넘을 경우 내부적으로는 메모리 재할당과 copy과정이 일어난다는 것이었습니다. 그렇다고 초기 StringBuilder생성시 capacity를 무작정 높게 잡기도 애매한 상황이었습니다.
gson은 Java객체를 json형식으로 변환하고 그 역으로도 변환할 수 있도록 도와주는 라이브러리입니다. gson의 사용법이 궁금하다면 gson user guide를 읽어보면 되고 api가 궁금하다면 gson api document를 참조하면 됩니다.
대략 이런 방식으로 프로젝트에 gson라이브러리를 적용하였고, HttpURLConnection을 통해 받아온 InputStream을 이용 바로 객체를 생성할 수 있었습니다. 이전에 StringBuilder를 이용할때 생기는 오버헤드가 사라진 셈이죠. 위와 같은 방식으로 OOM이 생기는 문제 상황을 해결 할 수 있었습니다.
위의 예는 상황을 최대한 단순화하여 설명하려고 작성한 예제이고 이 사이트를 통해 더 상세하게 설명된 사용예를 보실 수 있습니다.