Tag Archives: JAVA

으~ 오라클 – Call Stored Procedure from Java Code 하는중에 생긴 중대한 호환성 오류

제목은 영어지만 내용은 한국어로

http://viralpatel.net/blogs/java-passing-array-to-oracle-stored-procedure

좋은 샘플 발견해고 코드 수정해서 돌려봤는데…

아무리 해도 응답값이 ARRAY.lengh() == 빵트루

뭐가 잘못된건가 싶어서 할 수 있는 모든코드에 디버깅을 돌려봤지만…

오라클은 디버깅이 안되지…

 

이런경우가 오랜만이라 쓸데없이 디버깅 하느라 반나절을 날려먹었다.

Solution : http://stackoverflow.com/questions/14998299/oracle-array-filled-with-null-data-in-java

 

이걸 항상 명심해야하는데말이지

알 수도 없고 디버깅 해도 안되는 오류는… 블랙박스 라이브러리의 버전 문제다.
이 프로젝트에는 오라클 ojdbc14.jar을 쓰고 있었는데
ojdbc6.jar + orai18n 이걸로 교체 해 주니 해결됐다.
코드에는 문제가 없었던걸로…

자바 개발을 하다보면 오픈소스만 쓰다보니 모든걸 직접 디버깅하고 오류를 발견할 수 있으리라는 착각에 빠지게 된다. 라이브러리도 정 맘에안드는 부분은 소스 수정하고 jar 패키징 다시해서 쓰기도 하고 하니까… github forking 해서 쓰기도 하고

오라클이나 SAP 등등 상용툴과 마주하게 되면 다른 개발습관이 필요한데

 

w3c xml 생성 변경 코드

작업중 필요없어져서 삭제하려다가 저장

Xml 이용해서 정보 저장하는코드.  오브젝트 네임을 바꿨는데 이 과정에서 오류가 약간 있을수도..

 

BCrypt 암호화 방식

비밀번호 저장에 특화된 암호화로 매 실행시마다 값이 변경된다.

글자수 제한이 있는것이 특징

자세한건 검색으로

테스트코드 첨부

 

[JAVA]시간변환 유틸 TimeUnit

이전에는 interval 기준으로 1000*x초 라는식으로 변환해서 계산을 했을데 이걸로 쓰면 좀 더 명확해서 좋은듯.

java.Validator 부족한 부분

상황을 지정할 수 있으면 어떨까

@NotNull
private String name;

@NotNull(scene = 1)
private String email;

 

위 두개의 필드가 있는 dto에서

상황 0 : 모두 동작
name, email notnull을 모두 체크

상황1 : 1만 동작
email만 체크

상황2 : 기본만 동작
name만 체크

 

이렇게 하면 validator에서 여러 상황을 복수로 셋팅할 수 있게됨

 

 

Jpa의 @ManyToMany 조인에서 구조상의 문제점

이런 구조의 Account 엔티티가 있다면

위의 groups에 3개 authorities에 2개의 데이터가 있다면 총 6개의 로우가 생성되서 출력이 되는 문제가 발생한다.
이것은 Hibernate에서 자동생성되는 다음과 같은 형태의 쿼리때문에 발생하는데
EAGER인 경우 쿼리를 묶어서 한번에 출력하려고 1개의 쿼리를 만들어내고

이것을 해결하려면

1 Set을 사용해서 중복이 제거되도록 하거나
이 경우 쿼리에서 데이터가 6개가 출력이 될 수도 있지만 중복을 자동으로 제거하게 된다. 이렇게 처리할 경우에는 ManyToMany 조인테이블에서 unique_index가 없어서 중복으로 들어가는게 가능한데 이렇게 데이터가 진짜로 중복으로 들어있는 경우가 발생하는것과 구분이 불가능하다.
2 ManyToMany가 두개이상 사용되는 경우 EAGER를 뺀다.
EAGER를 빼면 getGroups(), getAuthorities()가 실행될 때 별도의 쿼리를 실행시켜서 데이터 중복문제가 해결된다.

 

 

java 순차적으로 다른값을 입력시키는 setter 형태.

이런 형태로 결과값이 나오는 경우가 있다.

이 값을 responseDto형태의 클래스를 미리 선언해서 받는 경우

orderedSet형태로 선언을 해두면 그냥 세터선언해서 foreach로 받는다.

 

Spring Data JpaRepository 사용시 주의점. 이름중복. no such method

요즘 잘 기록을 안해놓다보니…

에러로그를 잃어버렸다.

이런 종류의 오류가 발생하는 경우에는 실행 순서에 따라 되다말다 하는 경우가 많아서 원인 찾기가 힘든데

사실 이것도 정확히 해결이라기보다는 원인 비슷한 것을 찾은 상황… 맞음말고 아님또말고다.

오류상황

PageEntity, 그리고 PageRepository extends JpaRepository<PageEntity, Long>

형태로 사용했는데

테스트코드에서는 이상없이 동작하지만… 웹에서 호출을 하면 오류가 발생하는 상황

해결

혹시나 해서…

PageEntityRepository로 변경을 했다.

무슨 에러로그를 보고 이걸 떠올렸었는데…

 

그러니까

네이밍을 중복 안되게 잘하쟈는…

스프링같은 라이브러리에서 네이밍을 할 때 프리픽스를 좀 붙여주면 좋겠다.

SPPageEntity 라던가.. 애플은 NSString이렇게 하는것처럼..

Spring JavaConfig 설정시 null pointer exception 등 알 수 없는 문제발생시

톰캣이 web.xml.bak web.xml.old 등등으로 파일명을 바꿔놔도 검색을 한다.

설정은 확실해야하고 오류상황에는 오류를 뱉아야하는데
어설픈 편의성 제공으로 지옥을 맛보게 해 놨다

말도안되는 오류가 생기고 구글검색도 안되는 경우에는 한줄한줄 디버깅을 해보자

Spring – Logback 서버별 다른 설정값 사용하기

App 을 만들 때 각 환경별로 다른 설정값이 필요한데 배포할 때 마다 이것을 바꿔주는건 매우 귀찮고 오류 가능성도 크다.

 

이런 부분을 개선하기 위해 나온 것이

Spring의 경우에는 Spring Profile이 있고 이에 맞게 설정을 해 주면 된다.
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

Spring기반 개발시에 대부분 Spring셋팅으로 해결이 되지만

내가 지금 쓰는 logback은 스프링의 관리하에 실행되는게 아니기 때문에 별도 설정이 필요하다.

기본제공방법은 실행시
-Dlogback.configurationFile={로그파일경로}
형태로 파라미터를 보내서 로그파일을 선택한다.
이 방법은 각 환경별로 필요한 logback 파일의 이름을 알고 이를 별도로 선언해줘야 하는 불편함이 있다.

그래서 이 부분을 조금 보완한게 이것.

기존의 logback을 대체한 후 몇 가지 설정만 해주면 된다

 

* dev서버에서 실행시킬 경우

-Dlogback.configSuffix=dev 또는 -Dspring.profiles.active=dev
의 파라미터를 넣어서 실행시키면

다음의 파일을 순서대로 찾아봐서 제일 먼저 검색되는 녀석을 이용해서 셋팅이 된다.

logback-dev.groovy
logback-dev.xml
logback.groovy
logback.xml

* 파라미터가 없는 경우

logback-test.groovy
logback-test.xml
logback.groovy
logback.xml

끝.

logback.xml 샘플

추가. 201506
GROOVY설정하면 더 간단해짐