본문 바로가기

Spring

토비의 스프링 예제 실행 가이드

  얼마 전부터 토비의 스프링을 공부하기 시작했습니다. 책을 읽으면서 필요한 부분만 따로 구현해 연습해보고 싶었는데, 마침 책에 수록된 예제 코드가 출판사 홈페이지에 공식적으로 올라와 있더라구요. 그런데 공식 예제 코드가 eclipse STS에서 작성한 코드라 IntelliJ에서 실습해보기가 약간 까다로웠던 데다가, 사용한 MySQL 버전도 현재 상용화되어있는 버전과 맞지 않아 실습에 어려움이 많았습니다. 그래서 IntelliJ에서 gradle을 통해 실습해볼 수 있도록 레거시 코드들을 포팅 하고, 도커를 이용해 MySQL을 띄워 실습을 진행해봤습니다. (현재 ch5-fianl 코드만 포팅 완료하였습니다. 순차적으로 계속 진행할 예정이며 어떻게 포팅 하였는지 포스트 작성 중입니다.) 본 포스팅는 토비의 스프링 예제 실습을 위한 환경을 어떻게 구축해야 하는지, 그리고 어떻게 예제를 어떻게 실행시키는지에 대한 포스팅입니다.

예제 코드 저장소 : https://github.com/Deocksoo/Toby-spring-exmaple


실행 환경

  토비의 스프링 예제를 gradle 빌드 도구를 사용하도록 porting 하였습니다. 책의 예제를 그대로 따라 해 볼 수 있게 하기 위해 예제 코드들이 사용하는 라이브러리의 버전은 최대한 변경하지 않고 실행 환경만 porting 했습니다. porting 작업과 테스트는 모두 IntellJ IDEA 2019.2.3 Ultimate Edition을 통해 진행하였습니다. 테스트 환경은 아래와 같습니다.

  1. jdk 1.8
  2. Spring framework 3.1
  3. MySQL-connector-java 5.1.48
  4. MySQL 5.7 (user docker container)

예제 실행 가이드

본 가이드는 토비의 스프링 6장을 실습하기 위한 가이드입니다. 5장에서 완성된 최종 코드를 이용해 진행합니다.  

1.  예제 코드 import

1-1) 프로젝트를 시작할 디렉터리에 위의 깃허브 저장소를 클론 합니다.

cd project_directory
git clone https://github.com/Deocksoo/Toby-spring-exmaple

1-2) 클론 한 프로젝트를 아래와 같이 import 합니다.

Toby-spring-example을 import 해주세요
Gradle 프로젝트로 import

2. MySQL Server 설치 및 실행

  현재 상용화되어있는 MySQL 버전은 8 버전인데, MySQL 8 버전을 그냥 사용하는 경우 프로젝트 예제 코드에서 DB에 접근하기 위해 사용 중인 MySQL-connector-java 5.1.48 버전과 프로토콜이 맞지 않습니다. 물론 MySQL 8과 호환되는 MySQL-connector-java 8 버전을 사용해도 동작하기는 하지만, 예제 코드가 MySQL 5 버전을 기준으로 작성되었으므로 혹시 모를 삽질을 예방하기 위해 MySQL 5를 사용하는 것이 좋겠습니다.

2-1) Docker를 이용한 MySQL server 설치

  (혹시 docker를 사용해본 경험이 없으시더라도 프로젝트를 진행하는 데에는 어려움이 없으니 계속 진행해주세요.) 본 예제 실습에서는 docker를 이용해 MySQL을 설치합니다. Docker가 설치되어 있지 않다면 먼저 docker부터 설치해주세요. 굳이 docker를 이용해서 설치하는 이유는 격리된 환경에서 충돌 없이 예제 실습용 MySQL Server를 띄우기 위함입니다. Mac의 경우 이전 버전의 MySQL을 설치하는 것이 상당히 까다롭기도 한 데다가, 사용자 local에 MySQL 8이 이미 설치되어 있는 경우 아얘 5 버전이 설치되지 않는 경우도 있는 것 같습니다. Docker가 이미 설치되어 있으시다면 docker를 실행시키고, 아래 command를 따라가 주시면 됩니다.

cd docker                                 // 프로젝트 디렉터리 안의 docker 디렉터리로 이동 
docker-compose up -d             // docker-compose-yml 설정에 따라 MySQL server가 설치됩니다.

  현재 docker-compose.yml 에서 프로젝트 진행에 필요한 DB 설정을 대부분 자동으로 해주고 있습니다. 위 명령어만 입력하면 MySQL 5 server, 프로젝트 진행에 필요한 DB 계정 정보, MySQL 데이터베이스까지 모두 자동으로 생성해줍니다. 따라서 위의 yml 설정을 사용하는 경우 /sql/create_mysql_database.sql/sql/create_mysql_user.sql은 따로 실행하지 않아도 괜찮습니다.

2-2) MySQL 서버가 잘 설치되어서 실행 중인지 아래 command를 통해 확인해봅니다.

docker ps                              // 현재 실행 중인 container들을 모두 보여줍니다.

MySQL server가 docker 컨테이너 내부에서 잘 실행된 모습입니다. 로컬의 53306 포트와 연결되어 있는 상태입니다.

3. Database에 각 모듈별로 필요한 table 생성

  docker-compose.yml에서 database는 자동으로 만들어주지만, 각 장의 예제에서 사용할 테이블은 직접 sql을 실행시켜서 만들어주셔야 합니다. 모듈별로 sql 디렉터리가 하나씩 존재하는데, 실습하려는 예제 모듈에서 해당 디렉터리를 찾아 아래와 같이 user_create.sql을 실행합니다. sql을 실행할 때, 아래처럼 IDE가 제공하는 기능을 이용하면 보다 편리하게 테이블을 생성할 수 있습니다.

ch5-fianl 모듈 안에 sql 디렉토리에서 users_create.sql을 찾습니다.
user_create.sql을 열면 에디터 우측 상단에 configure data soure라는 문구가 뜹니다. 클릭해주세요. 
좌측 상단에 + 버튼을 눌러주세요
MySQL을 찾아서 선택
Port 번호, User, Password, Database 항목 입력 후 Test connection으로 연결 가능 여부를 확인해줍니다.
짜잔~ 이런 문구가 뜨면 성공! 이제 IDE에서 MySQL server에 query를 보낼 수 있게 되었습니다. Apply를 눌러주세요.

 

다시 user_create.sql로 이동해서, 실행시키려는 sql문 위에 커서를 두고 option + Enter 또는 Alt + Enter를 누르면 뭔가 창이 뜹니다. Enter를 누르며 계속 진행하면 sql이 실행됩니다.
그러면 console에 위와 같이 성공 메시지가 뙇! 테이블까지 모두 생성되었습니다.

이제 DB 설정까지 모두 완료되었습니다! 

4. 테스트 실행

4-1)  학습 예제를 작성하기에 앞서, 마지막으로 모든 설정이 제대로 다 되었는지 확인하기 위해 테스트를 한번 돌려봅시다. 그러려면 IDE 설정에서 확인해야 할 것이 하나 있습니다. settings 또는 preferences로 들어가 주세요.

Run test using : IntelliJ IDEA로 변경해주세요. Test task를 만들어두지 않았기 떄문에, IDEA의 도움을 받아 학습 테스트를 진행해나가야 합니다. 
변경된 설정 정보를 적용하기 위해 invalidate and restart를 한번 수행해줍니다.  

4-2) 이제 정말로 테스트 실행! ch5-fianl 모듈의 test들을 모두 실행해주세요. 만약 제대로 수행되지 않는다면 본 포스팅의 맨 아래 5번 항목을 참고해주세요.

여기까지 잘 수행되면 성공!

모든 테스트를 pass 한다면 성공입니다. 이제 토비와 함께 행복 코딩하러 갈 시간이네요.

 

5. 만약 마지막 단계까지 진행하고도 제대로 테스트가 수행되지 않는다면

5-1)  캐시를 날리고 restart 하는 경우에, gradle이 build 해놓은 것들까지 다 날아가버려서 application context가 제대로 시작되지 못했다는 문구와 함께 예외가 발생하는 경우가 있습니다. 그럴 때에는 아래처럼 gradle로 다시 한번 build 해 주세요.

 

5-2) CoreMatchers에서 deprecated된 is 메서드 때문에 complie 에러가 발생하는 경우

  2019.11.15 현재 CoreMatchers에서 클래스의 인스턴스인지 확인하는 기존의 CoreMatcher.is 메서드가 deprecated 되어있습니다. 따라서 특정 인스턴스의 클래스 타입을 체크하는 테스트를 작성해야 하는 경우 CoreMatcher.instanceOf 메서드를 사용해야 합니다.

기존의 CoreMatcher.is 메서드가 deprecated 되어있습니다. 컴파일 에러가 발생합니다.
따라서 deprecated된 is 메서드 대신 instanceOf를 사용해 테스트를 진행해주어야 합니다.

 

ps. 혹시 프로젝트에 문제가 있거나 내용 수정이 필요한 경우 피드백 환영합니다 :)

'Spring' 카테고리의 다른 글

Vue.js + Spring boot 개발 환경 및 빌드 환경 설정  (16) 2019.11.22