1. DATABASE URL 에 아래의 인자를 추가하면 속도가 향상된다.
  2. Table 구조에서 성능저하를 일으킬 수 있는 불필요한 부분을 삭제한다. ( 절대 빈값이 들어갈수 없는 INSERT 문을 이용하는데 NOT NULL을 사용함, 검색을 자주하지 않는 필드에 대해서 인덱스를 사용함 등…)


Sample XML

Java Code

 

정된 문자들로 조합된 무작위 문자열을 만드는 예제 코드이다. (import 부분은 생략되었음)

아래의 예제는 50000 유저에 대해 랜덤한 케릭터로 구성된 아이디를 발급하는 부분이다. 길이는 5 ~ 20자 내에서 랜덤하게 생성된다.

개발시 임시로 사용했던 http post sample page 내용을 공유해본다.

아래의 예제에서 쓰이는 Post variable은 pk, title 그리고content 이다.

기본적인 내용이지만, 필자는 아직 Java 초보인 관계로 3개의 객체에 대한 차이점들을 기록으로 남긴다.

  • String 객체는 한번 저장한 내부의 문자열을 변화시키지 않는다(immutable). 대신 변화된 문자열을 새로 생성한한다. 따라서 += 과 같은 append 연산자를 자주 사용해야 할 경우 String 객체를 사용하면 속도가 엄청 느리게 된다.
  • StringBuffer는 내부 값들을 변화시키는 구조(mutable)로 되어있다. 따라서 append 연산에 있어 String보다 최적화 되어있다. Thread Safe 하므로 (Synchronized), 이 속성을 유지하면서 빠른 string append 연산을 요구하는 부분에 사용한다.
  • StringBuilder또한 내부 값들을 변화시키는 구조(mutable)로 되어있다. Thread  safe하지 않으므로 StringBuffer보다 빠르다. 따라서 Thread Safe속성을 필요로 하지 않는 부분에 사용할 수 있다.

참조 : http://www.rgagnon.com/javadetails/java-handle-utf8-file-with-bom.html

text 파일을 다루다보면 가끔 BOM까지 문자열로 찍힐때가 있다.

보통 utf8 이나 utf16을 사용하므로 본인은 아래의 클래스를 사용하여 BOM을 제거하였다.

utf32에 대한 BOM을 제거하려면 위의 참조링크를 참조한다.

 

이번에 새로 맡게된 자바 프로젝트의 소스를 이것저것 보다가, 빌드 버전에 대한 내용이 여러 곳에 분산되어 하드코딩 되어 있었고, 마침 시간적 여유도 되어서 빌드버전관리의 일원화에 대한 효율적인 구조들을 찾아보았다.

소스 자바 빌드 버전에 대한 관리를 다른 사람들은 어떤식으로 하고 있는지 찾아보다가 몇가지 좋은 링크들을 발견하였지만 본인의 프로젝트 요구조건과는 맞지 않았다.

 

프로젝트의 상황은 다음과 같다.

  • 특정 properties 파일에 빌드버전정보가 들어있다.
  • properties 파일의 빌드버전 정보를 ant package script에서 이용한다.
  • 빌드버전정보는 java source 내에 중복되어 하드코딩 되어 있다. 이는 프로그램 시작시 버전 정보 출력을 하는데 사용된다.

본인이 생각하는 개선사항은 다음과 같다.

  • 버전 정보는 하나의 파일에서만 관리하고 이를 필요한 위치에 적용하는 형식으로 사용한다.
  • eclipse 상에서 테스트 시에는 ant 빌드 없이 진행이 될 수 있으므로, 이러한 상황에서도 일원화된 버전정보를 잘 가져올 수 있어야 한다.

이러한 개선 요구사항을 기반으로 여러가지 방법들을 생각해보았으나 딱히 마땅한 해결책이 떠오르지 않았다. 그래서 소스를 크게 변경하지 않는 선에서 효율적으로 관리할 수 있는 방안을 적용하였다.

  • 빌드버전정보는 기존처럼 properties 파일 내에 기록한다.
  • VersionInfo.java를 추가하여 빌드버전정보를 제공한다. 기능은 다음과 같다.
    • 패키지 화 할 경우에는 소스를 복사해서 컴파일 하므로, ant build script 내부에서 복사할 때 VersionInfo.java의 특정 부분을 properties 의 빌드버전정보로 치환하여 복사한다.
    • eclipse에서 디버깅 할 때 해당 버전 정보를 정확하게 보여줄 수 있어야 하므로, eclipse내에서 디버깅 중인지를 인지하여 조건이 일치하는 경우  properties파일을 읽어 빌드버전정보를 얻어오게 한다.

본인이 사용하고 있는 properties는 다음과 같다.

ant build script 내에서 복사시 치환하는 부분이다. filter 부분과 copy 의  filtering부분을 참조한다.

 

해당 properties 파일을 읽고 해당 빌드 버전과 번호를 읽어오는 자바 소스(VersionInfo.java)는 다음과 같다.

p.s 혹시 이보다 더 괜찮은 방법을 알고 계시면 추천 부탁드립니다. :)

Failed to create the Java Virtual Machine.
  • 원인 : Maximum Heap space size 를 설정하는 Xmx가 너무 큰값으로 설정되어 있다.
  • 해결방안 : eclipse.ini 파일을 열어 -Xmx512m으로 되어 있는 부분을 -Xmx256m으로 바꾼 후 이클립스를 재실행한다.
  • 참고 : xms 는 initial heap space size이다. 각 플랫폼별 예제는 아래의 링크에서 확인한다.



자바 String Class 는 내부적으로 16Bit Unicode 라는 일관된 타입으로 관리한다.

이와 관련해 encoding performance issue 가 발생할 수 있는데, 예를 들면
CP949로 인코딩 된 입력문을 다른 모듈에 CP949 타입으로 전달하려고 할때 String 을 이용하는 경우,

CP949 -> UTF-16(String 내부) -> CP949 

에 해당하는 불필요한 연산을 거치게 된다.

따라서 이러한 불필요한 변환을 방지하는 한가지 팁으로 Byte array를 써서 넘기게 되면 
변환을 거치지 않고 원본 그대로 전달할 수 있다.


(출처) 울회사 H군.
자바에 이런 기능이 있다니 참으로 놀랍다.

특정 클래스에는 어떤메쏘드가 있으며 
그에 따른 파라미터 타입이라던지 특정 메소드 호출까지 제어할 수있다.



결과

------------------------------------------ Method Name : testMethodOne Method Name with param : public void TestClass.testMethodOne() Method Param No : 0 testMethodOne is called ------------------------------------------ Method Name : testMethodTwo Method Name with param : public void TestClass.testMethodTwo(int) Method Param No : 1 testMethodTwo is called : 10 ------------------------------------------ Method Name : testMethodThree Method Name with param : public void TestClass.testMethodThree(int,java.lang.String) Method Param No : 2 testMethodThree is called10 Test String ------------------------------------------ Method Name : testMethodFour Method Name with param : private void TestClass.testMethodFour(int,java.lang.String,java.lang.String) Method Param No : 3

개행문자로
  • Unix 는 '\n' 을 쓰고 
  • Windows 는"\r\n" 을쓰고
  • Mac 은 과거에 '\r' 만 썻었는데 unix 로 옮겨가면서(System X) '\n'도 허용한다고 하는데
이를 한방에 해결해 주는 녀석도 역시나 자바에 있다. System 요녀석을 잘보면 유용한 정보들을 얻을 수 있다.
  • String newline = System.getProperty("line.separator");


C++에 익숙한 사람들이 자주 저지른 실수중에 하나는,

자바에서 string 비교시 == 를 사용한다는 점이다. 

하지만 이런경우 동일한 문자열을 지니고 있어도 어쩔때는 true, 어쩔때는 false 를 리턴하는데,

그 이유는 java 안에서의 == 에 있다.

C++ 에서 string 에 대해 == 를 쓰는경우,
string 클래스의 operator 를 이용하는 것이며,

java 에서의 == 는,
system operator 로서 string object 를 하나의 변수로 보고 그 안의 값을 통채로 비교하게 되는 것이다.

따라서 동일한 문자열을 지니고 있어도 그 이외의 내부 변수는 다를 수 있으므로 
자바에서 == 는 문자열을 비교하는데에는 적합하지 않다.

결론. 자바에서 문자열이 같은지를 비교할 경우에는 
string interface인 equals() 나 compareTo() 를 사용한다.
결과로 받은 XML String 을 Document 에 적용하려는데 저런 에러가 났다.

파싱에러같아서 스트링 전송에 문제가 있는건 아닌지 확인해보기위해 

하나하나 살펴봤는데 그것도 아니었다.

결국 명시적 exception을 추가하여 제목과 같은 메시지를 확인하게 되었는데,

C모듈에서 시그널을 보내면 파일 끄트머리에 여분의 NULL 문자가 추가되서

생기는 문제였다. 이는 String 을 SAXBuilder에 넣기전에 trim()을 해버리면

간단하게 해결된다.
java 를 차근차근 배우지 않아 아주 기초적인 내용임에도 불구하고 거의 2시간을 소비한 녀석.

우선 XMLTest.java 소스를 보자


현재  디렉토리내에 파일 구성이 아래와 같다고 가정해보자

org/
test.xml
XMLTest.java

우선 jar 를 만들자. Jar 를 만들때에는 import 할 구조를 정확히 가져와야 한다. 즉 아래와 같이 해야한다.
$ jar cf org.jar org/

그래서 만약 이 jar 파일을 import 하는 java 파일에서 "import org.*" 이라는 것을 썻을경우, 이 jar 파일을 풀었을때 org디렉토리가 생성되어야 올바르게 링킹을 할 수가 있다.


또한 XMLTest.java를 컴파일 및 실행할때마다 jar 를 지정해주는 것이 필요하다. 
(현재 디렉토리를 설정하는것이랑은 다른 문제. jar는 파일을 직접 지정해야 한다.)
$ javac -cp org.jar:$CLASSPATH XMLTest.java
$ java -cp org.jar:$CLASSPATH XMLTest


1. public 을 사용하는 클래스하나뿐이어야한다. 또한 이는 파일명과 완벽히 같은
   이름이어야 한다
. public 을 사용하지 않을 때에는 컴파일러가 자동으로 파일명과
   같은 클래스를 찾는다.

 - main() method 를 찾기 위해서...
 - 모든 클래스명은 대문자로 시작한다. 이를 반드시 명심할 것. (의무사항은 아니지만
    대부분 이렇게 사용하므로 유념해둔다.)

2. 한줄 주석처리 on / off 단축키 : ctrl + '/'

3. 자료형

boolean : 1 byte (true / false)

byte    : 1 byte (-128 ~ 127)

char    : 2 byte 유일한 unsigned data (0 ~ 65535)
 (ex) char ch = 65; // ASCII value
      char ch = 'A'; // Also ASCII value
      char ch = '\u0041' // Unicode 16진수 0041

int     : 4 byte (-2,147,483,648 ~ 2,147,483,647)
 - 연산자 기본연산자. 즉 byte 형 둘이 덧셈을 하게 되는경우 int 형으로 자동 전환된다.

float   : 4 byte
 - 뒤에 f나 F 를 붙일것.값이 INF 면 무한대 값. NaN 은 0을 0으로 나눈, 수가 아닌 것.

String  : 4 byte (레퍼런스형: 자바에서 클래스 변수는 무조건 4byte 이다)

long    : 8 byte (-2^63 ~ 2^63 -1)
 - 저장시 뒤에 'l' 이나 'L' 을 붙여줘야 함
 (ex) long t = 123456767777L;

double  : 8 byte

4. 형변환

- promotion : 자료형이 작은것을 큰것에 대입하는 경우
- casting   : 자료형이 큰것을 작은것에 대입하는 경우

(주1)실수형 변수는 무조건 정수형보다 byte 수가 적어도 더 큰 수를 표현하므로
long 형을 float 에 저장한다고 에러가 일어나지는 않는다.

(주2)그냥 소수점으로 적은경우 double 형으로 인식하므로 에러난다.
      float f = 12.5; (에러) -> float f = 12.5f;

5. Wrapper Class

- 종류 : Boolean , Byte , Character , Short , Integer , Long , Float , Double
  (클래스이기 때문에 첫글자는 무조건 대문자이다.)

- 이 클래스를 사용하게 되면 자료형의 형태로는 생각할 수 없는 많은 작업들을 할 수 있다.
  (예를들면 최대, 최소값 같은것.)

  short sh = Short.MAX_VALUE;
  int ii = Integer.MIN_VALUE;

6. 초기화

클래스 내부 변수를 Field 라고 하는데 Field를 선언하게 되면 두가지 부분에 메모리가
 
할당된다.  하나는 지역변수 'Runtime Stack'영역에 메모리가 할당, 또하나는 멤버 변수로서

'Garbage Collection Heap' 영역에 메모리가 할당된다.

+ Recent posts

티스토리 툴바