레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시

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/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
  • 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.

    2015/06/05

    XA, JTA, Atomikos and Spring


  • [번역]JTA와 XA, 그리고 Atomikos
  • Atomikos 3.7 - Spring3.1 - Tomcat7 Integration
  • 스프링(Spring) 3.2 + Atomikos 3.8.0 + Tomcat 7로 분산트랜젝션 구성하기
  • [Spring 3 - Transaction] JTA를 이용한 글로벌/분산 트랜잭션
  • Understanding Java EE Support
  • Atomikos Spring integration
  • JAVA 애플리케이션을 XA 구성 하기 위해서는 DBMS부터 XA 설정이 되어야 하는데, MS-SQL SERVER의 경우 XA 구성은 JDBC 드라이버에 설정 파일들이 포함되어 있다. CPU 아키텍처 별로 sqljdbc_xa.dll 파일을 구분하여 SQL SERVER INSTANCE가 설치 되어 있는 BINN 폴더로 복사를 해야하고, xa_install.sql 파일의 스크립트를 실행해서 XA user와 권한을 등록해야 한다. 또한 Windows OS에서도 설정을 해야 하는데 제어판 > 관리도구 > 구성 요소 서비스(Component Service) > 컴퓨터 >> Local DTC 속성 > 보안 탭 > XA 트랜잭션 사용 체크를 반드시 해야 한다. JDBC Connection URL을 확인 SQL-SERVER의 경우 ClassName을 com.microsoft.sqlserver.jdbc.SQLServerXADataSource라고 지정해줘야한다. 오라클도 마찬가지. XA 클래스네임을 반드시 확인하자.
  • Understanding XA Transactions
  • Spring application-context 설정
    <bean id="eslDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
        <property name="uniqueResourceName" value="mssql" />
        <property name="xaDataSourceClassName" value="#{db['esl.driverClassName']}" />  
        <property name="xaProperties">
            <props>
                <prop key="user">#{db['esl.username']}</prop>
                <prop key="password">#{db['esl.password']}</prop>
                <prop key="URL">#{db['esl.url']}</prop>
            </props>
        </property>
        <property name="testQuery" value="Select 1" />
        <property name="minPoolSize" value="10" />
        <property name="maxPoolSize" value="10" />
    </bean>
    
    <bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
        <property name="forceShutdown" value="false" />
    </bean>
     
    <bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="300" />
    </bean>
     
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="AtomikosTransactionManager" />
        <property name="userTransaction" ref="AtomikosUserTransaction" />
    </bean>