본문 바로가기

웹 개발(OLD)/Spring Framework(OLD)

Spring + MySQL 연동 테스트 매뉴얼

- 전체 코드


BasicSettingProject.zip


- 순서


0. 우선 톰캣 서버와 MySQL(Workbench)이 설치되어 있다는 가정하에 진행합니다.


1. File-New-Spring Legacy Project-Spring MVC Project를 생성해준다. 이때 지정하는 패키지는 스프링이 기본으로 참고하게되는 패키지이다.


이 작업이 완료되면 STS는 기본적으로 maven을 내장하고 있기 때문에, 프로젝트 생성 시 바로maven을 이용해서 필요한 스프링 라이브러리를 다운로드 받는다. 완료되면 다음과 같은 폴더트리로 구성된 스프링 프로젝트가 생성되고 주요 폴더의 용도는 다음과 같다. 참고로 이때 폴더 옆에 S가 있는 것들은 스프링이 관리하고 있는 것들이라는 의미이다.

src/main/java : 개발되는 java 코드의 경로

src/main/resources : 서버가 실행될 때 필요한 파일들의 경로

src/test/java : 테스트 전용 경로( 각 테스트 코드 작성 경로)

src/test/resources : 테스트 시에만 사용되는 파일들 경로

spring : Spring 설정 파일의 경로

views : JSP 파일의 경로

pom.xml :Maven의 설정 파일



2. 스프링과 java-jdk버전을 최신으로 변경해주고, 프로젝트의 전체 테스트를 담당하는 jUnit은 4.7 정도로 버전이 설정되는데, 이후에 사용하는 스프링의 테스트에서는 높은 버전의 jUnit을 써야 하는 경우가 많기 때문에 pom.xml에서 다음과 같이 4.12버전으로 수정해준다. 그리고 저장해주면 Maven Dependencies에서 변경된 라이브러리를 확인할 수 있다.



3. 스프링은 설정 하나만 잘못해도 로딩하지 않고 에러를 낸다. 따라서 한 단계 한 단계 설정을 할 때마다 테스트를 반드시 해주어야한다.

특히, IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당하는 BeanFactory인 ApplicationContext가 잘 생성되었는지 test 후에 진행해야한다. 테스트에 앞서 테스트에 필요한 라이브러릴 pom.xml에 다음과 같이 spring-test 를 추가해준다. 이 스프링 모듈은 WAS없이 테스트할 수 있는환경을 만들어준다. 따라서 WAS 한 번 구동시켜서 테스트하는데에 오래 걸릴경우 필수 적인 테스트 모듈이다. 





테스트 결과 아래와 같이 콘솔에서 log들이 잔뜩 찍히고 ApplicationContext가 만들어진 것을 확인할 수 있다. 테스트 클래스 상단의 어노테이션 두가지(11, 12라인)은 현재 테스트 코드를 실행할 때 스프링이 로딩되도록 하는 부분이다. 어쨌든 기본적인 스프링 프로젝트의 세팅과 테스트는 마쳤다. 이제 MySQL과 연동을 해보자.


4. 먼저 DB와 관련된 라이브러리들(spring-jdbc, mysql-connector-java, log4jdbc-log4j2-jebc4.1)을 다음고 같이 pom.xml에 각각 추가해주고,

src-main-resources아래에 log4jdbc.log4j2.properties파일과 logback.xml 파일을 추가해준다.(아래에 첨부했음) 이 경로에 추가하면 위의 src/main/resources 밑에도 자동으로 추가되기 때문에 여기에 추가하는 것이다.


log4jdbc.log4j2.properties


logback.xml





5. 이제 조금전에 추가한 spring-jdbc 모듈의 클래스를 이용해서 root-context.xml에 다음과 같이 DataSource라는 것을 추가한다. DataSource 는 JDBC의 커넥션을 처리하는 기능을 가지고 있기 때문에 데이터베이스와 연동 작업에 반드시 필요하다.

참고로 url에서 team4는 MySQL에서 Local접속 설정시 지정한 기본 스키마 이름이다.


6. 그러면 이제 이 DataSource를 갖고 DB와 연결이 되는지부터 테스트를 해주어야 한다. 그러면 다음과 같이 연결이 되는 것을 확인할 수 있다.



7. 이제 실제로 DB에 쿼리를 날려서 받아올 수 있는지 테스트 해볼 차례이다. 먼저 DB관련 코드를 작성할 것이기 때문에 패키지를 org.zerock.persistence로 새로 만들어서 이 안에 다음과 같이 클래스를 설계 하도록한다.( 간단히 오늘 날짜를 받아오는 쿼리를 날린다. )

그런데 위의 사진을 보면 폴더트리에서 TimeDAO에 S표시가 없는 것을 볼수 있다. 즉 스프링이 관리하는 것이 아니라는 뜻이다. 이건 왜 그럴까?

스프링이 프로젝트 생성시 지정하였던 기본 패키지인 org.zerock.controller의 클래스가 아니기 때문이다. 따라서 기본 패키지 외의 패키지내의 클래스도 어노테이션을 메기면 스프링이 관리할 수 있도록 설정을 해주어야한다. 먼저 아래 처럼 servlet-context.xml에 가보면 기본 패키지가 잡혀있는 것을 볼 수 있다. 



8. servlet-context는 웹과 관련된 설정을 하고, 웹 자원과 관련되지 않은 DB나 서비스 설정은 root-context.xml에서 해준다. 따라서 다음과 같이 root-context.xml에 추가해준다. 그런데 오류가 날 것이다. 그 이유는 context 태그를 사용하도록 설정하지 않았기 때문이다. xml의 네임스페이스 탭을 눌러서 context를 체크하여 사용할 수 있도록 해주고 저장하면 에러가 사라질 것이다. (이후에도 스프링 프레임워크에 다양한 설정을 하기 위해서는 STS상에서 네임스페이 탭을 이용해 사용 가능한 XML 태그의 폭을 넓혀 줘야 한다. )



아 이렇게 한 순간 다음과 같이 TimeDAO 옆에 S 표시가 된 것을 확인할 수가 있다(스프링이 이제 해당 클래스를 관리한다는 의미이다.)


9. 이제 다음과 같이 TimeDAO를 테스트하는 코드를 작성하고 테스트 해보면 DB로 쿼리를 보내고 그 결과를 받아오는 작업이 되는지를 확인할 수 있다.

결과를 보면 DB 드라이버 로딩부터 커넥션 연결, 쿼리 수행, 커넥션 닫기 등 DB와 관련된 로그들과 함께 결과가 올바르게 콘솔에 출력되는 것을 확인할 수 있다. 



10. 결론적으로 모든 세팅과 테스트는 완료했지만 추가적으로 덧붙이자면, TimeDAO클래스에서 어노테이션을 쓰지 않고 xml파일을 수정하여 스프링이 관리하도록하여 의존성주입하는 방법이 있다.

우선 다음과 같이 @Repository와 @Inject를 주석처리 해준다. 이 순간 다음과 같이 TimeDAO 옆에 S 표시도 사라지는 것을 볼 수 있다.(스프링이 관리하지 않는다는 의미)


11. 이제 root-context.xml에 다음과 같이 추가해준다.


그런데 위와 같이 ds에서 오류가 난다.(자세한건 위 사진의 주석을 참고) property는 setter메소드 방식으로 처리되는데 timeDAO에 setter메소드가 없기때문이다. 따라서 다음과 같이 setter 메소드를 추가해주면 오류가 사라지는 것을 확인할 수 있다.



어쨌든 테스트하면 다음과 같이 결과가 적절히 출력되는 것을 확인할 수 있다.



끝.