서른, 프로그래머 입문하다
-
NoSQL
최종 수정: 2025.06.17NoSQL대규모 데이터를 다루기에 용이하고 확장성이 좋아 최근 부상하고 있다. NoSQL은 RDBMS와 상반되는 특징을 가졌다고 하여 비관계형 데이터베이스라고 부르기도 한다.■ RDBMS vs NoSQL: NoSQL의 특징NoSQL은 Not Only SQL의 약자이다. 레코드를 다양한 형태로 저장할 수 있고, SQL 이외의 방법으로 저장된 데이터도 다룰 수 있다. 대표적인 NoSQL 데이터베이스의 유형으로는 4가지를 꼽을 수 있다. 1) 키-값 데이터베이스 (key-value database)이름 그래로 데이터베이스에 레코드를 키(필드)와 값의 쌍으로 저장하는 데이터베이스이다. 가장 간단한 형태의 유형이라 할 수 있다. Redis, Memcached 등이 대표적이다. 레코드..
2025.06.17
-
데이터베이스 설계
최종 수정: 2025.06.17데이터베이스 설계■ ER 다이어그램 (ER diagram, 이하 ERD)엔티티 관계(ER, Entity Relationship)를 표현하는 다이어그램이다. ERD는 데이터베이스에 저장되는 엔티티의 구조를 모델링하는 것을 목적으로 한다. 데이터베이스 설계 초기 단계에서 이러한 시각적 표현인 모델링은 매우 중요한 역할을 한다. 추후에 데이터베이스를 확장하거나 수정할 떄 어떤 부분이 영향을 받는지 쉽게 파악할 수 있어, 유지보수가 용이하고 개발자 간 원활한 소통이 가능하기 때문이다. 잘못된 테이블 구조로 개발을 시작하는 거슨 소위 '첫 단추를 잘못 꿰는 것'과 같아서 점점 유지보수가 어려워지고, 언젠가는 많은 시간과 노력을 들여 데이터베이스의 구조를 수정해야 할 수 있다. 나아가..
2025.06.17
-
효율적 쿼리
최종 수정: 2025.06.17효율적 쿼리■ 서브 쿼리와 조인서브 쿼리(subquery)는 다른 SQL 문이 포함된 SQL 문을 의미하며, 조인(join)은 2개의 테이블을 하나로 합치는 것을 의미한다. 둘은 엄연히 별개의 개념이지만, 때로는 같은 문제 상황을 해결하기 때문에 비교해 학습하면 좋다. 서브 쿼리다양한 테이블을 세밀하게 다루는 SQL 문을 작성하기 위해서는 서브 쿼리를 이용할 수 있다. 서브 쿼리의 일반적인 의미는 '내부에 다른 SQL 문이 포함되어 있는 SQL 문'이다. 서브 쿼리는 또 다른 서브 쿼리를 포함할 수도 있다. 조인서브 쿼리를 통해 복잡한 상황을 다루는 세밀한 SQL 문을 작성할 수 있다고는 하지만, 자칫 SQL 문이 너무 복잡해질 수 있다. 여러 테이블을 기반으로 SQL 문을..
2025.06.17
-
SQL
최종 수정: 2025.06.16SQLSQL 명령을 크게 데이터 정의 언어(DDL),와 데이터 조작 언어(DML), 데이터 제어 언어(DCL), 트랜잭션 제어 언어(TCL)로 나누고 있다.■ 데이터 정의 언어(DDL)DDL(Data Definition Languge)는 데이터 정의를 위한 SQL이다.종류설명CREATE데이터베이스 혹은 데이터베이스 객체 생성ALTER데이터베이스 객체 갱신ex) 테이블에 필드 및 제약 조건을 추가/삭제DROP데이터베이스 객체 삭제ex) 테이블이나 데이터베이스를 삭제TRUNCATE테이블 구조를 유지한 채 모든 레코드 삭제데이터베이스 객체란 데이터베이스에서 정의될 수 있는 대상을 통칭하는 용어이다. 테이블, 인덱스, 뷰 등이 대표적이다. CREATESQL문에서는 끝을 표기하기 위..
2025.06.16
-
RDBMS의 기본
최종 수정: 2025.06.16RDBMS의 기본■ 테이블의 구성: 필드와 레코드RDBMS 내의 레코드들은 테이블의 형태를 이룬다. 이때 각 필드로 사용 가능한 데이터 유형이 정해져 있는데, 이를 필드 타입이라 한다. 그리고 테이블 내의 특정 레코드를 식별할 수 있는 필드의 집합을 키라고 한다. 키는 레코드의 식별뿐만 아니라 테이블 간의 참조에도 사용된다. 필드 타입RDBMS의 테이블 필드에는 다양한 데이터 형식(타입), 즉 필드 타입이 저장될 수 있다. 키테이블의 레코드를 식별할 수 있는 하나 이상의 필드를 키(key)라고 한다. 키는 테이블의 각 레코드를 식별하는 용도로 사용되기도 하지만, 테이블 간의 참조를 위해 사용되기도 하고 테이블의 접근 속도를 높이기 위해 사용되기도 한다. 후보 키(candid..
2025.06.16
-
프록시와 안정적인 트래픽
최종 수정: 2025.06.15프록시와 안정적인 트래픽개발자는 클라이언트보다 서버를 만들고 다루는 일이 더 많다. 서버를 다루는 개발자는 한 번에 수많은 클라이언트와 메시지를 주고받아야 한다.■ 오리진 서버와 중간서버: 포워드 프록시와 리버스 프록시클라이언트와 단일한 서버가 한 네트워크 내에 존재하거나 나란히 위치하는 경우는 거의 없다. 클라이언트와 서버 사이에는 수많은 네트워크 장비들이 있을 수 있고, 서버를 보완하는 수많은 중간 서버들도 있을 수 있다. 게다가 어느 한 서버에 문제가 생기더라도 문제없이 동작할 수 있도록 서버를 다중화하여 운영하는 경우가 많다. 수많은 네트워크 장비과 중간 서버들 사이에서 클라이언트가 최종적으로 메시지를 주고받는 대상을 오리진 서버(origin server)라고 한다...
2025.06.15
-
응용 계층 - HTTP의 응용
최종 수정: 2025.06.15응용 계층 - HTTP의 응용■ 쿠키HTTP는 기본적으로 스테이트리스 프로토콜이기 때문에 모든 HTTP 요청 메시지는 독립된 메시지로 간주된다. 그렇다면, '3일간 보지않기'와 같은 기능은 어떻게 구현되는 걸까? HTTP 쿠키(이하 쿠키)를 활용하면 이와 같은 기능을 구현할 수 있다. 쿠키(cookie)는 HTTP의 스테이트리스한 특성을 보완하기 위한 대표적 수단으로, 서버에서 생성되어 클라이언트 측에 저장되는 쌍 형태의 데이터이다. 때로는 쿠키의 만료 기간과 같은 추가적인 속성값도 가질 수 있다. 클라이언트는 서버로부터 받은 쿠키를 주로 브라우저에 저장한다. 그렇기 때문에 서버로부터 전달받은 쿠키는 브라우저를 통해 확인할 수 있다. 서버는 쿠키를 생성하여 클라이언트에 전..
2025.06.15
-
성능 향상을 위해 시도할 수 있는 방법
최종 수정: 2025.06.12성능 향상을 위해 시도할 수 있는 방법■ 렌더링 최적화 (Redering Performance)1. 컴포넌트 재렌더링 최소화React.memo(): props가 바뀌지 않으면 리렌더링 방지useMemo, useCallback: 계산 결과 or 함수 캐싱상태(state)를 가능한 상위에서 분리context API 대신 props 전달 or 전역 상태관리 라이브러리 사용 2. 서버 컴포넌트 활용서버 컴포넌트는 클라이언트로 JS번들을 전송하지 않아 더 빠른 초기 렌더링 가능하다.■ 정적 렌더링과 캐싱 활용1. SSG2. ISR 3. CDN 캐싱정적 자산을 CDN에 캐싱(Clodflare, Vercel 등에서는 자동 지원 된다.)■ 이미지 최적화1. Image 컴포넌트 사용자동 사..
2025.06.12
-
정적 배열과 동적 배열 비교
최종 수정: 2025.06.12정적 배열과 동적 배열■ 정적 배열 (Static Array)내용이 고정되어 있고, 변경하지 않는 배열보통 리터럴로 선언하며, 불변 데이터를 표현할 때 사용한다.const fruits = ['apple', 'banana', 'orange']; 주요 메서드원본 배열을 변경하지 않는다.forEach(): 각 요소 순회map(): 요소 변환하여 새 배열 반환filter(): 조건에 맞는 요소만 반환includes(): 특정 값 포함 여부 확인find(): 조건에 맞는 첫 요소 반환join(): 배열 -> 문자열 변환slice(): 배열 일부 복사■ 동적 배열 (Dynamic Array)실행 중에 데이터를 추가하거나 제거할 수 있는 배열사용자 입력, API 데이터 등으로 구성되는..
2025.06.12
-
성능 개선 - 게시글 상세 페이지 LCP 개선
요약: LCP 5.04 -> 2.27~3.29 개선방법1) 컴포넌트 분할2) preload와 prefetch 적용 (이미지 있을 때)3) 렌더링 순서 조정 (모든 데이터를 동시에 -> 게시글 먼저 UI 즉시 업데이트)게시글 상세 페이지에서 LCP가 5.04가 나왔다.해당하는 부분은 이곳이다.{/* 게시글 본문 */} {user && user.id === post.author_id && ( 수정 삭제 )} {renderPostContent(post.content)} 컴포넌트를 분할하니 4.13~4.48 정도로 감소했다. 그럼에도 좋은 수치는 아니다. 코드를 살펴보면 renderContent가 문제인 것인데, Image 컴포넌트를 사용해도 수치가 ..
2025.06.07