JavaRush /Java Blog /Random-KO /SpringBoot + Flyway - "A부터 Z까지의 Java 프로젝트"
Roman Beekeeper
레벨 35

SpringBoot + Flyway - "A부터 Z까지의 Java 프로젝트"

Random-KO 그룹에 게시되었습니다
Java 프로젝트 생성에 관한 시리즈 기사입니다(다른 자료에 대한 링크는 끝에 있습니다). 그 목표는 핵심 기술을 분석하는 것이고, 그 결과는 텔레그램 봇을 작성하는 것입니다. 이 부분에서는 SpringBoot와 Flyway를 시작하려고 합니다. 원하는 만큼 이론의 최소량))) Flyway/Liquibase의 최종 비교를 무기한 생략하고 요점만 설명합니다. 그럼에도 불구하고 그것은 이미 계속되고 있습니다. Flyway를 두 번 설명하지 않기 위해 저는 이를 향후 JRTB 프로젝트에 즉시 추가하기로 결정했습니다."A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 1

이것의 일환으로 우리는 무엇을 해야 합니까?

  1. Maven을 기반으로 SpringBoot 애플리케이션을 시작합니다.
  2. 거기에 Flyway를 추가하세요. 다행스럽게도 쉽게 통합됩니다.
  3. 예제 데이터베이스에 있는 테이블에 대한 스키마를 추가합니다.
이 방법으로 우리는 Flyway로 작업하는 방법을 배울 것입니다. JRTB에 즉시 참여하지 않고 별도의 프로젝트를 진행하는 이유는 무엇입니까? 나중에 이 작업을 수행하는 방법을 이해하려는 사람은 예제와 작업을 설명하는 기사가 포함된 프로젝트를 갖게 될 것이기 때문입니다. 자, 가자!

비행경로란 무엇인가

무언가를 사용하려면 먼저 그것이 무엇인지, 왜 그런지 알아야 합니다. Flyway 는 데이터베이스 버전 제어 도구입니다. 말은 잘 알지만 왠지 이해가 더해지지 않았죠? 이동경로가 해결하는 문제를 설명해보자. 프로젝트가 있다고 가정해 보겠습니다. 세상의 모든 것이 그렇듯이 완벽하지 않기 때문에 프로젝트의 최종 버전을 계획하고 작성하는 것이 불가능했습니다. 설명되지 않은 특정 뉘앙스가 나타날 때마다. 프로젝트는 작업에 데이터베이스를 사용합니다. 물론 프로젝트가 변경되면 데이터베이스 구조도 변경될 수 있습니다. 프로젝트의 엔터티 중 하나에 대한 새 필드를 추가한다고 가정해 보겠습니다. 어떻게 하나요?
  1. 이 필드를 엔터티에 추가하고 비즈니스 논리가 작동하도록 모든 것을 업데이트합니다.
  2. 데이터베이스를 업데이트하십시오. 유일한 방법은 수동으로 수행하는 것입니다. 이렇게 하려면 필요한 SQL 스크립트에 들어가서 등록해야 합니다.
두 번째 요점은 많은 질문을 제기합니다.
  1. 하지만 프로젝트를 배포할 위치가 두 개 이상인 경우 각 위치에서 이 작업을 수행해야 합니까?
  2. 다시 돌아가고 싶다면 데이터베이스 구조가 현재 어떤 상태인지 정확히 어떻게 알 수 있나요?
  3. 데이터베이스 변경이 성공했는지 어떻게 확인할 수 있나요?
  4. 프로젝트에서 발생한 모든 데이터베이스 변경 사항을 추적할 수 있는 기회를 얻으려면 어떻게 해야 합니까?
수동으로 수행하면 답변이 최선이 아닐 것입니다... 이러한 모든 어려움을 피하려면 데이터베이스 마이그레이션 도구를 사용할 수 있습니다. 그 중 하나가 플라이웨이(Flyway)입니다. 그의 직업은 무엇입니까? 프로젝트의 일부로 우리는 데이터베이스로 수행하는 모든 작업을 한 번에 저장하는 별도의 SQL 파일(소위 마이그레이션)을 저장합니다. 모든 마이그레이션은 특정 순서에 따라 엄격하게 발생하므로 데이터베이스 구조 및 데이터의 변경 사항을 추적할 수 있습니다(종종 마이그레이션을 사용하면 테스트 데이터가 프로젝트에 추가되므로 일부 서버에 배포할 때 이미 일부 프로젝트를 테스트할 수 있는 값). 테스트를 통과한 후 프로젝트가 빌드되면 마이그레이션이 시작됩니다. 데이터베이스에 연결하고 마이그레이션을 수행합니다. 이 데이터베이스에서 마이그레이션이 이미 수행된 경우 flyway는 이를 건너뛰고(마이그레이션에 대한 데이터와 해당 상태를 데이터베이스의 별도 테이블에 저장하여 관리하는 데 도움이 됨) 일부 마이그레이션이 실패한 경우 프로젝트 빌드 및 서버에 대한 마운트(배포)가 중지됩니다. 최대한 자세히 설명하려고 노력했습니다. 모든 것이 아직 완전히 명확하지 않더라도 문제가 되지 않습니다. 연습을 하면 이해가 될 것입니다.

SpringBoot + Flyway 실행

스프링 부트란?

무엇을 출시할 예정인가요?... ​​우리가 무엇을, 왜 하는지 이해하려면 SpringBoot가 무엇인지 결정해야 합니다. 먼저 Spring 에 대해 빠르게(매우 빠르게) 이야기해 보겠습니다 . 현재 이는 Java로 서버 애플리케이션을 개발하는 데 있어 사실상 업계 표준입니다. 무엇의 기준? 이것을 어떻게 설명할 수 있나요? Spring은 애플리케이션의 뼈대이며, 여기에 비즈니스 로직인 "핵심"을 추가합니다. Spring의 도움으로 (이하 언어 전환에 시간을 낭비하지 않도록 이 트레이싱 페이퍼를 사용할 것입니다:D)) Spring은 우리가 모든 일을 시작하는 시작점을 제공합니다. 이는 다각적이며 다중 모듈식입니다.
  1. 데이터베이스 작업을 원하시나요? 관계형을 원하시나요? 비관계형을 원하시나요? 여기 Spring Data가 있습니다.
  2. http 요청 작업을 하시겠습니까? 여기, Spring 웹(Spring MVC)이 있습니다.
  3. 모든 개체를 한 곳에 보관할 수 있는 컨테이너가 필요합니까? 여기 스프링 코어가 있습니다.
  4. 다양한 역할과 명령 체계가 있도록 프로젝트에 보안을 설정해야 합니까? 스프링 시큐리티.
  5. 그런 것이 있으면 좋겠다고 생각했을 때 Spring이 이미 필요한 것을 갖추고 있고 빠르고 쉽게 통합된다는 사실이 밝혀졌습니다.
따라서 우리는 이것이 단순한 프레임워크(거대한 라이브러리)가 아니라 엄청난 속도로 발전하고 있는 전체 생태계라고 말할 수 있습니다. Spring Core가 무엇인지, 즉 모듈이 연결되는 기반을 이해하려면 자신만의 프레임워크를 만드는 라이브 데모를 시청하는 것이 좋습니다. Java 및 Spring 분야의 매우 멋진 사람인 Evgeny Borisov가 호스트합니다. 그가 행한 모든 일을 행하면 봄의 일이 당신에게 더욱 분명해질 것입니다. SpringBoot는 그들이 갖고 있는 모든 것의 정점입니다. 순수한 물의 마법. 애플리케이션을 처음 실행하기 위한 최소 설정입니다. 물론, 이것은 당신에게 그것을 사용하는 방법과 무엇을 해야 하는지에 대한 이해를 제공하지 않습니다. 그러나 개발의 깊이로 돌진하기 전에 모든 것을 조감도에서 볼 필요가 있습니다.

SpringBoot 실행

Maven이 무엇인지 이미 이해했으므로 필요에 맞는 새 프로젝트를 만들어 보겠습니다. 이렇게 하려면 이 문제를 위해 특별히 만들어진 웹사이트로 이동하면 됩니다. 이를 Spring 초기화 라고 합니다 . "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 2여기에서 필요한 사항을 작성하고 선택해야 합니다.
  1. 프로젝트 빌드 도구는 gradle 또는 maven입니다. 보시다시피 Ant는 더 이상 언급되지 않습니다. 이는 어떤 빌드 도구가 시간을 투자할 가치가 있는지에 대한 좋은 힌트입니다.
  2. 작성할 수 있는 언어는 java, kotlin, groovy입니다. 여기에서는 모든 것이 간단합니다. 모두 JVM과 유사하며 Java 코드를 쉽게 실행할 수 있습니다. 그건 그렇고, Kotlin을 살펴볼 가치가 있습니다. Groovy는 솔직히 재미가 없어졌습니다(그루비로 전환한 적도 있었지만 금방 지나갔습니다).
  3. Spring 버전... 여기서는 Spring의 주요 부분과 해당 모듈의 버전이 일관된다는 점을 이해해야 합니다.
  4. 프로젝트 데이터. 나는 이미 이러한 것들을 설명했습니다.
  5. Jar 또는 War 중에서 수집할 아카이브를 선택합니다.
  6. 글쎄, 우리가 가장 좋아하는 Java 버전입니다. 그리고 최근에는 이러한 버전이 많이 나왔습니다... 그들은 수년을 기다렸고 이제는 1년에 두 개가 있습니다.
우리의 경우 이 프로젝트를 JavaRush 커뮤니티 조직 에 게시하므로 프로젝트에 대한 정보가 적절할 것입니다.
  1. Maven – 우리가 이전에 이것에 대해 이야기한 것은 아무것도 아닙니다.
  2. Java는 우리의 사랑입니다 :D
  3. 버전 2.2.11을 살펴보겠습니다. 왜 최신이 아닌가? 최신 버전일수록 버그가 있을 가능성이 더 커지기 때문입니다. 우리에게는 어떤 버전이 중요하지 않지만 이전 버전이 더 안정적입니다. 따라서 우리는 2.2.11을 선택합니다.
  4. 그룹: com.github.javarushcommunity
  5. 아티팩트: springboot-flyway-demo
  6. 이름: SpringBoot + Flyway 데모
  7. 설명: 프로젝트는 SpringBoot와 Flyway 간의 통합을 보여줍니다 . (예, 문서 작성 능력은 개발의 중요한 부분입니다 :))
  8. 패키지 이름: com.github.javarushcommunity.springbootflywaydemo . 여기에서는 애플리케이션을 시작할 클래스가 포함된 기본 패키지를 즉시 생성합니다.
  9. 포장: 항아리
  10. 자바: 8. 기관차보다 먼저 가서 오래된 8호선을 타지 말자. 왜 11이 아니지? 무엇 때문에? 우리의 예에서는 요점을 알 수 없습니다.
"A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 3이제 모듈을 추가해 보겠습니다. Flyway와의 통합을 찾아야 합니다. MySQL 및 Spring Data와 관련된 항목을 추가할 수도 있습니다. 또 다른 롬복을 추가해 보겠습니다(이것은 매우 필요한 것입니다. 지금은 저를 믿으십시오 :D)) 이렇게 하려면 ADD DEPENDENCIES ...를 클릭하고 필요한 모든 것을 선택하십시오. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 4이것이 Flyway를 추가하는 방법입니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 5롬복... 등등. 결과적으로 다음과 같은 결과가 나옵니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 6허... 모든 내용을 작성했습니다.) 이제 생성을 클릭하면 됩니다... 생성된 프로젝트가 포함된 아카이브가 준비되었습니다. :) SHARE... 와 같은 멋진 기능도 있습니다 . 방금 작성한 페이지에 대한 링크를 제공합니다. 즉, 여기에 내가 생성한 것이 있습니다 . 그리고 문제가 발생하더라도 링크를 통해 언제든지 확인할 수 있습니다. 다음으로 생성된 프로젝트를 Git 저장소에 연결해야 하므로 생성된 springboot-flyway-demo 프로젝트를 복제 하고 IDEA를 통해 다운로드합니다. 이렇게 하려면 아이디어를 열고 파일 -> 새로 만들기 -> 기존 소스에서 프로젝트...를 선택해야 합니다 . "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 7이제 URL을 추가하고 복제를 클릭합니다 . 다음 단계는 생성된 프로젝트의 내부를 복제한 프로젝트 내부로 전송하는 것입니다. 혼란스러운? 지금 보여 드리겠습니다. 압축을 풀고 다음 파일 세트를 받았습니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 8이 파일은 복제된 프로젝트로 전송해야 합니다. 이전 기사에서와 마찬가지로 pom.xml을 Maven 프로젝트로 추가해 보겠습니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 9이제 생성된 내용을 살펴보겠습니다. src 이상의 모든 폴더를 열면 이전 기사에서 논의한 Maven 프로젝트의 일반적인 계층 구조를 볼 수 있습니다 . 아직 읽지 않은 분들은 꼭 읽어보세요! "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 10Application 클래스가 있고 이를 사용하여 SpringBoot 애플리케이션이 실행되는 것을 볼 수 있습니다. SpringBoot용 Maven 플러그인 덕분에 이제 Maven에 필요한 작업, 즉 spring-boot:run이 생겼습니다. 이 정보는 어디서 찾을 수 있나요? 오른쪽에서 Maven 플레이트와 프로젝트를 열면 "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 11오류가 발생하여 읽을 수 없으며 다음과 같은 내용이 표시됩니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 12더 많은 정보를 얻으려면 속도를 위해 기본 메서드를 실행할 수 있습니다. Application 클래스의: "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 13그리고 우리는 실제 이유를 보게 될 것입니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 14여기에 이미 더 많은 정보가 있고 그것으로 뭔가를 할 수 있습니다. 뭐가 문제 야? 데이터베이스와 관련된 종속성이 있으므로 데이터베이스에 연결하기 위한 설정을 제공해야 합니다. 이를 위해 Google에서는 application.properties에 다음 구성을 추가해야 함을 발견했습니다.
spring.datasource.url=jdbc:mysql://localhost:3306/flyway_demo_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
기본 메소드를 다시 실행하여 다음을 얻습니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 15이제 최소한 하나의 마이그레이션을 추가해야 합니다. 마이그레이션을 올바르게 작성하려면 다음 템플릿을 사용해야 합니다. V<VERSION>__<NAME>.sql 이 템플릿을 사용하여 해당 폴더 / src/main/resources/ 에 V00001__Create_country_table.sql 이라는 마이그레이션 파일을 생성합니다. db.migration/ . 그 안에 국가 테이블을 만들어 보겠습니다. 데이터베이스에 관한 두 번째 기사 의 스크립트를 살펴보겠습니다 . "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 16시작하기 전에 작업용 데이터베이스 flyway_demo_db를 생성해 보겠습니다. MysqlWorkbench를 통해 이 작업을 수행해 보겠습니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 17이제 기본 메서드를 다시 실행할 수 있습니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 18모든 것이 잘 진행되었지만 아직 프로젝트에 아무것도 없기 때문에 작업이 완료되었습니다. 그러나 로그에서 다음 사항이 분명합니다( 로그 내용 읽기 ).
  1. 데이터베이스에 성공적으로 연결되었습니다.
  2. 마이그레이션이 검증되었으며 모든 것이 정상입니다.
  3. Flyway는 마이그레이션을 관리하기 위한 테이블을 만들었습니다.
  4. 그리고 00001이 시작된 이주 – 국가 창설이 성공했습니다.
이를 확인하려면 데이터베이스에서 수행되는 작업을 확인할 수 있습니다. 이제 MySQL 서버로 가서 flyway_demo_db 데이터베이스의 테이블에 무슨 일이 일어나고 있는지 살펴보겠습니다. $ USE flyway_demo_db; $ 쇼 테이블; "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 19예상한 대로 마이그레이션이 발생했고, 그 동안 국가 테이블이 생성되고 마이그레이션 정보를 저장하는 flyway_schema_history 테이블이 나타났습니다. 더 나아가서 어떤 기록이 있는지(그리고 아예 있는지 여부도) 살펴보겠습니다. $SELECT * FROM flyway_schema_history; "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 20여기에 녹음이 있습니다. 유일한 것입니다. 여기에는 흥미로운 데이터가 많이 포함되어 있습니다. 버전, 마이그레이션 설명, SQL 유형(XML도 가능), 스크립트 자체 이름, 체크섬( 이것은 마이그레이션이 변경되었는지 여부를 확인하는 데 사용되는 해시코드와 유사합니다. 이 작업은 완료되었습니다. 데이터베이스에서 마이그레이션을 수행한 후 수정된 경우: 이는 수행할 수 없으며 모든 변경은 새로운 마이그레이션을 통해서만 이루어지며 이러한 일이 발생하지 않도록 확인 금액이 이를 모니터링합니다. ), 사용자 SQL 이름, 마이그레이션 처리 날짜, 실행 시간 및 결과(성공 또는 실패) . 한 번 작성된 마이그레이션은 나중에 변경하면 안 됩니다. 비록 결함이 있더라도 말이죠. 모든 변경 사항은 새로운 마이그레이션을 통해서만 발생합니다. 그것은 매우 중요합니다. 무슨 일이 일어날지 보여주기 위해 스크립트를 약간 변경하고 다시 실행해 보겠습니다. 마이그레이션 시 국가 테이블에 하나의 항목을 추가 "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 21하고 기본 메서드를 실행하면 다음과 같은 결과가 나옵니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 22예상대로 Flyway는 스크립트가 변경되었음을 인식하고 마이그레이션을 수행하지 않았습니다. 경우에 따라 실제로 업데이트된 마이그레이션을 실행해야 할 수도 있으며, flyway가 이를 건너뛰려면 flyway_schema_history 테이블에서 항목을 삭제한 다음 업데이트된 마이그레이션을 실행해야 합니다. 이는 정상적인 동작이 아니며 그래서는 안 되지만, 이 문제 해결 방법에 대해서도 알아야 합니다. 우리는 첫 번째 마이그레이션을 처리했습니다. 이제 데이터베이스에 관한 기사에 나온 것처럼 국가에 대한 데이터가 포함된 또 다른 마이그레이션을 추가하고 싶습니다. file V00002__Add_test_data_to_country.sql"A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 23 그리고 기본 메소드를 다시 실행해 보겠습니다. "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 24로그를 보면 마이그레이션이 시작되기 전에 데이터베이스가 버전 00001에서는 이 버전 이후의 모든 마이그레이션입니다. 다음으로 버전 00002가 출시되어 성공했습니다. 확인해 보겠습니다. 아니면 국가의 세 가지 기록이 이미 데이터베이스에 있을 것이라고 믿으시나요?)) 확인하겠습니다. 따라서 증거는 "A부터 Z까지의 Java 프로젝트": SpringBoot + Flyway - 25다음과 같습니다. 프로젝트를 다시 실행하면 데이터베이스가 필요한 버전을 완전히 준수하므로 Flyway는 마이그레이션 롤아웃을 건너뜁니다.

결론

이번에는 SpringBoot와 연계하여 데이터베이스 마이그레이션 도구를 이해하고 사용하는 방법을 배웠습니다. 이 정보는 Flyway를 예로 들어 데이터베이스 버전 제어 도구가 무엇인지 이해하는 데 필요합니다. 여러분, 제가 보여드린 프로젝트의 소스코드는 우리 조직의 Github에 공개되어 있습니다 . 예제가 마음에 든다면 별점을 주세요 . 그러면 제 작업이 유용하고 계속할 가치가 있다는 것을 이해하게 될 것입니다. 전통적으로 저는 Github 계정을 구독하는 것을 제안합니다 . 그를 통해 나는 오픈 소스에 대한 모든 작업과 항상 내 기사에 수반되는 모든 데모 프로젝트를 수행합니다. 읽어주신 모든 분들께 감사드립니다. 다음에는 신청서를 작성해보겠습니다. 미래에는 Docker에 관해 몇 가지 필요한 이론이 있을 것이지만, 실습을 통해 이를 크게 희석시킬 것입니다.

유용한 링크

현재는 유용한 링크가 많지 않습니다. Evgeniy의 비디오에 주목하세요. 정말 가치가 있습니다!
  1. Spring에서 프로젝트를 생성하기 위한 웹사이트
  2. Evgeniy Borisov — 스프링 빌더
  3. Flyway에 대한 Spring 문서

시리즈의 모든 자료 목록은 이 기사의 시작 부분에 있습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION