2023.08.21.월.TIL

heeh·2023년 8월 21일

TIL

목록 보기
68/82
post-thumbnail

2023.08.21.월.TIL

주말

기술 문제 3

💡 RDBMS의 정규화에 대해 설명해주세요.

RDBMS의 정규화

관계형 데이터베이스 관리 시스템(RDBMS)의 정규화는 데이터베이스의 설계를 개선하여 데이터 중복을 최소화하고 데이터 일관성 및 무결성을 유지하기 위한 프로세스입니다. 정규화는 데이터베이스 테이블을 여러 개의 작은 테이블로 분해하고 이들을 관련성에 따라 조직화하여 데이터 중복과 이상(Anomaly)을 줄이는 목적으로 수행됩니다. 정규화를 통해 데이터베이스의 성능, 유지보수 및 확장성이 향상될 수 있습니다.

주로 업무적으로 연관된 데이터를 효율적으로 저장하고 조회하기 위해 사용되며, 데이터를 삽입, 갱신, 삭제하는 과정에서 발생할 수 있는 이상 현상을 방지하고 데이터 일관성을 유지하는 데 도움이 됩니다. 정규화는 여러 단계로 진행되며, 보통 제1정규형(1NF), 제2정규형(2NF), 제3정규형(3NF), BCNF(Boyce-Codd Normal Form) 등의 수준으로 나뉩니다. 아래는 이러한 정규형의 간단한 설명입니다:

  1. 제1정규형 (1NF):
    테이블의 각 열은 원자값(더 이상 나눌 수 없는 값)만을 포함해야 합니다. 다시 말해, 하나의 셀에는 하나의 값만 들어가야 합니다. 이렇게 함으로써 중복된 데이터를 방지하고 복합적인 값들을 분해할 수 있습니다.
  2. 제2정규형 (2NF):
    부분 함수 종속성을 제거하는 것이 목표입니다. 이를 위해서는 모든 테이블의 열이 기본 키 전체에 대해서만 의존해야 합니다. 기본 키 중 일부에만 의존하는 경우 해당 열을 별도의 테이블로 분리하여 중복을 줄입니다.
  3. 제3정규형 (3NF):
    이행 함수 종속성을 제거하는 것이 목표입니다. 어떤 열이 기본 키가 아닌 열에 의해 종속되는 경우, 해당 열을 다른 테이블로 분리하여 종속성을 제거합니다.
  4. BCNF (Boyce-Codd Normal Form):
    모든 결정자가 후보 키여야 합니다. 즉, 어떤 열이 기본 키가 아닌 열에 종속되는 경우 해당 열을 분리하여 종속성을 제거합니다.

이 외에도 더 높은 정규형 수준이 있을 수 있습니다. 데이터베이스 설계 시, 보통 정규화 과정을 통해 어느 정도까지 정규화를 진행할지 결정하게 되며, 필요에 따라 정규형을 넘어서 데이터 중복을 허용하는 디자인도 선택될 수 있습니다. 이는 데이터베이스의 성능, 데이터의 일관성, 조회 및 갱신 작업의 복잡성 등을 고려하여 결정되어야 합니다.

RDBMS의 정규화 간단 ver

RDBMS의 정규화란 데이터를 깔끔하고 효율적으로 정리하는 과정입니다. 이를 위해 데이터를 작은 조각으로 나누고 중복을 최소화합니다.

  1. 제1정규형 (1NF): 표 안에 모든 데이터를 하나씩 채워 넣어요. 한 칸에는 한 가지 정보만 들어가게 해서 중복을 없앱니다.
  2. 제2정규형 (2NF): 데이터들을 더 작은 표들로 나누어요. 그리고 각 표는 특별한 '기준'에 맞춰서 데이터를 정렬합니다. 이렇게 하면 중복된 데이터를 줄일 수 있어요.
  3. 제3정규형 (3NF): 데이터들이 얽히지 않도록 해요. 한 표의 정보가 다른 표의 정보에 영향을 미치면 그것을 나누어서 정리해줍니다.

  • RDBMS의 정규화란, 자료 손실 없이 데이터 일관성을 유지 시키면서 데이터 중복을 최소화하고 데이터의 무결성과 자료 구조의 안정화성 최대화를 위해서 데이터베이스 테이블을 여러 개의 작은 테이블로 분해하여 데이터를 깔끔하고 효율적으로 정리하는 과정입니다.

기술 문제 4

💡 Primary Key, Foreign Key에 대해 설명해주세요.

Primary Key, Foreign Key & 예제

Primary Key와 Foreign Key는 데이터베이스에서 테이블 간의 관계를 구축하고 데이터의 무결성을 유지하기 위해 사용되는 개념입니다.

  1. Primary Key (기본 키):
    • 기본 키는 특정 테이블에서 각 레코드를 고유하게 식별하는 역할을 합니다.
    • 각 테이블은 반드시 하나의 기본 키를 가져야 합니다.
    • 주로 숫자나 문자열과 같은 유일한 값으로 설정됩니다.
    • 기본 키는 해당 테이블에서 레코드를 식별하고 찾기 위해 사용됩니다.
  2. Foreign Key (외래 키):
    • 외래 키는 다른 테이블의 기본 키를 참조하는 열입니다.
    • 외래 키를 사용하여 두 테이블 사이의 관계를 설정할 수 있습니다.
    • 관계를 통해 데이터를 연결하고 한 테이블의 데이터를 다른 테이블과 연관시킵니다.
    • 외래 키를 통해 부모 테이블과 자식 테이블 사이의 연결을 만들 수 있습니다.
    • 외래 키를 사용하여 데이터의 무결성을 유지하고 참조 무결성 규칙을 적용할 수 있습니다. 이는 부모 테이블의 값이 변경되거나 삭제되지 않도록 보장합니다.

간단한 예시를 들어보겠습니다:

예를 들어, "주문(Order)" 테이블과 "고객(Customer)" 테이블이 있다고 가정해봅시다. "주문" 테이블의 각 레코드는 고유한 주문 번호를 가지며, 이 주문은 특정 "고객"에 의해 생성되었습니다. 이때 "주문" 테이블의 외래 키는 "고객" 테이블의 기본 키인 고객 ID를 참조합니다. 이 관계를 통해 각 주문을 해당하는 고객과 연결할 수 있습니다. 이렇게 하면 데이터베이스에서 주문과 고객 간의 관계를 정확하게 표현할 수 있습니다.

기본키를 지정하는 이유

1. 기본키는 테이블의 각 행(컬럼)을 고유하게 식별합니다.

2. 기본키는 중복되지 않고 NULL 값을 가질 수 없기 때문에 중복 데이터가 발생하는 것을 방지하고 데이터의 무결성을 보장할 수 있습니다.

3. 기본키는 다른 테이블의 외래키에 의해 참조되며 테이블 간 관계가 구축됩니다.

4. 기본키는 자동으로 인덱스가 생성되어 검색 성능이 향상됩니다.

외래키를 지정하는 이유

1. 외래키는 관계형 데이터베이스에서 테이블 간의 관계를 정의합니다. 테이블 간 관련된 데이터를 연결해서 조직화하고 쿼리 작성과 데이터 분석이 용이해집니다.

2. 외래키는 참조 무결성을 보장합니다. 참조 무결성이란 외래키 값이 참조하는 기본키 값과 일치하도록 강제함으로써 데이터 무결성을 유지하는 것입니다.

3. 외래키를 사용하면 데이터베이스에서 데이터의 중복을 최소화할 수 있습니다.

4. 외래키 제약 조건을 설정할 때 CASCADE 옵션을 사용할 수 있습니다. 이 옵션은 참조하는 기본키 값이 변경되거나 삭제될 때 외래키 값도 자동으로 변경되거나 삭제되도록 합니다. 이를 통해 데이터 일관성을 유지할 수 있습니다.

  • 테이블 내 각 레코드, 레코드?
    • 레코드는 데이터베이스에서 하나의 개별 데이터 단위를 말합니다. 보통 테이블 안에 있는 각 행이 하나의 레코드에 해당합니다. 예를 들어, "고객" 테이블에서 각각의 행은 고객의 정보를 담고 있으며, 이러한 각 행을 레코드라고 부릅니다. 레코드는 일련의 속성 또는 열(column)로 구성되며, 각 열은 해당 레코드의 특정 데이터 값을 나타냅니다.
    • 레코드 예제 레코드는 테이블의 각 행을 나타내는 것으로 생각하시면 됩니다. 아래의 예시와 같이 테이블이 있다고 가정해보겠습니다.
      고객 ID이름나이이메일
      1홍길동30hong@example.com
      2장보고25jang@example.com
      3신사임당40shin@example.com
      이 테이블에서 각 행(가로로 나열된 데이터)이 하나의 레코드를 나타냅니다. 예를 들어, 첫 번째 행인 "홍길동"의 정보는 고객 ID 1, 이름 "홍길동", 나이 30, 이메일 "hong@example.com"으로 구성된 레코드입니다. 이런 식으로 각 행이 하나의 레코드로써 데이터베이스에서 관리됩니다.

  • Primary Key(기본 키)는 테이블 내 각 레코드를 고유하게 식별하는 역할을 하며, 데이터의 중복을 방지하고 레코드를 신속하게 검색하는 데 사용됩니다. Foreign Key(외래 키)는 다른 테이블의 기본 키를 참조하는 열로, 테이블 간의 관계를 설정하여 데이터 간의 연결과 참조 무결성을 보장합니다. 이를 통해 부모-자식 관계를 표현하고 데이터의 무결성을 유지할 수 있습니다.
  • 피드백
    • null!!
    • 기본 키는 null이 될 수 없다 → 값이 무조건 들어가야 한다! 하여 고유하게 식별하는 역할을 할 수 있다!
    • 외래 키는 null이 될 수 있다
    • null이 뭐냐?
      • string name = ""; 는 null이 아니에요!
      • null은 아예 공백, 아예 없음
    • 키의 종류가 많다!!! (특히 오라클)
      • 슈퍼 키
      • 대체 키
      • 후보 키

기술 문제 5

💡 HTTP 메서드에 대해 설명해주세요.

HTTP(HTTP - HyperText Transfer Protocol) 메서드

HTTP(HTTP - HyperText Transfer Protocol) 메서드는 클라이언트와 서버 간에 데이터를 전송하고 요청 또는 응답을 수행하는 데 사용되는 행동을 나타내는 명령어입니다. 웹 애플리케이션에서 정보를 요청하거나 전달할 때 이 메서드를 사용합니다. 주요한 HTTP 메서드는 다음과 같습니다:

  1. GET:
    • 서버로부터 리소스(웹 페이지, 이미지 등)를 요청할 때 사용됩니다.
    • 데이터를 요청할 때 사용되며, 서버로부터 데이터를 받아오는 역할을 합니다.
    • 주소 표시줄에 데이터가 노출되므로 보안적으로 민감한 데이터 전송에는 적합하지 않습니다.
  2. POST:
    • 서버로 데이터를 전송할 때 사용됩니다.
    • 주로 폼 데이터나 파일 업로드와 같이 서버에 데이터를 제출할 때 사용합니다.
    • 데이터가 HTTP 요청의 본문에 담겨서 전송되므로 주소 표시줄에 노출되지 않습니다.
  3. PUT:
    • 서버에 리소스를 생성하거나 업데이트할 때 사용됩니다.
    • 요청한 데이터로 서버의 리소스를 대체합니다. 즉, 요청한 데이터로 리소스를 덮어씁니다.
  4. DELETE:
    • 서버의 리소스를 삭제할 때 사용됩니다.
    • 요청한 리소스를 서버에서 삭제합니다.
  5. PATCH:
    • 서버의 리소스를 부분적으로 업데이트할 때 사용됩니다.
    • PUT과 유사하지만 리소스의 일부만 업데이트합니다.
  6. HEAD:
    • GET 메서드와 유사하지만, 서버는 본문(body)을 반환하지 않습니다. 헤더 정보만 가져옵니다.
    • 주로 리소스의 메타데이터나 헤더 정보를 확인할 때 사용합니다.
  7. OPTIONS:
    • 서버가 지원하는 HTTP 메서드를 확인하거나 리소스에 대한 통신 옵션을 확인할 때 사용됩니다.

HTTP 메서드는 클라이언트가 서버에게 원하는 동작을 알리는데 사용되며, 이를 통해 웹 애플리케이션에서 데이터의 전송과 처리를 관리합니다.

  • HTTP 메서드는 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식(명령어)입니다. 주요 메서드는 GET(정보 요청 및 조회), POST(데이터 전송), PUT(리소스 수정), DELETE(리소스 삭제)가 있습니다. 이를 통해 웹 페이지 보기, 데이터 전송, 리소스 관리 등의 동작을 수행하며, 애플리케이션 간 효율적인 통신을 가능하게 합니다.
  • 네트워크에 대한 질문에 대한 시작…!
    • https 는 무엇인가! 부터…
    • 네트워크 / 데이터베이스
    • URL / URI

공통

CI / CD

CI/CD는 "Continuous Integration" 및 "Continuous Deployment" 또는 "Continuous Delivery"의 줄임말로, 소프트웨어 개발 프로세스의 중요한 개념입니다. 이는 개발자 및 개발팀이 소프트웨어를 효율적이고 안정적으로 개발하고 배포하는 데 도움이 되는 접근 방식입니다.

  1. Continuous Integration (CI - 지속적 통합): 이것은 개발자들이 새로운 코드 조각을 작성하거나 기존 코드를 수정할 때마다, 이 변경 사항을 중앙 코드 저장소에 통합하는 접근 방식입니다. 주요 목표는 여러 개발자가 동시에 작업할 때 발생하는 통합 문제를 방지하고, 코드의 일관성과 품질을 높이는 것입니다. 이를 위해 자동화된 테스트와 빌드 프로세스가 사용됩니다. CI 시스템은 변경 사항을 검증하고 테스트하여 문제가 있는 경우 이를 조기에 발견하여 수정하도록 도와줍니다.
  2. Continuous Deployment (CD - 지속적 배포) 및 Continuous Delivery (CD - 지속적 제공): 이것은 CI의 확장으로, 코드 변경 사항이 검증되고 통합된 후, 자동화된 프로세스를 통해 실제 환경에 소프트웨어를 배포하는 것을 말합니다. 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();

장점

  1. 어느 변수에 어떤 값을 세팅하려는 것인지 직관적으로 알 수 있다.
  2. 일부 변수의 값만 세팅하고 싶을 때 일일히 생성자를 따로 만들지 않아도 된다.
    1. 즉, 유연성이 증가한다.
  3. 변경 가능성을 최소화 한다.
    1. 매개변수의 갯수를 변경하고 싶을 때 생성자의 경우 생성자 / 선언 부분 모두 수정해야 하지만, 빌더의 경우 . 뒤의 변수만 추가하면 된다.
  • 빌더 패턴 예제1 빌더 패턴을 예제로 설명해보겠습니다. 가정해보겠습니다. 당신은 게임 개발자이며, RPG 게임을 개발하고 있습니다. 게임 내에서 플레이어 캐릭터를 생성하는 빌더 패턴을 구현해보겠습니다.
    1. 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}"
    2. 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
    3. 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
    4. 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()
    5. 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는 해당 빌더를 사용하여 캐릭터를 생성합니다. 이를 통해 복잡한 객체 생성 프로세스를 단순화하고 객체의 일관성을 유지할 수 있습니다.

  • 빌더 패턴 예제2 웹 서버를 구축하는 과정에서 빌더 패턴을 사용하여 웹 애플리케이션의 설정을 구성하는 예제를 살펴보겠습니다. 가정해봅시다. 당신은 웹 애플리케이션을 개발하고 있으며, 간단한 설정 관리 시스템을 구현해야 합니다. 이때 빌더 패턴을 사용하여 설정 객체를 생성하고 구성하는 방법을 살펴보겠습니다.
    1. 설정 클래스 - 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}"
      
    2. 빌더 클래스 - 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
      
    3. 웹 애플리케이션 구축 - 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 객체를 생성합니다. 이를 통해 복잡한 설정 객체 생성을 단순화하고, 빌더 패턴을 활용하여 웹 애플리케이션의 설정을 효율적으로 관리할 수 있습니다.

  • 역할 맡은 것! 프론트, 댓글(대댓글), 팔로우 기능, 내가 쓴 글 가져오기(프로필 관련)
  • 팔로우
    • 팔로우 DB에 2개의 외래키가 담김!
    • 팔로우, 팔로잉 구분! following_user_id
      • 한 사람만 팔로우 한다면 단방향!
      • 서로 팔로우 한다면 양방향!
    • user_id : 팔로우를 한 사람 / following_user_id : 팔로우를 당한 사람
    • 부리더님한테 더 물어보기!
  • applycation.propertice
    • 환경변수?!
    • enviroment variable
  • 내일 할 것
    • 오전 11시 회의!
    • ERD 완성, entity 완성, 깃(포크) 배우기
    • CS, 기술면접, 공통공부도 잊지 말기!
    • CS 강의 듣고 중요한 질문 1개

프론트엔드?

profile
공부하자개발하자으쌰으쌰

0개의 댓글