2022 01 07 - oneso123456789/2022 GitHub Wiki

스프링과의 연동처리

SQLSessionFactory를 이용해서 코드를 작성해도 직접 Connection을 얻어서 JDBC코딩이 가능하지만,
더 편한한 작업을 하기 위해서 SQL을 어떻게 처리할 것인지를 별도의 설정을 분리해 주고,
자동으로 처리되는 방식을 이용하는 것이 좋습니다.
이를 위해서는 MyBatis의 Mapper라는 존재를 작성해 줘야 합니다.

Mapper는 쉽게 말해서 SQL과 그에 대한 처리를 지정하는 역활을 합니다.
MyBatis-Spring을 이용하는 경우에는 Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성할 수 있습니다.

Mapper인터페이스

Mapper를 작성하는 작업은 XML을 이용할 수도 있지만, 최소한의 코드를 작성하는 Mapper 인터페이스를 사용해보겠음

com.crow.mapper라는 package를 만들고, TimeMapper라는 인터페이스를 추가함(src/main/java)
TimeMapper 인터페이스에는 MyBatis의 어노테이션을 이용해서 SQL을 메서드에 추가합니다.

Mapper 설정

Mapper를 작성해 주었다면 MyBatis가 동작할 때 Mapper를 인식할 수 있도록 root-context.xml에 추가적인 설정이 필요함
가장 간단한 방식은 mybatis:scan태그를 이용하는것임
root-context.xml 파일을 열고, 아래쪽의 'Namespaces'항목에서 'mybatis-spring'탭을 선택합니다.
mybatis-spring:scan 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아서 처리합니다.
Mapper를 설정하는 작업은 각각의 XML이나 Mapper 인터페이스를 설정할 수도 있지만,
매번 너무 번잡하기 때문에 자동으로 com.crow.mapper 패키지를 인식하는 방식으로 작성하는 것이 가장 편리함.

Mapper 테스트

MyBatis-Spring은 Mapper 인터페이스를 이용해서 실제 SQL 처리가 되는 클래스를 자동으로 생성함.
따라서 개발자들은 인터페이스와 SQL만을 작성하는 방식으로 모든 JDBC처리를 끝낼 수 있음.

작성한 TimeMapper를 테스트하는 코드는 src/test/java 밑에 com.crow.persistence.TimeMapperTests라는 클래스를 생성해서 처리.
테스트중
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.ibatis.reflection.Reflector (file:/C:/Users/oneso/.m2/repository/org/mybatis/mybatis/3.4.6/mybatis-3.4.6.jar) to method java.lang.String.value()
WARNING: Please consider reporting this to the maintainers of org.apache.ibatis.reflection.Reflector
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
라는 오류가 야기된거 같은대 pom.xml에서 mybatis 버전을 잠시 3.4.6에서 3.5.4로 변경하고
다시 JUnit으로 테스트 성공후 3.4.6으로 돌려서 테스트 해보니 해결됨 notebook에서 브런치를 옴겨서 다시 테스트 해봐야겠음
마지막으로 테스트해보니 다시 생겨서 그냥 버전을 3.5.4로 변경하겠음
그리고 INFO : com.crow.persistence.TimeMapperTests - 2022-01-06 15:54:48.0
ec2상에 올라가있는 oracle 서버 시간이 안맞음 .. 이건 확인결과 ubuntu 서버의 시간이 UTC 기준으로 되어있어서 그럼
Thu Jan 6 15:59:07 UTC 2022
https://blog.buffashe.com/2020/02/changing-ubuntu-timezone/ 여길 참고해서 내일 바꾸겠음.

위의 코드는 TimeMapper가 정상적 사용이 가능한지 알아보기 위해 만들어짐
제대로 동작한다면 스프링 내부에는 TimeMapper타입으로 만들어진 스프링 객체(빈)이 존재한다는뜻임
위의 코드에서 timeMapper.getClass().getName()은 실제 동작하는 클래스의 이름을 확인해 주는데 실행결과를 보면
개발 시 인터페이스만 만들어 주었는데 내부적으로 적당한 클래스가 만들어진 것을 확인할 수 있음(더 자세한 내용은 스프링 AOP참고)

01 07 저녁 9시

타임존 설정 완료함 sudo timedatectl set-timezone Asia/Seoul 그러나 ubuntu에만 설정함
위의 코드로 테스트 해본결과 db 타임 스탬프도 정확히 나오지만 또 시간이 다르게 나올시 oracle쪽도 설정해줘야겠음
또한 하는김에 useradd로 추가한 crow 계정과 (usermod -G dba 계정이름로 sysdba권한 부여함) oracle 계정에도 오라클 환경변수를 추가해줌 05일 리포트 참고

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe   
export ORACLE_SID=XE     
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`    
export ORACLE_BASE=/u01/app/oracle    
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH    
export PATH=$ORACLE_HOME/bin:$PATH
그러나 이게 등록후 sqlplus 명령어가 안먹혀서 알아보니 환경 변수 등록후 source ~/.bash_profile 로 반영을 안해줌

XML 매퍼와 같이 쓰기

MyBatis를 이용해서 SQL을 처리할 때 어노테이션을 이용하는 방식이 압도적으로 편리함
하지만, SQL이 복잡하거나 길어지는 경우에는 어노테이션 보다는 XML을 이용하는 방식을 더 선호하게 됨
MYBatis-Spring의 경우 Mapper와 XML을 동시에 이용할수있음 ^오^b

XML을 작성할땐 파일의 위치와 namespace속성이 중요함
Mapper 인터페이스가 있는곳에 같이 작성하던가 src/main/resources경로에
com/crow/mapper/TimeMapper.xml파일 생성(반드시 한번에 하나씩 폴더를 생성해줘야함 한번에 폴더를 만들면 제대로 인식 안될수있음)
또한 XML파일을 만들때 이름에 대한 규칙은 없지만 가급적 Mapper 인터페이스같은 이름을 사용해서 가독성을 높여야함

XML 파일에는 MyBatis의 XML 매퍼에서 이용하는 태그에 대한 설정이 필요함. 이에 대한 자세한 정보는 http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html을 추가 참고
Mapper인터페이스와 XML을 같이 이용해보기 위해서 기존의 TimeMapper 인터페이스에 추가적인 메서드를 선언함.

TimeMapper 인터페이스를에 getTime2()를 추가했지만 특이하게도 @Select와 같이 MyBatis 어노테이션이 존재하지 않고,
SQL 역시 존재하지 않는다.

MyBatis는 Mapper 인터페이스와 XML을 인터페이스 이름과 namespace 속성값을 가지고 판단함
위와같이 com.crow.mapper.TimeMapper 인터페이스와 XML의 <mapper namespace="com.crow.TimeMapper">와 같이 동일한
이름이 존재하면 이를 병합해서 처리함.

따라서 이 이 방식은 메서드 선언은 인터페이스에 존재하고 SQL에 대한 처리는 XML을 이용하는 방식임

태그의 id속성값은 메서드의 이름과 동일하게 맞춰야함. 또한 태그의 경우 resultType 속성을 가지는데 이 값은 인터페이스에 선언된 메서드의 리턴 타입과 동일하게 작성함 최종적으로 testGetTime2()메서드의 결과값은 getTime()과 동일함.

⚠️ **GitHub.com Fallback** ⚠️