2016/10/14
Very simple web application using spring
자바로도 간단한 Web API 서버 만들 수 있다.
[Spring] Spring Data JPA + REST 소개
Spring boot로 해봐야징.
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] 프록시 모드 - 인터페이스와 클래스
proxy-target-class 옵션이 있는데,
저 설정은 프록시 대상이 되는 항목이 클래스냐 인터페이스냐 하는 옵션이다.
기본적으로 스프링은 DI를 위해 Strategy pattern을 사용하는 만큼 가능한한 인터페이스를 작성하는 것이 기본 철학이다.
그럼에도 불구하고 인터페이스 파일 작성이 귀찮아서 혹은 레거시 코드 자체에 손을 댈 수 없는 없어서
클래스에 직접 AOP를 적용시켜야 할 때가 있는데
그 때를 위한 옵션이 바로 proxy-target-class 옵션이다.
한마디로 프록시 객체를 만들어야 하는데 만들기 위해서 상속받아야 하는 대상이 클래스 맞음? 하는 질문.
프록시 자체가 상속을 통해서 생성되므로 상속을 할 수 있는 객체여야하고(not final),
상속을 하는 만큼 생성자가 중복해서 호출이 발생하므로 생성자에서 자원을 할당하는 경우는 피해야하며,
프록시 대상이 된 클래스의 public 메소드는 모두 포인트컷 대상이 되므로,
트랜잭션의 경우 포인트컷을 꼼꼼하게 작성하지 않으면 DB 접근할 필요가 없는 메소드도 트랜잭션에 포함이 될 수 있다.
애초 클래스 설계 자체를 잘 해야하긴 하지만 행여나 리소스나 시간을 많이 잡아먹는 메소드가 섞여있을 경우엔
트랜잭션이 늘어지는 상황이 발생할 수 있으니 조심해야한다.
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
이유는 자바 8이 나오기 전에 JPA 2.1이 먼저 릴리즈 됐기 때문인데...
그것 때문에 계속 기존 API를 사용하기도 답답한 노릇이라...
@Converter 애노테이션과 AttributeConverter 인터페이스를 활용해서 해결한다.
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.
참... 어쩜 이렇게 뭐가 안되는 상황은 죄다 한번씩 겪어 보는지..
늘 그래왔듯이 검색 그리고 해결.
등록된 답변 보다도 답변에 추가된 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
<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>
2015/05/27
피드 구독하기:
글 (Atom)
