아래 이미지 한 장이 모든 것을 설명해 주고 있음 물론 -Xssn JVM parameter로 메모리 설정 변경이 가능함.
Quartz 사용 시 cron expression에 정의한 시간에 정상 동작하는지를 체크해야 할 경우가 있다 단순한 방법으로는 테스트 하고자 하는 시간으로 표현식을 설정하고 그 시간에 스케줄링이 동작하는지 확인해 보면 되지만 이는 무식한 방법이다. 간단하게 quartz에서 제공하고 있는 CronExpression 클래스를 이용하여 테스트 가능하다.@Test public void cronTimeTest() throws ParseException { // 매일 9, 12, 18시 정각에 스케줄링 동작 String cronEx = "0 0 9,12,18 * * ?"; CronExpression cronExpression = new CronExpression(cronEx); Date nextTime1 = cro..
jedis의 returnBrokenResource 메서드에 대해 잘못 알고 있는 부분이 있어 정리한다. @Beforepublic void init() { GenericObjectPoolConfig config = new GenericObjectPoolConfig();config.setMaxTotal(20);config.setBlockWhenExhausted(true);config.setMaxWaitMillis(1000); JedisShardInfo shard1 = new JedisShardInfo("test.com", 6300);JedisShardInfo shard2 = new JedisShardInfo("test.com", 6301);JedisShardInfo shard3 = new JedisShard..
쿼리 검수를 위해 mybatis 플러그인에 아래 interceptor를 추가 - 바인딩 변수에 값이 맵핑되어 있는 쿼리문 출력가능 [SQL Map Config] DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> [Logback Config] /home/test/${SERVER_NAME}/tomcat/logs/sql/mybatis_sql.log /home/test/${SERVER_NAME}/tomcat/logs/sql/mybatis_sql.%d{yyyy-MM-dd}.log.gz 60 %m%n
현재 운영중인 시스템에서 비트 연산자를 이용하여 속성 값을 추출하는 로직이 있다.데이터의 구조가 5바이트로 되어 있는데 4번째 바이트를 추출하여 사용하게 되는 구조이다. 4번째 바이트 값을 뽑았을 때 값이 7이라고 가정하자.7의 값은 비트로 표기하면 다음과 같을 것이다.00000111 속성들의 값은 다음과 같다.속성1 = 1속성2 = 2속성4 = 4속성8 = 8 속성1은 비트로 00000001속성2은 비트로 00000010속성4은 비트로 00000100속성8은 비트로 00001000 4번째 바이트의 비트와 속성1 비트를 & 연산자를 이용해 비교하게 되면00000111 & 00000001 결과 0000000100000111 & 00000010 결과 0000001000000111 & 00000100 결과 0..
2진수에서 16진수, 10진수에서 16진수로의 변환에 대해 자주 까먹어서 정리해 본다. (나 요즘 정리 엄청 좋아하는 듯) 변환하기에 앞서 진수에 따른 데이터 표현 방법은 다음과 같다.2진수는 0, 110진수는 0, 1, 2, 3, 4, 5, 6, 7, 8, 916진수는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 10진수 -> 2진수10진수 23이 있다고 하자. 이를 2진수로 바꾸는 방법은 23을 2로 계속 나누면 된다. (나눌 수 없을 때까지)23 / 2 = 11 나머지 111 / 2 = 5 나머지 15 / 2 = 2 나머지 12 / 2 = 1 나머지 0 위의 계산식에서 맨 마지막의 몫과 나머지들을 아래에서부터 위로 나열을 하면 10111 이 될 것이고, 1바이..
select * from TestTablewhere testId = #{testId} MyBatis에서 위와 같은 쿼리문을 실행하게 되면 database에서는 아래 쿼리문에 대한 의미, 구문 분석 및 파싱 작업을 진행하게 된다. select * from TestTablewhere testId = ? 만약 testId에 1 값이 바인드 되게 되면 database에서는 이미 파싱되어 있는 쿼리문을 재활용하게 되기에 위의 작업들을 줄일 수 있다.단, 데이터베이스 옵티마이저에 대한 수행 계획은 항상 동일하다라는 것이 단점이다.수행 계획에 따른 데이터 추출은 데이터의 분포도에 영향을 받게 되는데 만약 1 이라는 값이 TestTable에 4개 존재하고, 2 라는 값이 1000개 존재한다고 했을 때1을 추출할 때에는..
1. 사용자 request 요청 /test.jsp2. jsp에서 데이터 렌더링 중 tag lib를 만남3. tag lib 인스턴스 생성 후 attribute에 선언되어 있는 속성에 데이터 바인딩 진행 (리플렉션 사용)4. doStartTag() 실행5. jsp에서 또 tag lib를 만남6. 3에서 생성한 인스턴스를 가져와 다시 attribute에 선언되어 있는 속성에 데이터 바인딩 진행 7. 사용자 request 요청 /test2.jsp8. jsp에서 데이터 렌더링 중 tag lib를 만남9. tag lib 인스턴스 생성 후 attribute에 선언되어 있는 속성에 데이터 바인딩 진행 정리를 해보니 jsp 안에 선언되어 있는 태그라이브러리를 만나게 되면 tag-class 엘리먼트에 선언되어 있는 클래스..
설계를 할때마다 Generic 사용법을 잊어먹는 경우가 많아 이해하기 쉬운 수준으로 정리를 해보려고 한다. Class generic typeClass generic type은 다음과 같은 방법으로 클래스가 작성된다.어떤 경우에 사용하면 되는지에 대해서는 ArrayList 클래스를 생각하면 될 것이다.ClassGenericType classGenericType = new ClassGenericType();class ClassGenericType { private T t; public void set(T t) { this.t = t; } public T get() { return t; } } Interface generic typeInterface generic type 또한 Class generic typ..
[유니코드란?]유니코드는 세계 각국의 문자를 하나의 문자코드체계로 제안된 규격이며 기본적으로 한 글자에 2byte(16bit)의 데이터를 사용한다.http://unicode-table.com/ 페이지에 나와 있는 코드들이 세계 각각의 문자를 모두 표현할 수 있는 유니코드들인 것이다.그럼 2byte로 되어 있는 저많은 코드들이 어떻게 한글 또는 알파벳으로 표현되는지 알아보겠다. 먼저 아래 표를 보면 세로 축에 0040 가로축에 1 값이 강조되어 있는 것을 볼 수 있다.해당 값들을 조합하면 0041과 같은 형태가 되는데 이것이 알파벳 A를 표현할 수 있는 2byte의 유니코드이다. 0041 유니코드 값이 A로 변환되는 과정을 확인하기 위해 이클립스에서 테스트를 진행해 보면 다음과 같이 A가 표현되는 것을 확..
SimpleDateFormat 클래스는 쓰레드 세이프 하지 않기 때문에 사용할 때 주의를 해야 한다. 다음은 쓰레드 10개를 실행시켜 SimpleDateFormat의 parse("20150630") 메서드를 동시에 실행시키는 테스트 코드이다. 위의 코드를 실행해 보면 다음과 같이 정상적으로 테스트가 종료되는 경우가 있고, 오류가 발생되는 케이스가 있다. 출력된 로그에 나와 있는 것처럼 테스트 코드에서 의도한 Tue Jun 30 00:00:00 KST 2015 값만 노출되는 것이 아닌 이상한 날짜가 출력되고 있는 것을 볼 수 있다. 이는 Thread safe하지 않은 상태에서 여러 쓰레드가 SimpleDateFormat 을 사용하게 됨으로써 발생되는 현상이다. 오류가 발생하면 그나마 다행이지만 가장 큰 우..
selectKey 조회 시 한 건만 가능했던 것이 MyBatis 3.2.6 버전부터는 multiple select key 가 지원되었다.모르고 있었던 기능인데 회사 동료로부터 알게 되었다.Provides some new features: - Caches nested selects - Lazy loading can be enabled only for specific relations - Supports returning multiple fields in a select key - Some other minor improvements http://blog.mybatis.org/2014/03/mybatis-326-released.html 아래와 같이 쿼리를 만들고 테스트를 해보니 잘 동작한다. 실제 업무에서 ..
HTTP POST 방식으로의 Request 요청 시 서블릿에서 getParameter("data")를 이용하여 데이터를 뽑아 올 때 주의사항이 있다.내가 삽질했던 내용을 적어보면 다음과 같다.서버 코드의 Controller에 다음의 request handler mapping이 정의되어 있다.@RequestMapping(value = "/test", method = RequestMethod.POST)@ResponseBodypublic String test(HttpServletRequest request) {String reqData = request.getParameter("data");return "success";} 위에 작성되어 있는 handler가 정상 동작하는지에 대해서 테스트 코드를 작성한 후 ..