위와 같은 그림이 있는데 -
직장/집 을 선택하면 주소를 넣어야하고, 수신거부를 선택하면 패스되는 유효성 검사를 해보려하는데 -

html을 이용한 for문을 사용한 것, jQuery를 이용하는 것 2가지를 비교해보면..

if(frm.p_addressGubun.length > 0){
	var b = 0; 
	for(var i=0; i<frm.p_addressGubun.length; i++){
		// 직장-집 일 경우
		if(frm.p_addressGubun[i].checked && frm.p_addressGubun[i].value != '3'){
			b = 1; break;
		// 수신거부일 경우
		}else if(frm.p_addressGubun[i].checked && frm.p_addressGubun[i].value == '3'){
			b = 2; break;
		}
	}
	if(b == 0){
		alert("주소 구분을 선택해 주세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		 return false;
	}else if(b == 1 && frm.p_zipCode.value == ""){
		 alert("주소를 입력하세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		 return false;
	}
	return true;
}


위 코드를 jQuery 코드로 바꾸면.. 아래와 같다..
if(frm.p_addressGubun.length > 0){
	if($j(':radio[name="p_addressGubun"]:checked').length < 1){
		alert("주소 구분을 선택해 주세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		return false;
	}
	}else if($(':radio[name="p_addressGubun"]:checked').val() != 3 && frm.p_zipCode.value == ""){
		 alert("주소를 입력하세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		 return false;
	}
	return true;
}


정말 간단해 진다..
:radio -> elements 중 radio 버튼 들
[name="elements_name"] -> elements_name 을 가진
합치면 :radio[name="p_addressGubun"] -> p_addressGubun 이름을 가진 radio 버튼을 선택한다.
:checked 선택된 것만.



왜 제네릭이 안되었는지 이제 알았다. 확실히...

먼저 제네릭이 안되었을때의 하이버네이트와 매핑한 bean을 살펴보면

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Integer getUserSeq() {
     return userSeq;
 }

오류난 로그

2010-01-09 23:06 [DEBUG] opened session at timestamp: 12630460153
2010-01-09 23:06 [DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2010-01-09 23:06 [DEBUG] opening JDBC connection
2010-01-09 23:06 [DEBUG] select this_.userSeq as userSeq2_0_, this_.ANSWER as ANSWER2_0_, this_.BIRTH_DAY as BIRTH3_2_0_, this_.CREATE_DATE as CREATE4_2_0_, this_.DISABLE as DISABLE2_0_, this_.DOMAIN as DOMAIN2_0_, this_.E_MAIL as E7_2_0_, this_.EMAIL_DENY as EMAIL8_2_0_, this_.masterCodes as masterCo9_2_0_, this_.QUESTION as QUESTION2_0_, this_.RELATION_GROUP_SEQ as RELATION11_2_0_, this_.RELATION_SEQ as RELATION12_2_0_, this_.UPDATE_DATE as UPDATE13_2_0_, this_.USER_ID as USER14_2_0_, this_.USER_NAME as USER15_2_0_, this_.USER_NICK as USER16_2_0_, this_.USER_PW as USER17_2_0_, this_.USER_STATUS as USER18_2_0_ from MEMBER this_ where this_.USER_ID=? and this_.USER_PW=?
2010-01-09 23:06 [DEBUG] preparing statement
2010-01-09 23:06 [DEBUG] binding 'agnes0417' to parameter: 1
2010-01-09 23:06 [DEBUG] binding '~~~~~~~' to parameter: 2
2010-01-09 23:06 [DEBUG] about to open ResultSet (open ResultSets: 0, globally: 0)
2010-01-09 23:06 [DEBUG] processing result set
2010-01-09 23:06 [DEBUG] result set row: 0
2010-01-09 23:06 [DEBUG] returning null as column: userSeq2_0_
      -> primary key 가 null인게 있을리 없다..

2010-01-09 23:06 [DEBUG] result row: null
2010-01-09 23:06 [DEBUG] done processing result set (1 rows)
2010-01-09 23:06 [DEBUG] about to close ResultSet (open ResultSets: 1, globally: 1)
2010-01-09 23:06 [DEBUG] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2010-01-09 23:06 [DEBUG] closing statement



@Column을 명시하지 않았기에 하이버네이트가 매핑된 이름 그대로 컬럼을 찾는다.
DB의 컬럼명은 USER_SEQ인데.. 만약 DB 컬럼명이 USERSEQ였다면 제네릭이 되었을테지만..

아래처럼 고쳐주었다..

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 @Column(name="USER_SEQ")
 public Integer getUserSeq() {
      return userSeq;
 }

제대로 돌아간 로그 기록..

2010-01-09 23:01 [DEBUG] opened session at timestamp: 12630457058
2010-01-09 23:01 [DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2010-01-09 23:01 [DEBUG] opening JDBC connection
2010-01-09 23:01 [DEBUG] select this_.USER_SEQ as USER1_2_0_, this_.ANSWER as ANSWER2_0_, this_.BIRTH_DAY as BIRTH3_2_0_, this_.CREATE_DATE as CREATE4_2_0_, this_.DISABLE as DISABLE2_0_, this_.DOMAIN as DOMAIN2_0_, this_.E_MAIL as E7_2_0_, this_.EMAIL_DENY as EMAIL8_2_0_, this_.masterCodes as masterCo9_2_0_, this_.QUESTION as QUESTION2_0_, this_.RELATION_GROUP_SEQ as RELATION11_2_0_, this_.RELATION_SEQ as RELATION12_2_0_, this_.UPDATE_DATE as UPDATE13_2_0_, this_.USER_ID as USER14_2_0_, this_.USER_NAME as USER15_2_0_, this_.USER_NICK as USER16_2_0_, this_.USER_PW as USER17_2_0_, this_.USER_STATUS as USER18_2_0_ from MEMBER this_ where this_.USER_ID=? and this_.USER_PW=?
2010-01-09 23:01 [DEBUG] preparing statement
2010-01-09 23:01 [DEBUG] binding 'agnes0417' to parameter: 1
2010-01-09 23:01 [DEBUG] binding '~~~~~' to parameter: 2
2010-01-09 23:01 [DEBUG] about to open ResultSet (open ResultSets: 0, globally: 0)
2010-01-09 23:01 [DEBUG] processing result set
2010-01-09 23:01 [DEBUG] result set row: 0
2010-01-09 23:01 [DEBUG] returning '2' as column: USER1_2_0_
2010-01-09 23:01 [DEBUG] result row: EntityKey[com.jaeyeollee.model.join.Member#2]
2010-01-09 23:01 [DEBUG] Initializing object from ResultSet: [com.jaeyeollee.model.join.Member#2]
2010-01-09 23:01 [DEBUG] Hydrating entity: [com.jaeyeollee.model.join.Member#2]

2010-01-09 23:01 [DEBUG] returning null as column: DISABLE2_0_
2010-01-09 23:01 [DEBUG] returning '@naver.com' as column: DOMAIN2_0_
2010-01-09 23:01 [DEBUG] returning 'leepcs' as column: E7_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: EMAIL8_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: masterCo9_2_0_
2010-01-09 23:01 [DEBUG] returning '어머니 성함' as column: QUESTION2_0_
2010-01-09 23:01 [DEBUG] returning 'CG0000' as column: RELATION11_2_0_
2010-01-09 23:01 [DEBUG] returning 'CS0000' as column: RELATION12_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: UPDATE13_2_0_
2010-01-09 23:01 [DEBUG] returning 'agnes0417' as column: USER14_2_0_
2010-01-09 23:01 [DEBUG] returning 'Hibernate' as column: USER16_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: USER18_2_0_
2010-01-09 23:01 [DEBUG] done processing result set (1 rows)
2010-01-09 23:01 [DEBUG] about to close ResultSet (open ResultSets: 1, globally: 1)
2010-01-09 23:01 [DEBUG] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)

2010-01-09 23:01 [DEBUG] closing statement





그러니.. 제네릭이 된다.. 하하하;;;

아.. 볍신 인증했네...

난 Collection을 사용할때 항상 Generic 타입으로 객체를 생성하려한다.
이유야 generic을 사용하면 좀 간편해지니 (캐스팅을 할 필요도 없고..)

이유야 어쨋든 하이버 네이트에서도 제네릭을 붙여보았는데 ..


  1. Session session = getHibernateTemplate().getSessionFactory().openSession();
  2.  
  3. Criteria crit = session.createCriteria(Member.class);
  4. crit.add(Expression.eq("userId", member.getUserId()));
  5. crit.add(Expression.eq("userPw", member.getUserPw()));
  6.  
  7. List<Member> list = crit.list();

난 이게 될 줄 알았다. 정말 진짜...
심심풀이 만들어보고 있는데 이상하게 유저가 존재하는데도 session을 생성하려고하면 null을 뱉어내니 환장하는 수 밖에..

별 수단 다 써보다가 설마 싶어서 <Member>를 지우고 찍어보니.. 객체 주소가 찍히네...

그래서 도달한 결론은 7번 라인처럼 generic을 이용하여도 -
crit.list()를 하게 되면 return 되는 값들은 Object 형이므로 무조건 class Casting을 하여야 한다.

Membe rmember = (Member) list.get(0);

이렇게...  하면 틀린거고;;

http://yeory.tistory.com/46 여기를 참고하세요..

이글은 무식 인증 글임 ㅋ

+ Recent posts