본문 바로가기

java66

Thread 생성 비용이 큰 이유 아래 이미지 한 장이 모든 것을 설명해 주고 있음 물론 -Xssn JVM parameter로 메모리 설정 변경이 가능함. 2016. 4. 6.
CronExpression Test 하기 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.. 2016. 3. 17.
jedis returnBrokenResource 메서드에 대한 오해 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.. 2016. 3. 9.
Mybatis 쿼리 로그 출력 쿼리 검수를 위해 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 2016. 3. 2.
비트단위의 논리곱을 이용한 데이터 활용 방법 - 논리곱(and) & 현재 운영중인 시스템에서 비트 연산자를 이용하여 속성 값을 추출하는 로직이 있다.데이터의 구조가 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.. 2016. 1. 31.
진수 변환 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바이.. 2016. 1. 26.
MyBatis 샾(#) 달러($) 차이 select * from TestTablewhere testId = #{testId} MyBatis에서 위와 같은 쿼리문을 실행하게 되면 database에서는 아래 쿼리문에 대한 의미, 구문 분석 및 파싱 작업을 진행하게 된다. select * from TestTablewhere testId = ? 만약 testId에 1 값이 바인드 되게 되면 database에서는 이미 파싱되어 있는 쿼리문을 재활용하게 되기에 위의 작업들을 줄일 수 있다.단, 데이터베이스 옵티마이저에 대한 수행 계획은 항상 동일하다라는 것이 단점이다.수행 계획에 따른 데이터 추출은 데이터의 분포도에 영향을 받게 되는데 만약 1 이라는 값이 TestTable에 4개 존재하고, 2 라는 값이 1000개 존재한다고 했을 때1을 추출할 때에는.. 2016. 1. 21.
tag 라이브러리 동작 원리에 대해서 생각해 보자 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 엘리먼트에 선언되어 있는 클래스.. 2016. 1. 18.
Spring Scoped Proxy Beans (prototype 빈 DI로 주입해서 사용) Spring 에서의 IoC 방식은 두 가지가 있다. DI, DL 방식DI 방식은 주입되는 객체의 인스턴스가 싱글톤일 때 사용하고,DL 방식은 매번 새로운 인스턴스를 생성하여 빈을 사용하고자 할 때 이용되는 것으로만 알고 있었다. 허나, 팀 동료로부터 새로운 정보를 들었는데DI 방식으로 의존성 주입된 빈을 사용할 때마다 새로운 인스턴스의 빈으로 연결 받을 수 있다고 하였다. 새로운 사실에 놀라 자료를 찾아보고 테스트를 해보니 정말로 가능하다는 것을 알게 되었다. MemberService는 prototype이 선언된 빈이다.테스트 클래스에 MemberService를 DI 받고 getMember() 메소드를 10번 호출해 보면 단 한 번의 인스턴스만 생성된 것을 확인할 수 있다.@Component @Scope.. 2016. 1. 14.
Java Generic 정리 설계를 할때마다 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.. 2016. 1. 13.
문자열 인코딩에 대한 정리 [유니코드란?]유니코드는 세계 각국의 문자를 하나의 문자코드체계로 제안된 규격이며 기본적으로 한 글자에 2byte(16bit)의 데이터를 사용한다.http://unicode-table.com/ 페이지에 나와 있는 코드들이 세계 각각의 문자를 모두 표현할 수 있는 유니코드들인 것이다.그럼 2byte로 되어 있는 저많은 코드들이 어떻게 한글 또는 알파벳으로 표현되는지 알아보겠다. 먼저 아래 표를 보면 세로 축에 0040 가로축에 1 값이 강조되어 있는 것을 볼 수 있다.해당 값들을 조합하면 0041과 같은 형태가 되는데 이것이 알파벳 A를 표현할 수 있는 2byte의 유니코드이다. 0041 유니코드 값이 A로 변환되는 과정을 확인하기 위해 이클립스에서 테스트를 진행해 보면 다음과 같이 A가 표현되는 것을 확.. 2015. 8. 19.
Servlet의 request, response와 JSP의 request, response는 서로 다른 객체 Spring을 이용해 웹을 개발할 때 대부분 Controller의 request, response 객체와 JSP의 request, response 객체가 서로 다르다는 것을 신경쓰지 않고 개발 한다. (Spring에만 국한 된 것이 아닌 MVC 패턴으로의 개발을 할 때도 포함) 최근에 경험한 삽질로 인해서 Controller와 JSP에서 사용하는 request, response 객체는 서로 다르다는 것을 알게 되었고 나의 삽질 경험을 이곳에 작성해 본다. 딱딱한 구성의 글 보다는 스토리 전개 방식으로 나의 경험을 풀어나가 보려 한다. 아주 오래 전~ 한 자바 개발자가 있었다.그 개발자는 자신이 만든 스프링 웹 애플리케이션에 버그가 있다는 것을 알게 되었고, 버그를 해결하기 위해서는 JSP 코드에 cook.. 2015. 7. 23.
SimpleDateFormat 쓰레드 세이프 하지 않음 SimpleDateFormat 클래스는 쓰레드 세이프 하지 않기 때문에 사용할 때 주의를 해야 한다. 다음은 쓰레드 10개를 실행시켜 SimpleDateFormat의 parse("20150630") 메서드를 동시에 실행시키는 테스트 코드이다. 위의 코드를 실행해 보면 다음과 같이 정상적으로 테스트가 종료되는 경우가 있고, 오류가 발생되는 케이스가 있다. 출력된 로그에 나와 있는 것처럼 테스트 코드에서 의도한 Tue Jun 30 00:00:00 KST 2015 값만 노출되는 것이 아닌 이상한 날짜가 출력되고 있는 것을 볼 수 있다. 이는 Thread safe하지 않은 상태에서 여러 쓰레드가 SimpleDateFormat 을 사용하게 됨으로써 발생되는 현상이다. 오류가 발생하면 그나마 다행이지만 가장 큰 우.. 2015. 7. 2.
mybatis multiple select key 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 아래와 같이 쿼리를 만들고 테스트를 해보니 잘 동작한다. 실제 업무에서 .. 2015. 5. 21.
HTTP request 요청 시 Content-Type의 중요성 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가 정상 동작하는지에 대해서 테스트 코드를 작성한 후 .. 2015. 3. 9.