0411 ~ 0417
# 0411 ~ 0417
# 0411 - DFS, BFS์ ์ค๋ช , ์ฐจ์
BFS, DFS ๋๊ฐ์ง ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ํ๋, ์ ์ (node)์ ๊ทธ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ (edge)์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ์ ์ผ์ข ์ ๋งํ๋ฉฐ, ๊ทธ๋ํ๋ฅผ ํ์ํ๋ค๋ ๊ฒ์ ํ๋์ ์ ์ ์ผ๋ก๋ถํฐ ์์ํ์ฌ ์ฐจ๋ก๋๋ก ๋ชจ๋ ์ ์ ๋ค์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํ๋ค.
# DFS ๊น์ด ์ฐ์ ํ์ (Depth-First Search)
๋ฃจํธ ๋
ธ๋(ํน์ ๋ค๋ฅธ ์์์ ๋
ธ๋)์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ์์ ๋งํ๋ค.
์๋ฅผ ๋ค์ด, ๋ฏธ๋ก์ฐพ๊ธฐ๋ฅผ ํ ๋ ์ต๋ํ ํ ๋ฐฉํฅ์ผ๋ก ๊ฐ ์ ์์ ๋๊น์ง ์ญ ๊ฐ๋ค๊ฐ ๋ ์ด์ ๊ฐ ์ ์๊ฒ ๋๋ฉด ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ๋ฆผ๊ธธ๋ก ๋์์์ ๊ทธ ๊ฐ๋ฆผ๊ธธ๋ถํฐ ๋ค์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ํ์์ ์งํํ๋ ๊ฒ์ด ๊น์ด ์ฐ์ ํ์ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์๋ค.
- ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์ ์ด ๋ฐฉ๋ฒ์ ์ ํํจ
- ๊น์ด ์ฐ์ ํ์(DFS)์ด ๋๋น ์ฐ์ ํ์(BFS)๋ณด๋ค ์ข ๋ ๊ฐ๋จํจ
- ๊ฒ์ ์๋ ์์ฒด๋ ๋๋น ์ฐ์ ํ์(BFS)์ ๋นํด์ ๋๋ฆผ
# BFS ๋๋น ์ฐ์ ํ์ (Breadth-First Search)
๋ฃจํธ ๋
ธ๋(ํน์ ๋ค๋ฅธ ์์์ ๋
ธ๋)์์ ์์ํด์ ์ธ์ ํ ๋
ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ์ฅ์ด ์ ์ ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ์ ์ ์ ๋์ค์ ๋ฐฉ๋ฌธํ๋ ์ํ ๋ฐฉ๋ฒ.
์ฃผ๋ก ๋ ๋
ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ์ถ์ ๋ ์ด ๋ฐฉ๋ฒ์ ์ ํ.
ex) ์ง๊ตฌ ์์ ์กด์ฌํ๋ ๋ชจ๋ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ํํํ ํ Sam๊ณผ Eddie์ฌ์ด์ ์กด์ฌํ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ฒฝ์ฐ
- ๊น์ด ์ฐ์ ํ์์ ๊ฒฝ์ฐ - ๋ชจ๋ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๋ค ์ดํด๋ด์ผ ํ ์ง๋ ๋ชจ๋ฆ
- ๋๋น ์ฐ์ ํ์์ ๊ฒฝ์ฐ - Sam๊ณผ ๊ฐ๊น์ด ๊ด๊ณ๋ถํฐ ํ์
# DFS, BFS ๋น๊ต
- DFS(๊น์ด์ฐ์ ํ์) : ํ์ฌ ์ ์ ์์ ๊ฐ ์ ์๋ ์ ๋ค๊น์ง ๋ค์ด๊ฐ๋ฉด์ ํ์ -> ์คํ ๋๋ ์ฌ๊ทํจ์๋ก ๊ตฌํ
- BFS(๋๋น์ฐ์ ํ์) : ํ์ฌ ์ ์ ์์ ์ฐ๊ฒฐ๋ ๊ฐ๊น์ด ์ ๋ค๋ถํฐ ํ์ -> ํ๋ฅผ ์ด์ฉํด์ ๊ตฌํ
# DFS, BFS์ ์๊ฐ๋ณต์ก๋
๋ ๋ฐฉ์ ๋ชจ๋ ์กฐ๊ฑด ๋ด์ ๋ชจ๋ ๋
ธ๋๋ฅผ ๊ฒ์ํ๋ค๋ ์ ์์ ์๊ฐ ๋ณต์ก๋๋ ๋์ผํ๋ค.
DFS์ BFS ๋ ๋ค ๋ค์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธํ์๋์ง๋ฅผ ํ์ธํ๋ ์๊ฐ๊ณผ ๊ฐ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ์๊ฐ์ ํฉํ๋ฉด ๋๋ค.
# ๊น์ด ์ฐ์ ํ์๊ณผ ๋๋น ์ฐ์ ํ์ ํ์ํ ๋ฌธ์ ์ ํ/์์ฉ
- ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ฃผ์ํ ๋ฌธ์
: ๋จ์ํ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ค์ํ ๋ฌธ์ ์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํด์ ์๊ด์๋ค. - ๊ฒฝ๋ก์ ํน์ง์ ์ ์ฅํด๋ฌ์ผ ํ๋ ๋ฌธ์
: ์๋ฅผ ๋ค๋ฉด ๊ฐ ์ ์ ์ ์ซ์๊ฐ ์ ํ์๊ณ a๋ถํฐ b๊น์ง ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋๋ฐ ๊ฒฝ๋ก์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด ์๋๋ค๋ ๋ฌธ์ ๋ฑ, ๊ฐ๊ฐ์ ๊ฒฝ๋ก๋ง๋ค ํน์ง์ ์ ์ฅํด๋ฌ์ผ ํ ๋๋ DFS๋ฅผ ์ฌ์ฉํ๋ค.(BFS๋ ๊ฒฝ๋ก์ ํน์ง์ ๊ฐ์ง์ง ๋ชปํ๋ค) - ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ ๋ฌธ์
: ๋ฏธ๋ก ์ฐพ๊ธฐ ๋ฑ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ, BFS๊ฐ ์ ๋ฆฌํ๋ค. ์ด์ ๋ ๊น์ด ์ฐ์ ํ์์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๊ฒ์ํ ๊ฒฝ์ฐ ์ฒ์๋ถํฐ ๋ฐ๊ฒฌ๋๋ ํด๋ต์ด ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋ ์ ์์ง๋ง, ๋๋น ์ฐ์ ํ์์ผ๋ก ํ์ฌ ๋ ธ๋์์ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ์ฐพ๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๋ฅผ ํ์ ์ ๋จผ์ ์ฐพ์์ง๋ ํด๋ต์ด ๊ณง ์ต๋จ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค. - ๊ฒ์ ๋์ ๊ทธ๋ํ๊ฐ ์ ๋ง ํฌ๋ค๋ฉด -> DFS๋ฅผ ๊ณ ๋ ค
- ๊ฒ์๋์์ ๊ท๋ชจ๊ฐ ํฌ์ง ์๊ณ , ๊ฒ์ ์์ ์ง์ ์ผ๋ก๋ถํฐ ์ํ๋ ๋์์ด ๋ณ๋ก ๋ฉ์ง ์๋ค๋ฉด BFS
# 0412 - PasswordEncoder
Spring Security์์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ ์ ์๋๋ก ๋น๋ฐ๋ฒํธ์ ๋จ๋ฐฉํฅ ์ํธํ๋ฅผ ์ง์ํ๋ PasswordEncoder
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ค์ ์ ๊ณตํ๋ค. ์ด ์ธํฐํ์ด์ค๋ ์๋์ ๊ฐ์ด ์ฌํํ๊ฒ ๊ตฌ์ฑ๋์ด ์๋ค.
public interface PasswordEncoder {
ใใ// ๋น๋ฐ๋ฒํธ๋ฅผ ๋จ๋ฐฉํฅ ์ํธํ
ใใString encode(CharSequence rawPassword);
ใใ// ์ํธํ๋์ง ์์ ๋น๋ฐ๋ฒํธ(raw-)์ ์ํธํ๋ ๋น๋ฐ๋ฒํธ(encoded-)๊ฐ ์ผ์นํ๋์ง ๋น๊ต
ใใboolean matches(CharSequence rawPassword, String encodedPassword);
ใใ// ์ํธํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ์ํธํํ๊ณ ์ ํ ๊ฒฝ์ฐ true๋ฅผ returnํ๊ฒ ์ค์
ใใdefault boolean upgradeEncoding(String encodedPassword) { return false; };
}
Spring Security 5.3.3์์ ๊ณต์ ์ง์ํ๋ PasswordEncoder ๊ตฌํ ํด๋์ค๋ค์ ์๋์ ๊ฐ๋ค.
- BcryptPasswordEncoder : BCrypt ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ
- Argon2PasswordEncoder : Argon2 ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ
- Pbkdf2PasswordEncoder : PBKDF2 ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ
- SCryptPasswordEncoder : SCrypt ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ
์ 4๊ฐ์ PasswordEncoder๋ Password๋ฅผ encodeํ ๋, ๋งค๋ฒ ์์์ salt๋ฅผ ์์ฑํด์ encodeํ๊ฒ ๋์ด ์๋ค.
์๋ฅผ ๋ค์ด BCryptPasswordEncoder Class์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
/*
* BCryptPasswordEncoder.encode() : ์ํธํ
*/
public String encode(CharSequence rawPassword) {
ใใif (rawPassword == null) {
ใใใใthrow new IllegalArgumentException("rawPassword cannot be null");
ใใ}
ใใString salt;
ใใ
if (random != null) {
ใใsalt = BCrypt.gensalt(version.getVersion(), strength, random);
} else {
ใใsalt = BCrypt.gensalt(version.getVersion(), strength);
}
return BCrypt.hashpw(rawPassword.toString(), salt);
}
/**
* BCrypt.gensalt() : Salt ์์ฑ
*/
public static String gensalt(String prefix, int log_rounds, SecureRandom random) throws IllegalArgumentException {
ใStringBuilder rs = new StringBuilder();
ใbyte rnd[] = new byte[BCRYPT_SALT_LEN]; // 16byte(128bit) ํฌ๊ธฐ์ Salt ์์ฑ
if (!prefix.startsWith("$2") || (prefix.charAt(2) != 'a' && prefix.charAt(2) != 'y' && prefix.charAt(2) != 'b')) {
throw new IllegalArgumentException ("Invalid prefix");
}
if (log_rounds < 4 || log_rounds > 31) {
throw new IllegalArgumentException ("Invalid log_rounds");
}
ใrandom.nextBytes(rnd);
ใrs.append("$2");
ใrs.append(prefix.charAt(2));
ใrs.append("$");
ใif (log_rounds < 10)
rs.append("0");
rs.append(log_rounds);
rs.append("$");
encode_base64(rnd, rnd.length, rs);
return rs.toString();
}
# BCryptPasswordEncoder
BCrypt ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ํ๋ PasswordEncoder์ด๋ค. Bruteforce attack์ด๋ Rainbow table attack๊ณผ ๊ฐ์ Password Cracking์ ๋ํ ์ ํญ๋ ฅ์ ๋์ด๊ธฐ ์ํด ์๋์ ์ผ๋ก ๋๋ฆฌ๊ฒ ์ค์ ๋์ด ์๋ค.
์ ๋ฌธ ์ฅ๋น๋ฅผ ์ด์ฉํ๋ฉด ํ ๊ณ์ ์ ๋ํ ๋น๋ฐ๋ฒํธ ์ ๋ ฅ์ 1์ด์ ์์ต๋ฒ ์ด์์ผ๋ก ์๋ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ์ ํ์ ๊ณต๊ฒฉ์ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ ์ํด 1๊ฐ์ ์ํธ๋ฅผ ํ์ธํ๋๋ฐ ์ฝ 1์ด ์ ๋์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ก ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ๊ฐ ์์คํ ๋ณ๋ก ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ PasswordEncoder๊ฐ ์ํธ๋ฅผ ํด๋ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ฌ๋ผ์ง ์ ์๋ค. ๋ฐ๋ผ์ ์์คํ ์ ๋ง๊ฒ ํ ์คํธํ๋ฉด์ ์๋๋ฅผ ์กฐ์ ํด์ค์ผ ํ๋ค.
BCryptPasswordEncoder์ ์๋๋ ๊ฐ๋(strength)๋ฅผ ์กฐ์ ํด์ ์กฐ์ ํ ์ ์๋ค. ๊ฐ๋๋ 4~31๊น์ง ์ค์ ํ ์ ์์ผ๋ฉฐ, BcryptPasswordEncoder๋ default ๊ฐ๋๋ก ์๋์ ๊ฐ์ด 10์ ์ฌ์ฉํ๋ค.
public BCryptPasswordEncoder(BCryptVersion version, int strength, SecureRandom random) {
if (strength != -1 && (strength < BCrypt.MIN_LOG_ROUNDS || strength > BCrypt.MAX_LOG_ROUNDS)) {
throw new IllegalArgumentException("Bad strength");
}
this.version = version;
this.strength = strength == -1 ? 10 : strength; // ์ง์ ํ์ง ์์ผ๋ฉด ๊ฐ๋๋ฅผ 10์ผ๋ก ์ค์
this.random = random;
}
// ๊ฐ๋์ค์
// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
# Argon2PasswordEncoder
Argon2 ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ํ๋ PasswordEncoder์ด๋ค. Argon2๋ Paasword Hasing Competition์ ์ฐ์น์๋ก Password Craking์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค๋ฅธ PasswordEncoder์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋์ ์ผ๋ก ๋๋ฆฌ๊ฒ ์คํ๋๋๋ก ์ค์ ๋์ด ์๋ค.
// Create an encoder with all the defaults
Argon2PasswordEncoder encoder = new Argon2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
# Pbkdf2PasswordEncoder
PBKDF2 ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ํ๋ PasswordEncoder์ด๋ค. FIPS ์ธ์ฆ(Federal Information Processing Standards, ๋ฏธ ์ฐ๋ฐฉ ์์คํ ๋ด์์ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํ ํ์ ํ์ค)์ด ํ์ํ ๊ฒฝ์ฐ ์ด PasswordEncoder๋ฅผ ์ ํํ๋๊ฒ์ด ์ข๋ค.
// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
# SCryptPasswordEncoder
SCrypt ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ํ๋ PasswordEncoder์ด๋ค.
SCryptPasswordEncoder encoder = new SCryptPasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result);
# 0414 - StringUtils๋ฅผ ์ฌ์ฉํ๋ ์ด์
.split()
.toCharArray()
equals()
๋ฑ String ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋ก ํธ์ถํ๋ ๊ฒ๋ณด๋ค StringUtils ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
String arr[], str = "hello-world";
arr = "hello-world".split("-"); // (X) warning
arr = str.split("-"); // (X) warning
arr = StringUtils.("hello-world", "-"); // (O) null-safe
arr = StringUtils.(str, "-"); // (O) null-safe
# StringUtils ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Null-Safeํ๋ค.
String ํด๋์ค์ ๊ฒฝ์ฐ str1.equals(str2); ์์ str1์ด null์ด๋ฉด NullPointerException ์์ธ๊ฐ ๋ฐ์ํ์ง๋ง, StringUtils ํด๋์ค์ ๊ฒฝ์ฐ StringUtils.equals(str1,str2) ์์ st1์ด null ์ด์ด๋ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ณ null์ ๋ฐํํ๋ค.
- ์ปฌ๋ ์ ์ธ ๊ฒฝ์ฐ CollectionUtils.isEmpty() ๋๋ CollectionUtils.isNotEmpty()์ ์ฌ์ฉํ๋ค.
# 0415 - @Converter
@Converter๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์๋ค.
# Converter ์ฌ์ฉ๋ฒ
@Entity
class Member{
@Id @GeneratedValue
private Integer id;
@Convert(converter=BooleanToYNConverter.class)
private boolean useYn;
}
@Converter
class BooleanToYNConverter implements AttributeConverter<Boolean, String>{
@Override
public String convertToDatabaseColumn(Boolean attribute){
return (attribute != null && attribute) ? "Y" : "N";
}
@Override
public Boolean convertToEntityAttribute(String dbData){
return "Y".eqauls(dbData);
}
}
- AttributeConverter<์ํฐํฐ์ปฌ๋ผํ์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ ํ์ >
# ํด๋์ค ๋ ๋ฒจ ์ค์
@Entity
@Converter(converter = BooleanToYNConverter.class, attributeName = "useYn")
class Member{
// ...
}
# ๊ธ๋ก๋ฒ ์ค์
@Converter(autoApply = true)
class BooleanToYNConverter implements AttributeConverter<Boolean, String>{
// ...
}
- ๋ชจ๋ Boolean ํ์ ์ ์ค์
# 0417 - ECS, Fagate
# Amazon ECS(Elastic Container Service)fks?
- ํด๋ฌ์คํฐ์์ ์ปจํ ์ด๋๋ฅผ ์ฝ๊ฒ ์คํ, ์ค์ง ๋ฐ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ์ปจํ ์ด๋ ๊ด๋ฆฌ ์๋น์ค.
- ๊ฐ๋จํ API ํธ์ถ์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ณ ์ค์งํ ์ ์๋ค.
# AWS Fargate๋
๋ณ๋๋ก ์ธ์คํด์ค๋ฅผ ์์ฑ ๊ด๋ฆฌํ์ง ์๊ณ , ์์ ํ ๋งค๋์ง๋ ์๋น์ค์ ํํ๋ก ๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํ์ํฌ ์ ์๋ ์๋ง์กด์ ์๋ฒ๋ฆฌ์ค ์ปจํ ์ด๋ ์ํ. Docker ์ด๋ฏธ์ง๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ ํธ์๋์ด ์๋ค๋ฉด, ํด๋ผ์คํฐ -> ์์ ์ ์ -> ์๋น์ค์ ์์๋ก ์์ฑํ์ฌ ์์ ํ 24์๊ฐ ์๋น์ค ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ํ ์ ์๋ค.
fagate๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์์ ๊ฐ๋ ์์ ํน์ ์ค์ผ์ผ์ค๋ ์ด์ ์ํ์ ์ ํํด์ผํ๋ค. ํ์ฌ Amazon ECS, Amazon EKS์์ ์ง์, ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
์ฌ์ฉ๋ฒ์ ์ถํ์ ์์ธ์ด ๊ณต๋ถ