2016/09/29

STS 에러 - 01

STS 3.7.3 버전을 사용하고 있다.
이 글을 쓰는 시점에 spring.io 사이트에는 STS 3.8.1 버전이 올라와 있는 상태이다.
새 버전이 나왔다고 매번 직접 다운받아 쓰는건 어지간히 귀찮은 일이 아닐수가 없는데
답답한게 STS 3.7.3 버전에서는 'Automatic updates download' 기능이 제대로 작동하지 않는다.
STS를 실행하면 백그라운드로 업데이트 체크를 하다가 어느 시점에 아래와 같이 'Automatic updates download' has encountered a problem. 에러창이 뜬다.

에러의 자세한 내용은 아래와 같다.

An error occurred while collecting items to be installed
session context was:(profile=DefaultProfile, phase=org.eclipse.equinox.internal.p2.engine.phases.Collect, operand=, action=).
No repository found containing: osgi.bundle,org.sonatype.m2e.buildhelper,0.15.0.201405280027
No repository found containing: osgi.bundle,org.sonatype.m2e.egit,0.14.0.201509090157
No repository found containing: org.eclipse.update.feature,org.sonatype.m2e.buildhelper.feature,0.15.0.201405280027
No repository found containing: org.eclipse.update.feature,org.sonatype.m2e.egit.feature,0.14.0.201509090157

위 문제는 STS 3.7.3 버전의 버그로 STS 이슈트래커에 등록된 상태이다.
링크를 따라가도 나오겠지만 해결방법은 아래의 순서대로 실행하면 해결된다.

1. 'Preferences > Available Software Sites' 메뉴로 이동
2. 모든 항목을 체크와 선택을 하고 'Export'
3. STS 종료
4. STS 다시 시작
5. 'Preferences > Available Software Sites' 메뉴로 다시 이동
6. 앞서 'Export' 한 파일을 'Import'
7. 'Help > Check for updates' 실행

2016/09/07

Spring DB 연결 에러 - 01

몇 달 만에 보는 소스를 실행을 시키니 디비 연결 시에 한없이 기다리다 아래와 같은 에러를 뱉는다.


우선 개발 환경을 보자면...

개발 머신 : 맥북 (엘캐피탄)
IDE : STS
언어 : Java
프레임웍 : Spring 4+
DB Connection URL : jdbc:postgresql://localhost:5432/dbName
DB 머신 : VirtualBox Guest (Win 10)
VBox Guest 네트웍 : NAT (port forwarding TCP 127.0.0.1:5432 -> 10.0.2.15:5432)
DB : PostgreSQL 9.5

늘 그래왔던 것 처럼
잘 되던 건데 안된다... 하하하
너무 오랜만에 해보나...
특히나 예외 메세지가 마음에 안든다. null 이라니..... null 이라니!!!
답답한 마음에 PGStream 소스도 까서
org.postgresql.core.VisibleBufferdInputStream wrapped.read(buffer, endIndex, canFit) 까지 가니까 한참을 기다리다 -1을 뱉어버린다.
wrapped 변수는 InputStream 인터페이스인데 구현체를 찾기가 귀찮아서 저기까지만 봤다.
그리고 검색을 하니 Re: Locking on PGStream.ReceiveChar(PGStream.java:256)를 발견!!
하고 보니 윈도우 포트 문제 ㅠㅠ
하아.. 도대체 내가 언제 방화벽을 켜둔건가..

여튼 정답은 OS의 방화벽 문제!!

2016/07/18

Spring AOP proxy-target-class 설정

Spring 설정 시에 aop 설정과 그 외에 별도로 aop에 적용시켜야 할 설정에
proxy-target-class 옵션이 있는데,
저 설정은 프록시 대상이 되는 항목이 클래스냐 인터페이스냐 하는 옵션이다.

기본적으로 스프링은 DI를 위해 Strategy pattern을 사용하는 만큼 가능한한 인터페이스를 작성하는 것이 기본 철학이다.
그럼에도 불구하고 인터페이스 파일 작성이 귀찮아서 혹은 레거시 코드 자체에 손을 댈 수 없는 없어서
클래스에 직접 AOP를 적용시켜야 할 때가 있는데
그 때를 위한 옵션이 바로 proxy-target-class 옵션이다.
한마디로 프록시 객체를 만들어야 하는데 만들기 위해서 상속받아야 하는 대상이 클래스 맞음? 하는 질문.

프록시 자체가 상속을 통해서 생성되므로 상속을 할 수 있는 객체여야하고(not final),
상속을 하는 만큼 생성자가 중복해서 호출이 발생하므로 생성자에서 자원을 할당하는 경우는 피해야하며,
프록시 대상이 된 클래스의 public 메소드는 모두 포인트컷 대상이 되므로,
트랜잭션의 경우 포인트컷을 꼼꼼하게 작성하지 않으면 DB 접근할 필요가 없는 메소드도 트랜잭션에 포함이 될 수 있다.
애초 클래스 설계 자체를 잘 해야하긴 하지만 행여나 리소스나 시간을 많이 잡아먹는 메소드가 섞여있을 경우엔
트랜잭션이 늘어지는 상황이 발생할 수 있으니 조심해야한다.

  • [Spring 3 - Transaction] 프록시 모드 - 인터페이스와 클래스
  • 2016/06/22

    Gradle 빌드 에러 - 01

    STS에서 spring boot를 gradle로 설정하고 빌드를 하다가 맞난 에러.
    Dependencies는 기본적으로 Maven Repository에서 copy/paste를 사용하는데
    아무리 봐도 발생하면 안될 것 같은 에러가 발생했다



    알고 보니 swagger를 사용하려고 springfox-swagger2를 설정하면서 버전을 이래저래 만져보다가
    name 항목 마지막 '2'를 나도 모르게 지워버린 것..

    그래서 '2'를 채워놓고 해결.

    오타 같은 건 자기 소스는 아무리 봐도 잘 안보이는거긴 한데..
    뻔히 설정이 잘못 됐다고 에러를 던져주는데도 한번에 받아먹지 못한다면 그만큼 미숙하다는 증거가 아닐까.
    나를 믿지 말고, 내 눈을 믿지 말아야지-_-

    Gradle의 발음

    이 바닥의 용어가 죄다 영어다 보니
    가져다 쓰는 외국인으로서 발음이 참 애매할 때가 많은데
    내 경우 gradle은 '그래들' 이라고 읽곤 했다.
    뭐.. 현지인들도 알아먹기만 하면 이것 저것 쓸지도 모르지만
    어쨌든 선검색 즉시 실천! First Search Just Execute! FSJE!!
    Gradle Forums에 비슷한 질문이 올라갔었고, 답변으로 '그레이들'로 부른다고..
    그레이들.. 어색어색한게 왠지 회색들아 하는 느낌이랄까.
    어쨌든 이제부턴 그레이들!

    2016/06/02

    Using Github as a Syntax Highlighter for Your Blog or Website

    https://github.com/에 접속한 후 로그인.

    화면 상단의 gist를 클릭하거나
    https://gist.github.com/로 직접 이동한다.

    파일명과 확장자를 입력하고
    소스코드를 입력

    Create secret gist / Create public gist 두 중 하나를 선택
    입력했던 파일명으로 새로운 gist가 생성된다.
    생성된 gist의 Embed 옆의 copy to clipboard를 선택한 후 블로그 내용에 입력하면 완성

    2016/05/13

    Window 10에서 Ping 요청 시간이 만료되었습니다 해결 방법

    Git 서버를 설치를 하다가 문득 설치할 서버에 Ping을 던졌는데
    요청 시간이 만료 되었단다.
    응?
    혹시나 해서 해당 원격서버에서 내 피씨로 Ping을 던졌는데
    요청 시간이 만료 되었단다.
    응??
    이미 원격 데스크톱이 연결이 되었는데 Ping을 못 주고 받는 경우라니..
    내 PC는 방화벽을 건드린 적이 없고, Git 서버는 얼마전에 새로 설치한 건데 이상하다.
    디폴트 설정이 뭔지 헷갈리기 시작한다.
    여튼 해결 방법은 방화벽을 열어주는데
    Ping이라는게 ICMP (Internet Control Message Protocol) 프로토콜을 이용하며
    OSI 7 Layer 기준으로 Network Layer (3 Level)에 속하며,
    TCP/IP 모델에서는 Internet Layer (2 Level)에 속한다.
    우리가 사용해 오던 포트는 OSI 7 Layer 기준 Transport Layer (4 Level)에 속하며,
    TCP/IP 모델에서도 Transport Layer (3 Level)에 속한다.
    그래서 포트를 열어주고 자시고 할 건 없는 건데...
    ICMP 데몬의 포트를 방화벽 설정에서 열고 닫아 줘야 한다.
    윈도우 10에서는 방화벽 설정 중 고급 설정의 인바운드/아웃바운드에 있는
    파일 및 프린터 공유(에코 요청 - ICMPvX-In), 파일 및 프린터 공유(에코 요청 - ICMPvX-out)
    모두 사용으로 해주면 된다.

    2016/05/11

    ZeroMQ

    아무래도 성능을 최우선 고려하자면 ZeroMQ 밖에 없지 라는 생각으로
    회사에서 사용할 미들웨어를 ZMQ로 결정이 났었다.
    그래서 어찌저찌 구현을 해 놓았다더니 만든 사람은 퇴사를 하고....
    ZMQ도 공부하고 영어 공부도 할 겸 해서 겸사겸사 ZeroMQ 공식 사이트를 조금씩 번역 해볼까 했는데
    여간 귀찮고 힘든 일이 아니다.
    그런데.. 전부 다는 아니지만 상당히 번역이 진행되고 있는 것이 아닌가...
    누구라도 언제라도 많은 참고가 되길 바래 본다.

  • ØMQ 분산 메시징

  • [번역] ZeroMQ설계자: 세계를 구원하라

  • 한눈에 보는 MQ
  • 2016/05/10

    JPA 2.1에서 LocalDate를 사용하는 방법

    자바 8에서 마침내 새로운 Time API가 추가가 됐는데 JPA 2.1에서는 새 API를 사용할 수 없다.
    이유는 자바 8이 나오기 전에 JPA 2.1이 먼저 릴리즈 됐기 때문인데...
    그것 때문에 계속 기존 API를 사용하기도 답답한 노릇이라...
    @Converter 애노테이션과 AttributeConverter 인터페이스를 활용해서 해결한다.

  • How to persist LocalDate and LocalDateTime with JPA

  • Java의 날짜와 시간 API
  • Casting in java

    instanceof를 사용한 static casting부터
    class를 사용한 dynamic casting,
    Generic과 Type을 활용한 dynamic casting,
    java 8에서 추가된 Optional과 method reference를 활용한 casting,
    Stream을 활용한 casting 까지.

  • Casting In Java 8 (And Beyond?)
  • Jackson JsonView가 작동하지 않을 때

    JsonView가 작동하지 않는 상황이 발생했다.
    참... 어쩜 이렇게 뭐가 안되는 상황은 죄다 한번씩 겪어 보는지..
    늘 그래왔듯이 검색 그리고 해결.

  • Jackson JsonView not being applied

  • 등록된 답변 보다도 답변에 추가된 Eric의 댓글이 포인트.
    Good catch regarding withView() not mutating the existing config. However, objectMapper.setConfig(objectMapper.getSerializationConfig().withView(YourView.‌​class)); works and is probably prefarable to subclassing ObjectMapper. work fine. thx.

    Java Map 객체의 동기화와 성능

    java Map 객체의 동기화에 대한 글과 Map 종류별 성능.

  • ConcurrentHashMap vs. HashTable

  • HashMap Vs. ConcurrentHashMap Vs. SynchronizedMap – How a HashMap can be Synchronized in Java

  • HashTable은 동기화 구현으로 인해서 성능이 좋지 않아 사용하지 않는 것이 정석.
    동기화를 고려한다면 SynchronizedMap 보다 ConcurrentHashMap을 사용하는게 성능에 도움이 된다는 내용.
    두 번째 블로그를 보면 차이가 참 많이 나네.