관계형 데이터베이스 관리 시스템(RDBMS)의 정규화는 데이터베이스의 설계를 개선하여 데이터 중복을 최소화하고 데이터 일관성 및 무결성을 유지하기 위한 프로세스입니다. 정규화는 데이터베이스 테이블을 여러 개의 작은 테이블로 분해하고 이들을 관련성에 따라 조직화하여 데이터 중복과 이상(Anomaly)을 줄이는 목적으로 수행됩니다. 정규화를 통해 데이터베이스의 성능, 유지보수 및 확장성이 향상될 수 있습니다.
주로 업무적으로 연관된 데이터를 효율적으로 저장하고 조회하기 위해 사용되며, 데이터를 삽입, 갱신, 삭제하는 과정에서 발생할 수 있는 이상 현상을 방지하고 데이터 일관성을 유지하는 데 도움이 됩니다. 정규화는 여러 단계로 진행되며, 보통 제1정규형(1NF), 제2정규형(2NF), 제3정규형(3NF), BCNF(Boyce-Codd Normal Form) 등의 수준으로 나뉩니다. 아래는 이러한 정규형의 간단한 설명입니다:
이 외에도 더 높은 정규형 수준이 있을 수 있습니다. 데이터베이스 설계 시, 보통 정규화 과정을 통해 어느 정도까지 정규화를 진행할지 결정하게 되며, 필요에 따라 정규형을 넘어서 데이터 중복을 허용하는 디자인도 선택될 수 있습니다. 이는 데이터베이스의 성능, 데이터의 일관성, 조회 및 갱신 작업의 복잡성 등을 고려하여 결정되어야 합니다.
RDBMS의 정규화란 데이터를 깔끔하고 효율적으로 정리하는 과정입니다. 이를 위해 데이터를 작은 조각으로 나누고 중복을 최소화합니다.
Primary Key와 Foreign Key는 데이터베이스에서 테이블 간의 관계를 구축하고 데이터의 무결성을 유지하기 위해 사용되는 개념입니다.
간단한 예시를 들어보겠습니다:
예를 들어, "주문(Order)" 테이블과 "고객(Customer)" 테이블이 있다고 가정해봅시다. "주문" 테이블의 각 레코드는 고유한 주문 번호를 가지며, 이 주문은 특정 "고객"에 의해 생성되었습니다. 이때 "주문" 테이블의 외래 키는 "고객" 테이블의 기본 키인 고객 ID를 참조합니다. 이 관계를 통해 각 주문을 해당하는 고객과 연결할 수 있습니다. 이렇게 하면 데이터베이스에서 주문과 고객 간의 관계를 정확하게 표현할 수 있습니다.
1. 기본키는 테이블의 각 행(컬럼)을 고유하게 식별합니다.
2. 기본키는 중복되지 않고 NULL 값을 가질 수 없기 때문에 중복 데이터가 발생하는 것을 방지하고 데이터의 무결성을 보장할 수 있습니다.
3. 기본키는 다른 테이블의 외래키에 의해 참조되며 테이블 간 관계가 구축됩니다.
4. 기본키는 자동으로 인덱스가 생성되어 검색 성능이 향상됩니다.
1. 외래키는 관계형 데이터베이스에서 테이블 간의 관계를 정의합니다. 테이블 간 관련된 데이터를 연결해서 조직화하고 쿼리 작성과 데이터 분석이 용이해집니다.
2. 외래키는 참조 무결성을 보장합니다. 참조 무결성이란 외래키 값이 참조하는 기본키 값과 일치하도록 강제함으로써 데이터 무결성을 유지하는 것입니다.
3. 외래키를 사용하면 데이터베이스에서 데이터의 중복을 최소화할 수 있습니다.
4. 외래키 제약 조건을 설정할 때 CASCADE 옵션을 사용할 수 있습니다. 이 옵션은 참조하는 기본키 값이 변경되거나 삭제될 때 외래키 값도 자동으로 변경되거나 삭제되도록 합니다. 이를 통해 데이터 일관성을 유지할 수 있습니다.
| 고객 ID | 이름 | 나이 | 이메일 |
|---|---|---|---|
| 1 | 홍길동 | 30 | hong@example.com |
| 2 | 장보고 | 25 | jang@example.com |
| 3 | 신사임당 | 40 | shin@example.com |
HTTP(HTTP - HyperText Transfer Protocol) 메서드는 클라이언트와 서버 간에 데이터를 전송하고 요청 또는 응답을 수행하는 데 사용되는 행동을 나타내는 명령어입니다. 웹 애플리케이션에서 정보를 요청하거나 전달할 때 이 메서드를 사용합니다. 주요한 HTTP 메서드는 다음과 같습니다:
HTTP 메서드는 클라이언트가 서버에게 원하는 동작을 알리는데 사용되며, 이를 통해 웹 애플리케이션에서 데이터의 전송과 처리를 관리합니다.
CI/CD는 "Continuous Integration" 및 "Continuous Deployment" 또는 "Continuous Delivery"의 줄임말로, 소프트웨어 개발 프로세스의 중요한 개념입니다. 이는 개발자 및 개발팀이 소프트웨어를 효율적이고 안정적으로 개발하고 배포하는 데 도움이 되는 접근 방식입니다.
CI/CD는 다음과 같은 장점을 가지고 있습니다:
CI/CD는 현대적인 소프트웨어 개발 방법론에서 핵심적인 역할을 하며, 팀의 협업과 개발 프로세스의 효율성을 높이는 데 도움을 줍니다.
Spring 사용 시 생성자 대신 빌더를 사용할 수 있다. (더 권장된다!)
// 생성자 사용
User user = new User("이름", 28, 180, 150);
// 빌더 사용
User user = User.builder()
.name("이름")
.age(28)
.height(180)
.iq(150).build();
장점
Product - Character 클래스: 플레이어 캐릭터를 나타내는 클래스입니다.
pythonCopy code
class Character:
def __init__(self):
self.name = ""
self.characterClass = ""
self.weapon = ""
self.armor = ""
def __str__(self):
return f"Name: {self.name}, Class: {self.characterClass}, Weapon: {self.weapon}, Armor: {self.armor}"
Builder - CharacterBuilder 인터페이스: 플레이어 캐릭터를 생성하고 설정하는 메서드를 정의합니다.
pythonCopy code
from abc import ABC, abstractmethod
class CharacterBuilder(ABC):
@abstractmethod
def set_name(self, name):
pass
@abstractmethod
def set_character_class(self, char_class):
pass
@abstractmethod
def set_weapon(self, weapon):
pass
@abstractmethod
def set_armor(self, armor):
pass
@abstractmethod
def get_character(self):
pass
ConcreteBuilder - WarriorBuilder와 MageBuilder: 플레이어 캐릭터의 구체적인 속성을 설정하는 클래스입니다.
pythonCopy code
class WarriorBuilder(CharacterBuilder):
def __init__(self):
self.character = Character()
def set_name(self, name):
self.character.name = name
def set_character_class(self, char_class):
self.character.characterClass = char_class
def set_weapon(self, weapon):
self.character.weapon = weapon
def set_armor(self, armor):
self.character.armor = armor
def get_character(self):
return self.character
class MageBuilder(CharacterBuilder):
def __init__(self):
self.character = Character()
def set_name(self, name):
self.character.name = name
def set_character_class(self, char_class):
self.character.characterClass = char_class
def set_weapon(self, weapon):
self.character.weapon = weapon
def set_armor(self, armor):
self.character.armor = armor
def get_character(self):
return self.character
Director - CharacterDirector 클래스: CharacterBuilder를 사용하여 플레이어 캐릭터를 생성하는 클래스입니다.
pythonCopy code
class CharacterDirector:
def __init__(self, builder):
self.builder = builder
def create_character(self, name, char_class, weapon, armor):
self.builder.set_name(name)
self.builder.set_character_class(char_class)
self.builder.set_weapon(weapon)
self.builder.set_armor(armor)
return self.builder.get_character()
Client - Main 코드: 실제로 빌더 패턴을 사용하여 플레이어 캐릭터를 생성하는 부분입니다.
pythonCopy code
if __name__ == "__main__":
warrior_builder = WarriorBuilder()
mage_builder = MageBuilder()
director = CharacterDirector(warrior_builder)
warrior = director.create_character("Conan", "Warrior", "Sword", "Plate Armor")
print(warrior)
director = CharacterDirector(mage_builder)
mage = director.create_character("Merlin", "Mage", "Staff", "Robe")
print(mage)
이 예제에서는 빌더 패턴을 사용하여 "전사"와 "마법사" 플레이어 캐릭터를 생성하고 설정합니다. 각 ConcreteBuilder 클래스는 CharacterBuilder를 구현하고, Director는 해당 빌더를 사용하여 캐릭터를 생성합니다. 이를 통해 복잡한 객체 생성 프로세스를 단순화하고 객체의 일관성을 유지할 수 있습니다.
설정 클래스 - AppConfig 클래스: 웹 애플리케이션의 설정을 나타내는 클래스입니다.
pythonCopy code
class AppConfig:
def __init__(self):
self.database_url = ""
self.secret_key = ""
self.debug_mode = False
def __str__(self):
return f"Database URL: {self.database_url}, Secret Key: {self.secret_key}, Debug Mode: {self.debug_mode}"
빌더 클래스 - AppConfigBuilder 클래스: AppConfig 객체를 생성하고 설정을 구성하는 클래스입니다.
pythonCopy code
class AppConfigBuilder:
def __init__(self):
self.app_config = AppConfig()
def set_database_url(self, database_url):
self.app_config.database_url = database_url
return self
def set_secret_key(self, secret_key):
self.app_config.secret_key = secret_key
return self
def enable_debug_mode(self):
self.app_config.debug_mode = True
return self
def build(self):
return self.app_config
웹 애플리케이션 구축 - Main 코드: AppConfigBuilder를 사용하여 웹 애플리케이션의 설정을 구성하는 코드입니다.
pythonCopy code
if __name__ == "__main__":
app_config = (
AppConfigBuilder()
.set_database_url("mysql://user:password@localhost/dbname")
.set_secret_key("my-secret-key")
.enable_debug_mode()
.build()
)
print(app_config)
이 예제에서는 빌더 패턴을 사용하여 AppConfig 객체를 생성하고 설정을 구성합니다. 웹 서버 개발자는 AppConfigBuilder를 사용하여 각 설정 옵션을 설정하고 최종적으로 AppConfig 객체를 생성합니다. 이를 통해 복잡한 설정 객체 생성을 단순화하고, 빌더 패턴을 활용하여 웹 애플리케이션의 설정을 효율적으로 관리할 수 있습니다.