เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ

เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ

เจ‡เจน เจฒเฉ‡เจ– เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจฆเฉฑเจธเจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉˆเจจเจพเจคเฉ€ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฎเฉเฉฑเจฆเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉฑเจฒ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจชเฉเจฐเฉ‹เจกเจ•เจธเจผเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเจพ เจ•เฉ€ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฎเฉเฉฑเจขเจฒเฉ€ เจคเจฟเจ†เจฐเฉ€ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เฅค เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจพเจˆเจซเจธเจพเจˆเจ•เจฒ เจชเฉœเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜เจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ (เจฒเจ—เจญเจ— เจฒเฉ‡เจจ: เจ…เฉฑเจ—เฉ‡ - เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ). เจธเจพเจกเฉ‡ เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจฆเจพ เจจเจคเฉ€เจœเจพ เจฌเฉˆเจ•เจตเจฐเจก-เจ…เจธเฉฐเจ—เจค เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€ เจจเฉ‚เฉฐ เจฌเฉˆเจ•เจตเจฐเจก-เจ…เจจเฉเจ•เฉ‚เจฒ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฒเฉ‡เจ– เจคเฉ‹เจ‚ เจ•เฉ‹เจก เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจฅเฉ‡ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹ GitHub.

เจœเจพเจฃ เจชเจ›เจพเจฃ

เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€

เจ•เฉ€ เจ‡เฉฑเจ• เจฐเจนเฉฑเจธเจตเจพเจฆเฉ€ เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€? เจคเฉเจธเฉ€เจ‚ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจกเจ•เจธเจผเจจ เจฒเจˆ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉ‡เจธเจผ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจฆเฉ‹เจ‚ เจ•เจฟ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‡เจธเจฆเฉ€ เจ…เจฃเจ‰เจชเจฒเจฌเจงเจคเจพ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเจพเฅค เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ…เจคเฉ‡ เจ•เฉฐเจชเจจเฉ€ เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚, เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจธเฉฐเจญเจต เจคเฉˆเจจเจพเจคเฉ€ เจฆเฉเจฐเจฟเจธเจผ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‡เจธเจผ เจ•เจฐเจจ เจ…เจคเฉ‡ เจฌเจ—เจธ เจจเฉ‚เฉฐ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจฐเฉเจ•เจพเจตเจŸ เจฆเฉ‡ เจนเฉฑเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจนเฉˆ? เจ‡เฉฑเจฅเฉ‡ เจ•เจˆ เจคเจฐเฉ€เจ•เฉ‡ เจนเจจ, เจ‡เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เจน เจนเฉˆ:

  • เจคเฉเจนเจพเจกเฉ€ เจธเฉ‡เจตเจพ เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉฐเจฌเจฐ 1 เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‹
  • เจ‡เฉฑเจ• เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจ•เจฐเฉ‹
  • เจธเฉฐเจธเจ•เจฐเจฃ #2 เจฆเฉ‡ เจธเจฎเจพเจจเจพเจ‚เจคเจฐ เจ†เจชเจฃเฉ€ เจธเฉ‡เจตเจพ เจฆเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ #1 เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‹
  • เจœเจฟเจตเฉ‡เจ‚ เจนเฉ€ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉฐเจฌเจฐ 2 เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เจน เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉฐ. 1 เจจเฉ‚เฉฐ เจนเจŸเจพ เจฆเจฟเจ“
  • เจคเจฟเจ†เจฐ เจนเฉˆ!

เจ†เจธเจพเจจ, เจนเฉˆ เจจเจพ? เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ‡เจน เจ‡เฉฐเจจเจพ เจธเฉŒเจ–เจพ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡เฅค เจ†เจ‰ เจนเฉเจฃ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ•เจพเจซเจผเฉ€ เจ†เจฎ เจคเฉˆเจจเจพเจคเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ - blue green deployment.

เจ•เฉ€ เจคเฉเจธเฉ€เจ‚ เจ•เจฆเฉ‡ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเฉเจฃเจฟเจ† เจนเฉˆ เจจเฉ€เจฒเฉ‡ เจนเจฐเฉ‡ เจคเฉˆเจจเจพเจคเฉ€? เจ•เจฒเจพเจ‰เจก เจซเจพเจŠเจ‚เจกเจฐเฉ€ เจ‡เจธ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจ†เจธเจพเจจ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจœเจผเจฐเจพ เจฆเฉ‡เจ–เฉ‹ เจ‡เจน เจฒเฉ‡เจ–, เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฆเจพ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจธเฉฐเจ–เฉ‡เจช เจ•เจฐเจจ เจฒเจˆ, เจ†เจ“ เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจจเฉ€เจฒเฉ‡ เจนเจฐเฉ‡ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจจเจพ เจนเฉˆ:

  • เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ“ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจ‰เจคเจชเจพเจฆเจจ เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ เจฆเฉ‹ เจ•เจพเจชเฉ€เจ†เจ‚ ("เจจเฉ€เจฒเจพ" เจ…เจคเฉ‡ "เจนเจฐเจพ") เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ;
  • เจธเจพเจฐเฉ‡ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจจเฉ‚เฉฐ เจจเฉ€เจฒเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉฑเจฒ เจญเฉ‡เจœเฉ‹, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเจพเจ‚ เจ•เจฟ เจ‰เจคเจชเจพเจฆเจจ URL เจ‰เฉฑเจฅเฉ‡ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจฆเฉ‡ เจนเจจ;
  • เจ‡เฉฑเจ• เจนเจฐเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ€ เจคเจพเจ‡เจจเจพเจคเฉ€ เจ…เจคเฉ‡ เจœเจพเจ‚เจš เจ•เจฐเฉ‹;
  • เจฏเฉ‚เจ†เจฐเจเจฒ เจจเฉ‚เฉฐ เจจเฉ€เจฒเฉ‡ เจคเฉ‹เจ‚ เจนเจฐเฉ‡ เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจš เจฌเจฆเจฒเฉ‹

เจฌเจฒเฉ‚ เจ—เฉเจฐเฉ€เจจ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ‡เฉฑเจ• เจ…เจœเจฟเจนเฉ€ เจชเจนเฉเฉฐเจš เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจคเจชเจพเจฆเจจ เจคเฉ‹เฉœเจจ เจฆเฉ€ เจšเจฟเฉฐเจคเจพ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจชเฉ‡เจธเจผ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจนเฉˆ เจ•เจฟ เจญเจพเจตเฉ‡เจ‚ เจ•เฉเจ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ "เจ‡เฉฑเจ• เจธเจตเจฟเฉฑเจš เจซเจฒเจฟเฉฑเจ•" เจ•เจฐเจ•เฉ‡ เจชเจฟเจ›เจฒเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจตเจพเจชเจธ เจ† เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ‰เจชเจฐเฉ‹เจ•เจค เจธเจญ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจธเจตเจพเจฒ เจชเฉเฉฑเจ› เจธเจ•เจฆเฉ‡ เจนเฉ‹: เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจฆเจพ เจฌเจฒเฉ‚ เจ—เฉเจฐเฉ€เจจ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจจเจพเจฒ เจ•เฉ€ เจธเจฌเฉฐเจง เจนเฉˆ?

เจ–เฉˆเจฐ, เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจ•เฉเจ เจธเจพเจ‚เจเจพ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เฉฑเจ•เฉ‹ เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉ€เจ†เจ‚ เจฆเฉ‹ เจ•เจพเจชเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจˆ เจฐเฉฑเจ–เจฃ เจฒเจˆ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจˆ เจฐเฉฑเจ–เจฃ เจฒเจˆ เจฆเฉเฉฑเจ—เจฃเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ เจ•เฉเจ เจŸเฉ€เจฎเจพเจ‚ เจฆเจพเจ…เจตเจพ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจฎเจพเจฐเจŸเจฟเจจ เจซเฉ‹เจฒเจฐ, เจ‡เจธ เจชเจนเฉเฉฐเจš เจฆเฉ€ เจ‡เฉฑเจ• เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเฉ‹:

เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจตเจฟเจ•เจฒเจช เจตเฉˆเฉฑเจฌ เจ…เจคเฉ‡ เจกเฉ‹เจฎเฉ‡เจจ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจฒเจˆ เจจเฉ€เจฒเฉ‡-เจนเจฐเฉ‡ เจธเจตเจฟเฉฑเจšเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃเจพ, เจ‰เจธเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจ‡เจธ เจชเจนเฉเฉฐเจš เจตเจฟเฉฑเจš, เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ…เจ•เจธเจฐ เจ‡เฉฑเจ• เจธเจฎเฉฑเจธเจฟเจ† เจนเฉ‹ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจฆเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจจ เจฒเจˆ เจ‡เจธเจฆเฉ€ เจธเจ•เฉ€เจฎเจพ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค

เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฎเฉเฉฑเจ– เจธเจฎเฉฑเจธเจฟเจ† เจตเฉฑเจฒ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚. เจกเจพเจŸเจพเจฌเฉ‡เจธ. เจ†เจ‰ เจ‡เจธ เจตเจพเจ•เฉฐเจธเจผ เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจจเจœเจผเจฐ เจฎเจพเจฐเฉ€เจเฅค

เจ‡เฉฑเจ• เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจ•เจฐเฉ‹.

เจนเฉเจฃ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจคเฉ‹เจ‚ เจ‡เจน เจธเจตเจพเจฒ เจชเฉเฉฑเจ›เจฃเจพ เจชเจเจ—เจพ - เจœเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€ เจชเจฟเฉฑเจ›เฉ‡ เจตเฉฑเจฒ เจ…เจจเฉเจ•เฉ‚เจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ เจคเจพเจ‚ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ? เจ•เฉ€ เจเจช เจฆเจพ เจฎเฉ‡เจฐเจพ เจชเจนเจฟเจฒเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจฌเจฐเฉ‡เจ• เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ? เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ…เจœเจฟเจนเจพ เจนเฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ ...

เจ‡เจธ เจฒเจˆ, เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ/เจจเฉ€เจฒเฉ‡ เจนเจฐเฉ‡ เจคเฉˆเจจเจพเจคเฉ€ เจฆเฉ‡ เจตเฉฑเจกเฉ‡ เจฒเจพเจญเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจ•เฉฐเจชเจจเฉ€เจ†เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฒเจˆ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ:

  • เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจœ เจคเจฟเจ†เจฐ เจ•เจฐเฉ‹
  • เจšเฉฑเจฒ เจฐเจนเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเฉ‹
  • เจกเจพเจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจฎเจพเจˆเจ—เจฐเฉ‡เจŸ เจ•เจฐเจจ เจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจšเจฒเจพเจ“
  • เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเจพ เจจเจตเจพเจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจคเฉˆเจจเจพเจค เจ…เจคเฉ‡ เจฒเจพเจ‚เจš เจ•เจฐเฉ‹

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจตเจฟเจธเจคเจพเจฐ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€ เจฆเจพ เจฒเจพเจญ เจฒเฉˆเจฃ เจฒเจˆ เจ†เจชเจฃเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจคเฉ‡ เจ•เฉ‹เจก เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฎเฉเฉฑเจฆเฉ‡

เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจŸเฉ‡เจŸเจฒเฉˆเฉฑเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจนเฉˆ เจœเฉ‹ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจกเจพเจŸเจพ เจธเจŸเฉ‹เจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจคเฉเจฐเฉฐเจค เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจจเฉ‚เฉฐ เจ•เจฟเจคเฉ‡ เจกเจพเจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฐเจ•เจŸ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจตเฉ€ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฆเฉ‹ เจตเจพเจฐ เจธเฉ‹เจšเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเจ•เฉ€เจฎเจพ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฆเจฒเจฃเจพ เจนเฉˆ เจ‡เจธ เจฆเฉ‡ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจœเจพเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจคเจพเจ‚ เจ•เจฟ เจจเฉ‹-เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€ เจธเฉฐเจญเจต เจนเฉ‹เจตเฉ‡, เจ†เจ“ เจชเจนเจฟเจฒเจพเจ‚ เจตเจฐเจœเจจเจฟเฉฐเจ— เจธเจ•เฉ€เจฎเจพ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจฆเฉ‡เจˆเจเฅค

เจตเจฐเจœเจจเจฟเฉฐเจ— เจธเจ•เฉ€เจฎ

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเจš เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจพเจ‚เจ—เฉ‡ เจซเจฒเจพเจˆเจตเฉ‡เจ… เจ‡เฉฑเจ• เจธเฉฐเจธเจ•เจฐเจฃ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจธเจพเจงเจจ เจตเจœเฉ‹เจ‚ (เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆ: เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚). เจ•เฉเจฆเจฐเจคเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเฉ€ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡ เจœเจฟเจธ เจตเจฟเฉฑเจš เจฌเจฟเจฒเจŸ-เจ‡เจจ เจซเจฒเจพเจˆเจตเฉ‡ เจธเจชเฉ‹เจฐเจŸ เจนเฉˆ เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจฆเจฐเจญ เจธเฉˆเจŸ เจ…เจช เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจธเจ•เฉ€เจฎเจพ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจ•เจฐเฉ‡เจ—เจพเฅค เจซเจฒเจพเจˆเจตเฉ‡เจ… เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจคเฉเจธเฉ€เจ‚ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš classpath:db/migration). เจ‡เฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹

โ””โ”€โ”€ db
 โ””โ”€โ”€ migration
     โ”œโ”€โ”€ V1__init.sql
     โ”œโ”€โ”€ V2__Add_surname.sql
     โ”œโ”€โ”€ V3__Final_migration.sql
     โ””โ”€โ”€ V4__Remove_lastname.sql

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ 4 เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจตเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹, เจœเฉ‡เจ•เจฐ เจชเจนเจฟเจฒเจพเจ‚ เจจเจนเฉ€เจ‚ เจšเจฒเจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจ, เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจฃ 'เจคเฉ‡ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เฉฑเจ• เจšเจฒเจพเจˆเจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚เฅค เจ†เจ‰ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ (V1__init.sql) เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เจนเจฐ เจšเฉ€เจœเจผ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจธเจตเฉˆ-เจตเจฟเจ†เจ–เจฟเจ†เจคเจฎเจ• เจนเฉˆ: เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฒเจˆ SQL เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉ‹เจงเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจ…เจคเฉ‡ เจซเจฒเจพเจˆเจตเฉ‡ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฒเจˆ, เจšเฉˆเฉฑเจ• เจ†เจŠเจŸ เจ•เจฐเฉ‹ เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจกเฉŒเจ•เจธ.

เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจฐเฉ‹เจค เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจŸเฉ‚เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡, เจคเฉเจนเจพเจจเฉ‚เฉฐ 2 เจตเฉฑเจกเฉ‡ เจฒเจพเจญ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจ:

  • เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ•เฉ‹เจก เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจคเฉ‹เจ‚ เจตเฉฑเจ– เจ•เจฐเจฆเฉ‡ เจนเฉ‹
  • เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจคเฉเจนเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจฐเฉ‹เจฒเจ†เจŠเจŸ เจฆเฉ‡ เจจเจพเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจนเจพเจกเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจฐเจฒ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ

เจกเจพเจŸเจพเจฌเฉ‡เจธ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฆเจพ เจจเจฟเจชเจŸเจพเจฐเจพ เจ•เจฐเจจเจพ

เจฒเฉ‡เจ– เจฆเฉ‡ เจ…เจ—เจฒเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฒเจˆ เจฆเฉ‹ เจชเจนเฉเฉฐเจšเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฃ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

  • เจชเจฟเจ›เจฒเจพ เจ…เจธเฉฐเจ—เจคเจคเจพ
  • เจชเจฟเฉฑเจ›เฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ

เจชเจนเจฟเจฒเฉ€ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจšเฉ‡เจคเจพเจตเจจเฉ€ เจตเจœเฉ‹เจ‚ เจฎเฉฐเจจเจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ เจ•เจฟ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฎเฉเฉฑเจขเจฒเฉ€ เจคเจฟเจ†เจฐเฉ€ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€... เจฆเฉ‚เจœเจพ เจ‡เฉฑเจ• เจนเฉฑเจฒ เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจฆเฉ‡ เจคเฉˆเจจเจพเจคเฉ€ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจชเจฟเจ›เฉœเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจœเจฟเจธ 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ เจ‰เจน เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจซเจฒเจพเจˆเจตเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจœเจฟเจธ เจตเจฟเฉฑเจš เจนเฉˆ Person ั first_name ะธ last_name เจกเจพเจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš (เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆ: Person เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจนเฉˆ เจ…เจคเฉ‡ first_name ะธ last_name - เจ‡เจน เจ‡เจธ เจตเจฟเฉฑเจš เจ–เฉ‡เจคเจฐ เจนเจจ). เจ…เจธเฉ€เจ‚ เจจเจพเจฎ เจฌเจฆเจฒเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ last_name ะฒ surname.

เจงเจพเจฐเจจเจพเจตเจพเจ‚

เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจœเจพเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจธเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ€เจ†เจ‚ เจ…เจฐเจœเจผเฉ€เจ†เจ‚ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจงเจพเจฐเจจเจพเจตเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจฎเฉเฉฑเจ– เจจเจคเฉ€เจœเจพ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ‡เฉฑเจ• เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

เจจเฉ‹เจŸ. เจ•เจพเจฐเฉ‹เจฌเจพเจฐเฉ€ เจชเฉเจฐเฉ‹-เจŸเจฟเฉฑเจชเฅค เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฐเจฒ เจฌเจฃเจพเจ‰เจฃ เจจเจพเจฒ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจนเจพเจ‡เจคเจพ 'เจคเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจชเฉˆเจธเจพ เจฌเจšเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ (เจœเจฟเฉฐเจจเฉ‡ เจœเจผเจฟเจ†เจฆเจพ เจฒเฉ‹เจ• เจคเฉเจนเจพเจกเฉ€ เจ•เฉฐเจชเจจเฉ€ เจฒเจˆ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจคเฉเจธเฉ€เจ‚ เจ“เจจเฉ‡ เจนเฉ€ เจชเฉˆเจธเฉ‡ เจฌเจšเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹)!

เจกเจพเจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ

เจ‡เจน เจคเฉˆเจจเจพเจคเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจฐเจฒ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ (เจ•เฉเจ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจฒเจ—เจญเจ— เจ…เจธเฉฐเจญเจต เจนเจจ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฎเจฟเจŸเจพเจ‰เจฃเจพ เจฐเฉ‹เจฒเจฌเฉˆเจ•)เฅค เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจฒเจฟเจ†เจ‰เจฃ เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจญเจพเจตเฉ‡เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจตเฉฑเจ–เจฐเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจนเจจ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, SQL เจ…เจคเฉ‡ NoSQL), เจคเฉเจนเจพเจกเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ€ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เฉ€เฅค

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจฐเจœเจจ เจฌเฉˆเจ• เจฐเฉ‹เจฒ เจฌเฉˆเจ• เจ•เจฐเจจเจพ เจนเจฎเฉ‡เจธเจผเจพ เจธเฉฐเจญเจต เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ (เจนเฉ‹เจฐ เจจเจนเฉ€เจ‚)

เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เฉ‡เจตเจฒ เจฒเฉ‹เฉœ เจชเฉˆเจฃ 'เจคเฉ‡ เจนเฉ€ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจฌเฉฑเจ— เจนเฉˆ เจœเฉ‹ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ เฉ€เจ• เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจจเจตเฉ€เจจเจคเจฎ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจธเฉฐเจธเจ•เจฐเจฃ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจฎเฉฐเจจเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เจน เจจเจตเฉ€เจจเจคเจฎ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจธเฉฐเจธเจ•เจฐเจฃ เจชเจฟเจ›เจฒเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจง เจฐเฉ‹เจฒเจ†เจ‰เจŸ เจฒเจˆ เจ•เฉ‹เจก เจ…เจคเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ–เจฃเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจ…เจคเฉ‡ เจฎเจนเจฟเฉฐเจ—เจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจจเฉ‹เจŸ. เจตเจงเฉ‡เจฐเฉ‡ เจชเฉœเฉเจนเจจเจฏเฉ‹เจ—เจคเจพ เจฒเจˆ, เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจฎเฉเฉฑเจ– เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจพเจ‚เจ—เฉ‡เฅค

เจ•เจฆเจฎ 1: เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเจฅเจฟเจคเฉ€

เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ: 1.0.0
DB เจธเฉฐเจธเจ•เจฐเจฃ: v1

เจŸเจฟเฉฑเจชเจฃเฉ€

เจ‡เจน เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเจฅเจฟเจคเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

เจกเจพเจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚

DB เจธเจผเจพเจฎเจฟเจฒ เจนเฉˆ last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เจ•เฉ‹เจก เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ€ เจนเฉˆ last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

เจชเจฟเฉฑเจ›เฉ‡ เจตเฉฑเจฒ เจ…เจธเฉฐเจ—เจค เจ•เจพเจฒเจฎ เจฆเจพ เจจเจพเจฎ เจฌเจฆเจฒเจฃเจพ

เจ†เจ‰ เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจจเจพเจฎ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฆเจฒเจฃเจพ เจนเฉˆ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจตเฉ‡เจ–เฉ€เจ:

เจงเจฟเจ†เจจ. เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจœเจพเจฃเจฌเฉเฉฑเจ เจ•เฉ‡ เจšเฉ€เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉ‹เฉœ เจฆเฉ‡เจตเฉ‡เจ—เฉ€เฅค เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ•เจฐเจจ เจฒเจˆ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค

เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ: 2.0.0.BAD

DB เจธเฉฐเจธเจ•เจฐเจฃ: v2bad

เจŸเจฟเฉฑเจชเจฃเฉ€

เจฎเฉŒเจœเฉ‚เจฆเจพ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจฆเฉ‹ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ (เจชเฉเจฐเจพเจฃเฉ€ เจ…เจคเฉ‡ เจจเจตเฉ€เจ‚) เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚เฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจœเจผเฉ€เจฐเฉ‹ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ (เจœเฉ‡ เจงเจพเจฐเจจเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ‡เจน เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ…เจธเฉฐเจญเจต เจนเฉˆ)เฅค

A/B เจŸเฉˆเจธเจŸเจฟเฉฐเจ—

เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจฅเจฟเจคเฉ€ เจ‡เจน เจนเฉˆ เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจนเฉˆ 1.0.0, เจ‰เจคเจชเจพเจฆเจจ, เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค v1. เจธเจพเจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ, เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจฆเฉ‚เจœเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ 2.0.0.BAD, เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹ v2bad.

เจ•เจฆเจฎ:

  1. เจตเจฐเจœเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจ‰เจฆเจพเจนเจฐเจฃ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ 2.0.0.BADเจœเฉ‹ เจ•เจฟ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ v2bad
  2. เจกเจพเจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš v2bad เจ•เจพเจฒเจฎ last_name เจนเฉเจฃ เจฎเฉŒเจœเฉ‚เจฆ เจจเจนเฉ€เจ‚ เจนเฉˆ - เจ‡เจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฟเจ† เจ—เจฟเจ† เจธเฉ€ surname
  3. เจกเจพเจŸเจพเจฌเฉ‡เจธ เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ…เฉฑเจชเจกเฉ‡เจŸ เจธเจซเจฒ เจฐเจฟเจนเจพ เจ…เจคเฉ‡ เจ•เฉเจ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจšเฉฑเจฒ เจฐเจนเฉ€เจ†เจ‚ เจนเจจ 1.0.0, เจนเฉ‹เจฐ - เจตเจฟเฉฑเจš 2.0.0.BAD. เจนเจฐ เจšเฉ€เจœเจผ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเจพเจฒ เจœเฉเฉœเฉ€ เจนเฉ‹เจˆ เจนเฉˆ v2bad
  4. เจตเจฐเจœเจจ เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจฎเฉŒเจ•เฉ‡ 1.0.0 เจ—เจฒเจคเฉ€เจ†เจ‚ เจธเฉเฉฑเจŸเจฃเฉ€เจ†เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเฉ‡เจฃเจ—เฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจ•เจพเจฒเจฎ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจชเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจเจ—เฉ‡ last_nameเจœเฉ‹ เจนเฉเจฃ เจฎเฉŒเจœเฉ‚เจฆ เจจเจนเฉ€เจ‚ เจนเฉˆ
  5. เจตเจฐเจœเจจ เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจฎเฉŒเจ•เฉ‡ 2.0.0.BAD เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเฉ‡เจ—เจพ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจชเจฟเฉฑเจ›เฉ‡ เจตเฉฑเจฒ เจ…เจธเฉฐเจ—เจค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ A/B เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจ…เจธเฉฐเจญเจต เจนเฉˆเฅค

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฐเฉ‹เจฒเจฌเฉˆเจ•

เจฎเฉฐเจจ เจฒเจ“ เจ•เจฟ A/B เจคเฉˆเจจเจพเจคเฉ€ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ (เจฒเจ—เจญเจ— เจชเฉเจฐเจคเฉ€.: เจฒเฉ‡เจ–เจ• เจฆเจพ เจฎเจคเจฒเจฌ เจธเจผเจพเจ‡เจฆ เจ/เจฌเฉ€ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจนเฉˆ) เจ…เจธเฉ€เจ‚ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจตเจฐเจœเจจ 'เจคเฉ‡ เจตเจพเจชเจธ เจฒเจฟเจ†เจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ 1.0.0. เจฎเฉฐเจจ เจฒเจ“ เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡เฅค

เจ•เจฆเจฎ:

  1. เจ…เจธเฉ€เจ‚ เจตเจฐเจœเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‰เจฆเจพเจนเจฐเจจ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฆเฉ‡ เจนเจพเจ‚ 2.0.0.BAD
  2. เจกเจพเจŸเจพเจฌเฉ‡เจธ เจ…เจœเฉ‡ เจตเฉ€ เจนเฉˆ v2bad
  3. เจธเฉฐเจธเจ•เจฐเจฃ เจคเฉ‹เจ‚ เจฒเฉˆ เจ•เฉ‡ 1.0.0 เจธเจฎเจ เจจเจนเฉ€เจ‚ เจ†เจ‰เจ‚เจฆเจพ เจ•เจฟ เจ‡เจน เจ•เฉ€ เจนเฉˆ surname, เจ…เจธเฉ€เจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡
  4. เจจเจฐเจ• เจŸเฉเฉฑเจŸ เจ—เจฟเจ† เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจตเจพเจชเจธ เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเฉ‡

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจชเจฟเฉฑเจ›เฉ‡ เจตเฉฑเจฒ เจ…เจธเฉฐเจ—เจค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจชเจฟเจ›เจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ 'เจคเฉ‡ เจตเจพเจชเจธ เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเฉ‡เฅค

เจธเจ•เฉเจฐเจฟเจชเจŸ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฒเฉŒเจ—เจธ

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

เจกเจพเจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚

เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจธเจ•เฉเจฐเจฟเจชเจŸ เจœเฉ‹ เจจเจพเจฎ เจฌเจฆเจฒเจฆเฉ€ เจนเฉˆ last_name ะฒ surname

เจธเจฐเฉ‹เจค เจซเจฒเจพเจˆเจตเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸ:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เจธเจ•เฉเจฐเจฟเจชเจŸ เจœเฉ‹ เจจเจพเจฎ เจฌเจฆเจฒเจฆเฉ€ เจนเฉˆ last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

เจ•เฉ‹เจก เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจ…เจธเฉ€เจ‚ เจ–เฉ‡เจคเจฐ เจฆเจพ เจจเจพเจฎ เจฌเจฆเจฒ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ lastName 'เจคเฉ‡ surname.

เจฌเฉˆเจ•เจตเจฐเจก-เจ…เจจเฉเจ•เฉ‚เจฒ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจฆเจพ เจจเจพเจฎ เจฌเจฆเจฒเจฃเจพ

เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจ†เจฎ เจธเจฅเจฟเจคเฉ€ เจนเฉˆ เจœเจฟเจธเจฆเจพ เจ…เจธเฉ€เจ‚ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจธเจพเจจเฉ‚เฉฐ เจชเจฟเฉฑเจ›เฉ‡ เจตเฉฑเจฒ เจ…เจธเฉฐเจ—เจค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจพเจฌเจค เจ•เจฐ เจšเฉเฉฑเจ•เฉ‡ เจนเจพเจ‚ เจ•เจฟ เจœเจผเฉ€เจฐเฉ‹-เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจตเจพเจงเฉ‚ เจ•เจฆเจฎเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจฒเฉ‡เจ– เจฆเฉ‡ เจ‡เจธ เจญเจพเจ— เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจฌเฉˆเจ•เจตเจฐเจก เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจฆเฉ‡ เจจเจพเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€เจ†เจ‚ 3 เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจจเฉ‹เจŸ. เจฏเจพเจฆ เจ•เจฐเฉ‹ เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจธเฉฐเจธเจ•เจฐเจฃ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจนเฉˆ v1. เจ‡เจธ เจตเจฟเฉฑเจš เจ•เจพเจฒเจฎ เจนเจจ first_name ะธ last_name. เจธเจพเจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ เจชเจตเฉ‡เจ—เจพ last_name 'เจคเฉ‡ surname. เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจตเฉ€ เจนเฉˆ 1.0.0, เจœเฉ‹ เจ…เจœเฉ‡ เจคเฉฑเจ• เจตเจฐเจคเจฟเจ† เจจเจนเฉ€เจ‚ เจ—เจฟเจ† เจนเฉˆ surname.

เจ•เจฆเจฎ 2: เจ‰เจชเจจเจพเจฎ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹

เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ: 2.0.0
DB เจธเฉฐเจธเจ•เจฐเจฃ: v2

เจŸเจฟเฉฑเจชเจฃเฉ€

เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ•เจพเจฒเจฎ เจœเฉ‹เฉœ เจ•เฉ‡ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจ•เฉ‡, เจ…เจธเฉ€เจ‚ เจฌเฉˆเจ•เจตเจฐเจก เจ…เจจเฉเจ•เฉ‚เจฒ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฌเจฆเจฒเจพเจ… เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚, เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ JAR เจจเฉ‚เฉฐ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเจพเจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเจพเจฃเจพ JAR เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฆเฉŒเจฐเจพเจจ เจจเจนเฉ€เจ‚ เจŸเฉเฉฑเจŸเฉ‡เจ—เจพเฅค

เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจชเฉ‡เจธเจผ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚

เจ•เจฆเจฎ:

  1. เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ•เจพเจฒเจฎ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจ•เจฐเฉ‹ surname. เจนเฉเจฃ เจคเฉเจนเจพเจกเจพ DB เจธเฉฐเจธเจ•เจฐเจฃ v2
  2. เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจ•เจพเจชเฉ€ เจ•เจฐเฉ‹ last_name ะฒ surname. เจงเจฟเจ†เจจ เจฆเฉ‡เจตเฉ‹เจ•เจฟ เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เจน เจฌเจนเฉเจค เจธเจพเจฐเจพ เจกเจพเจŸเจพ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเฉˆเจš เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ!
  3. เจ‰เจน เจ•เฉ‹เจก เจฒเจฟเจ–เฉ‹ เจœเจฟเฉฑเจฅเฉ‡ เจ‰เจน เจตเจฐเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจฆเฉ‹เจตเฉ‡เจ‚ ะธ ะฝะพะฒั‹ะนเจ…เจคเฉ‡ เจชเฉเจฐเจพเจฃเจพ เจ•เจพเจฒเจฎ เจนเฉเจฃ เจคเฉเจนเจพเจกเจพ เจเจช เจธเฉฐเจธเจ•เจฐเจฃ 2.0.0
  4. เจ•เจพเจฒเจฎ เจคเฉ‹เจ‚ เจฎเฉเฉฑเจฒ เจชเฉœเฉเจนเฉ‹ surname, เจœเฉ‡เจ•เจฐ เจ‡เจน เจจเจนเฉ€เจ‚ เจนเฉˆ null, เจœเจพเจ‚ l เจคเฉ‹เจ‚ast_name, เจœเฉ‡ surname เจจเจนเฉ€ เจฆเฉฑเจธเจ‡เจ†. เจคเฉเจธเฉ€เจ‚ เจฎเจฟเจŸเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ getLastName() เจ•เฉ‹เจก เจคเฉ‹เจ‚, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเฉ‡เจ—เจพ null เจคเฉ‹เจ‚ เจคเฉเจนเจพเจกเฉ€ เจ…เจฐเจœเจผเฉ€ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ 3.0.0 เจจเฉ‚เฉฐ 2.0.0.

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจซเจฒเจพเจˆเจตเฉ‡เจ… เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจฐเจนเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ‡เจน เจฆเฉ‹ เจ•เจฆเจฎ เจตเจฐเจœเจจ เจธเจŸเจพเจฐเจŸเจ…เฉฑเจช เจฆเฉŒเจฐเจพเจจ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡ 2.0.0 เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจธเฉฐเจธเจ•เจฐเจฃ เจธเฉฐเจฆ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ เจฆเฉ‹ เจตเฉฑเจ–-เจตเฉฑเจ– เจšเฉ€เจœเจผเจพเจ‚ เจ•เจฐเจจเฉ€เจ†เจ‚ เจชเฉˆเจฃเจ—เฉ€เจ†เจ‚ (เจชเจนเจฟเจฒเจพเจ‚ db เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจซเจฟเจฐ เจจเจตเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเฉ‹)เฅค

เจ‡เจน เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจนเฉˆ. เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจ•เจฟ เจจเจตเจพเจ‚ เจฌเจฃเจพเจ‡เจ† เจ•เจพเจฒเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉ‹เจฃเจพ เจจเจนเฉ€เจ‚. เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจชเฉเจฐเจพเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจจเจตเฉ‡เจ‚ เจ•เจพเจฒเจฎ เจฌเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚ เจชเจคเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจฆเฉŒเจฐเจพเจจ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพ Insert. เจชเจฐ เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจฐเฉเจ•เจพเจตเจŸ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเจพ เจกเฉ€.เจฌเฉ€ v2, เจ‡เจธ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจ•เจพเจฒเจฎ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจœเจฟเจธ เจจเจพเจฒ เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจฆเฉ€ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

เจ‡เจน เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจนเฉˆ. เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ getLastName(), เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš 3.0.0 เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจฆเฉ€ เจ•เฉ‹เจˆ เจงเจพเจฐเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ last_name. เจ‡เจธ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‰เฉฑเจฅเฉ‡ null เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจคเฉเจธเฉ€เจ‚ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธ เจฒเจˆ เจšเฉˆเฉฑเจ• เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹ null, เจชเจฐ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจนเฉฑเจฒ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃเจพ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ เจคเจฐเจ• เจตเจฟเฉฑเจš getSurname() เจคเฉเจธเฉ€เจ‚ เจธเจนเฉ€ เจ—เฉˆเจฐ-เจœเจผเฉ€เจฐเฉ‹ เจฎเฉเฉฑเจฒ เจšเฉเจฃเจฟเจ† เจนเฉˆเฅค

A/B เจŸเฉˆเจธเจŸเจฟเฉฐเจ—

เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจฅเจฟเจคเฉ€ เจ‡เจน เจนเฉˆ เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจนเฉˆ 1.0.0, เจ‰เจคเจชเจพเจฆเจจ 'เจคเฉ‡ เจคเฉˆเจจเจพเจค, เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš v1. เจธเจพเจจเฉ‚เฉฐ เจตเจฐเจœเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ 2.0.0เจœเฉ‹ เจ•เจฟ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ‡เจ—เจพ v2.

เจ•เจฆเจฎ:

  1. เจตเจฐเจœเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจ‰เจฆเจพเจนเจฐเจฃ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ 2.0.0เจœเฉ‹ เจ•เจฟ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ v2
  2. เจ‡เจธ เจฆเฉŒเจฐเจพเจจ เจ•เฉเจ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ 'เจคเฉ‡ เจตเจฐเจœเจจ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ•เจพเจฐเจตเจพเจˆ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€ 1.0.0
  3. เจ…เฉฑเจชเจกเฉ‡เจŸ เจธเจซเจฒ เจฐเจฟเจนเจพ เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจตเจฐเจœเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€เจ†เจ‚ เจ•เจˆ เจตเจพเจฐ เจšเฉฑเจฒ เจฐเจนเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจนเจจ 1.0.0 เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจธเฉฐเจธเจ•เจฐเจฃ 2.0.0. เจนเจฐ เจ•เฉ‹เจˆ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเจพเจฒ เจธเฉฐเจšเจพเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ v2
  4. เจตเจฐเจœเจจ 1.0.0 เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ‰เจชเจจเจพเจฎ เจ•เจพเจฒเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ, เจชเจฐ เจธเฉฐเจธเจ•เจฐเจฃ 2.0.0 เจตเจฐเจคเจฆเจพ เจนเฉˆเฅค เจ‰เจน เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจฆเจ–เจฒ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเฉ‡, เจ…เจคเฉ‡ เจ•เฉ‹เจˆ เจ—เจฒเจคเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€.
  5. เจตเจฐเจœเจจ 2.0.0 เจชเฉเจฐเจพเจฃเฉ‡ เจ…เจคเฉ‡ เจจเจตเฉ‡เจ‚ เจ•เจพเจฒเจฎ เจฆเฉ‹เจจเจพเจ‚ เจตเจฟเฉฑเจš เจกเจพเจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเฉฑเจ›เฉœเฉ€ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ

เจ‡เจน เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจนเฉˆ. เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ•เฉ‹เจˆ เจธเจตเจพเจฒ เจนเจจ เจœเฉ‹ เจชเฉเจฐเจพเจฃเฉ‡/เจจเจตเฉ‡เจ‚ เจ•เจพเจฒเจฎ เจฆเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡ เจ†เจˆเจŸเจฎเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจฐเฉฑเจ–เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจนเฉเจฃ เจกเฉเจชเจฒเฉ€เจ•เฉ‡เจŸ เจฎเฉเฉฑเจฒ เจนเจจ (เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจ‰เจน เจ…เจœเฉ‡ เจตเฉ€ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจŸ เจ•เจฐ เจฐเจนเฉ‡ เจนเจจ)เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจจเฉ‚เฉฐ เจ—เจฟเจฃเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเจพ เจ†เจ–เจฐเฉ€ เจจเจพเจฎ (เจœเฉ‹ เจตเฉ€ เจ•เจพเจฒเจฎ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ) เจ…เฉฑเจ–เจฐ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจ‡เจ† เจธเฉ€ A, เจซเจฟเจฐ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจกเฉ‡เจŸเจพ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจชเฉ‚เจฐเจพ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ (old โ†’ new เจ•เจพเจฒเจฎ) เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ•เจพเจฒเจฎ เจชเฉเฉฑเจ›เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ…เจธเฉฐเจ—เจค เจกเฉ‡เจŸเจพ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฐเฉ‹เจฒเจฌเฉˆเจ•

เจนเฉเจฃ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจนเฉˆ 2.0.0 เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš v2.

เจ•เจฆเจฎ:

  1. เจ†เจชเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจตเจฐเจœเจจ 'เจคเฉ‡ เจตเจพเจชเจธ เจญเฉ‡เจœเฉ‹ 1.0.0.
  2. เจตเจฐเจœเจจ 1.0.0 เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ surname, เจ‡เจธ เจฒเจˆ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจธเจซเจฒ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ

DB เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจจเจพเจฎ เจฆเจพ เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจนเฉˆ last_name.

เจซเจฒเจพเจˆเจตเฉ‡ เจธเจฐเฉ‹เจค เจธเจ•เฉเจฐเจฟเจชเจŸ:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เจธเจ•เฉเจฐเจฟเจชเจŸ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ surname.

เจงเจฟเจ†เจจ. เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจœเฉ‹ เจ•เจพเจฒเจฎ เจœเฉ‹เฉœ เจฐเจนเฉ‡ เจนเฉ‹ เจ‰เจธ เจตเจฟเฉฑเจš เจคเฉเจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจตเฉ€ NOT NULL เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจจเจนเฉ€เจ‚ เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ JAR เจจเฉ‚เฉฐ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจ—เจ เจ•เจพเจฒเจฎ เจฌเจพเจฐเฉ‡ เจ•เฉ‹เจˆ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช NULL 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค เจœเฉ‡เจ•เจฐ เจ…เจœเจฟเจนเฉ€ เจ•เฉ‹เจˆ เจธเฉ€เจฎเจพ เจนเฉˆ, เจคเจพเจ‚ เจชเฉเจฐเจพเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจฟเจฐเจซเจผ เจŸเฉเฉฑเจŸ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

เจ•เฉ‹เจก เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ last_name, เจ…เจคเฉ‡ เจ…เฉฐเจฆเจฐ surname. เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจชเฉœเฉเจนเจฆเฉ‡ เจนเจพเจ‚ last_name, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ•เจพเจฒเจฎ เจธเจญ เจคเฉ‹เจ‚ เจขเฉเจ•เจตเจพเจ‚ เจนเฉˆเฅค เจคเฉˆเจจเจพเจคเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจ•เฉเจ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเฉ‹ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ…เฉฑเจชเจกเฉ‡เจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจเฅค

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

เจ•เจฆเจฎ 3: เจ•เฉ‹เจก เจคเฉ‹เจ‚ เจ†เจ–เจฐเฉ€_เจจเจพเจฎ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃเจพ

เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ: 3.0.0

DB เจธเฉฐเจธเจ•เจฐเจฃ:v3

เจŸเจฟเฉฑเจชเจฃเฉ€

เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจชเฉเจฐเจคเฉ€.: เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉ‚เจฒ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฒเฉ‡เจ–เจ• เจจเฉ‡ เจ—เจฒเจคเฉ€ เจจเจพเจฒ เจ‡เจธ เจฌเจฒเจพเจ• เจฆเฉ‡ เจชเจพเจ  เจจเฉ‚เฉฐ เจ•เจฆเจฎ 2 เจคเฉ‹เจ‚ เจจเจ•เจฒ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจ‡เจธ เจชเฉœเจพเจ… 'เจคเฉ‡, เจ•เจพเจฒเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃ เจฆเฉ‡ เจ‰เจฆเฉ‡เจธเจผ เจจเจพเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฆเจฒเจพเจ… เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค last_name.

เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ•เจพเจฒเจฎ เจœเฉ‹เฉœ เจ•เฉ‡ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจ•เฉ‡, เจ…เจธเฉ€เจ‚ เจฌเฉˆเจ•เจตเจฐเจก เจ…เจจเฉเจ•เฉ‚เจฒ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฌเจฆเจฒเจพเจ… เจฌเจฃเจพเจ เจนเจจเฅค เจจเจพเจฒ เจนเฉ€, เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ JAR เจจเฉ‚เฉฐ เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเจพเจ‚ เจ•เฉ‹เจˆ เจชเฉเจฐเจพเจฃเจพ JAR เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฆเฉŒเจฐเจพเจจ เจจเจนเฉ€เจ‚ เจŸเฉเฉฑเจŸเฉ‡เจ—เจพเฅค

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฐเฉ‹เจฒเจฌเฉˆเจ•

เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจนเฉˆ 3.0.0 เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ v3. เจธเฉฐเจธเจ•เจฐเจฃ 3.0.0 เจตเจฟเฉฑเจš เจกเจพเจŸเจพ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ last_name. เจ‡เจธ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‡เจจ surname เจธเจญ เจคเฉ‹เจ‚ เจ…เฉฑเจช-เจŸเฉ‚-เจกเฉ‡เจŸ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจ•เจฆเจฎ:

  1. เจ†เจชเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจตเจฐเจœเจจ 'เจคเฉ‡ เจตเจพเจชเจธ เจญเฉ‡เจœเฉ‹ 2.0.0.
  2. เจตเจฐเจœเจจ 2.0.0 เจตเจฐเจคเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ last_name ะธ surname.
  3. เจตเจฐเจœเจจ 2.0.0 เจฒเฉˆ เจœเจพเจตเฉ‡เจ—เจพ surname, เจœเฉ‡เจ•เจฐ เจ‡เจน เจœเจผเฉ€เจฐเฉ‹ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจจเจนเฉ€เจ‚ เจคเจพเจ‚ -last_name

เจกเจพเจŸเจพเจฌเฉ‡เจธ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚

เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจขเจพเจ‚เจšเจพเจ—เจค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเจนเฉ€เจ‚ เจนเจจเฅค เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจฃเฉ‡ เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจ…เฉฐเจคเจฎ เจฎเจพเจˆเจ—เฉเจฐเฉ‡เจธเจผเจจ เจ•เจฐเจจ เจฒเจˆ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ:

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

เจ•เฉ‹เจก เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจชเฉเจฐเจคเฉ€.: เจ‡เจธ เจฌเจฒเจพเจ• เจฆเจพ เจตเจฐเจฃเจจ เจตเฉ€ เจ—เจฒเจคเฉ€ เจจเจพเจฒ เจฒเฉ‡เจ–เจ• เจฆเฉเจ†เจฐเจพ เจ•เจฆเจฎ 2 เจคเฉ‹เจ‚ เจ•เจพเจชเฉ€ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจฒเฉ‡เจ– เจฆเฉ‡ เจคเจฐเจ• เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ, เจ‡เจธ เจชเฉœเจพเจ… 'เจคเฉ‡ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ เจ•เจพเจฒเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจคเฉฑเจคเจพเจ‚ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃเจพ เจนเฉˆเฅค last_name.

เจ…เจธเฉ€เจ‚ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ last_name, เจ…เจคเฉ‡ เจ…เฉฐเจฆเจฐ surname. เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ…เจธเฉ€เจ‚ เจ•เจพเจฒเจฎ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจฆเฉ‡ เจนเจพเจ‚ last_name, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจขเฉเจ•เจตเจพเจ‚ เจนเฉˆเฅค เจคเฉˆเจจเจพเจคเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจ•เฉเจ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉเจ†เจฐเจพ เจธเฉฐเจธเจพเจงเจฟเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเฉ‹ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ…เฉฑเจชเจ—เจฐเฉ‡เจก เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจเฅค

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

เจ•เจฆเจฎ 4: เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเฉ‹เจ‚ เจ†เจ–เจฐเฉ€_เจจเจพเจฎ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃเจพ

เจเจช เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ: 4.0.0

DB เจธเฉฐเจธเจ•เจฐเจฃ: v4

เจŸเจฟเฉฑเจชเจฃเฉ€

เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ•เจฟ เจธเฉฐเจธเจ•เจฐเจฃ เจ•เฉ‹เจก 3.0.0 เจ•เจพเจฒเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ last_name, เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฆเฉŒเจฐเจพเจจ เจ•เฉเจ เจตเฉ€ เจฌเฉเจฐเจพ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจตเจพเจชเจธ เจฎเฉเฉœเจฆเฉ‡ เจนเจพเจ‚ 3.0.0 เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ.

เจธเจ•เฉเจฐเจฟเจชเจŸ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฒเฉŒเจ—เจธ

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

DB เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจฌเจพเจฐเฉ‡ v3 เจ…เจธเฉ€เจ‚ เจฌเจธ เจ•เจพเจฒเจฎ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ last_name เจ…เจคเฉ‡ เจ—เฉเฉฐเจฎ เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

เจ•เฉ‹เจก เจฌเจฆเจฒเจฆเจพ เจนเฉˆ

เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจฌเจฆเจฒเจพเจ… เจจเจนเฉ€เจ‚ เจนเจจเฅค

เจธเจฟเฉฑเจŸเจพ

เจ…เจธเฉ€เจ‚ เจ•เจˆ เจฌเฉˆเจ•เจตเจฐเจก-เจ…เจจเฉเจ•เฉ‚เจฒ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจ‡เฉฑเจ• เจชเจฟเฉฑเจ›เฉ‡-เจ…เจธเฉฐเจ—เจค เจ•เจพเจฒเจฎ เจจเจพเจฎ เจคเจฌเจฆเฉ€เจฒเฉ€ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจนเฉ‡เจ เจพเจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเจพ เจธเจพเจฐ เจนเฉˆ:

  1. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ 1.0.0 ั v1 เจกเจพเจŸเจพเจฌเฉ‡เจธ เจธเจ•เฉ€เจฎเจพ (เจ•เจพเจฒเจฎ เจฆเจพ เจจเจพเจฎ = last_name)
  2. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ 2.0.0, เจœเฉ‹ เจกเจพเจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ last_name ะธ surname. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจฆเจพ เจนเฉˆ last_name. เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจนเฉˆ v2เจตเจฐเจ—เฉ‡ เจ•เจพเจฒเจฎ เจฐเฉฑเจ–เจฃ เจตเจพเจฒเฉ‡ last_name, เจ…เจคเฉ‡ surname. surname l เจฆเฉ€ เจ‡เฉฑเจ• เจ•เจพเจชเฉ€ เจนเฉˆast_name. (เจจเฉ‹เจŸ: เจ‡เจธ เจ•เจพเจฒเจฎ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ null เจชเจพเจฌเฉฐเจฆเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€)
  3. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ 3.0.0, เจœเฉ‹ เจธเจฟเจฐเจซ เจกเจพเจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ surname เจ…เจคเฉ‡ เจ‰เจชเจจเจพเจฎ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจฆเจพ เจนเฉˆเฅค เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฒเจˆ, เจ†เจ–เจฐเฉ€ เจฎเจพเจˆเจ—เจฐเฉ‡เจธเจผเจจ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ last_name ะฒ surname. เจ‡เฉฑเจ• เจธเฉ€เจฎเจพ เจตเฉ€ เจจเจนเฉ€เจ‚ เจคเฉ‹เจ‚ เจนเจŸเจพเจ‡เจ† เจ—เจฟเจ† last_name. เจกเจพเจŸเจพเจฌเฉ‡เจธ เจนเฉเจฃ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจนเฉˆ v3
  4. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ 4.0.0 - เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจฌเจฆเจฒเจพเจ… เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจเฅค เจกเจพเจŸเจพเจฌเฉ‡เจธ เจคเฉˆเจจเจพเจคเฉ€ v4, เจœเฉ‹ เจนเจŸเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ last_name. เจ‡เฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจตเฉ€ เจ—เฉเฉฐเจฎ เจฐเฉเจ•เจพเจตเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ‡เจธ เจชเจนเฉเฉฐเจš เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจ•เฉ‡, เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ/เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจจเฉ‚เฉฐ เจคเฉ‹เฉœเฉ‡ เจฌเจฟเจจเจพเจ‚ เจนเจฎเฉ‡เจธเจผเจพเจ‚ เจ‡เฉฑเจ• เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ•เฉ‹เจก

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจ—เจฟเจ† เจธเจพเจฐเจพ เจ•เฉ‹เจก เจ‡เฉฑเจฅเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเฉˆ GitHub. เจนเฉ‡เจ เจพเจ‚ เจตเจพเจงเฉ‚ เจตเฉ‡เจฐเจตเจพ เจนเฉˆเฅค

เจชเฉเจฐเจพเจœเฉˆเจ•เจŸ

เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจ•เจฒเฉ‹เจจ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจธเฉ€เจ‚ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจฌเจฃเจคเจฐ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เฉ‹เจ—เฉ‡เฅค

โ”œโ”€โ”€ boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
โ”œโ”€โ”€ boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
โ”œโ”€โ”€ boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
โ”œโ”€โ”€ boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
โ””โ”€โ”€ boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

เจฒเจฟเจชเฉ€เจ†เจ‚

เจคเฉเจธเฉ€เจ‚ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€เจ†เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจฃเจฟเจค เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเฉ‹ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจชเจฟเจ›เฉœเฉ‡-เจ…เจจเฉเจ•เฉ‚เจฒ เจ…เจคเฉ‡ เจ…เจธเฉฐเจ—เจค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเจพ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ•เจฐเจจเจ—เฉ‡เฅค

เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจฌเฉˆเจ•เจตเจฐเจก เจ…เจจเฉเจ•เฉ‚เจฒ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจตเจพเจฒเจพ เจ•เฉ‡เจธ, เจฐเจจ:

./scripts/scenario_backward_compatible.sh

เจ…เจคเฉ‡ เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจชเจฟเฉฑเจ›เฉ‡ เจตเฉฑเจฒ เจ…เจธเฉฐเจ—เจค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจตเจพเจฒเจพ เจ•เฉ‡เจธ, เจฐเจจ:

./scripts/scenario_backward_incompatible.sh

เจธเจชเจฐเจฟเฉฐเจ— เจฌเฉ‚เจŸ เจธเฉˆเจ‚เจชเจฒ เจซเจฒเจพเจˆเจตเฉ‡

เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจคเฉ‹เจ‚ เจฒเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ Spring Boot Sample Flyway.

เจคเฉเจนเจพเจจเฉ‚เฉฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจจเจœเจผเจฐ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจนเฉ‹ http://localhost:8080/flyway, เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจนเฉˆเฅค

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš H2 เจ•เฉฐเจธเฉ‹เจฒ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉˆ (เจคเฉ‡ http://localhost:8080/h2-console) เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจธเจฅเจฟเจคเฉ€ (เจกเจฟเจซเฉŒเจฒเจŸ jdbc URL เจนเฉˆ jdbc:h2:mem:testdb).

เจตเจพเจงเฉ‚

เจธเจพเจกเฉ‡ เจฌเจฒเฉŒเจ— 'เจคเฉ‡ เจนเฉ‹เจฐ เจฒเฉ‡เจ– เจตเฉ€ เจชเฉœเฉเจนเฉ‹:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹