[꼼꼼한 개발자] 꼼코더

15. 코드로 배우는 스프링 웹 프로젝트 - [스프링과 DataBase 연동] - XML 매퍼와 같이 쓰기, log4jdbc-log4j2 설정 본문

Spring/코드로 배우는 스프링 웹 프로젝트

15. 코드로 배우는 스프링 웹 프로젝트 - [스프링과 DataBase 연동] - XML 매퍼와 같이 쓰기, log4jdbc-log4j2 설정

꼼코더 2023. 1. 2. 19:42
반응형
 

🤝 XML 매퍼와 같이 쓰기

MyBatis를 이용해서 SQL을 처리할 때 어노테이션을 이용하는 방식이 압도적으로 편리하긴 하지만

SQL이 복잡하거나 길어지게 되면 XML 방식을 더 선호하게 된다.

MyBatis-Spring은 Mapper 인터페이스와 XML을 동시에 이용이 가능하다.

 

XML 작성 시 XML 파일의 위치, XML 파일에서 지정하는 namespace 속성이 중요하다

XML 파일 위치는 Mapper 인터페이스가 있는 곳에 같이 작성하거나

src/main/resources 구조에 XML을 저장할 폴더를 생성 할 수도 있다.

 

XML 파일을 만들 때 이름에 대한 규칙은 없다.

하지만 가능하면 Mapper 인터페이스와 같은 이름을 이용하자.(가독성을 위해)


👨🏻‍💻 TimeMapper.java 수정

XML 파일에는 MyBatis의 XML 매퍼에서 이용하는 태그의 대한 설정이 필요합니다.

 

우선 Mapper 인터페이스와 XML을 같이 이용하기 위해 기존 TimeMapper 인터페이스 파일에 메서드 추가.

TimeMapper 인터페이스를 보면

MyBatis의 어노테이션과( @Select) SQL 역시 존재하지 않는다.

 

실제 SQL은 XML을 이용해서 처리하게끔 TimeMapper.xml 클래스 추가


👨🏻‍💻 TimeMapper.xml 추가

src/main/resources → org → zerock → mapper 작성(반드시 한 번에 하나씩 생성)

이후 TimeMapper.xml 파일 작성

XML 매퍼 사용 시 신경 쓸 부분은 <mapper> 태그의 namespace 속성값이다.

MyBatis는 Mapper 인터페이스와 XML을 인터페이스의 이름과 namespace 속성값을 가지고 판단한다.

 

<select> 태그의 id 속성값은 메서드의 이름과 동일하게 해야 한다.

그 이유는 resultType 속성을 가지는데 ‘이 값은 인터페이스에 선언된 메서드의 리턴 타입과 동일하게 작성한다.’

 

코드와 같이 ‘org.zerock.mapper.TimeMapper’ 인터페이스가 존재하고

XML의 <mapper namespace = "org.zerock.mapper.TimeMapper">와 동일한 이름이 존재하면

이를 병합해서 처리한다.

 

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

 

💁🏻‍♂️ 테스트 코드 작성 후 결과

TimeMapperTests 클래스 수정 후 결과를 확인해 보자.


⚙️ log4 jdbc-log4 j2 설정

MyBatis는 내부적으로 JDBC의 PreparedStatement를 이용해서 SQL을 처리한다.

따라서 SQL에 전달되는 파라미터는 JDBC와 같이 ‘?’로 치환되어 처리된다.

 

복잡한 SQL의 경우 ‘?’로 나오는 값이 제대로 확인이 어렵다. 이런 문제를 해결하기 위하여

PreparedStatement에 사용된 ‘?’가 어떤 값으로 처리되었는지 확인하는 기능을 추가하자.

 

👨🏻‍💻 pom.xml 코드 추가(라이브러리 설정)

라이브러리를 추가하였으면

1) 로그 설정 파일 추가

2) JDBC의 연결 정보를 수정해야 한다.

 

👨🏻‍💻 log4 jdbc.log4j2.properties 파일 추가

 

log4jdbc를 이용하는 경우는 JDBC 드라이버와 URL 정보를 수정해야 합니다.

👨🏻‍💻 root-context.xml수정

root-context.xml의 일부를 수정한다.

dataSource() 메서드에서 변경되는 부분은 JDBC 드라이버의 클래스를

"net.sf.log4jdbc.sql.jdbcapi.DriverSpy"로 수정하는 작업과

JDBC연결 URL 중간에 ‘log4jdbc’ 문자열이 추가되는 부분이다.

정상적으로 설정되어 있지 않으면 데이터베이스의 로그가 정상적으로 기록되지 않는다.

💁🏻‍♂️ 결과

이전과 다른 JDBC와 관련된 로그들이 출력된다.

Java설정을 이용하는 경우에는 RootConfig 클래스를 아래와 같이 수정


⚙️ 로그의 레벨 설정

테스트 코드를 실행하면 상당히 많은 양의 로그가 출력된다.

따라서 시간이 지나면 개발할 때 불편하다고 느낄 수 있다.

 

이러한 상황은 로그의 레벨을 이용해서 수정이 필요하다.

 

👨🏻‍💻 log4j.xml 수정

test/resources 밑에 log4j.xml을 수정한다.

테스트 코드 실행 시 보이는 ‘INFO’ 메시지는 log4j.xml의 마지막 부분에 설정 영향을 받기 때문.

 

출력되는 로그를 조절하고 싶으면 <logger>를 지정해서 처리한다.

 

💁🏻‍♂️ 결과

확실히 결과코드가 많이 줄어들었다.

 

 


🧹 최종 정리

  • SQL이 복잡하거나 길어지게 되면 XML 방식을 더 선호
  • XML 작성 시 XML 파일의 위치, XML 파일에서 지정하는 namespace 속성이 중요하다
  • XML 매퍼 사용 시 신경 쓸 부분은 태그의 namespace 속성값이다.
  • <select> 태그의 id 속성값은 메서드의 이름과 동일하게 작성
  • resultType의 값은 메서드의 리턴 타입과 동일하게 작성
  • MyBatis는 JDBC의 PreparedStatement를 이용해서 SQL을 처리하기 때문에 전달되는 파라미터는 ‘?’로 치환되어 처리된다.
 

 

 

위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.

 

코드로 배우는 스프링 웹 프로젝트 - YES24

이 책은 Spring Framework(이하 스프링)를 사용해서 말 그대로 ‘웹 프로젝트’를 어떻게 진행하는지를 설명하는 책이다. 웹 프로젝트라고 거창하게 표현하지만, 좀 더 구체적으로는 스프링으로 웹

www.yes24.com

 

 

 
Comments