๐Ÿ“’ AWS(3) - ์‹ค์Šต

Kimdongkiยท2024๋…„ 5์›” 3์ผ

DB

๋ชฉ๋ก ๋ณด๊ธฐ
13/33

๐Ÿ“Œ ๋ฐฑ์—”๋“œ ๋ชจ๋“ˆ ๊ตฌ์„ฑ

  • Spring๊ณผ gradle์„ ์ด์šฉํ•ด์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด์ž
  • ์ดํด๋ฆฝ์Šค๋ฅผ ์ด์šฉํ•œ ๋ฐฑ์—”๋“œ ๊ตฌ์„ฑ์˜ ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„ํŽธํ•œ ์ธํ…”๋ฆฌ์ œ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹ค์Šตํ•œ๋‹ค.
  • ๋จผ์ € Spring boot๋ฅผ ๊ธฐ์ค€์œผ๋กœ JAVA-Gradle-Groovy๋กœ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  • ์ด ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“ค๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋์ด๋‹ค.

๐Ÿ“™ src\main\java\com.name\nameApplication.java(Class)

package com.urface.cit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class UrfaceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UrfaceApplication.class, args);
    }

}

๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— ์ง„์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

swagger-ui 3.x version ์ด์ƒ http://localhost:8080/swagger-ui/index.html
swagger-ui 3.x version ๋ฏธ๋งŒ http://localhost:8080/swagger-ui.html

๐Ÿ“™ src\main\application.yml

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  application:
    name: name

๐Ÿ“™ build.gradle(name)

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.5'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'com.netflix.dgs.codegen' version '6.0.3'
    id 'org.graalvm.buildtools.native' version '0.9.28'
    id 'dev.hilla' version '2.5.5'
    id 'com.vaadin' version '24.3.10'
}

group = 'org.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

ext {
    set('hillaVersion', "2.5.5")
    set('springModulithVersion', "1.1.4")
    set('vaadinVersion', "24.3.10")
    springCloudVersion = "2023.0.1"
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
//    implementation 'io.springfox:springfox-boot-starter:3.0.0'
//    implementation 'io.springfox:springfox-swagger2:2.9.2'
//    implementation 'io.springfox:springfox-swagger-ui:2.9.2'
}

dependencyManagement {
    imports {
        mavenBom "dev.hilla:hilla-bom:${hillaVersion}"
        mavenBom "org.springframework.modulith:spring-modulith-bom:${springModulithVersion}"
        mavenBom "com.vaadin:vaadin-bom:${vaadinVersion}"
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:$springCloudVersion"
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

generateJava {
    schemaPaths = ["${projectDir}/src/main/resources/graphql-client"]
    packageName = 'org.example.urface.codegen'
    generateClient = true
}

build.gradle์—์„œ ๊ต‰์žฅํžˆ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ–ˆ๋‹ค.
์ด์œ ๋Š” Spring boot์™€ swagger ๋•Œ๋ฌธ์ด๋‹ค.
๋‚˜๋Š” ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค.
1. ๋ฒ„์ „ ๋งž์ถ”๊ธฐ
2. ๋ฒ„์ „์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ๋ฒ• ๋ณ€๊ฒฝ...๋“ฑ๋“ฑ

ํ•˜์ง€๋งŒ 404ERROR ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ERROR 2๊ฐ€์ง€๋ฅผ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ๊ฒช์—ˆ๋‹ค.

๊ฒฐ๋ก ์€ SwaggerConfig.java๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๊ฒƒ์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

springdoc์˜ ๊ฒฝ์šฐ SwaggerConfig๊ฐ€ ์—†์–ด๋„ Ui๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด ์ด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค. ์ด์œ ๋Š” ์ด ์‹ค์Šต์€ ๋ฐฑ์—”๋“œ ๊ตฌ์„ฑ ๋ณด๋‹ค๋Š” AWS ์‹ค์Šต์ด ์šฐ์„ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

16์‹œ๊ฐ„์„ ๊ฐˆ์•„๋ฒ„๋ฆฐ๊ฒƒ์€ ๋น„๋ฐ€์ด๋‹ค..

๐Ÿ“™ src\mian\java\com.name\controller\MemberService.java

package com.urface.cit.controller;

//import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MemberService {

    @GetMapping("/members")
//    @ApiOperation("ํšŒ์›์กฐํšŒ")
    public void get(){

    }

    @PostMapping("/members")
//    @ApiOperation("ํšŒ์›๋“ฑ๋ก")
    public void register(){

    }

    @DeleteMapping("/members")
//    @ApiOperation("ํšŒ์›์‚ญ์ œ")
    public void delete(){

    }

}

์ด์ œ ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚ซ๊ธฐ ๋•Œ๋ฌธ์— AWS ์‹ค์Šต์œผ๋กœ ๋„˜์–ด๊ฐ€์ž

๐Ÿ“Œ VPC ๊ตฌ์„ฑ

์ด์ œ VPC๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์ž.
๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.


์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์˜ฌ๊ฒƒ์ด๋‹ค.
ํ•˜...์ด๋ฆ„์— vpc๊ฐ€ ๋‹ฌ๋ ค์„œ ๋‚˜์˜ค๋‹ˆ๊นŒ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ทธ๋ƒฅ name๋งŒ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค..

์ด๋ฆ„์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๊พธ์–ด์ฃผ์ž.
์„ธ๋ถ€์ •๋ณด์„œ๋ธŒ๋„ท๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ดNAT ๊ฒŒ์ดํŠธ์›จ์ด
์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” IP๋Š” ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ 52.79.73.57๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ“Œ Elasticbeanstalk ๊ตฌ์„ฑ






์ด ์‹ค์Šต์—์„œ๋Š” Private๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. -> Public์ด ๋” ์‰ฌ์›€

  • Elasticbeanstalk์„ ๋งŒ๋“ค๋•Œ t2-micro๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ง‘์ค‘ํ•ด์„œ ์„ค์ •์„ ํ•˜๋‚˜์”ฉ ๋ณด๊ณ  ๋„˜๊ธฐ์ž.

Elasticbeanstalk์„ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ EC2๋„ ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด์ œ ์ด ์„œ๋ฒ„๋กœ ์ ‘์†ํ•  ์ˆ˜์žˆ๋Š” Baston host ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” EC2๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ์ž.
ํฐ์—ดํ• ์„ ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— micro๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉฐ Key๋Š” ์ด์ „์— ๋งŒ๋“ ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
๋‚˜๋Š” putty๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ
์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋ฉด ๊ทธ๋งŒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด Elasticbeanstalk์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋Š” ์ฐธ๊ณ ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•ด๊ฒฐํ•˜์ž. ๋ฌผ๋ก  ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

์„ฑ๊ณต์ด๋‹ค!!

์ด์ œ Putty๋ฅผ ์‹คํ–‰ํ•ด์„œ BastonHost์— ์ ‘์†ํ•ด๋ณด์ž. ์•„๋ž˜ ํผ๋ธ”๋ฆญ IPv4 DNS์˜ ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋์ด๋‹ค! (Login as ๋ผ๊ณ  ๋œจ๋ฉด ๊ทธ๋ƒฅ ec2-user๋ฅผ ์ž‘์„ฑํ•ด๋ผ ๊ทธ๋Ÿผ ์ ์†๋จ ใ…‡ใ…‡)

๋ฌผ๋ก  ๋‚ด๊ฐ€ ๊ฐ€์ง„ Key์˜ ์œ„์น˜๋ฅผ Connection\SSH\Auth\Credentials์—์„œ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ณผ์ •์ด ์žˆ๋‹ค.
๋˜ํ•œ Elasticbeanstalk์œผ๋กœ ๋งŒ๋“  EC2์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ”๋กœ ์ ‘์†ํ•˜๋ ค ํ•˜๋ฉด ์ ‘์†์„ ํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋•Œ๋Š” bastonHost๋ฅผ ํ†ตํ•ด์„œ ์ ‘์†์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋จผ์ € Window์—๋Š” vi๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
๋‚˜๋Š” Gitbash๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.
Gitbash๋Š” Vi๋ฅผ ์ง€์›ํ•œ๋‹ค ๊ฐœ๊ฟ€ ใ…œใ…œ Vim ๊น”์•„์„œ ์จ๋ณด๊ฒŸ๋‹ค๊ณ  ๊นŒ๋ถˆ๋‹ค๊ฐ€ 1์‹œ๊ฐ„ ๋‚ ๋ฆฐ๊ฑด ๋น„๋ฐ€..

์ˆœ์„œ๋ฅผ ๋‹ค์‹œ ์ƒ๊ธฐ ์‹œ์ผœ๋ณด์ž.
1. Putty์—์„œ bastonhost์— ์ ‘์†
2. ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” pemํ‚ค ๋‚ด์šฉ์„ gitbash์—์„œ vi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌ(๋‚˜๋Š” ๊ตฌ์—ญ์„ ๋‚˜๋ˆ„์–ด์„œ ๋ณต์‚ฌํ•จ.. y๋กœ ๋ณต์‚ฌํ•˜๋ผ๋Š”๋ฐ ์•ˆ๋˜๋Š”๋ฐ..?)
3. pwd๋ฅผ ์ž‘์„ฑํ–ˆ์„๋•Œ ๋‚˜์˜จ ์ฃผ์†Œ๋กœ cd ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘์†
4. mkdir .ssh ์ž‘์„ฑํ•ด์„œ .ssh ๋งŒ๋“ค๊ธฐ
5. ls -arlt ์ž‘์„ฑํ•ด์„œ .ssh ๋งŒ๋“ ๊ฑฐ ํ™•์ธ
6. cd .ssh ์ ‘์†
7. vi key_name.pem ์ž‘์„ฑํ•ด์„œ vi ํ™˜๊ฒฝ์œผ๋กœ ์ ‘์†
8. Gitbash์—์„œ ๋ณต์‚ฌํ•œ ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ(i๋ฅผ ๋ˆŒ๋Ÿฌ์„œ insert ๋ชจ๋“œ๋กœ ์ง„์ž…ํ•ด์•ผํ•จ)
9. ESC, shift+:, wq ์ž…๋ ฅํ•ด์„œ ๋‚˜์˜ค๊ธฐ(์ €์žฅ์ž„)
10. chmod 400 key_name.pem ์ž‘์„ฑ
11. ssh -i key_name.pem ec2-user@ํ”„๋ฆฌ์•„๋น— IPv4 ์ฃผ์†Œ

์ด๋ ‡๊ฒŒ ์ง„์ž…ํ•˜๋ฉด ์™„์„ฑ์ด๋‹ค~!

์ด์ƒํƒœ๋กœ netstat -an | grep 5000 ์„ ์ž‘์„ฑํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋”ฐ.
Elasticbeanstalk๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 5000๋ฒˆ ํฌํŠธ์ด๋‹ค..


๐Ÿ“Œ RDS ๊ตฌ์„ฑ

์ด์ œ DB๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž ๋จผ์ € ์„œ๋ธŒ๋„ท ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด์ฃผ์ž.

์ด์ œ DB๋ฅผ ์ƒ์„ฑํ•˜์ž
admin0411
launch-wizard-1์˜ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์—์„œ MySQL/Aurora, TCP, 3306, ๋ชจ๋‘ ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
์ด๋Š” EC2์˜ ๋ณด์•ˆ๊ทธ๋ฃน์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด์ œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“  DB๋ฅผ ์ธํ…”๋ฆฌ์ œ์ด์—์„œ ์„ค์ •ํ•˜์ž.
์ธํ…”๋ฆฌ์ œ์ด๋Š” DB๋ฅผ ์˜ค๋ฅธ์ชฝ ํƒญ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
์ด ์—”๋“œํฌ์ธํŠธ ๋ฐ ํฌํŠธ๋ฅผ Host์— ๋„ฃ์–ด์ฃผ์ž
๊ทธ๋Ÿผ ์ด์ œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!ํ•˜ํ•˜ ์ด๊ฑด Private์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ธํ…”๋ฆฌ์ œ์ด๊ฐ€ ์ฐธ ํŽธํ•˜๋‹ค ๋ญ˜ ํ•ด์•ผํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค...ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ SSH/SSLํƒญ์—์„œ Use SSh tunnel์„ ํด๋ฆญํ•ด์„œ ์„ค์ •์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ bastonhost๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด ์ฃผ๊ฒŸ๋‹ค.

๊น”๋”ํ•˜๊ฒŒ ์„ฑ๊ณตํ–ˆ๋‹ค.
์ด์ œ๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.


ํ…Œ์ด๋ธ”๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ฃผ์ž

์ž˜ ๋งŒ๋“ค์–ด ์กŒ๋‹ค~


๐Ÿ“Œ S3 ๊ตฌ์„ฑ

S3 ๋ฒ„ํ‚ท์„ ๋งŒ๋“ค์–ด๋ณด์ž.
๋ฒ„ํ‚ท ์ด๋ฆ„๋งŒ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์ž˜ ๋งŒ๋“ค์–ด์„œ ๊ธฐ์–ตํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
์ด์ œ ์†์„ฑ์— ๋“ค์–ด๊ฐ€์„œ ์ •์  ์›น ์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…์„ ํ™œ์„ฑํ™” ์‹œ์ผœ์ฃผ์ž.


๐Ÿ“Œ React ๊ตฌ์„ฑ

๋ญ”๊ฐ€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Front๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
๊ฐ„๋‹จํ•˜๊ฒŒ React ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.

pip install npx

npx create-react-app urface-app

์›นํŽ˜์ด์ง€ ๋„์šฐ๊ธฐ

npm start

build ํŒŒ์ผ ์ƒ์„ฑ

npm run build

npm install -g serve

build๋ฅผ S3์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

build ๋‚ด์˜ ํŒŒ์ผ๋“ค์„ S3์— ๋งŒ๋“  urface.com์— ์—…๋กœ๋“œ ํ•ด๋ณด์ž.
์ด์ œ ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ(๋ฒ„ํ‚ท ์„ค์ •)์„ ํŽธ์ง‘ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
์ด์ œ ๋ฒ„ํ‚ท ์ •์ฑ…์„ ํŽธ์ง‘ํ•ด์ฃผ์ž. ์ •์ฑ… ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งž์ถฐ์ฃผ๋ฉด ๋œ๋‹ค.

์ด์ œ ์†์„ฑ - ์ •์  ์›น ์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ… ์œผ๋กœ ๊ฐ€๋ฉด ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ๋‹ค.
์ง„์ž…ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ CI/CD ๊ตฌ์„ฑ

๋จผ์ € CodePipeline์„ ๊ตฌ์„ฑํ•ด์ฃผ์ž.
์—ฌ๊ธฐ์„œ master ์ด์™ธ์— ๋ฐ๋ชจ๋ฒ„์ „์ด ์žˆ๋‹ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ๊ฐ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

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