ํ์ด์ง ์ฒ๋ฆฌ๋ ํ ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋จ์๋ฅผ ๋๋ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ๋จํธํ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ค
ํ์ด์ง๋ค์ด์ ์ด๋ ์ฌ๋ฌ๊ฐ์ ์ปจํ ์ธ ๋ฅผ ์ฌ๋ฌ ํ์ด์ง๋ก ๋๋๊ณ ํ์ด์ง ๋ฒํธ ๋ฒํผ, ์ด์ ๋ฒํผ, ๋ค์ ๋ฒํผ์ ๋๋ฌ์ ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๊ธฐ๋ฅ์ด๋ค
์คํ๋ง์์ ํ์ด์ง๋ค์ด์ ์ ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํด์ ์ฌ์ฉํ ์ ์๊ณ , Spring์์ ์ ๊ณตํ๋ Pageable์ ์ฌ์ฉํ ์๋ ์๋ค
Spring Data JPA์์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ก ํ์ด์ง ํฌ๊ธฐ(size), ํ์ด์ง ๋ฒํธ(page), ์ ๋ ฌ(sort) ๋ฐฉ์์ ์ค์ ํ ์ ์๋ค
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ํ์ด์ง ์์ฒญ์ ๋ด๋นํ๋ Pageable ๊ฐ์ฒด๋PageRequest.of(page, size, sort)
๋ฉ์๋๋ฅผ ํตํด ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ฒด๋ Spring Data JPA ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฉ์๋์ ์ ๋ฌ๋๋ค
๐ ๋ณ์
size
: ํ ํ์ด์ง๋น ๋ด๊ธธ ๋ฐ์ดํฐ์ ์ ex) 10, 5, ...
page
: size๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ช๋ฒ์งธ ํ์ด์ง์ธ์ง? ex) 0, 1, ...
sort
: ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๊ฒ์ธ์ง? ex) createdAt,DESC, description
์ด๊ฒ์ ๊ธฐ์ค์ผ๋ก ์์ฒญ URL์ ๋ณ์๋ฅผ ๋๊ธฐ๋ฉด, ํ์ด์ง๋ค์ด์
์ด ๋์ํ๋ค
๐ Pageable ์ฌ์ฉ๋ฒ
//Pageable ์ธ์คํด์ค ์์ฑ
PageRequest pageRequest = PageRequest.of(pageNum - 1, PAGE_POST_COUNT, Sort.by(Sort.Direction.DESC, "createdAt"));
Spring Data JPA์์ ํ์ด์ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ์ธํฐํ์ด์ค๋ก, ํ์ด์ง๋ ๋ฐ์ดํฐ์ ํ์ด์ง ์ ๋ณด(์ด ํ์ด์ง ์, ํ์ฌ ํ์ด์ง ๋ฑ)๋ฅผ ์ ๊ณตํ๋ค
๐ Page ์ฌ์ฉ๋ฒ
Page<BoardEntity> page = boardRepository.findByTitleContaining(keyword, pageRequest);
List<BoardDto> boardDtoList = page.getContent(); // ํ์ด์ง๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ
int totalPages = page.getTotalPages(); // ์ด ํ์ด์ง ์
๋จ์ ํ ์คํธ(Unit Test)๋ ํ๋์ ๋ชจ๋์ ๊ธฐ์ค์ผ๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์งํ๋๋ ๊ฐ์ฅ ์์ ๋จ์์ ํ ์คํธ
โ ๋จ์ ํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ํ๋์ ๊ธฐ๋ฅ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๋ ๊ฒ์ผ๋ก, "์ด๋ค ๊ธฐ๋ฅ์ด ์คํ๋๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค" ์ ๋๋ก ํ ์คํธ๋ฅผ ์งํํ๋ค
๐ ์ฅ์
โพ ํ
์คํ
์ ๋ํ ์๊ฐ๊ณผ ๋น์ฉ์ ์ ๊ฐํ ์ ์๋ค
โพ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ์์ ์์๋ก ๋น ๋ฅด๊ฒ ํ
์คํธ ํ ์ ์๋ค
โพ ๋ฆฌํฉํ ๋ง ์์ ์์ ์ฑ์ ํ๋ณดํ ์ ์๋ค
โพ ์ฝ๋์ ๋ํ ๋ฌธ์๊ฐ ๋ ์ ์๋ค
โ ์ค๋ฌด์์๋ ๋จ์ ํ
์คํธ๋ฅผ ์ ํธํ๋ฉฐ, ์์ฆ ๋ง์ด ์ฌ์ฉ๋๋ TDD(Test-Driven Development, ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ)์์ ์๊ธฐํ๋ ํ
์คํธ๋ ๋จ์ ํ
์คํธ๋ฅผ ์๋ฏธํ๋ค
โ ์์ฑํ ํ
์คํธ ์ฝ๋๋ฅผ ์์๋ก ๋น ๋ฅด๊ฒ ๋๋ฆฌ๋ฉด์ ๋ฌธ์ ๋ฅผ ํ์
ํ ์ ์๋ค
๋ชจ๋์ ํตํฉํ๋ ๊ณผ์ ์์ ๋ชจ๋ ๊ฐ์ ํธํ์ฑ์ ํ์ธํ๊ธฐ ์ํด ์ํ๋๋ ํ ์คํธ
โ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ๊ฐ ์๋๋ผ ์น ํ์ด์ง๋ก๋ถํฐ API๋ฅผ ํธ์ถํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ์ง๋ฅผ ํ์ธํ๋ ๊ฒ
์ปดํ์ผ ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ํ๋ก ๋ง๋๋ ์ผ
โ ๋น๋ ํด๋ก๋ Ant, Maven, Gradle ๋ฑ์ด ์๋ค
๐ IntelliJ IDE๋ฅผ ์ด์ฉํ ๋น๋
โ Spring Boot๋ Gradle ๋น๋ ํด์ ์ด์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํ ์ ์๋ ํด์ ์ง์ํ๋ค
โ :build ๋๋ :bootJar ์คํํ๋ค
โ ๋น๋๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด build/libs ๋๋ ํ ๋ฆฌ์ Jar ํ์ผ์ด ์์ฑ๋๋ค
โ ์์ฑ๋ Jar ํ์ผ์ ๋ก์ปฌ์์ ์คํ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์คํ ํ์ผ์ด๋ค
๐ :build
assemble, :check ๊ฐ์ด Gradle์์ ๋น๋๋ฅผ ์ํด ๊ด๋ จ๋ ๋ชจ๋ task๋ค์ ์คํ์ํจ๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ ๊ฐ๋ฅํ Jar ํ์ผ ์ด์ธ์ plain Jar ํ์ผ ํ๋๋ฅผ ๋ ์์ฑํ๋ค
๐ :bootJar
๋น๋๋ฅผ ์ํด ๊ด๋ จ๋ ๋ชจ๋ task๋ค์ ์คํํ๋ ๊ฒ์ด ์๋๋ผ, jar ํ์ผ์ ์์ฑํ๊ธฐ ์ํ task๋ง ์คํํ๋ค.
๋น๋๊ฐ ์์ฑ๋ ์คํ ๊ฐ๋ฅํ ํ์ผ์ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ํ๊ฒฝ์ ๋ฐฐ์น์ํค๋ ์ผ
๐ ์ ํต์ ์ธ ๋ฐฐํฌ ๋ฐฉ๋ฒ
Spring Boot ๊ธฐ๋ฐ์ Executable Jar ํ์ผ์ ์๋ฒ์ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ scp์ ๊ฐ์ ํ์ค ์ ๋์ค ํด์ ์ด์ฉํด์ ์๋ฒ๋ก ๊ฐ๋จํ ์ ์กํ๋ ๊ฒ์ด๋ค. ์๋ฒ๋ก ์ ์ก๋ jar ํ์ผ์ JVM์ด ์ค์น๋ ํ๊ฒฝ์ด๋ผ๋ฉด ์ด๋์๋ ์์ฝ๊ฒ ์คํํ ์ ์๋ค
๐ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ํ ๋ฐฐํฌ ๋ฐฉ๋ฒ
jar ํ์ผ์ ํด๋ผ์ฐ๋ ํ๊ฒฝ์๋ ์์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๋ค
๐ PaaS(Platform as a Service)
๋ํ์ ์ธ PaaS ์ ๊ณต ํ์ฌ์ธ Cloud Foundry์์ ์ ๊ณตํ๋ cf command line ํด์ ์ฌ์ฉํ๋ฉด jar ํ์ผ์ ์์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๋ค.
๐ IaaS(Infrastructure as a Service)
jar ํ์ผ์ AWS Code Deploy, AWS Elastic Beanstalk, AWS Container Registry ๊ฐ์ ์๋น์ค๋ฅผ ์ด์ฉํด์ ์์ฝ๊ฒ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ํ, Microsoft์ ํด๋ผ์ฐ๋ ์๋น์ค์ธ Azure์ Google Cloud ์ญ์ ์ฌ๋ฌ๊ฐ์ง Executable Jar ํ์ผ ๋ฐฐํฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๐ CI / CD ํ๋ซํผ์ ์ฌ์ฉํ ๋ฐฐํฌ
Github Actions๋ Circle CI, Jenkins ๊ฐ์ CI/CD ํ๋ซํผ์ ์ด์ฉํด AWS๋ Azure ๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค์ Executable Jar ํ์ผ์ ์๋ ๋ฐฐํฌํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค
๋น๋/ํ ์คํธ ์๋ํ ๊ณผ์ ์ ์๋ฏธํ๋ ์ฉ์ด๋ก ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ํ ํ๋ก์ธ์ค์ด๋ฉฐ, ์ง์์ ์ธ ํตํฉ(Continuous Integration)์ ์๋ฏธํ๋ค
์ฝ๊ฒ GitHub์ ํน์ ๋ธ๋์น(master)์ ์๋ก์ด ์ปค๋ฐ์ด ๋ ๋ ๋ง๋ค, ํด๋น ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ๋น๋ํ๊ณ ์ฌ์ฉ์๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ฌธ์ ๊ฐ ์๋์ง ์๋์ง๋ฅผ ์ฒดํฌํ๋ ๊ณผ์ ์ ์๋ํ ํ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐฐํฌ ์๋ํ ๊ณผ์ ์ ์๋ฏธํ๋ ์ฉ์ด๋ก ์ง์์ ์๋น์ค ์ ๊ณต(Continuous Delivery) ๋๋ ์ง์์ ๋ฐฐํฌ(Continuous Deployment)๋ฅผ ์๋ฏธํ๋ค.
๊ธฐ์กด์๋ ๋น๋ ํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จ๋๋ฉด, ์ค์ ์๋ฒ๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ํฉ์ณ์ง ์ฝ๋(๋น๋๋ ์ํ์)๋ฅผ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ์ด๋ฅผ ๋ฐฐํฌํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ CI(Continuous Integration) ๊ณผ์ ์ ํตํด ์ฝ๋๊ฐ ์๋์ผ๋ก ํตํฉ๋๊ณ ํ ์คํธ๊ฐ ์๋ฃ๋ ์ดํ, ๋ฐฐํฌ๊น์ง ์๋์ผ๋ก ์คํํ๋ฉด ์ด๋ฅผ CD๋ผ๊ณ ํ๋ค
๋ธ๋์น ์ ๋ต์ด๋ย ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ๋์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ์ ์ฅ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํ work-flow๋ก ๋ธ๋์น ์์ฑ์ ๊ท์น์ ๋ง๋ค์ด์ ํ์ ์ ์ ์ฐํ๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ก ์ด๋ผ ๋งํ ์ ์๋ค
โ ๊ธฐ๋ณธ์ ์ธ ๋ธ๋์น ์ด๋ฆ : feature > develop > release > hotfix > master
โ ์ ์์๋ค์ ์ผ์ชฝ์ผ๋ก ๊ฐ์๋ก ํฌ๊ด์ ์ธ ๋ธ๋์น์ด๋ฉฐ master branch๋ฅผ ๋ณํฉํ ๊ฒฝ์ฐ ๊ทธ ์ผ์ชฝ์ ์๋ hotfix ๋ฑ ๋ชจ๋ ๋ธ๋์น์ ์๋ ์ปค๋ฐ๋ค๋ ๋ณํฉํ๋๋ก ๊ตฌ์ฑํ๊ฒ ๋๋ค
โ 5๊ฐ์ง ์ค, ํญ์ ์ ์ง๋๋ ๋ฉ์ธ ๋ธ๋์น master, develop 2๊ฐ์ง์ merge ๋๋ฉด ์ฌ๋ผ์ง๋ ๋ณด์กฐ ๋ธ๋์น feature, release, hotfix 3๊ฐ์ง๋ก ๊ตฌ์ฑ๋๋ค
master
ย : ๋ผ์ด๋ธ ์๋ฒ์ ์ ํ์ผ๋ก ์ถ์๋๋ ๋ธ๋์น
develop
ย : ๋ค์ ์ถ์ ๋ฒ์ ์ ๋๋นํ์ฌ ๊ฐ๋ฐํ๋ ๋ธ๋์น
feature
ย : ์ถ๊ฐ ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น.ย developย ๋ธ๋์น์ ๋ค์ด๊ฐ๋ค
release
ย : ๋ค์ ๋ฒ์ ์ถ์๋ฅผ ์ค๋นํ๋ ๋ธ๋์น. develop ๋ธ๋์น๋ฅผ release ๋ธ๋์น๋ก ์ฎ๊ธด ํ QA, ํ
์คํธ๋ฅผ ์งํํ๊ณ master ๋ธ๋์น๋ก ํฉ์น๋ค
hotfix
ย :ย masterย ๋ธ๋์น์์ ๋ฐ์ํ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ธ๋์น
๐ ๋จ์ ํ
์คํธ์ ํตํฉ ํ
์คํธ
๐ ๋น๋์ ๋ฐฐํฌ ๋ฐฉ๋ฒ
๐ ๋น๋์ ๋ฐฐํฌ, CI/CD
๐ ๋ธ๋์น ์ ๋ต