내일배움캠프 Node.js 본캠프 26일차

김선우·2024년 9월 10일
post-thumbnail

알고리즘 문제 풀어보기

두 개 뽑아서 더하기

문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.

작성코드

function solution(numbers) {
    var answer = [];
    for (i = 0; i < numbers.length; i++) {
      for (j = i + 1; j < numbers.length; j++) {
        ver sum = numbers[i] + numbers[j];
        if( answer.indexOf(sum) === -1) {
          answer.push(sum);
        }
      }
    }
    answer.sort((a, b) => a - b);

    return answer;
}

풀이 과정

numbers의 값을 순서대로 더해주고, indexOf를 이용해 answer 배열 안에 sum의 내용이 없을때(중복이 아닐 때) sum값을 answer에 넣어줌.
위의 과정이 모두 완료된 후(반복문이 끝난 후) answer을 오름차순으로 정렬해주고 return.

관계형 데이터베이스(RDB, Relational DataBase)

각 데이터를 테이블이라는 표형태의 구조에 저장.

테이블

여러 정보를 저장, 테이블간의 연관 관계를 설정해, 여러 테이블에 분산된 데이터를 서로 연결하여 관리 가능.

  • RDB는 테이블이라는 구조를 가지며 각 테이블은 고유한 데이터를 나타내는 행(row)과 속성을 나타내는 열(column)을 가짐.
  • 테이블간 연결이 가능하고 연결을 통해 복잡한 데이터를 가질 수 있음.

RDB와 NoSQL의 차이점

  • RDB는 테이블이라는 개념이 존재 => 테이블간의 연관 관계로 더 복잡한 쿼리를 작성할 수 있음.
    더욱 복잡한 비즈니스 로직과 정형화된 데이터를 체계적으로 관리할 수 있어 안전한 서버 환경 구성에 좋음.
    => 보안이 중요한 기관이나 은행같은 안전성을 중시하는 곳에서 사용

  • NoSQL은 유연한 데이터 구조를 가지기 때문에 저장과 읽기작업이 빠르고 복잡한 비즈리늣 로직없이 주로 데이터 읽기와 쓰기에 중점을 둔 서버에서 주로 사용
    => 빅데이터 환경, 단순 페이지뷰가 많은 어플리케이션 등

MySQL

  • 가장 널리 사용되는 오픈소스 관계형 데이터베이스
  • 데이터베이스를 관리하는 가장 대표적인 언어인 SQL(Structured Query Language)을 사용해 데이터를 조작하고 관리.
  • 트랜잭션의 특징인 ACID를 준수해 구현된 데이터베이스로서 트랜잭션을 안전하게 처리 가능.

RDS

  • AWS에서 제공하는 RDB 서비스.
  • 서버 운영, 유지 보수, 백업과 같은 데이터베이스 관련 작업을 AWS에 위임해, 백엔드 개발자가 데이터베이스를 사용하는 것에 집중하게 해줌.

SQL(Structured Query Language)

  • 데이터베이스에서 사용되는 생성, 삽입, 조회 명령문.

SQL의 종류

DDL(Data Definition Language)

데이터를 정의할 때 사용하는 언어, 테이블이나 데이터베이스를 생성, 수정, 삭제와 같은 작업에 사용.

  • CREATE - DATABASE, TABLE, VIEW, INDEX 등을 생성할 때 사용합니다.
CREATE DATABASE 데이터베이스명;
CREATE TABLE 테이블명
{
 컬럼명 컬럼속성
}
  • DROP - DATABASE, TABLE, VIEW, INDEX 등을 삭제할 때 사용합니다.
DROP DATABASE 데이터베이스명;
DROP TABLE 테이블명;
  • ALTER - DATABASE, TABLE 등의 속성을 변경할 때 사용합니다.
ALTER DATABASE 데이터베이스명 변경조건;
ALTER TABLE 테이블명 ADD 변경조건; -- 테이블에 새로운 컬럼을 추가합니다.
ALTER TABLE 테이블명 DROP 변경조건; -- 테이블에서 컬럼을 삭제합니다.
ALTER TABLE 테이블명 MODIFY 변경조건; -- 테이블의 컬럼을 수정합니다.
ALTER TABLE 테이블명 RENAME 변경조건; -- 테이블의 이름을 변경합니다.

DML(Data Manipulation Language)

데이터베이스에서 데이터를 조작할 때 사용. 저장, 삭제, 수정, 조회와 같은 행위를 함.

  • SELECT - 일반적으로 TABLE에서 원하는 데이터들을 조회할 때 사용합니다.
    DB를 관리하면서 가장 많이 사용하는 명령어 이기도 합니다.
SELECT 컬럼목록 FROM 테이블명 [WHERE 조건];

  • INSERT - TABLE에 새로운 데이터들을 삽입할 때 사용합니다.
INSERT INTo 테이블명 (컬럼목록) VALUES (값목록);

  • DELETE - TABLE에서 특정한 조건에 맞는 데이터들을 삭제할 때 사용합니다.
    WHERE 조건이 없다면, 모든 데이터가 삭제됩니다.
DELETE FROM 테이블명 [WHERE 조건];

  • UPDATE - TABLE에서 특정한 조건에 맞는 데이터들을 수정할 때 사용합니다.
    WHERE 조건이 없다면, 모든 데이터가 수정됩니다.
UPDATE 테이블명 SET 컬럼 = 값 [WHERE 조건];

DCL(Data Control Language)

데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때 사용.

  • GRANT - 데이터베이스의 특정한 유저에게 사용 권한을 부여할 때 사용합니다.
    권한에는 SELECT, INSERT, UPDATE, DELETE등 다양한 종류가 존재합니다.
GRANT [권한] ON 객체명 TO 사용자;
  • REVOKE - 데이터베이스의 특정한 유저에게 사용 권한을 취소할 때 사용합니다.
REVOKE [권한] ON 객체명 FROM 사용자;

TCL(Transaction Control Language)

데이터베이스 내의 트랜잭션을 관리하는 문법, 트랜잭션의 시작과 종료, 롤백을 수행할 때 사용.

  • COMMIT - 데이터베이스의 작업이 정상적으로 완료되었음을 관리자에게 알려줄 때 사용합니다.
START TRANSACTION;
...
COMMIT;

  • ROLLBACK - 데이터베이스의 작업이 비정상적으로 완료되었음을 관리자에게 알려줄 때 사용합니다.
    작업 중 오류가 발생한 경우 이를 취소하고, 이전 상태로 되돌릴 때 사용합니다.
START TRANSACTION;
...
ROLLBACK;

SQL 제약조건(Constraint)

각 컬럼간의 제한사항을 관리하고, 조건을 위반하는 데이터를 방지해 데이터베이스의 무결성(Integrity)을 보장하는 규칙.

  • 무결성(Integrity) - 데이터가 결함없이 정확하고 완전한 상태.
    ex) 여러 사용자의 회원가입을 처리할 때, 이메일이 중복되거나, 이메일이 아닌 다른 데이터로 사용자를 고유하게 구분할 수 없으면 사용자의 정보를 정확하게 가져오기가 힘듦. => 제약 조건 사용.
  • 데이터베이스 테이블을 분석할 때 설정된 컬럼의 속성을 바탕으로 테이블의 역할, 어떤 데이터를 저장하는지 명확히 인지 가능.

종류

기본 키(Primary Key)제약 조건

  • 테이블에 있는 데이터를 고유하게 구분할 수 있는 정보를 나타내기 위해 사용.
    만약 기본키를 설정하지 않은 테이블을 생성하려고 하면 특정 데이터를 찾기 위한 고유한 정보가 존재하지 않으므로 에러메세지가 출력되면서 테이블이 생성되지 않음.
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

요구사항

  • 사용자(Users)테이블
    1. userId 컬럼을 가지고, 기본키로 설정.
    2. 이름(name) 컬럼을 가짐.

구현

CREATE TABLE Users
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255)
);
  • AUTO_INCREMENT - 데이터를 삽일할 때 아무런 데이터를 입력하지 않아도 고유한 값을 유지할 수 있도록 도와주는 속성.
    => DB내에서 데이터가 입력될 때 마다 숫자를 1씩 증가시켜 기본키의 고유한 값을 유지시켜줌.

NULL 제약 조건

  • 특정 컬럼에서 NULL값을 허용하거나, 허용하지 않도록 설정하는 조건.
    테이블에서 컬럼을 생성할 때 추가 조건을 작성하지 않으면 기본적으로 NULL값을 허용하는 상태의 컬럼이 됨.
    => NULL값을 허용한다 = 필수적으로 입력되어야 하는 데이터가 누락될 수 있다.
  • 특정 컬럼에서 NULL값을 허용하지 않을때는 NOT NULL 제약조건을 추가해 NULL값이 입력되는 것을 방지해야함.

요구사항

  • 사용자(Users) 테이블
    1. userId 컬럼을 가지고, 기본키로 설정.
    2. 이름(name) 컬럼을 가짐.
  • 이외 요구사항
    1. 사용자 테이블의 이름 컬럼은 NULL 값을 허용 X.

구현

CREATE TABLE Users
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL
);

고유(Unique) 제약 조건

  • 특정 컬럼에서 중복된 값이 허용되지 않도록 설정하는 조건.

요구사항

  • 사용자(Users) 테이블
    1. userId 컬럼을 가지고, 기본키로 설정합니다.
    2. 이름(name) 컬럼을 가집니다.
  • 이외 요구사항
    1. 사용자 테이블의 이름 컬럼은 NULL을 허용하지 않습니다.
    2. 사용자 테이블의 이름 컬럼은 중복된 값을 허용하지 않습니다.

구현

CREATE TABLE Users
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL UNIQUE
);
  • 기본 키를 적용한 컬럼은 고유 제약 조건이 자동으로 적용되어 있음.

외래 키(Foreign KEY) 제약조건

  • 테이블간의 연관 관계(테이블과 다른 테이블이 관계를 맺을 때)를 표현할 때 사용.
  • 연관 관계의 대표적인 3가지 형태
    1) 1:1 - 1명의 사용자는 1개의 사용자 정보를 가질 수 있다.
    2) 1:N - 1명의 사용자는 여러개의 주문을 할 수 있다.
    3) N:M - 여러명의 학생은 여러개의 학원을 등록할 수 있다.
  • 기본적으로 외래 키 제약 조건은 CREATE TABLE 문을 사용해 테이블을 생성과 동시에 정의.

요구사항

  • 정원(Garden) 테이블
    1. 이름(name) 컬럼을 가집니다.
    2. 주소(address) 컬럼을 가집니다.
  • 정원 식물(GardenPlants) 테이블
    1. 식물 이름(name) 컬럼을 가집니다.
  • 이외 요구사항
    1. 정원 식물(GardenPlants)은 특정 정원(Garden)에 소속되어 있습니다.
    2. 하나의 정원여러개정원 식물을 가질 수 있습니다.

구현

CREATE TABLE Garden
(
    gardenId INT(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name     VARCHAR(255) NOT NULL,
    address  VARCHAR(255) NOT NULL
);

CREATE TABLE GardenPlants
(
    gardenPlantsId INT(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    gardenId       INT(11)      NOT NULL,
    name           VARCHAR(255) NOT NULL,
    FOREIGN KEY (gardenId) REFERENCES Garden (gardenId)
);

연계 참조 무결성 제약 조건

  • 외래 키의 경우 다른 테이블과 관계를 맺는 참조 데이터가 삭제 또는 수정 될 때 어떤 행위를 해야하는지 설정하고 수행하는 것.

종류

CASCADE

  • 참조하는 개체가 변경/삭제 될 경우 함께 변경/삭제됨. => 사용자가 삭제되면 그 사용자의 모든 주문 내역도 삭제.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

NO ACTION

  • 참조하는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러 발생. => 사용자가 삭제될때, 주문 내역이 아직 존재하면 삭제를 막음.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

SET NULL

  • 참조하는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경. => 사용자가 삭제되면 주문 내역의 사용자 ID는 NULL로 변경.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE SET NULL
    ON UPDATE SET NULL;

SET DEFAULT

  • 참조하는 개체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경. => 사용자가 삭제되면 주문내역의 사용자 ID는 기본값으로 변경.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

SELECT JOIN 연산자

  • 여러 테이블 간의 외래 키로 설정된 컬럼들을 연결하여 조회하는 SELECT 연산자의 활용법 중 하나. => SQL의 제약 조건 X
  • JOIN 연산자 - 두 테이블 사이의 공통된 데이터를 기준으로 테이블을 연결해 하나의 테이블처럼 조회할 수 있게 해주는 연산자.

0개의 댓글