3월, 2015의 게시물 표시

Spring Boot 시작하기

새로운 프로젝트를 셋업할때 AS-IS 1. 기존에 있던 프로젝트 중에서 적당한걸 고른다. 그리고 pom파일을 ctrl+c, ctrl+v 한다. 2. 더 필요한 라이브러리가 있으면 추가한다. 3. 아파치 톰캣 설정을 한다. 4. 서버를 띄워본다. 5. 에러가 난다. 6. 각종 설정 파일 수정 및 라이브러리 버전을 바꿔본다. 7. 에러가 안날때까지 반복한다. 문제점 1. 사용하지 않는 불필요한 디펜던시가 pom에 추가된다. 2. pom에 이것저것 추가하다 보면 디펜던시가 충돌난다. 3. pom.xml 이 엄청 길어진다. 4. 어지간해서는 스프링 및 기타 라이브러리의 버전을 바꾸지 않는다. (괜히 버전 올려서 에러라도 나면..) 5. 서버 띄우기가 힘들다. (nodejs, rails 등을 생각해보면...) 처음 한두번은 뭔가 배울게 있을지 몰라도 몇번 하다보면 지루한 단순반복작업일 뿐이다. TO-BE Spring Boot 참고 http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/   준비물 JDK1.6+ Intellij 14.1(버전업이 되면서 Spring-boot가 추가되었다.) 시작하기(셋중 하나로 시작하거나 아니면 복붙하던가..) - Spring CLI  -  https://start.spring.io - Intellij > Spring Initializer 프로젝트를 생성하고 실행한다. 이렇게 나오면 일단 성공이다. 톰캣8이 포함되어 있기 때문에 따로 톰캣을 설치하지 않아도 실행할수 있다. 외부 톰캣 컨테이너에서 실행시키기려면 약간의 추가 작업이 필요하다. scope를 provided로 설정해야 한다.  그리고 SpringBootServletInitializer를 상속받게 수정한다.

cd ../../../../ 쉽게 하기

뭐 대단한 방법이 있는건 아니고 alias ..="cd .." alias ...="cd ../.." alias ....="cd ../../.." alias .....="cd ../../../.." alias ......="cd ../../../../.." 이렇게 설정해두고 (익!숙!해지면) 편리하다.

Mac에서 java_home 확인하기

mac에 java8을 설치했는데 기존의 java6가 있던 위치랑 전혀 다른곳에 있더라. /usr/libexec/java_home 을 실행시켜 보니 java8이 설치된 경로가 표시된다.(JAVA_HOME) https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/java_home.1.html

ssh 접속할때 private key 지정하기

-i 옵션 ssh -i /path/to/id_dsa ricardo@123.12.12.12 또는 .ssh/config에 설정하면 된다.

JSONP with Jersey 2.0

Jersey는 JAX-RS 구현체이다. 여기에 더해서 몇가지 추가적인 기능을 자체적으로 제공하는데 JSONP 어노테이션도 그중에 하나. 스프링이든 뭐든 JSONP를 구현하려면 이래저래 잡다한 코드가 들어가야 한다. Jersey 1.x 에서도 상황이 크게 다르진 않았는데 2.x부터는 @JSONP 어노테이션이 추가되어서 간단하게 JSONP를 구현할수 있다! https://jersey.java.net/apidocs/2.0/jersey/org/glassfish/jersey/server/JSONP.html 그냥 @JSONP를 붙히기만 하면 된다. callback 함수 이름을 지정하려면 callback 속성을 지정하면 되고 디폴트값은 "callback"이다. callback 함수를 queryParam에서 가져올수도 있다. 즉, queryParam이 설정되어 있으면 그걸 쓰고 없으면 callback 속성을 사용한다. @GET @Path("/get") @JSONP(queryParam="callback") @Produces({"application/x-javascript"}) public MediaInfo getMediaInfo(@QueryParam("callback") String callback) { return new MediaInfo("imbc"); } }

spring-boot profile 셋팅해서 서버 띄우기

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=development"

8080포트 사용중인 프로세스 찾기 on Mac

lsof -i tcp:8080

하이버네이트, 데이터 변경 이력 남기기

입력/수정/삭제에 대해  히스토리을 남기고 싶다.  - 속성, 이전값, 변경값 https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/Interceptor.html 간단히 EmptyInterceptor를 오버라이드해서 쓰면 된다. [설정, hibernate 4.2는 이렇고 3.x는 설정이 다르다. 인터셉터 구현 패턴의 변경]     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">         <property name="dataSource" ref="dataSource"/>         <property name="entityInterceptor" ref="historyInterceptor"/> 1. 입력 onSave(...) 2. 수정 onFlushDirty(...) 3. 삭제 onDelete(...) 4. 컬렉션 입력/수정/삭제 onCollectionRecreate(...), onCollectionUpdate(...), onCollectionRemove(...) 5. 기타 등등 많이 있음. 이상한점 1 객체가 컬렉션일때(OneToMany) 그 객체들을 삭제하려면? 1. Set.remove(o)를 하면 삭제가 안된다. 왜 안되는지 모르겠다. 2. Set.removeAll(..) 을 해야 삭제가 된다. 그런데 Set 전체를 삭제해야 한다. 일부만 삭제하면 삭제가 안된다. 이건 뭥미?? 3. 위와 같은 경우에 인터셉터에 걸리지 않는다. 삭제가 안되었으니까 .. 이상한점 2 afterTransactionBegin(), afterTransactionCompletion(), before