๐Ÿ“š [Spring] ํ”„๋กœ์ ํŠธ ๊ณ ๋„ํ™”

์ด๊ฐ€์€ยท2024๋…„ 6์›” 27์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
13/13
post-thumbnail

๐Ÿ“• ํŽ˜์ด์ง•/ํŽ˜์ด์ง€๋„ค์ด์…˜

ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋Š” ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์œ„๋ฅผ ๋‚˜๋ˆ ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋‹จํŽธํ™”์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค
ํŽ˜์ด์ง€๋„ค์ด์…˜์ด๋ž€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…์ธ ๋ฅผ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆ„๊ณ  ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ๋ฒ„ํŠผ, ์ด์ „ ๋ฒ„ํŠผ, ๋‹ค์Œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค

์Šคํ”„๋ง์—์„œ ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , Spring์—์„œ ์ œ๊ณตํ•˜๋Š” Pageable์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค

๐Ÿ“– 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"));

๐Ÿ“– Page ์ธํ„ฐํŽ˜์ด์Šค

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, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)์—์„œ ์–˜๊ธฐํ•˜๋Š” ํ…Œ์ŠคํŠธ๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค
โœ” ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์‹œ๋กœ ๋น ๋ฅด๊ฒŒ ๋Œ๋ฆฌ๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ“– ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Integration Test)

๋ชจ๋“ˆ์„ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“ˆ ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ

โœ” ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์›น ํŽ˜์ด์ง€๋กœ๋ถ€ํ„ฐ 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 ํŒŒ์ผ์„ ์ž๋™ ๋ฐฐํฌํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ“— CI / CD - AWS

๐Ÿ“– CI

๋นŒ๋“œ/ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ณผ์ •์„ ์˜๋ฏธํ•˜๋Š” ์šฉ์–ด๋กœ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค์ด๋ฉฐ, ์ง€์†์ ์ธ ํ†ตํ•ฉ(Continuous Integration)์„ ์˜๋ฏธํ•œ๋‹ค
์‰ฝ๊ฒŒ GitHub์— ํŠน์ • ๋ธŒ๋žœ์น˜(master)์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ๋  ๋•Œ ๋งˆ๋‹ค, ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™ํ™” ํ•œ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ“– CD

๋ฐฐํฌ ์ž๋™ํ™” ๊ณผ์ •์„ ์˜๋ฏธํ•˜๋Š” ์šฉ์–ด๋กœ ์ง€์†์  ์„œ๋น„์Šค ์ œ๊ณต(Continuous Delivery) ๋˜๋Š” ์ง€์†์  ๋ฐฐํฌ(Continuous Deployment)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๊ธฐ์กด์—๋Š” ๋นŒ๋“œ ํ›„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด, ์‹ค์ œ ์„œ๋ฒ„๋‚˜ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์— ํ•ฉ์ณ์ง„ ์ฝ”๋“œ(๋นŒ๋“œ๋œ ์ƒํƒœ์˜)๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ ์ด๋ฅผ ๋ฐฐํฌํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CI(Continuous Integration) ๊ณผ์ •์„ ํ†ตํ•ด ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํ†ตํ•ฉ๋˜๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„, ๋ฐฐํฌ๊นŒ์ง€ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฅผ CD๋ผ๊ณ  ํ•œ๋‹ค

๐Ÿ“˜ ๋ธŒ๋žœ์น˜ ์ „๋žต - ๊นƒ ํ”Œ๋กœ์šฐ

๋ธŒ๋žœ์น˜ ์ „๋žต์ด๋ž€ย ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ €์žฅ์†Œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ work-flow๋กœ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ์— ๊ทœ์น™์„ ๋งŒ๋“ค์–ด์„œ ํ˜‘์—…์„ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋ผ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ“– git-flow ์ „๋žต

โœ” ๊ธฐ๋ณธ์ ์ธ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„ : feature > develop > release > hotfix > master
โœ” ์œ„ ์ˆœ์„œ๋“ค์€ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ํฌ๊ด„์ ์ธ ๋ธŒ๋žœ์น˜์ด๋ฉฐ master branch๋ฅผ ๋ณ‘ํ•ฉํ•  ๊ฒฝ์šฐ ๊ทธ ์™ผ์ชฝ์— ์žˆ๋Š” hotfix ๋“ฑ ๋ชจ๋“  ๋ธŒ๋žœ์น˜์— ์žˆ๋Š” ์ปค๋ฐ‹๋“ค๋„ ๋ณ‘ํ•ฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค
โœ” 5๊ฐ€์ง€ ์ค‘, ํ•ญ์‹œ ์œ ์ง€๋˜๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ master, develop 2๊ฐ€์ง€์™€ merge ๋˜๋ฉด ์‚ฌ๋ผ์ง€๋Š” ๋ณด์กฐ ๋ธŒ๋žœ์น˜ feature, release, hotfix 3๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค

๐Ÿ“– git-flow ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ

masterย : ๋ผ์ด๋ธŒ ์„œ๋ฒ„์— ์ œํ’ˆ์œผ๋กœ ์ถœ์‹œ๋˜๋Š” ๋ธŒ๋žœ์น˜
developย : ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ๋Œ€๋น„ํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
featureย : ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜.ย developย ๋ธŒ๋žœ์น˜์— ๋“ค์–ด๊ฐ„๋‹ค
releaseย : ๋‹ค์Œ ๋ฒ„์ „ ์ถœ์‹œ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ธŒ๋žœ์น˜. develop ๋ธŒ๋žœ์น˜๋ฅผ release ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ธด ํ›„ QA, ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  master ๋ธŒ๋žœ์น˜๋กœ ํ•ฉ์นœ๋‹ค
hotfixย :ย masterย ๋ธŒ๋žœ์น˜์—์„œ ๋ฐœ์ƒํ•œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ธŒ๋žœ์น˜

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

๐Ÿ“– ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
๐Ÿ“– ๋นŒ๋“œ์™€ ๋ฐฐํฌ ๋ฐฉ๋ฒ•
๐Ÿ“– ๋นŒ๋“œ์™€ ๋ฐฐํฌ, CI/CD
๐Ÿ“– ๋ธŒ๋žœ์น˜ ์ „๋žต

profile
๊ฐ€๋ฟก์ด์˜ ๊ณต๋ถ€ ์ƒ์ž๐Ÿ“ฆ

0๊ฐœ์˜ ๋Œ“๊ธ€