[에러] no matching editors or conversion strategy found


1. 환경                                                         

                         

 Spring 

 4.3.6 (SpringMVC 기준)

 Java 

 1.8.0_92

 Tomcat 

 8.0.42

 암호화 관련 라이브러리

 jasypt-spring31-1.9.2.jar

 jasypt-1.9.2.jar

 bcprov-jdk15on-1.56.jar

 bcpkix-jdk15on-1.56.jar

            


2. 에러 메세지


 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationEncryptor' defined in file [C:\sample\server\apache-tomcat-8.0.42\webapps\sample-pjt\WEB-INF\classes\META-INF\config\context-datasource-dev.xml]: Cannot resolve reference to bean 'environmentVariablesConfiguration' while setting bean property 'config'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'environmentVariablesConfiguration' defined in file [C:\Sample\server\apache-tomcat-8.0.42\webapps\sample-pjt\WEB-INF\classes\META-INF\config\context-datasource-dev.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'java.security.Provider' for property 'provider'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.security.Provider' for property 'provider': no matching editors or conversion strategy found



3.  AS-IS 설정/소스

 

    - database 관련 설정파일 context-datasource.xml 파일 내 프로퍼티 파일 암호화 환경 설정

   

   <!-- 암호화  provider 선언 -->

    <bean id="bouncyCastleProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider"/>

    <!-- 암호화  환경 설정 -->

    <bean id="environmentVariablesConfiguration"

        class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">

        <property name="provider" value="bouncyCastleProvider" />

        <property name="algorithm" value="PBEWITHSHA256AND128BITAES-CBC-BC" />

        <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />

    </bean>

    <!-- 암호화 실행 모듈 선언 -->

    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">

        <property name="config" ref="environmentVariablesConfiguration" />

        <property name="password" value="easyframework" />

    </bean> 



4. 에러 원인


    - environmentVariablesConfiguration bean에서는 bouncyCastleProvider 라는 bean을 참조로 하여 암호화 환경을 설정하고 있는데,

       이때, provider 속성에 해당하는 참조 bean bouncyCastleProvider를 'ref'로 선언해야 하는 데 value 로 선언하여 이를 provider 속성에

       String 값으로 넣으려 하다가 나는 에러다. 객체를 참조하는 부분이니 value 가 아니라 ref로 바꿔줘야 정상 동작한다. ㅎㅎㅎ 이런 실수를 ㅜ

       처음보는 에러 메세지여서 정리해둔닷



5. 해결


    - 아래와 같이 설정 변경해주니, 정상 기동하였다.


  <!-- 암호화  provider 선언 -->

    <bean id="bouncyCastleProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider"/>

    <!-- 암호화  환경 설정 -->

    <bean id="environmentVariablesConfiguration"

        class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">

        <property name="provider" ref="bouncyCastleProvider" />

        <property name="algorithm" value="PBEWITHSHA256AND128BITAES-CBC-BC" />

        <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />

    </bean>

    <!-- 암호화 실행 모듈 선언 -->

    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">

        <property name="config" ref="environmentVariablesConfiguration" />

        <property name="password" value="easyframework" />

    </bean> 




'Spring' 카테고리의 다른 글

(작성중) dispatcher-servlet.xml 설정  (0) 2017.04.16
spring - profile  (0) 2017.03.19
[Spring] Transaction 관리  (0) 2017.03.12
Spring - BeanNameViewResolver  (0) 2017.01.29


프로젝트에서 전체 프로젝트 환경 구성을 맡게 되었다. 

프로젝트 구조를 어떻게 가져갈지 고민하고, 패키지 구조, 공통 제공 기능 등을 구상해야 했다. 

처음해보기도 했고, 아직 많~~~~이 부족하다는 걸 매순간 깨닫는 작업이었다..  

프로젝트 끝나기 전까지 내가 스스로 프로젝트를 좀 더 효율적으로 할 수 있는 부분을 캐치해내고, 적용해보는 부분이 생기도록 고민해봐야겠다!


우선, 오늘은 Spring 설정 부분을 정리해두려 한다. 

구성한 프로젝트 환경은 아래와 같다


 - JAVA: JDK 1.8

  - IDE: Eclipse Mars2 (4.5)

  - WAS: Tomcat 8.0.42 

  - DB: Oracle 11g

  - Build: Maven 3.3.9

  - Framework: Spring 4.3.6 , 사내프레임워크

 


기존 시스템 재구축 성격의 프로젝트라, 기본적인 tools 업그레이드와, 프레임워크 버전 현행화가 요새 주된 작업이다.

버전 업그레이드라 생각해서 처음부터 구축하는 것 보다 낫겠지 싶었는데, 더 어려운 것 같다.. 호환성이 안맞아 깨지는 부분이 생기고 ㅜ


AS-IS 시스템은 Spring 3.1 버전을 쓰고 있었다.


Spring 4.3.x 에 맞게 dispatcher-servlet.xml 파일을 수정했다. 처음엔 뜬구름 잡듯이 이해됬었는데, 차장님한테 질문하고나니

그래도 흐름이 쭉 잡힌 것 같다. 잘정리해놔야지!


_____________________________________________________________________________________________________________________________

# Spring 설정: dispatcher-servlet.xml


  dispatcher-servlet에서 기본적으로 설정 고려해야 하는 항목들은 아래와 같다고 생각한다.

  

  1.component 스캔

   2.MVC 설정 = interceptors, adpater, handler

   3.Resolver 설정


 '화면'단에 적용할 설정들을 모아놓는 곳이기 때문에 기본적으로 위의 설정들은 들어가야 한다. 


1) dispatcher-servlet.xml

  

    - 톰캣 서버를 기동시키면 기동로그에 dispatcher-servlet 파일이 로딩되는 부분이 보인다.

    - root Context 초기화가 이루어진 다음, 이제 WebApplication Context가 초기화될 차례다.

    -  WebApplication Context가 초기화되면서, dispatcher-servlet.xml 파일에 선언한 bean 들이 등록된다.


정보: Initializing Spring FrameworkServlet 'sample'

| [INFO ] 20:45:38.727 [o.s.w.servlet.DispatcherServlet] [localhost-startStop-1]   -FrameworkServlet 'sample': initialization started 

| [INFO ] 20:45:38.732 [o.s.w.c.s.XmlWebApplicationContext] [localhost-startStop-1]   -Refreshing WebApplicationContext for namespace 'sample-servlet': startup date [Sun Apr 16 20:45:38 KST 2017]; parent: Root WebApplicationContext 

| [INFO ] 20:45:38.732 [o.s.b.f.x.XmlBeanDefinitionReader] [localhost-startStop-1]   -Loading XML bean definitions from class path resource [META-INF/dispatcher-servlet.xml]  



  (1) component 스캔 작업


      - dispatcher-servlet.xml 파일 내 컴포넌트 스캔 셋팅은 아래와 같다. 


<?xml version="1.0" encoding="UTF-8"?>

<beans  xmlns:context="http://www.springframework.org/schema/context" 

            xsi:schemaLocation=" http://www.springframework.org/schema/context 

                                         http://www.springframework.org/schema/context/spring-context.xsd ">


<context:component-scan base-package="com.sampleframework, com.sampleCompany.sample" use-default-filters="false">

   <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>    

</context:component-scan>  



      ▶ Spring이 @Component 또는 @Component를 메타 어노테이션으로 갖고 있는 어노테이션(@Controller, @Repository, @Service)이 

          붙은 클래스들을 빈으로 등록한다.

      ▶ 스캔 범위: 보통 공통빈(persistence, service) 설정 정보는 Application context에, web layer 단의 빈(controller)들WebApplicationContext에 

                        저장한다.

      ▶ stereotype annotation: 클래스에 붙어 해당 클래스가 컴포넌트 스캔 대상이고, 스프링에 의해 관리될 것임을 명시한다. 

      ▶ base-package: 설정한 패키지 내에서 컴포넌트 스캔을 수행한다. 스캔 범위 지정

      ▶ use-default-filters: 아무 설정을 안할 경우 default로는 모든 stereo type 스캔한다. 개별적으로 특정 빈만 스캔하려는 경우 

                                   해당 설정을 false로 해주고, 특정 빈을 include filter 설정해주어야 한다.



      ▶ sts 의 spring explorer를 통해 bean 로딩 확인 (프로젝트 패키지명은 모자이크 처리함)



[ 이미지1 - component-scan의 use-default-filters 설정을 주지 않은 경우, base-package내 컴포넌트들을 모두 스캔하고 있다]



                   [ 이미지2 - component-scan의 use-default-filters 설정을 false로 주고, Controllerㄹ 컴포넌트만 include 설정 한 경우, base-package내 

                                  @Controller 컴포넌트들만 스캔하고 있다]




(2) spring MVC 설정


    - spring MVC를 활성화하기 위해 아래와 같은 설정을 해준다.


    - 보통 설정들을 copy해서 쓰기 때문에 실제로 이 설정이 정확히 어떤 역할을 하는지 몰라 그냥 그대로 쓰는 경우가 많다.

      그러다 보면 사용하지 않는 설정들도 다 포함되어 설정파일만 비대해지게 된다. 


      STS를 별도로 설치하여 spring explorer 뷰를 활용하여 실제 설정을 적용했을 때 어떤 변화가 일어나는 지 확인해 보았다. (강추!)

      (eclipse Mars2 4.5 버전에서는 sts 플러그인 설치 시, 기존 내장되어 있는 maven 의 m2e와 충돌이 나는지.. 설치 후 

       maven 도 안되고, sts 기능도 사용이 불가했다...버그인것 같은데 레퍼런스가 거의 없다 ㅜㅜ. sts 중 maven 과 겹치는 부분은 제외한 채

       설치해도 같은 결과가 반복됬다.....eclipse를 밀기를 몇번 ^^;; 그냥 sts 를 별도로 설치해서 확인했다)


<mvc:annotation-driven />  


    ▶@Controller 와 @RequestMapping 사용 활성화

    ▶@Controller들에게 요청을 전파하기 위한 HandlerMapping(default: RequestMappingHandlerMapping)과          

       HandlerAdapter(default: RequestMappingHandlerAdapter)를 등록


         - RequestMappingHandlerMapping 역할: 요청들을 해당 annotation이 걸린 컨트롤러 method로 매핑

          

    ▶ HandlerExceptionResolver 등록

  


[이미지3 - mvc:annotation-driven 설정을 해준 경우, 위와 같이 handlerAdapter가 자동으로 등록되었다. 더 깊게 확인은 못해봤지만,       

              AnnotationDrivenBeanDefinitionParser라는 애가 파싱을 담당하나 보다.]





(3) MVC - interceptor 설정 


(4) MVC - adapter 설정


(5) MVC - resolver 설정






__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.



 

      


'Spring' 카테고리의 다른 글

[에러] no matching editors or conversion strategy found  (0) 2017.04.20
spring - profile  (0) 2017.03.19
[Spring] Transaction 관리  (0) 2017.03.12
Spring - BeanNameViewResolver  (0) 2017.01.29

계속해서 업데이트 되는 Tomcat 버전에도 버전 별로 보안취약점이 발견되고, 패치되고 있다.

취약점 발견 버전을 사용하고 있는 경우 보안 위험이 존재하므로 패치된 버전으로 변경하는 것을 권장하고 있다.


그래서 Tomcat 버전 별 보안취약점에 대해 정리해보았다.


# Tomcat 보안취약점 패치 버전 업데이트 권고       


 

* 권장 Tomcat 버전: 8.5.11 / 8.0.41 / 7.0.75 / 6.0.50

* 권장 Tomcat JK connector 버전: 1.2.42

* 권장 Apache Standard Taglib 버전: 1.2.3

 

Tomcat 보안 취약점 패치 적용 버전 업데이트 권고

중요도

취약점 발견 버전

보안 취약점

취약점 상세

권장 Tomcat

버전

참고

Moderate

8.5.7 ~ 8.5.9

정보 노출 취약점

(information disclosure)

ByteBuffer를 사용할 때, 동일 connection의 여러 요청 간에 정보 유출 위험이 존재한다. ByteBuffer I/O가 일어날 때 주고 받을 때 데이터를 일시적으로 담고 있는 역할을 하는 클래스다. 이러한 취약점은 Apache 등의 웹서버를 함께 사용하는 경우 사용자 간의 정보 유출도 초래할 위험이 있다.

8.5.11

* ByteBuffer 클래스: fast low level I/O를 수행할 때, 일시적으로 데이터를 담아놓기 위해 사용.

important

8.0.0 ~ 8.0.39

정보 노출 취약점

(information disclosure)

Tomcat connector protocol NIO HTTP connector를 사용할 경우, 복수의 요청을 처리하는데 동일한 processor가 사용되어 세션 ID 및 응답 정보가 유출 될 위험이 있다. 프로세서를 공유하게 되면 session ID를 포함한 request response body 사이의 정보 노출 위험이 존재한다.

8.0.41

* NIO: New Input/Ouput stream. Non-blocking protocol.
* Blocking:
어떤 시스템 콜을 호출했을 때, 네트워크 시스템이 동작을 완료할 때 까지 그 시스템 콜에서 프로세스가 멈춤. I/O 처리 시 완료 될 때까지 기다려야한다. 비동기 작업 수행 불가. 일대일 통신 또는 프로그램이 한 가지 작업만 처리하면 되는 경우 blocking 모드 사용
* Non-blocking:
시스템 콜에 대해 네트워크 시스템이 즉시 처리
할 수 없는 경우라도 시스템 콜이 바로 리턴되어 응용 프로그램이 block 되지 않게 하는 모드. 통신 상대가 여럿이거나, 여러 작업을 병행하려는 경우, non-blocking 모드를 사용한다. non-blocking 모드 사용 시, 시스템 콜이 성공적으로 실행될 때 까지 루프를 돌며 계속 확인하는 방법 '폴링(polling)'을 사용한다.

important

7.0.0 ~ 7.0.73

정보 노출 취약점

(information disclosure)

파일 전송 코드를 사용할 때, Tomcat connector protocol NIO HTTP connector를 사용할 경우, 복수의 요청을 처리하는데 동일한 processor가 사용되어 세션 ID 및 응답 정보가 유출 될 위험이 있다.

프로세서를 공유하게 되면 session ID를 포함한 request response body 사이의 정보 노출 위험이 존재한다.

7.0.75

 

important

7.0.0 ~ 7.0.72

Jmx 원격코드 실행 취약점

(Remote code execution)

Jmx에서 CVE-2016-3427 에 대한 패치를 반영하지 않아 발생하는 취약점이다.  Jmx(Java Management eXtension)는 자바 서비스들을 관리하고 모니터링하기 위한 API를 제공하는 기능을 포함한 기술로, 발견된 취약점 CVE-2016-3427 Java SE 8u77, JRockit R28.3.9를 사용할 때 Jmx를 통해 기밀성·무결성·가용성에 영향을 줄 수 있는 취약점이다.

* CVE-2016-3427: Java SE 8u77, JRockit R28.3.9를 사용할 때 Jmx를 통해 기밀성, 무결성, 가용성에 영향을 줄 수 있는 취약점

* JMX(Java Management Extension): JVM의 메모리나 쓰레드 및 VM 내부 정보 등의 자바 서비스들을 관리하고 모니터링 하기 위한 API를 제공하는 기술.

important

6.0.0 ~ 6.0.48

정보 노출 취약점

(information disclosure)

파일 전송 코드를 사용할 때, Tomcatconnector protocol NIO HTTP connector를 사용할 경우, 복수의 요청을 처리하는데 동일한 processor가 사용되어 세션 ID 및 응답 정보가 유출 될 위험이 있다. 프로세서를 공유하게 되면 session ID를 포함한 request response body 사이의 정보 노출 위험이 존재한다.

6.0.50

 

important

6.0.0 ~ 6.0.47

Jmx 원격코드 실행 취약점

(Remote code execution)

Jmx에서 CVE-2016-3427 에 대한 패치를 반영하지 않아 발생하는 취약점이다. Jmx(Java Management eXtension)는 자바 서비스들을 관리하고 모니터링하기 위한 API를 제공하는 기능을 포함한 기술로, 발견된 취약점 CVE-2016-3427 Java SE 8u77, JRockit R28.3.9를 사용할 때 Jmx를 통해 기밀성·무결성·가용성에 영향을 줄 수 있는 취약점이다.

* CVE-2016-3427: Java SE 8u77, JRockit R28.3.9를 사용할 때 Jmx를 통해 기밀성, 무결성, 가용성에 영향을 줄 수 있는 취약점

Moderate

Tomcat JK Connector

1.2.0 ~ 1.2.41

Buffer Overflow

Virtual host 매핑 룰을 생성하기 위해 가상 호스트명과 URI이 연결되는데, buffer write하기 전에 virtual host 명에대한 길이 체크를 하지 않아, 잠재적으로 buffer overflow 취약점이 존재한다.

à 원격지의 공격자가 overflow를 유발하는 아주 긴

URL 요청을 보내 시스템 상의 임의의 코드를 실행시키는 등의 공격으로 프로그램 오류 발생 가능.

1.2.42

* Buffer Overflow: 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점. 프로세스가 데이터를 buffer에 저장할 때 프로그래머가 지정한 곳 바깥에 저장해 버리는 것이다.
이로 인해, 프로그램 오류가 발생할 수 있으며, 메모리 접근 오류, 잘못된 결과, 프로그램 종료, 또는 시스템 보안 누설 등의 문제가 발생할 수 있다.
 --> buffer overflow
는 보통 데이터를 저장하는 과정에서 그 데이터를 저장할 메모리 위치가 유효한지 검사하지 않아 발생하곤 한다. 데이터가 담긴 위치 근처에 있는 값 손상 가능.

Important

Apache Standard Taglib
1.2.3
이전 버전들

정보 노출 취약점
(information disclosure)

Apache Standard Taglibs 1.2.3 이전의 버전들은 악의적인 사용자가 원격으로 임의의 코드를 실행하거나, XXE injection 공격을 행할 수 있다.

1.2.3

 

* XXE(XML eXternal Entity) injection: XML 문서에서 동적으로 외부 URI의 리소스를 포함시킬 수 있는 external entity를 사용하여 서버의 로컬파일 열람, denial of service 등을 유발할 수 있는 취약점으로, XML Request를 파싱하는 페이지에서 발생한다.


                                                                                      

 [Spring] 


# Profile 기능


1) spring profile 이란?


    - Spring Profiles provide a way to segregate parts of your application configuration and make it only available in certain 

        environments. Any @Component or @Configuration can be marked with @Profile to limit when it is loaded

     - 어플리케이션의 여러 환경들을 설정해놓고 필요시마다 원하는 환경으로 선택 구동하게끔 설정해주는 기능.

     - Spring 3.1 부터 등장한 기능으로, 환경 별로 다른 profile을 적용할 수 있게 하는 기능.

     - 주로 어플리케이션 개발/테스트/운영 환경 설정에 자주 쓰인다.



2) 설정 방법


     (1)application context 의 beans 에 환경 별 profile 등록


 <beans profile="dev">

     <bean id="" class="">

          <property name="" value=""/>             --> 개발환경 profile

     </bean>

 </beans>

 <beans profile="prd">

<bean id="" class="">

          <property name="" value=""/>             --> 운영환경 profile

     </bean>

 </beans>    



    (2) 등록한 bean 중 구동할 profile 선택 활성화

          

         방법1) JVM property로 설정

                  : tomcat 서버 더블 클릭 > open launch configuration > arguments 탭 > VM arguments 에 아래 설정 추가 

                                

 -Dspring.profiles.active=dev       --> 개발환경 용 profile 활성화 시 



         방법2) web.xml 에 설정


 <context-param>

    <param-name>spring.profiles.active</param-name>

    <param-value>dev</param-value>

 </context-param>



         방법3) annotation 으로 설정

                       : 설정 파일에 각 환경별로 설정한 후, @Configuration + @Profile("설정한환경 value") 로 구동할 수 도 있다.

                                                                                  @ContextConfiguration("/context-common.xml") + @ActiveProfiles("dev")  

                                                                                       --> junit 등으로 test case 돌릴 때 유용

   

 @Configuration 

 @Profile("dev") 

 public class SampleClass {

   .....

 }




         방법4) programming으로 설정

                   : 어플리케이션 구동 전SpringApplication.setAdditionalProfiles() 를 사용하거나

                     , spring이 제공하는 인터페이스 ConfigurableEnvironment 를 통해 설정하여  활성화 할 profile 설정





__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.


  - http://docs.spring.io/spring-boot/docs

  - http://www.lesstif.com/

 

'Spring' 카테고리의 다른 글

[에러] no matching editors or conversion strategy found  (0) 2017.04.20
(작성중) dispatcher-servlet.xml 설정  (0) 2017.04.16
[Spring] Transaction 관리  (0) 2017.03.12
Spring - BeanNameViewResolver  (0) 2017.01.29

# Spring - Transaction


1) Transaction 이란?


    - 데이터베이스 관리 시스템에서의 상호작용 단위

    - 데이터베이스 작업 단위

    - 하나 이상의 SQL 문장들로 이루어진 논리적인 작업 단위

    - 데이터베이스 처리 작업이 모두 완료되거나 모두 취소되게 되는 작업의 단위


     --> 실제로 INSERT, UPDATE, DELETE 등 도 하나의 트랜잭션으로 볼 수 있다.  예를 들어, 10개의 데이터를 삭제 하는 경우 3개를 삭제한 후,

          4개째에서 오류가 발생하여 삭제가 안되면, 기존의 삭제 된 3개도 rollback 한다. (또는 3개만 정상 삭제 처리됬다고 사용자에게 알림을 

          주기도 한다)


     --> 여러개의 DML 문을 복합적으로 사용하여 하나의 트랜잭션으로 묶는 경우도 많다. DELETE 후 INSERT 하는 경우가 그 예이다. 



2) Transaction의 특성 'ACID'

  

    - 원자성(Atomicity): 더이상 분리할 수 없는 하나의 작업 단위로, 모두 완료되거나 모두 취소되어야 한다.


    - 일관성(Consistency): 사용되는 데이터는 모두 일관되어야 한다.


    - 고립성(Isolation): 하나의 트랜잭션이 접근하고 있는 데이터는 다른 트랜잭션으로 부터 격리되어야 한다. 

                             트랜잭션 과정 중간의 데이터는 확인 불가.


    - 영구성(Durability): 트랜잭션이 종료되면, 그 결과는 영구적으로 적용되어야 한다.


       --> 실제론, 성능향상을 위해 각 특성을 완화하는 경우도 많다. 



 3) Transaction, 뭐 때문에 쓰는건지?? 목적?


     트랜잭션을 쓰는 이유는 데이터 무결성(integrity) 때문이다. 

     쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백한다. 

     은행에서 내계좌에서 돈이 빠져나간 후 '송금' 처리하는 작업을 순차적으로 처리할 때, 중간에 쿼리가 실패하여

     내 계좌에서는 돈이 빠져나갔는데, 송금 처리는 되지 않는 경우가 발생 할 수 있다. 이런 경우 데이터 무결성이 깨지게 된다. 

     이러한 문제를 방지하기 위해서, 즉 데이터 무결성을 지키기 위해 트랜잭션을 사용한다.

     

     --> 실제로 트랜잭션은 보통 아래와 같은 과정을 거쳐 SQL 언어로 데이터베이스 내에서 실행된다.

            * Begin the transaction

            * Execute several queries  (DB 갱신 전)

            * Commit the transaction  (성공적인 트랜잭션 수행 후, DB 갱신)



  4) Transaction 설정


      사실 이 부분을 정리해 두려고, 이 포스팅을 작성하기 시작했다. 프로젝트 때 delete 후 insert 하는 업무 등을 처리하기 위해

      트랜잭션을 걸어줬었다. 실제로 어떻게 설정하는지 아래에 정리해 보았다.


      트랜잭션을 설정하는 방법은 하나만 있는 것이 아니다. Java의 트랜잭션 API (JTA)를 쓸 수도 있고, Spring이 제공하는 트랜잭션

      기능 등을 이용할 수 도 있다. 


      우선 이번 포스팅에서는 Spring에서 제공해주는 트랜잭션 관리 방법을 정리하고자 한다. 



 (4.1) Transaction 관련 스키마 설정

      

<?xml version="1.0" encoding="UTF-8"?>

<beans  xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:tx="http://www.springframework.org/schema/tx"

        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">



 (4.2) TransactionManager 설정


         - 우선, datasource 쪽 설정파일에 transactionmanager 설정을 해준다.

         - 이번 프로젝트에서는, resources/spring/context-datasource.xml 이라고 DB 관련 설정을 한 데 모아놓았다. 트랜잭션도 이곳에 설정!

         - class: spring 프레임워크에서 제공하는 DataSourceTransactionManager 클래스 (platformTransactionManager)


<tx:annotation-driven transaction-manager="transactionManagerSample" proxy-target-class="true" />

     <bean id="transactionManagerSample"       

              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

         <property name="dataSource" ref="dataSourceSample" />

     </bean>

tx:annotation-driven

 어노테이션에 기반한 트랜잭션의 동작을 활성화한다

 @Transcational이 붙은 bean 만 찾음 (applicationContext에서)

   --> 만약 webApplicationContext에 tx:annotaion-driven을 설정해놓으면 서비스가 아니라 controller

         에서만 @Transcational이 붙은 bean을 찾는다

transaction-manager

 default 값: transactionManager

 default 값 'transactionManager' 가 아닌 다른 이름을 사용하는 경우에만 설정 

 proxy-target-class

 proxy 모드에만 적용된다.
 @Transactional 어노테이션이 붙은 클래스에 어떤 타입의 트랜잭션 프록시를 생성할 것인지 제어한다.    proxy-target-class 속성을 true로 설정했다면 클래스기반의 프록시가 생성된다.
  --> 트랜잭션은 원래 interface에다가 걸게끔 나왔는데, controller 클래스에 걸려는 사용자들이 늘어나

       면서 기본 클래스에도 transaction을 걸 수 있도록 설정할 수 있게 되었다. 

 proxy-target-class 속성을 생략하거나 false로 설정하면 표준 JDK 인터페이스 기반의 프록시가 생성된다


 DataSourceTransactionManager 클래스

 역할

  - JDBC 3.0을 통해 트랜잭션 지원
  - 특정 datasource 로 부터 현재 쓰레드까지 JDBC connection 을 바인딩 한다 

 주요 메서드

  - setDataSource, getDataSource

  - doBegin

  - doCommit

  - doRollback



 (4.3) @Transactional 어노테이션 설정


        - 인터페이스 정의, 인터페이스의 메서드, 클래스 정의, 클래스의 퍼블릭 메서드 앞에 @Transactional 어노테이션을 설정 할 수 있다.

        - 트랜잭션을 적용하려는 메서드 등에 설정. 특정 메서드에서만 트랜잭션을 사용하는 경우, 인터페이스 혹은 클래스 전체에 거는 것보다

          특정 메서드에만 걸어주는 것이 성능면에서 효율적이다.


/**

* 데이터 일괄 삭제 후 insert 서비스

* @param CommandMap commandMap, String jasonData

* @return Map<String, Object> resultMap

* @throws Exception

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

@RequestMapping(value = "/ajaxUpdateList", method = RequestMethod.POST)

@Transactional

public @ResponseBody Map<String, Object> updateFpFunctionList(

@RequestParam(value = "rowList", required = true) String jasonData, CommandMap commandMap)

throws Exception {

...... 생략

        

// 기존 데이터 일괄 삭제

mapDao.delete("groupId.artifactId.sample_delete_all", commandMap.translateMap());

   

// 업데이트 데이터, 한 row 씩 INSERT 처리

for (Object object : array) {

mapDao.update("groupId.artifactId.sample_insert", (Map) object);

}

       ..... 

}

return resultMap;

}



 @Transactional 속성

 propagation

 

  

 isolation

 

 

 readOnly 

 boolean

 읽기/쓰기 트랜잭션? or 읽기 전용 트랜잭션?  

 성능을 최적화하기 위해 사용할 수도 있고 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는  것을 의도적으로 방지하기 위해 사용하기도 함. 

 timeout

 int 

 트랜잭션 타임 아웃

 정해진 시간 내에 메소드 수행이 완료되지 않을 경우 rollback함

 default 값: -1 ( = timeout 수행하지 않음)

 rollbackFor

 

 정의된 exception에 대해서는 rollback을 수행함 

 noRollbackFor

 

 정의된 exception에 대해서는 rollback을 수행하지 않음

( ** propagation 과 isolation 개념은 아직 정확히 이해가 안되어 작성하지 못했다.. 



 (4.4) Transaction 이 잘 걸렸나 테스트


       - 위와 같이 트랜잭션 설정을 해놓았으니, 이제 정말 잘 설정된 것이 맞는 지 테스트를 해 볼 차례다.

         테스트는 jUnit 테스트로 진행해보았다.

       

@WebAppConfiguration

@RunWith(SpringJUnit4ClassRunner.class)

@ActiveProfiles("dev")

@ContextConfiguration(locations={"classpath*:/spring/context-*.xml", "classpath*:/config/dispatcher-servlet.xml"})

public class TestTransaction {


    @Autowired

private TransactionTest TransactionTest;

    

    @Autowired

private GenericDao<Map<String, Object>> mapDao;

@SuppressWarnings({ "unchecked", "rawtypes" })

@Test

public void test() throws Exception {

Map map = new HashMap();

map.put("YEAR", "2017");

map.put("userId", "testID");

map.put("name", "tester");

//삭제 후 테스트

mapDao.delete("groupId.artifactId.sample_delete", map);

//중복키 INSERT 테스트

try{

TransactionTest.testDuplecateInsert(map); --> testDuplecateInsert 클래스에서는 같은 데이터(map)를 insert 시도

                                                                                        --> 예외 발생(SQLServerException)

}

catch(Exception e){

//예외 발생 시 INSERT 여부 파악

List<Map<String, Object>> list = mapDao.list("groupId.artifactId.sample_select", map);

if(list.size() == 0 ) {

   System.out.println( "rollback success!" );

}else{

   System.out.println( "rollback fail!" );

}

}

}


위의 class를 test 클래스로 만들고 공통모듈 'aop'쪽에 TestTransaction.java 라는 클래스를 만들어 실제 testDuplecateInsert 메서드를 수행했다.

위 클래스에서 마우스 우측 > run as > junit Test 를 클릭하면 junit test 가 수행된다. (junit 테스트 관련 정리는 다음 포스팅에~!!)


그, 결과 삭제 후 insert 도중 exception이 발생하여 예외가 발생하기전에 insert 수행 처리 되었던 row까지 전부 rollback 되었다. 

트랜잭션 rollback 성공!!


<-- 발생 Exception: SQLServerException -->

com.microsoft.sqlserver.jdbc.SQLServerException: PRIMARY KEY 제약 조건 'TB_SAMPLE'을(를) 위반했습니다. 개체 'dbo.TB_SAMPLE'에 중복 키를 삽입할 수 없습니다. 중복 키 값은 (2017, testID, tester)입니다.

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)

at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)

at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)

at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)

at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)

at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)

at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)

at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:320)

at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)

at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)

at net.sf.log4jdbc.PreparedStatementSpy.execute(PreparedStatementSpy.java:418) 


     ....... 생략

 rollback success!



트랜잭션을 무작정 걸기 전에, 왜 트랜잭션을 쓰는지, 어디에 걸어야 성능측면에서 가장 효율적일지 등의 고민을 해야할 것 같다. 

설정 후 테스트도 충분히 해보고~!


__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.


  - https://ko.wikipedia.org/wiki

  - https://spring.io/guides/gs/managing-transactions/

  - https://blog.outsider.ne.kr/869





'Spring' 카테고리의 다른 글

[에러] no matching editors or conversion strategy found  (0) 2017.04.20
(작성중) dispatcher-servlet.xml 설정  (0) 2017.04.16
spring - profile  (0) 2017.03.19
Spring - BeanNameViewResolver  (0) 2017.01.29

맨날 정리해봐야지 하면서도, 기술적인 요소들 익히는데 급급해 가장 기초적인 것들을 놓치고 있었다.

누군가에게는 기술적인 것들이 더 중요할 수 도 있지만, 내가 맡은 역할 기준에서는 고객과의 커뮤니케이션을 하는 데 있어서

이런 부분도 꼭 알아두어야 할 사항이다. 


차근히 하나씩 공부하고 정리해봐야겠다!



# 소프트웨어 개발방법론


1. 방법론?


    - 방법론이란, 무엇을 어떻게 해야 하는지 제시하는 것

    - 특정한 목적을 달성하기 위해 사용되는 일련의 효율적인 기술 절차

    - 방법론(Methodology) = 방법(Method) + 지식과 경험(Knowledge How)



2. 소프트웨어 개발방법론?


    - 소프트웨어를 생산하는 데 필요한 반복적인 과정들을 정리한 것 

    - 소프트웨어 개발 계획 부터 구축, 운영에 이르기까지의 절차, 도구, 기법, 산출물 표준들의 체계적인 집합.

    - 소프트웨어 공학 원리를 소프트웨어 생명주기에 적용한 개념으로, 정보시스템을 개발하기 위한 작업활동, 절차, 산출물, 기법 등을 체계화 한 것.



3. 소프트웨어 개발방법론 쓰는건지?


    (1) 작업의 표준화로 인한 프로젝트 관리 용이

         - 프로젝트의 시작, 중간 과정, 종료의 기준이 명확해짐

         - 관리 포인트를 지정할 수 있고, 전체 개발과정이 가시화 됨

         


    (2) 효율적인 의사소통 

         - 표준 방법과 양식에 의거한 체계적인 요구사항 유지, 활용

         - 정형화된 절차와 표준용어 사용을 통해 의사소통의 오류를 최소화.

         - 고객 뿐만 아니라 프로젝트 팀 내부적으로도 효율적인 의사소통 가능


    (3) 소프트웨어의 품질 관리    

         - 표준 산출물, 표준 절차를 통한 작업 기준 제시 

         - 도구와 기법 활용을 통한 작업 효율 극대화

         - 각 단계별 검증과 종결승인을 통해 일정 수준의 품질 보증

         - 소프트웨어 프로젝트가 대형화되면서, 개발기간의 장기화로 예산, 기간, 품질 상 복합적인 문제가 대두되었고, 이를 해결하기 위한

           방법으로 소프트웨어 개발방법론 사용

 


4. 소프트웨어 개발방법론 구성요소


     




5. 소프트웨어 개발방법론의 변화   


 

 구조적 방법론 

(Structured Development)

정보공학 방법론

객체지향 방법론

CBD 방법론  

(Component Based Development)

서비스 지향 방법론

(Service Oriented Development) 

 sum up

업무활동 중심 

절차중심

데이터 중심 

모델링기반

객체, 클래스 및 이들의 관계를 식별하여 설계모델로 변환 

재사용 가능한 컴포넌트를 사용한 개발

 

 역사

1970~1980년대 

  - 민간영역으로 컴퓨터가 사     용되면서 고객의 요구사항     발생 시작

  - 체계적인 대응책 필요

  - 1968, 소프트웨어 위기론

  - 폭포수 방법론 등장

  - 과거의 소규모 프로그램       을 벗어나 기업 전사적 차     원의 대규모 시스템 구축     을 위한 체계적인 절차가     필요

 1990년대 주류
  - 프로젝트의 효율성과 생     산성에 초점

  - 대형 프로젝트 증가

  - 객체지향언어(JAVA,  C++) 전성기

  - 반복과 통합 프로세스 탄생

  

 대표적인 방법론

폭포수 방법론  - 프로토타입
 - 정보공학방법론

 - CBD

 - 반복적 개발

 - RUP

 - XP

 - Agile

 - 마르미

 

프로세스

 추상화 > 구체화 > 단계적 상세화 > 모듈화 

 정보전략계획 > 업무영역 분석 > 업무시스템 설계 > 시스템 구축 

 요건정의 > 객체지향 분석 > 객체지향 설계 > 테스트 / 배포

 요구사항 분석 > 설계 > 개발 > 개발 및 테스트 > 릴리즈 > 교육

 

 특징

 - 프로그램 로직 중심

 - 정보와 정보, 기능과 기능간의 구조화 

 - 하향식

 - 프로세스 중심

 - 절차적 프로그래밍

  - 프로그램 로직은 데이터       구조에 종속 

 - 데이터 모델 중시

 - 기업의 전략경영에 맞는      시스템 구축을 중시함

 - 공학적 접근 방식: 분석,      설계 등 초기 단계에서 철    저하게 작업 

 - 초기 단계 부터 사용자를      참여시켜 불명확한 요구사    항을 없애고자 함

 - 객체중심

 - 사용자 참여 중시

 - 데이터와 로직 통합(객체)

 - 고도의 모듈화 

 - 기업정보시스템 중심

 - 컴포넌트 기반
 - 재사용성 중시

 - 반복과 통합 중시

 - 객체방법론의 진화된 형태

 - 인터페이스 중시 

 - 프레임워크 지향 프로그래    밍

 

 관련언어

 - COBOL, C, VB, PASCAL 

  - C++, JAVA, C#, VB

  

 장점

 - 구조적 방법론에서는 상하    관계가 명확하고, 결합도가 
   강하므로 어떻게 처리되는    지 프로세스가 쉽게 그려지    기 때문에 사소한 기능 수      정에는 편리하다.

  

  - 각 객체는 독립적이다. 즉,     응집도는 높고 결합도는       낮다

 - 개별적인 객체의 작동은      파악하기 쉽다

 - 각 객체가 독립적이여서      새로운 기능을 추가하거나    재활용 시, 기존 구조에 큰    영향을 주지않고 수정 가능    하다

 

 단점

  - 폭포수모형의 특성처럼 잘     못된 작업에 대해서는 거       스르기가 어려운 경직된       구조

 - 데이터 설계 방법의 결여

 - 대규모의 복잡합 시스템에    비효율적

 - 새로운 기능을 추가하거나    재활용하려면 각 기능들을 

   다시 뜯어내야 하므로 비용    이 많이 든다.

  

 - 객체 전체의 작동 원리를      알기 위해서는 객체간의 관    계 정립이 필요하다

 

 

 기타

 - 시스템의 대표적인 기능을 찾아내고, 대표적인 기능을 수행하기 위한 서브 기능을 찾아가는  식으로 분석

 - 예를 들어, '사람'을 구조적으로 분석하면

   대표기능: 밥먹기

   서브기능: 이빨로 씹는다 > 목구멍으로 넘긴다 > 위에서 녹인다 > 장에서 흡수한다 

   

 

 - 컴포넌트: 인터페이스를 통    해 서비스를 제공하는 소프    트웨어 패키지

 - 세부에서 전체를 만들어가    는 상향식 방법

 - 시스템의 구성요소들을 찾    아내고, 구성 요소들간의      연관성을 증명해내는 과정

 - 예를 들어, '사람'을 객체지    향적 분석을 해보면

  1. 객체모델링: 뇌, 눈, 코,          귀, 입, 치아, 심장, 근육        등

 2. 기능모델링: 이빨로 자른       다, 목구멍을 통해 넘긴다,     위에서 녹인다 등

 



Q. 어느 방법론이 가장 잘 만들어진 방법론인지? 방법론 선택 기준은?


   --> A. 최고의 방법론이 무엇인지에 대한 답은 없다.  프로젝트 특성, 규모, 가용자원, 요구사항의 명확도, 프로젝트 참여자의 수준, 프로젝트 기간 등

            프로젝트 환경을 고려했을 때 가장 적합한 방법론을 찾는 것이 해당 프로젝트에게는 최고의 방법론이 된다.



Q. 객체지향방법론과 CBD 방법론의 차이는?


   --> A. 우선, 두 방법론은 재사용의 범위나 규모가 다른 만큼 기본 개념이나 개발 방식에 있어 많은 차이가 있다.

            단순히 객체를 재사용하느냐, 컴포넌트를 재사용하느냐의 차이는 아니다.

            컴포넌트 역시 객체 재사용을 통해 만들어지고, 객체가 만들어지면서 컴포넌트화 되기 때문에 재사용 대상만을 놓고 비교하기엔 애매하다.

            

            1. 소스코드 재사용 vs binary 파일 재사용

               : 객체지향방법론은 소스코드 레벨의 표준만 가지고 있었다. 하지만 CBD는 binary 파일 형태의 재사용을 가능하게 해주었다.


            2. 클래스(class) vs 컴포넌트(component)

               : class는 시스템 분석/설계의 모델링 활동의 결과이고, component는 프로그램된 결과물이다. 

                 class는 논리적 측면의 재사용이라 볼 수 있고, component는 물리적 측면의 재사용이라 볼 수 있다. 

                 component의 활용규모가 더 크므로, 재사용 효과도 더 크다고 볼 수 있다.


            3. 접근 방법

               : component는 interface를 통해 접근 가능하다. 따라서 요구사항에 부합하는 component를 시장에서 구입/활용 가능하다.

                 표준화된 아키텍처만 준수한다면, 다른 컴포넌트로 쉽게 교체도 가능하며, 높은 유지보수성과 호환성을 보장한다.


            4. 개발 vs 조립

               : 객체지향방법론이 재사용을 통한 효과적인 '개발'에 초점을 맞춘다면, CBD는 개발보다는 '조립'에 초점을 맞춘다.

                 component를 식별하고 정의하는 것이 CBD의 핵심.


 


Q. 구조적방법론과 정보공학방법론의 차이는?

    

  --> 






__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.


  - http://zakarum.tistory.com/

  - http://m.blog.naver.com/seilius/130185981952

  - ttps://ko.wikipedia.org/wiki/

  - http://blog.naver.com/neovader/150015541094

  - http://imp17.com/tc/myevan/185

  - http://m.blog.naver.com/jvioonpe/220246556042



# MSSQL - LEN ( ) 함수


1. LEN () 역할


   - 문자열의 길이를 계산하여 반환해주는 역할의 함수

   - 비슷한 역할의 함수로 datalength() 함수가 있는데 , datalength는 문자열의 byte 수를 반환한다.

      (참고로 한글은 한 자에 2byte)


   - 아래는 예시로 함수를 사용해 본 결과 캡쳐이미지다.

   

  




__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.




'Database > MSSQL' 카테고리의 다른 글

MyBatis + MSSQL 사용 시 LIKE 구문  (0) 2017.02.26
MSSQL - Numeric() 소수점 자릿수 지정 함수  (0) 2017.02.26

프로젝트에서 개발을 하던 중 내가 알던 for문과는 다른 형태의 for문을 쓰는 소스를 보았다.

처음 봤을 땐 역할이 약간 다른 for 문인가 싶었는데, 차장님이 보시더니 성능면에서 좀 더 향상된 for문이라고 알려주셨다.


자세히 알아보기 위해 정리해보았다.


# JAVA - For 문


1. 기존 For문 

   

    - for(초기화; 조건; 증감)

    

for(int i=0; i <100 ; i++) {

     .... 반복 수행 할 로직

 }    



2. 배열에 이용되는 For문 


    - for(변수타입 변수 : 배열)

    - Java 1.5 부터 향상된 for문 제공

    - 배열에 들어있는 값들을 하나씩 왼쪽 변수에 할당한다. 

    - 단, 배열의 자료형과 변수의 타입이 같아야 한다. 

    - 기존 for 문 처럼 조건문으로 size를 주지 않아도, 알아서 배열 크기 만큼 for문을 수행한다. 또, 기존처럼 반복 변수를 따로 선언해줄 필요도 없다.

    - 단, 배열의 값을 가져다 쓸 수 만 있고, 수정해 쓸 수는 없다.

    - 아래 예시는 array 배열 데이터를 object에 담아 insert 쿼리를 수행하는 소스다. 


for (Object object : array) {

mapDao.update("groupId.artifactId.context.mapper.tb_insert", (Map) object);

 }



    - 실제로 향상된 for문이 항상 성능이 더 좋은 것은 아니다. 때에 따라 기존 for문의 속도가 더 빠른 경우도 있다. 

      통상 반복 횟수가 많을 수록 향상된 for문의 성능이 더 좋다고 하지만, 그 정도는 정말 미세한 차이라고 하니 사용하기 쉽고, 가독성이 더 좋은 for문으       로 선택하는게 좋을 것같다.

      


__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.


'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
system32와 systemWOW64  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

# MyBatis + MSSQL 사용 시 LIKE 구문


MariaDB (MYSQL 문법) 쓰다가 MSSQL 을 써보았는데, LIKE 구문 작성 형식이 달라 처음에 읭?? 했었다.

다른 쿼리에서 에러난 줄 알고 한참 보고있었는데, 결국 에러 원인은 LIKE 구문이었다 ㅎㅎ. 미세하게 다르다.


1. MyBatis + MariaDB 사용 시 LIKE 구문


 USERNAME  LIKE '%' #{USERNAME } '%'



2. MyBatis + MSSQL 사용 시 LIKE 구문 

   

   - 동적으로 받아오는 입력값 양옆으로 + 를 붙여줘야 한다.


 USERNAME LIKE '%' + #{USERNAME} + '%' 



3. 참고


   - LIKE 구문은 문자열 중 해당 문자를 포함하고 있는 문자열을 검색해주는 기능을 한다. 

   - 주로 검색 조건 값을 처리할 때 사용되는 연산자이다.

   - 아래 표는 LIKE 연산자 사용 시 함께 사용되는 와일드 카드들이다.

   

 %

  여러 문자
 _  단일 문자

 [ ]

  [ ]에 속하는 하나의 패턴과 일치하는 단일 문자 

  

  예) LIKE '[0-9][0-9][0-9]%';

      결과--> 앞의 세글자가 각각 숫자인 것을 찾아냅니다.

 [^]

  [ ] 에 속하는 패턴에 포함되지 않는 단일 문자



__________________________________________________________________________________________________________________________________________________________
** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 
** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.

 


'Database > MSSQL' 카테고리의 다른 글

MSSQL - LEN() 문자열 자릿수 반환  (0) 2017.02.26
MSSQL - Numeric() 소수점 자릿수 지정 함수  (0) 2017.02.26

# MSSQL - Numeric(p,s) 함수


1. 역할


   : 소수점 자릿수를 지정하는 함수

   : 파라미터 p는 소수점 이하 자리를 포함한 총 자릿 수 이며, s는 소수점 이하 자릿 수 만을 의미한다.

   : s 를 생략하면 default 로 0으로 설정된다.

 

2. Example


   : AVG_PAY AS Numeric(6,2): AVG_PAY라는 필드의 값을 소수점 이하 두 자리로, 소수점 이하 두자리 포함 전체 6자리의 수까지만 허용하겠다는 뜻.

   : Numeric (6,2) 의 결과로 올 수 있는 숫자들로는 5,200.50 / 240.38 / 9,900.99  등이 있다.



'Database > MSSQL' 카테고리의 다른 글

MSSQL - LEN() 문자열 자릿수 반환  (0) 2017.02.26
MyBatis + MSSQL 사용 시 LIKE 구문  (0) 2017.02.26

+ Recent posts