본문 바로가기

Java

[Java] Generic을 사용 할 때 가끔 Generic Type의 instance를 만들고 싶다. Collection 같은 경우 generic type을 넣고 빼는 정도의 저장소로써 사용을 해서 그런 일이 없는데.. 가끔 Generic Type의 instance를 동적으로 가져오고 싶을 때가 있다... 얼마전에 enum 을 사용한 mapper에 대해서 살짝 쓴적이 있는데.. (http://devyongsik.tistory.com/288) 이 짓을 하기 위해서는 List 형의 데이터를 getter 메서드를 가지고 있는 T type을 사용한 List 형으로 바꿔주어야 했다. 솔루션에서 List type으로 결과를 받아서 for문 돌려주면서 만들면 되기는 하는데.. 필요한 곳에서 사용 할 수 있는 converter를 만들고 싶었다. 로 해결 되면 좋겠지만.. 문제는 이 generic type의 T가 생성자.. 더보기
정규표현식에서... 돌리면 아래와 같은 exception.. Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^ 이유. What happens is that the compiler sees \\ as an escape for \, so it looks for something after the \\ and finds \h which isn't appropriate. You want it to see \\ so you need to escape the first \ to \\ and you need to escape the second \ to \\. 출처 : http://www.c.. 더보기
[Java] Class.forName(String className) 그리고 Service Provider Interface JAVA의 jdbc를 공부 할 때 많이 보는 Class.forName("oracle.jdbc.OracleDrvier"); 이런 실행 문장이 있습니다. 단지, 사용 할 DBMS에 맞는 드라이버의 full name을 인수로 주었을 뿐인데 그리고 보통 저 메서드를 실행하고 리턴값을 받지도 않죠.. 그런데 저 문장을 실행하고 나면 바로 DriverManager라는 클래스에서 Connection을 얻어 쓸 수 있습니다. 어떻게 저렇게 작동하는 것일까요? 각 DBMS 마다 드라이버와 Connection의 구현이 다를 것 입니다. 하지만 Java를 사용하는 입장에서는 각 DBMS 마다 다른 API를 사용하여 DB에 연결하는 것을 원하지 않죠. 그렇게 된다면 DBMS가 바뀌는 날에는 끔찍한 참사가 일어나겠죠.. --;.. 더보기
[Java] Class.forName(String className); - 1 - 앞선 포스트에서 Class.class에 대해 이야기 하였는데 그 내용안에 Class.forName(String className) 메서드가 나옵니다. 이 메서드에 대해서 좀 더 알아보겠습니다. 풍대리님이 static 키워드를 생각해보라고 하신 것이 이 메서드를 말씀하신 거였더라구요.. 우선 Class.forName(String className)는 이렇게 구현이 되어 있고 forName0 메서드는 native 메서드입니다. Class.forName 메서드를 실행하면 해당 클래스 이름을 갖는 클래스가 클래스 로더에 로드 되면서 Class.class의 인스턴스를 리턴합니다. 앞에서도 이야기 하였지만 Class.forName("java.lang.String")을 실행하면 String.class의 명세를 갖는 .. 더보기
[Java] Class.class, Class 클래스. Class.class에 대한 나의 생각. Class 클래스가 있습니다. 저 처음에 자바 공부 할 때 이 클래스는 도대체 뭔가???? 했었습니다. String.class 라는 것이 코드 속에 나오는 것도 엄청 신기했습니다. String.class는 파일로만 존재하는 것인 줄 알았었습니다. Class 클래스는 무엇일까요. Java의 OOP를 얘기 할 때 나오는 얘기 중 가장 많이 나오는 것이.. 클래스를 만들어 틀을 만들어 놓고 , 이 틀을 사용해 인스턴스를 찍어낸다(?)라는 것입니다. 위 처럼 User 클래스를 만들어서 틀을 만들고 이렇게 인스턴스를 만들어냅니다. 이때 생성 된 User 클래스의 인스턴스들은 모두 이름,주민번호라는 필드와 getName, setName등의 메서드들을 가지고 있게 됩니다. 데.. 더보기
[Java] Object.equals() equals의 스펙이나 이런 것 보다는 (여기에 잘 나와있습니다.) 클래스를 만드는데 있어서 이 equals라는 메서드가 왜 필요한지.. OOP라는 관점으로 한번 써보려고 합니다. (그래봐야 아주 기초적인 내용입니다.) 사실 이런 것은... 논란의 여지가 있기도 할 것 같아서... 좀 그렇지만.. List는 자바에서 가장 많이 사용 되는 Collections 프레임워크에 속해있는 클래스입니다. 잘 알고 계시다시피.. List는 입력 된 순서대로 저장이 되며, index를 통해 접근한다는 특징이 있습니다. 원소를 가지고 있는지를 파악하는 contains라는 메서드도 가지고 있습니다. 일단 아래와 같은 클래스를 만들어 봅니다. 이름과 나이를 갖는 사람을 클래스화 하였습니다. 아래의 코드를 보겠습니다. 실행 .. 더보기
enum의 ordinary() 메서드 사용. effective java를 보면 서수가 필요 할 때 enum의 ordinary() 메서드는 가급적 사용하지 말라고 되어있습니다. enum을 구성하는 값이 지워지거나 하게 되면 ordinary() 메서드에서 리턴되는 순서 값도 같이 변하기 때문입니다. 이런식의 버그는 나중에 어디선가 발생하게 되면 상당히 찾기 난해합니다. 그런데 제가 이번에 ordinary를 쓸모있게 사용한 부분(이라고 혼자 생각하는 부분 ^^)이 있어서 소개하려 합니다. ordinary 메서드는 enum을 구성 하는 각 값들의 순서를 리턴합니다. 일 때, FIELDNAME.NAME.ordinary()는 0을 리턴합니다. FIELDNAME.PRICE.ordinary()는 1을 리턴하겠죠. 그러다가 PRICE가 빠지게 되면 FIELDNAM.. 더보기
Jrebel Ibatis Plugin을 만들어 봅시다.. -3- Ibatis의 resultMap 클래스로 사용되는 Domain 클래스들에 대해서 리로드시 캐싱에서 지우는 것으로 만들어봤고..이제는 쿼리와 resultMap 클래스가 정의 되어 있는 xml 파일들을 모니터링하여 xml 파일 변경시 xml 파일을 리로드 하도록 해야 합니다. 다만, ibatis에서 최소 read 단위가 sqlMapConfig.xml 이어서... 이 xml이 커지면 로딩하는데 시간이 걸리게 됩니다. 더 작은 단위로 모니터링하여 로드되도록 하고 싶은데 아직 거기까지는 못 하였습니다. 일단,, 최소 ibatis에서 buildSqlMapClient 메서드를 실행 할 때 로딩하는 xml 파일을 모니터링 할 수 있도록 어딘가에 저장해두도록 해야 합니다. 그 역할을 하는 파일을 SqlMapFilesMa.. 더보기
Jrebel Ibatis Plugin을 만들어 봅시다.. -2- 일단 Jrebel 플러그인의 메인이 되는 클래스는 org.zeroturnaround.javarebel.Plugin 인터페이스를 구현해야 합니다. 여기서 중요한 메서드가 preinit() 메서드 입니다. 앞서 얘기했듯이 Jrebel이 다양한 프레임워크에서 플러그인을 통해 클래스 실시간 로딩을 지원하는 방법은 컴파일 된 바이트코드를 핸들링하는 것 입니다. 이렇게 핸들링 할 클래스를 합쳐주는 메서드가 바로 preinit() 메서드입니다. 그리고 , void org.zeroturnaround.javarebel.Integration.addIntegrationProcessor(ClassLoader arg0, String arg1, ClassBytecodeProcessor arg2) 를 통해 등록되는 형식을 보면 a.. 더보기
Jrebel Ibatis Plugin을 만들어 봅시다.. -1- 회사에서 jrebel을 사용하면서 ibatis 에서 사용하는 sqlMap.xml과 Domain 클래스들의 변경에 대한 이슈가 있어서 플러그인을 만들었습니다. 회사에서는 프레임웍이 있어서 순수 ibatis를 위한 플러그인은 아니라서 소스를 그대로는 못 보여드리고.. 순수 ibatis (2.3.x)에서 사용 가능한 ibatis 플러그인을 한번.. 의사 코드를 사용해서 만들어 보려고 합니다. 우선 jrebel의 플러그인은 이미 컴파일된 클래스의 바이트 코드에 원하는 코드를 끼워넣어서 thread를 가로채는 방식으로 원하는 메서드를 먼저 실행하거나 나중에 실행하도록 하는 것이 기본적인 구현 방식입니다. 기본적으로 ibatis를 사용 할 때는 이런식이 됩니다. 일반적으로 매번 저렇게 SqlMapClient를 bu.. 더보기