μ ν리μΌμ΄μ μμ μ± λ° μ μ§ κ΄λ¦¬μ±μ ν₯μμν€κΈ° μν΄ νμ μμ κ΅¬μ± ν¨ν΄μ μ΄ν΄λ³΄μΈμ. λ€μν νκ²½ λ° μΈμ΄μμ μ ν리μΌμ΄μ μ€μ μ κ΄λ¦¬νλ λͺ¨λ² μ¬λ‘λ₯Ό μμ보μΈμ.
νμ μμ ꡬμ±: μ ν리μΌμ΄μ μ€μ μ ν ν¨ν΄
μννΈμ¨μ΄ κ°λ°μ λμμμ΄ μ§ννλ νκ²½μμ μ ν리μΌμ΄μ μ€μ μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ κ²μ μμ μ μ΄κ³ μ μ§ κ΄λ¦¬ κ°λ₯νλ©° νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμ νμ μμ ꡬμ±μ κ°λ μ μμΈν μ΄ν΄λ³΄κ³ κ΅¬μ± λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ°©μμ ν¬κ² κ°μ ν μ μλ λ€μν μ ν리μΌμ΄μ μ€μ μ ν ν¨ν΄μ νꡬν©λλ€. κ°λ¨ν λͺ λ Ήμ€ λꡬμμ μ μΈκ³μ μΌλ‘ λ°°ν¬λ 볡μ‘ν λΆμ° μμ€ν μ μ΄λ₯΄κΈ°κΉμ§ λ€μν νκ²½μ μ μ©ν μ μλ λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
νμ μμ ꡬμ±μ μ€μμ±
ꡬμ±μ μ’ μ’ λ―Όκ°ν λ°μ΄ν°, νκ²½λ³ λ§€κ°λ³μ λ° μ ν리μΌμ΄μ λμ μ€μ μ ν¬ν¨ν©λλ€. κ°λ ₯ν κ΅¬μ± μ λ΅μ΄ μμΌλ©΄ λ°νμ μ€λ₯, 보μ μ·¨μ½μ± λ° λλ²κΉ κ²½νμ μ΄λ €μμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. νμ μμ ꡬμ±μ μ ν리μΌμ΄μ μ€μ μ΄ μ»΄νμΌ νμ(κ°λ₯ν κ²½μ°) λλ λ°νμμ κ°λ ₯ν μ ν μ§μ μ ν΅ν΄ κ²μ¦λλλ‘ νμ¬ μ€λ₯ κ°λ₯μ±μ μ€μ΄κ³ μ½λμ λͺ νμ±μ ν₯μμν΅λλ€.
λ¬Έμμ΄ κΈ°λ° κ΅¬μ± νμΌμ μ¬μ©νκ±°λ νκ²½ λ³μμλ§ μμ‘΄νλ κ²κ³Ό κ°μ ꡬμ±μ λν κΈ°μ‘΄ μ κ·Ό λ°©μμ μ’ μ’ μ€λ₯κ° λ°μνκΈ° μ½μ΅λλ€. μλ₯Ό λ€μ΄, μ«μλ‘ μλλ κ΅¬μ± μ€μ μ΄ λ¬Έμμ΄λ‘ μ½ν μ μμ΄ μκΈ°μΉ μμ λμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ°λ©΄μ νμ μμ ꡬμ±μ μ ν μ μ½μ μ μ©νμ¬ κ΅¬μ± κ°μ΄ μμ λ°μ΄ν° μ νμ μ€μνλλ‘ ν©λλ€. μ΄ μ κ·Ό λ°©μμ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ μ΄μ μ μ 곡ν©λλ€.
- μ‘°κΈ° μ€λ₯ κ°μ§: νμ μμ ꡬμ±μ μ¬μ©νλ©΄ λ°νμμ΄ μλ κ°λ° μ€μ μ€λ₯λ₯Ό ν¬μ°©νμ¬ λλ²κΉ μ λ μ½κ² νκ³ κ°λ μ€μ§ μκ°μ μ€μΌ μ μμ΅λλ€.
- μ½λ κ°λ μ± λ° μ μ§ κ΄λ¦¬μ± ν₯μ: κ΅¬μ± μ€μ μ μ νμ λͺ μμ μΌλ‘ μ μν¨μΌλ‘μ¨ μ½λ κ°λ μ±μ κ°μ νκ³ κ°λ°μκ° μ ν리μΌμ΄μ μ΄ κ΅¬μ±λλ λ°©μμ λ μ½κ² μ΄ν΄ν μ μλλ‘ ν©λλ€.
- ν₯μλ κ°λ°μ κ²½ν: νμ μμ ꡬμ±μ IDEμμ λ λμ μ½λ μμ± λ° μ μμ μ 곡νμ¬ κ΅¬μ± μ€λ₯ κ°λ₯μ±μ μ€μ λλ€.
- 보μ μ·¨μ½μ± μν κ°μ: μμ μ νμ λν΄ κ΅¬μ± κ°μ κ²μ¦ν¨μΌλ‘μ¨ μ£Όμ 곡격과 κ°μ νΉμ 보μ μνμ μνν μ μμ΅λλ€.
- 리ν©ν°λ§ λ¨μν: μ μ λΆμ λꡬλ₯Ό μ¬μ©νμ¬ κ΅¬μ± μ€μ λ³κ²½ μ¬νμ μ½κ² μΆμ νκ³ λ¦¬ν©ν°λ§ν μ μμ΅λλ€.
μΌλ°μ μΈ μ ν리μΌμ΄μ μ€μ μ ν ν¨ν΄
νμ μμ ꡬμ±μ ꡬννκΈ° μν΄ λͺ κ°μ§ ν¨ν΄μ μ±νν μ μμ΅λλ€. μ’ μ’ ν¨κ» μ¬μ©λλ μ΄λ¬ν ν¨ν΄μ λ€μν νλ‘μ νΈ μꡬ μ¬νμ μ μ°μ±κ³Ό μ μμ±μ μ 곡ν©λλ€.
1. λ°μ΄ν° μ μ‘ κ°μ²΄(DTO) / κ΅¬μ± ν΄λμ€
κ°μ₯ κΈ°λ³Έμ μΈ μ κ·Ό λ°©μ μ€ νλλ μ ν리μΌμ΄μ μ€μ μ λνλ΄λ μ μ© λ°μ΄ν° μ μ‘ κ°μ²΄(DTO) λλ κ΅¬μ± ν΄λμ€λ₯Ό λ§λλ κ²μ λλ€. μ΄λ¬ν ν΄λμ€λ μΌλ°μ μΌλ‘ κ΅¬μ± ν€μ ν΄λΉνλ μμ±μ μ μνλ©° κ° μμ±μ νΉμ λ°μ΄ν° μ νμ κ°μ΅λλ€.
μ(C#):
public class AppSettings
{
public string? ApiEndpoint { get; set; }
public int TimeoutSeconds { get; set; }
public bool EnableCaching { get; set; }
public string? DatabaseConnectionString { get; set; }
}
μ΄ μμμ `AppSettings`λ μ ν리μΌμ΄μ ꡬμ±μ λν κ³μ½ μν μ ν©λλ€. κ°μ μμ±μ κ°λ¨ν μ½μ΄ μ‘μΈμ€ν©λλ€. .NETμ `Microsoft.Extensions.Configuration`κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ νκ²½ λ³μ λλ κ΅¬μ± νμΌκ³Ό κ°μ κ΅¬μ± μμ€λ₯Ό μ΄λ¬ν ν΄λμ€μ λ°μΈλ©νκΈ° μν νλ μμν¬λ₯Ό μ 곡ν©λλ€.
μ₯μ :
- κ΄μ¬μ¬μ λͺ νν λΆλ¦¬.
- λ¨μ ν μ€νΈκ° μ©μ΄ν¨.
- μ»΄νμΌ νμμ μ ν μμ .
κ³ λ € μ¬ν:
- ν΄λμ€λ₯Ό μ μνκ³ μ±μ°κΈ° μν μ΄κΈ° μ€μ μ΄ νμν©λλ€.
- 볡μ‘ν κ΅¬μ± κ³μΈ΅ ꡬ쑰μ λν μ μ€ν μ€κ³κ° νμν μ μμ΅λλ€.
2. μ΄κ±°νμ μ¬μ©ν κ°λ ₯ν μ ν μ§μ
κ°λ₯ν κ° μ§ν©μ΄ μ νλ κ΅¬μ± μ€μ (μ: λ‘κΉ μμ€, νκ²½ μ ν)μ κ²½μ° μ΄κ±°νμ μ¬μ©νλ κ²μ΄ λ§€μ° ν¨κ³Όμ μ λλ€. μ΄ ν¨ν΄μ μ ν μμ μ 보μ₯νκ³ νμ©λλ κ°μ 미리 μ μλ μ§ν©μΌλ‘ μ νν©λλ€.
μ(Java):
public enum LogLevel {
DEBUG, INFO, WARN, ERROR;
}
public class AppConfig {
private LogLevel logLevel;
public AppConfig(LogLevel logLevel) {
this.logLevel = logLevel;
}
public LogLevel getLogLevel() {
return logLevel;
}
}
μ΄ μ κ·Ό λ°©μμ `LogLevel` μ΄κ±°νμ μ¬μ©νμ¬ `logLevel` κ΅¬μ± μ€μ μ΄ μ ν¨ν κ°μΌλ‘λ§ μ€μ λλλ‘ ν©λλ€. μ΄λ κ² νλ©΄ μλͺ»λ κ΅¬μ± κ°μΌλ‘ μΈν΄ λ°νμ μ€λ₯κ° λ°μνλ κ²μ λ°©μ§ν μ μμ΅λλ€.
μ₯μ :
- μ ν μμ 보μ₯.
- μ½λ κ°λ μ± ν₯μ.
- κ΅¬μ± κ°μ μ½κ² κ²μ¦ν μ μμ΅λλ€.
κ³ λ € μ¬ν:
- λ€μν κ° λ²μλ₯Ό κ°λ μ€μ μλ μ ν©νμ§ μμ΅λλ€.
- μ΄κ±°νμ μ μνκ³ μ μ§ κ΄λ¦¬ν΄μΌ ν©λλ€.
3. λ°μ΄ν° μ£Όμ/μ ν¨μ± κ²μ¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μ ν¨μ± κ²μ¬
νΉν μΈλΆ μμ€(νμΌ, νκ²½ λ³μ, λ°μ΄ν°λ² μ΄μ€)μμ ꡬμ±μ μ½μ λ λ°μ΄ν° 무결μ±μ λμ± λ³΄μ₯νλ €λ©΄ μ ν¨μ± κ²μ¬ κΈ°μ μ νμ©νμμμ€. λΌμ΄λΈλ¬λ¦¬λ μ’ μ’ μ΅μ/μ΅λ κ°, νμ νλ λ±μ μ€μ νλ λ± κ΅¬μ± ν΄λμ€μ μ ν¨μ± κ²μ¬ κ·μΉμ μ μ©νλ λ©μ»€λμ¦μ μ 곡ν©λλ€.
μ(Pydanticμ μ¬μ©ν Python):
from pydantic import BaseModel, validator, ValidationError
class Settings(BaseModel):
api_url: str
timeout_seconds: int = 30
@validator("timeout_seconds")
def timeout_must_be_positive(cls, value):
if value <= 0:
raise ValueError("Timeout must be positive")
return value
# Example usage:
settings = Settings(api_url="https://api.example.com", timeout_seconds=60)
print(settings.timeout_seconds)
try:
invalid_settings = Settings(api_url="https://api.example.com", timeout_seconds=-1)
except ValidationError as e:
print(e.errors())
μ΄ μμ μμλ Pydanticμ μ¬μ©νμ¬ `timeout_seconds` μ€μ μ κ²μ¦ν©λλ€. κ°μ΄ μμμ΄λ©΄ μ ν¨μ± κ²μ¬ μ€λ₯κ° λ°μνμ¬ μ ν리μΌμ΄μ μ΄ μλͺ»λ ꡬμ±μ μ¬μ©νλ κ²μ λ°©μ§ν©λλ€.
μ₯μ :
- λ°μ΄ν° 무결μ±μ μ μ©ν©λλ€.
- μμΈν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€.
- κΈ°μ‘΄ κ΅¬μ± λ©μ»€λμ¦κ³Ό μ½κ² ν΅ν©ν μ μμ΅λλ€.
κ³ λ € μ¬ν:
- κ΅¬μ± κ΄λ¦¬μ μΆκ°μ μΈ λ³΅μ‘μ±μ λν©λλ€.
- μ ν¨μ± κ²μ¬ κ·μΉμ μ μ€νκ² κ΅¬μ±ν΄μΌ ν©λλ€.
4. κ΅¬μ± λΉλ/ν©ν 리
νΉν μ¬λ¬ κ΅¬μ± μμ€ λλ λμ κ΅¬μ± μꡬ μ¬νμ΄ μλ λ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ° κ΅¬μ± λΉλ λλ ν©ν 리λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμμμ€. μ΄λ¬ν κ΅¬μ± μμλ λ€μν μμ€μμ κ΅¬μ± λ°μ΄ν°λ₯Ό μ½κ³ , μ ν¨μ±μ κ²μ¬νκ³ , κ΅¬μ± κ°μ²΄λ₯Ό ꡬμ±νλ μν μ ν©λλ€.
μ(κ΅¬μ± λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν Node.js):
const convict = require('convict');
const config = convict({
env: {
doc: 'The application environment.',
format: ['production', 'development', 'test'],
default: 'development',
env: 'NODE_ENV'
},
port: {
doc: 'The port to bind.',
format: 'port',
default: 3000,
env: 'PORT'
},
database: {
uri: {
doc: 'Database connection string',
format: String,
default: 'mongodb://localhost:27017/test',
env: 'DATABASE_URI'
}
}
});
config.validate({ allowed: 'strict' });
console.log(config.get('database.uri'));
Node.jsμ `convict`μ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ κ΅¬μ± μ€ν€λ§λ₯Ό μ μν λ€μ λ€μν μμ€(νκ²½ λ³μ, κ΅¬μ± νμΌ λ±)μμ κ°μ μλμΌλ‘ λ‘λν μ μμ΅λλ€.
μ₯μ :
- κ³ λλ‘ μ¬μ©μ μ μ κ°λ₯.
- μ¬λ¬ κ΅¬μ± μμ€λ₯Ό μ§μν©λλ€.
- 볡μ‘ν κ΅¬μ± κ³μΈ΅ ꡬ쑰λ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
κ³ λ € μ¬ν:
- λ κ°λ¨ν ν¨ν΄λ³΄λ€ ꡬνμ΄ λ 볡μ‘ν©λλ€.
- κ΅¬μ± λΉλ λλ ν©ν 리λ₯Ό μ μ€νκ² μ€κ³ν΄μΌ ν©λλ€.
5. κ΅¬μ± λΌμ΄λΈλ¬λ¦¬ μ¬μ©
λ§μ νλ‘κ·Έλλ° μΈμ΄μ νλ μμν¬λ νμ μμ λ°©μμΌλ‘ μ ν리μΌμ΄μ μ€μ μ κ΄λ¦¬νλ λ° νΉλ³ν μ€κ³λ μ μ© λΌμ΄λΈλ¬λ¦¬λ₯Ό μ 곡ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ’ μ’ λ€μκ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
- λ€μν μμ€(νμΌ, νκ²½ λ³μ, λͺ λ Ήμ€ μΈμ, λ°μ΄ν°λ² μ΄μ€)μμ κ΅¬μ± λ‘λ.
- μ ν λ³ν λ° μ ν¨μ± κ²μ¬.
- κ³μΈ΅μ κ΅¬μ± μ§μ.
- κ΅¬μ± λ³κ²½ μ¬νμ ν« λ¦¬λ‘λ©.
κ΅¬μ± λΌμ΄λΈλ¬λ¦¬μ μ:
- .NET:
Microsoft.Extensions.Configuration(λ΄μ₯, μ μ°) - Java: Spring Bootμ κ΅¬μ± κΈ°λ₯(ν΅ν©) λ° Apache Commons Configuration
- Python:
pydantic(λ°μ΄ν° μ ν¨μ± κ²μ¬ λ° μ€μ μ©) λ°python-dotenv(.env` νμΌ λ‘λμ©) - Node.js:
convict,configλ°dotenv - Go:
viper
μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ νμ μμ ꡬμ±μ ꡬννλ νλ‘μΈμ€κ° κ°μνλκ³ μμ±ν΄μΌ νλ μμ©κ΅¬ μ½λμ μμ΄ μ€μ΄λλλ€.
μ₯μ :
- κ΅¬μ± κ΄λ¦¬λ₯Ό λ¨μνν©λλ€.
- μΌλ°μ μΈ μμ μ λν μ¬μ ꡬμΆλ κΈ°λ₯μ μ 곡ν©λλ€.
- κ°λ° μκ°μ μ€μ λλ€.
κ³ λ € μ¬ν:
- νμ¬ λΌμ΄λΈλ¬λ¦¬μ λν μ’ μμ±μ λμ ν μ μμ΅λλ€.
- νΉμ λΌμ΄λΈλ¬λ¦¬μ APIλ₯Ό λ°°μμΌ ν©λλ€.
νμ μμ ꡬμ±μ λͺ¨λ² μ¬λ‘
νμ μμ ꡬμ±μ ν¨κ³Όμ μΌλ‘ ꡬννλ κ²μ λ¨μν ν¨ν΄μ μ ννλ κ² μ΄μμ ν¬ν¨ν©λλ€. λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ κ²μ΄ νμμ μ λλ€. μ΄λ¬ν κ΄νμ κ΅¬μ± μμ€ν μ΄ κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯νλ©° μμ νλλ‘ λ³΄μ₯ν©λλ€.
1. μꡬ μ¬νμ μ ν©ν ν¨ν΄ μ ν
μ΅μ μ κ΅¬μ± ν¨ν΄μ μ ν리μΌμ΄μ μ 볡μ‘μ±, μ€μ μ, μ€νλλ νκ²½μ λ°λΌ λ€λ¦ λλ€. λͺ κ°μ§ μ€μ μ΄ μλ κ°λ¨ν μ ν리μΌμ΄μ μ κ²½μ° DTO/κ΅¬μ± ν΄λμ€λ₯Ό μ¬μ©νλ κ²μΌλ‘ μΆ©λΆν μ μμ΅λλ€. μ€μ μ΄ λ§μ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ° κ΅¬μ± λΉλ λλ μ ν¨μ± κ²μ¬ κΈ°λ₯μ΄ μλ μ μ© λΌμ΄λΈλ¬λ¦¬κ° λ μ ν©ν μ μμ΅λλ€.
2. μ½λμμ κ΅¬μ± λΆλ¦¬
κ΅¬μ± κ°μ μ½λλ² μ΄μ€ μΈλΆ, μ΄μμ μΌλ‘ νκ²½ λ³μ, κ΅¬μ± νμΌ λλ μ μ© κ΅¬μ± μλΉμ€μ μ μ₯ν΄μΌ ν©λλ€. μ΄ μ κ·Ό λ°©μμ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ λ€μ λΉλνκ±°λ λ€μ λ°°ν¬νμ§ μκ³ λ ꡬμ±μ λ³κ²½ν μ μμΌλ©°, μ΄λ DevOps λ° μ§μμ ν΅ν©/μ§μμ μ λ¬(CI/CD) νμ΄νλΌμΈμμ μ€μν κ΄νμ λλ€. 12-factor μ± λ°©λ²λ‘ μ μ¬μ©νλ©΄ μ΄λ¬ν λ¬Έμ μ λν νλ₯ν μ§μΉ¨μ μ»μ μ μμ΅λλ€.
3. νκ²½λ³ κ΅¬μ± μ¬μ©
κ°λ°, ν μ€νΈ, νλ‘λμ κ³Ό κ°μ μλ‘ λ€λ₯Έ νκ²½μλ μ’ μ’ μλ‘ λ€λ₯Έ ꡬμ±μ΄ νμν©λλ€. λ³λμ κ΅¬μ± νμΌμ λ§λ€κ±°λ νκ²½ λ³μλ₯Ό μ¬μ©νμ¬ κ° νκ²½μ λν μ€μ μ μ μν©λλ€. μ΄ κ΄νμ 보μ(μ: νλ‘λμ μ© μλ‘ λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€ μ격 μ¦λͺ ), μ±λ₯ λ° κΈ°λ₯ ν μ€νΈμ λ§€μ° μ€μν©λλ€.
4. κ΅¬μ± λ°μ΄ν° μ ν¨μ± κ²μ¬
νΉν μΈλΆ μμ€μμ μ½μ λ νμ κ΅¬μ± λ°μ΄ν°λ₯Ό κ²μ¦ν©λλ€. μ΄ κ΄νμλ κ°μ΄ μμ μ ν, λ²μ λ° νμμ μ€μνλμ§ νμΈνλ κ²μ΄ ν¬ν¨λ©λλ€. μ ν¨μ± κ²μ¬λ λ°νμ μ€λ₯, 보μ μ·¨μ½μ± λ° μκΈ°μΉ μμ λμμ λ°©μ§νλ λ° λμμ΄ λ©λλ€. μ νν νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©ν μ μλ μ ν¨μ± κ²μ¬ λΌμ΄λΈλ¬λ¦¬ λλ μ£Όμμ νμ©ν©λλ€.
5. κΈ°λ³Έκ° μ 곡
λͺ¨λ κ΅¬μ± μ€μ μ λν κΈ°λ³Έκ°μ μ 곡ν©λλ€. μ΄ κ΄νμ κ΅¬μ± μ€μ μ΄ λͺ μμ μΌλ‘ μ 곡λμ§ μμ κ²½μ°μλ μ ν리μΌμ΄μ μ΄ μ¬λ°λ₯΄κ² μλνλλ‘ λ³΄μ₯ν©λλ€. κΈ°λ³Έκ°μ ν©λ¦¬μ μ΄μ΄μΌ νλ©° μ ν리μΌμ΄μ μ μλλ λμκ³Ό μΌμΉν΄μΌ ν©λλ€. νμ κΈ°λ³Έκ°μ λ¬Έμννμμμ€.
6. λ―Όκ°ν μ 보 보νΈ
μνΈ λ° API ν€μ κ°μ λ―Όκ°ν μ 보λ₯Ό μ½λλ² μ΄μ€ λλ κ΅¬μ± νμΌμ νλμ½λ©νμ§ λ§μμμ€. λμ , νκ²½ λ³μ, 보μ κ΄λ¦¬ μλΉμ€(μ: AWS Secrets Manager, Azure Key Vault λλ Google Cloud Secret Manager) λλ μνΈνλ κ΅¬μ± νμΌμ λ―Όκ°ν μ 보λ₯Ό μμ νκ² μ μ₯ν©λλ€. μΉμΈλ μ§μ λ° νλ‘μΈμ€μ λν μ΄λ¬ν 보μμ λν μ‘μΈμ€λ₯Ό μ ννμμμ€. λ―Όκ°ν ν€μ μνΈλ₯Ό μ κΈ°μ μΌλ‘ κ΅μ²΄νμμμ€.
7. κ΅¬μ± λ¬Έμν
κ΅¬μ± μ€μ μ λͺ ννκ³ ν¬κ΄μ μΌλ‘ λ¬Έμνν©λλ€. μ΄ λ¬Έμμλ λ€μμ΄ ν¬ν¨λμ΄μΌ ν©λλ€.
- κ° μ€μ μ λν μ€λͺ .
- κ° μ€μ μ μμ λ°μ΄ν° μ ν.
- κ° μ€μ μ κΈ°λ³Έκ°.
- μ ν¨ν κ° λ²μ(ν΄λΉνλ κ²½μ°).
- λ€μν νκ²½μ λν μ€μ μ ꡬμ±νλ λ°©λ²μ λν μ 보.
μ λ¬Έμνλ ꡬμ±μ κ°λ°μκ° μ ν리μΌμ΄μ μ μ΄ν΄νκ³ μ μ§ κ΄λ¦¬νλ λ° λ μ½κ² λ§λλλ€. OpenAPI(Swagger) λλ Postmanκ³Ό κ°μ λꡬλ₯Ό μ¬μ©νλ©΄ CI/CDμ μ½κ² ν΅ν©ν μ μλ API λ¬Έμλ₯Ό μ¬μ©ν μ μμ΅λλ€.
8. κ΅¬μ± λ€μ λ‘λ λ©μ»€λμ¦ κ΅¬ν(νμν κ²½μ°)
μ ν리μΌμ΄μ μ΄ λ°νμμ ꡬμ±μ λμ μΌλ‘ μ λ°μ΄νΈν΄μΌ νλ κ²½μ° κ΅¬μ± λ€μ λ‘λ λ©μ»€λμ¦μ ꡬνν©λλ€. μ΄ λ©μ»€λμ¦μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μμ κ΅¬μ± λ°μ΄ν°μ λ³κ²½ μ¬νμ κ°μ§νκ³ λ€μ μμνμ§ μκ³ μ κ°μ λ€μ λ‘λν μ μμ΅λλ€. μ΄λ λΆμ° μμ€ν κ³Ό ν΄λΌμ°λ νκ²½μ λ°°ν¬ν λ νΉν μ μ©ν©λλ€. λΌμ΄λΈλ¬λ¦¬λ κ΅¬μ± λ°μ΄ν°λ₯Ό λ€μ λ‘λνκΈ° μν λ΄μ₯ κΈ°λ₯μ μ 곡νλ κ²½μ°κ° λ§μ΅λλ€.
9. κ΅¬μ± ν μ€νΈ
λ¨μ ν μ€νΈ λ° ν΅ν© ν μ€νΈλ₯Ό μμ±νμ¬ κ΅¬μ±μ΄ μ¬λ°λ₯΄κ² λ‘λλκ³ μ¬μ©λλμ§ νμΈν©λλ€. μ΄λ¬ν ν μ€νΈλ λ€μκ³Ό κ°μ λ€μν μλ리μ€λ₯Ό λ€λ£¨μ΄μΌ ν©λλ€.
- λ€μν μμ€μμ κ΅¬μ± λ‘λ.
- κ΅¬μ± κ°μ μ ν¨μ± κ²μ¬.
- λλ½λκ±°λ μλͺ»λ κ΅¬μ± μ€μ μ²λ¦¬.
- λ€μν κ΅¬μ± κ°μΌλ‘ μ ν리μΌμ΄μ μ λμ ν μ€νΈ.
TDD(Test-Driven Development)λ λ¬Έμ λ₯Ό μ‘°κΈ°μ κ°μ§νκ³ κ°λ ₯ν κ΅¬μ± μ²λ¦¬λ₯Ό μ΄μ§νλ λ° λμμ΄ λ©λλ€.
10. λ²μ κ΄λ¦¬ ꡬμ±
κ΅¬μ± νμΌμ λ²μ κ΄λ¦¬ μμ€ν (μ: Git)μ μ μ₯ν©λλ€. μ΄ κ΄νμ ν΅ν΄ ꡬμ±μ λ³κ²½νκ³ , νμν κ²½μ° μ΄μ λ²μ μΌλ‘ λλλ¦¬κ³ , λ€λ₯Έ κ°λ°μμ ν¨κ³Όμ μΌλ‘ νμ ν μ μμ΅λλ€. λΈλμΉ μ λ΅(μ: Gitflow)μ κ΅¬μ± νμΌ κ΄λ¦¬μ λμμ΄ λ μ μμ΅λλ€.
κ΅μ ν λ° νμ§ν κ³ λ € μ¬ν
κΈλ‘λ² μ²μ€μ μν μ ν리μΌμ΄μ μ ꡬμΆν λ κ΅¬μ± μ λ΅μμ κ΅μ ν(i18n) λ° νμ§ν(l10n)λ₯Ό κ³ λ €νμμμ€. ꡬμ±μ μΈμ΄λ³ μ€μ , ν΅ν νμ, λ μ§ λ° μκ° νμ λ° κΈ°ν λ‘μΊλ³ λ°μ΄ν°λ₯Ό μ²λ¦¬ν΄μΌ ν μ μμ΅λλ€.
- λ‘μΊλ³ μ€μ : λ‘μΊλ³ μ€μ μ μμ©νλλ‘ κ΅¬μ±μ μ€κ³ν©λλ€. μ¬κΈ°μλ μλ‘ λ€λ₯Έ μΈμ΄ λλ μ§μμ λν μ€μ μ μ μ₯νλ κ²μ΄ ν¬ν¨λ μ μμ΅λλ€.
- 리μμ€ λ²λ€: νμ§νλ ν μ€νΈ λ° κΈ°ν 리μμ€λ₯Ό μ μ₯νκΈ° μν΄ λ¦¬μμ€ λ²λ€(μ: Javaμ μμ± νμΌ λλ JSON νμΌ)μ νμ©ν©λλ€.
- λ μ§ λ° μκ° νμ: μ¬μ©μμ λ‘μΊμ λ°λΌ μ μ ν λ μ§ λ° μκ° νμμ μ¬μ©ν©λλ€.
- ν΅ν νμ: μ¬μ©μμ λ‘μΊμ λ°λΌ ν΅ν κ°μ νμνν©λλ€.
λΌμ΄λΈλ¬λ¦¬μ νλ μμν¬λ i18n λ° l10nμ λν λ΄μ₯ μ§μμ μ 곡νμ¬ κΈλ‘λ² μ²μ€μ μν μ ν리μΌμ΄μ μ λ μ½κ² ꡬμΆν μ μμ΅λλ€. μλ₯Ό λ€μ΄, Javaμ `java.util.Locale` ν΄λμ€ λλ λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μ ICU λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ¬μ©μμ λ‘μΊμ λ°λΌ λ μ§μ μ«μμ νμμ μ§μ ν©λλ€.
μ λ° μ€μ μ ν리μΌμ΄μ
νμ μμ ꡬμ±μ΄ μ€μν μ€μ μλ리μ€λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
- μ μ μκ±°λ νλ«νΌ: ꡬμ±μλ μ§λΆ κ²μ΄νΈμ¨μ΄ μ격 μ¦λͺ , λ°°μ‘λ£(κ΅κ°λ³) λ° μΈμ¨(μ§μμ λ°λΌ λ€λ¦)μ΄ ν¬ν¨λλ©°, μ΄λ₯Ό κ΄λ¦¬νκ³ λ³΄νΈν΄μΌ ν©λλ€.
- κΈλ‘λ² SaaS μ ν리μΌμ΄μ : λ©ν°ν λνΈ μ ν리μΌμ΄μ μ API μλν¬μΈνΈ, λ°μ΄ν°λ² μ΄μ€ μ°κ²°(μ§μλ³) λ° κΈ°λ₯ νλκ·Έ(κ³ κ° κ΅¬λ κΈ°λ°)μ λν ꡬμ±μ μμ‘΄ν©λλ€.
- κΈμ΅ μμ€ν : κΈμ΅ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ μ ν리μΌμ΄μ μ API ν€, κ·μ μ€μ μ€μ λ° μλ μ νμ μμ νκ² μ μ₯ν΄μΌ ν©λλ€.
- λͺ¨λ°μΌ μ ν리μΌμ΄μ : λͺ¨λ°μΌ μ±μ API μλν¬μΈνΈ, UI ν λ§ λ° μ¬μ©μ μΈν°νμ΄μ€ μΈμ΄ μ νμ λν ꡬμ±μ μμ£Ό μ¬μ©ν©λλ€.
- λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²: λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²μμ κ° μλΉμ€λ λ°μ΄ν°λ² μ΄μ€, λ©μμ§ ν λ° μλΉμ€ κ° ν΅μ μ λν μ체 ꡬμ±μ κ°λ κ²½μ°κ° λ§μ΅λλ€.
μ μΈκ³μ μΌλ‘ λΆμ°λ μ°¨λ 곡μ μλΉμ€κ° λ€μν μ§μμ λν API μλν¬μΈνΈλ₯Ό ꡬμ±ν΄μΌ νλ μλ리μ€λ₯Ό μκ°ν΄ 보μμμ€. νμ μμ ꡬμ±μ μ¬μ©νλ©΄ μλΉμ€μμ λ€μμ μνν μ μμ΅λλ€.
- κ° μ§μμ λν κ΅¬μ± μ€μ (μ: API μλν¬μΈνΈ URL, μλ μ ν λ° μ§λΆ κ²μ΄νΈμ¨μ΄ μΈλΆ μ 보)μ μ μν©λλ€.
- μ΄λ¬ν μ€μ μ΄ νμν νμκ³Ό μ νμ μ€μνλμ§ νμΈνκΈ° μν΄ μ΄λ¬ν μ€μ μ μ ν¨μ±μ κ²μ¬ν©λλ€.
- λ°°ν¬ νκ²½μ λ°λΌ λ€μν μμ€(νκ²½ λ³μ, κ΅¬μ± νμΌ λ±)μμ ꡬμ±μ λ‘λν©λλ€.
- κ° μ§μμ λν΄ λ€λ₯Έ ꡬμ±μ μ¬μ©ν©λλ€.
κ΅¬μ± ν΄λμ€ λλ DTOμ μ ν¨μ± κ²μ¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¨κ» μ¬μ©νλ©΄ μ°¨λ 곡μ μλΉμ€μμ λͺ¨λ μ§μμμ μ ν리μΌμ΄μ μ΄ μ¬λ°λ₯΄κ² μ€νλλλ‘ νμ¬ μ€λ₯λ₯Ό μ΅μννκ³ μ¬μ©μ κ²½νμ ν₯μμν¬ μ μμ΅λλ€.
κ²°λ‘
νμ μμ ꡬμ±μ νΉν μ μΈκ³μ μΌλ‘ λ°°ν¬λ μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯νλ©° μμ ν μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν νμμ μΈ κ΄νμ λλ€. νμ μμ κ΅¬μ± ν¨ν΄μ μ±ννκ³ , λͺ¨λ² μ¬λ‘λ₯Ό μ€μνκ³ , κ΅¬μ± λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν¨μΌλ‘μ¨ μ½λ νμ§μ ν¬κ² κ°μ νκ³ λ°νμ μ€λ₯μ μνμ μ€μΌ μ μμ΅λλ€. λ€μν μ§μμ λ°°ν¬λ κ°λ¨ν μΉ μ ν리μΌμ΄μ μ μμμ λ―Όκ°ν λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ 볡μ‘ν μν°νλΌμ΄μ¦ μμ€ν μ μ΄λ₯΄κΈ°κΉμ§ νμ μμ ꡬμ±μ κΈλ‘λ² μ²μ€μ μν νμ₯ κ°λ₯νκ³ μμ μ μΈ μ ν리μΌμ΄μ μ κΈ°λ°μ μ 곡ν©λλ€.
νμ μμ ꡬμ±μ μ¬μ©νλ©΄ μ€λ₯ λ°©μ§ μ΄μμ μ΄μ μ μ»μ μ μμ΅λλ€. μ½λ κ°λ μ± ν₯μ, κ°λ°μ κ²½ν ν₯μ, μ ν리μΌμ΄μ μ μμ μ±μ λν μμ κ° μ¦κ° λ±μ΄ μμ΅λλ€. μ΄λ¬ν ν¨ν΄μ ꡬννλ λ° μκ°κ³Ό λ Έλ ₯μ ν¬μνλ©΄ μ μΈκ³ μ¬μ©μμκ² κ°μΉλ₯Ό μ 곡νλ κ³ νμ§ μννΈμ¨μ΄λ₯Ό ꡬμΆν μ μμ΅λλ€.
μλ‘μ΄ μννΈμ¨μ΄ νλ‘μ νΈλ₯Ό μμνκ±°λ κΈ°μ‘΄ νλ‘μ νΈλ₯Ό 리ν©ν°λ§ν λ νμ μμ ꡬμ±μ μ€μμ±μ κΈ°μ΅νμμμ€. μ μΈκ³ μ¬μ©μμκ² κ°μΉλ₯Ό μ 곡νλ κ³ νμ§ μννΈμ¨μ΄λ₯Ό λ§λ€κΈ° μν κΈ°λ³Έμ μΈ κ΅¬μ± μμμ λλ€.