[펌글] xXxxx… 형식의(소문자대문자소문자…) 자바 프로퍼티 사용시 파라미터가 맵핑되지 않는 경우

By | 10월 9, 2009

- 출처 : http://www.okjsp.pe.kr/seq/33596 -

자카르타 커먼스 BeanUtils 를  쓰다가 경험한 팁입니다.

 

예를 들어 설명하겠습니다.

자바빈 클래스에  "aProperty"라는 변수명의 String 멤버가 있다고 합시다.
그러면 이 변수에 대한 get메소드의 이름은 자바빈 컨벤션에 의하면 getAProperty() 가

됩니다. 근데 이게 문제가 될지는 몰랐습니다. 

 

BeanUtils  을 써서 "aProperty" 변수에 값을 할당하거나 가져올 때 에러가 뻑 납니다.

왜 그런가 자바빈의 인트로스펙션 관련 클래스를 분석한 결과 getAProperty()

메소드에 해당하는 변수의 이름을  "aProperty"가 아닌 "AProperty"로 인식하더군요.

 

J2SE java.beans.Introspector 클래스의 decapitalize() 메소드가 이 문제의 핵심인데
메소드 설명에 아래와같이 나옵니다.

 

Utility method to take a string and convert it to normal Java variable 
name capitalization.  This normally means converting the first         
character from upper case to lower case, but in the (unusual) special  
case when there is more than one character and both the first and      
second characters are upper case, we leave it alone.                   
Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays    
as "URL".                                                    

          

즉, get메소드에서 get을 제외한 나머지 문자열이 연속하여 대문자가 2개이상 나오면
첫문자를 소문자로 바꾸지 않고 그대로 리턴하네요. getAProperty에서 get을 빼면
APoperty인데 대문자가 연속으로 나오므로 "aProperty"로 안바뀌고, "AProperty"를
리턴하여,  결과적으로 우리가 원하는 변수이름인 "aProperty"를 인식하지
못하는 문제가 생기는 것입니다.

 

따라서 자바빈 작성시 get/set 메소드 이름이 대문자로 연달아 시작하지 않도록
주의를 기울여야 이 문제를 피할 수 있습니다.

보통  DB테이블의 컬럼 이름을 자바빈에 매핑하는 경우가 많은데요, 만약 컬럼 이름이

a_column 인데, 이 컬럼명을 자바컨벤션에 맞게 매핑하여 자바빈을 작성할 경우

(변수이름 aColumn => getAColumn, setAColumn), 문제가 생기겠죠.

해결책은 여러가지입니다.

 

1. J2SE의 소스를 고친다. =>  비현실적임
2. 테이블의 컬럼명을 고친다. one_column식으로. => DBA 및 설계자 반발예상
3. 자바빈에서 변수명을 "AColumn"으로 작성하도록 한다. => 변수명 어색함
4. SQL작성시 별칭을 주어 컬럼명을 변경한다. (select a_column as one_column) => 자바빈 변수명과 컬럼명이 일치하지 않음

갠적으로는 이 중에서 4번이 제일 나은 해결방법처럼 보입니다.
테이블의 컬럼명을 풀어서 별칭을 준다고 생각하면 오히려 이해하기가 쉽겠죠.

 

급하게 짬내서 올린 팁이었습니다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments