SpringFramework

미완성 [ property / 커맨드객체 / ${EL} / #{ } ] 문법별 set/get 메서드명 필드명 참조 기준 확인]

유혁스쿨 2020. 9. 4. 06:41
728x90
반응형

미완성 포스팅 입니다.

 

 

property name속성명과 setter( )

(basci/ex02)

property name속성명 : url

필드명 : url

메서드명 : setUrl2()

 

메서드명 변경 실험 결과 :

경고: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'db1' defined in class path resource [db-config.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'url' of bean class [com.spring.basic.ex02.DataBaseInfo]: Bean property 'url' is not writable or has an invalid setter method. Did you mean 'uid', 'upw', or 'url2'?

메서드명 기준으로 필드 참조※


 

커맨드객체의 setter( )

 

컨트롤러의 메서드에 커맨드 객체를 받을때 자동으로 request.getParameter가 작동하게됩니다

이때 받은 파라미터들은 해당 객체의 setter메서드의 이름과 네임파라미터의 이름이 일치한다면 추가로 setter메서드가 동작하여 해당 객체에 담아주게 됩니다.

 

캡슐화된 private 필드에 접근하려고 할때 자바 내부적으로 set이 작동하게 되는걸까? 라는 생각이 들어

 setter메서드의 이름을 바꿔 실험해 봤습니다.

작동하지 않습니다

 

메서드명 변경 실험 결과 : 오류메시지 출력 및 작업실패

심각: 경로 [/database]의 컨텍스트 내의 서블릿 [appServlet]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='writer', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111]을(를) 발생시켰습니다.

 

Command객체를 받을때에는 setter메서드명이 네임파라미터명과 일치해야만 setter메서드가 호출됩니다.

메서드명 기준으로 필드 참조


${EL}의 getter( ) 

메서드명을 변경해 본 실험 결과 콘솔창에 메서드가 호출되었다는 내용의 로그를 찍어보면 로그내용이 찍히지 않습니다. 딱히 오류는 출력해 주지 않으며 뷰페이지상에 null값이라고 뜨게됩니다.

만약 ${EL}을 네임 파라미터에 싣고 url로 전송할때 NullPointerException을 띄울수도 있지 않을까 생각이듭니다.

어쨋든 메서드명 기준입니다. 

만약 메서드명이 EL로 참조할때의 메서드의 이름과 다르다면 PropertyNotFoundExceptiond을 발생시킵니다.

 

메서드명 변경 실험 결과 : PropertyNotFoundExceptiond

${객체명.필드명} → 객체.getter이름() 일때 getter메서드이름과 EL에서 참조하는 이름이 다르면 참조해오지 못합니다.

메서드명 기준으로 필드 참조


#{ }의 getter( )

1. 메서드가 없거나 메서드명을 필드명과 다르게 했을때 실험 결과 : 오류발생

2. VO클래스에 필드 없이 메서드만 선언 했을때 : 메서드에 접근합니다........

#{필드명}으로 넘어온 파라미터 타입 객체의 필드값을 참조할때는 getter( )메서드명의 이름과 참조하려는 필드명이 같아야 필드값이 호출됩니다. getter( )메서드명의 이름을 참조하는것 입니다.  getter( ) 메서드가 없으면 필드 참조가 불가능합니다.

 필드가 존재하지 않고 메서드만 존재한다면 넘어온 객체에 존재하는 동일한 이름의 getter( )메서드에 접근하게 됩니다.

 

getter( ) 메서드명 기준 으로 필드를 참조하거나 필드가 없을때에도 동일한 이름의 getter( ) 메서드를 참조※

728x90
반응형