먼저 질문부터!

“나는 스포츠 경기에서 어떤 정보를 관리하려고 하는 걸까?”

이 질문이 바로 DB 목적을 명확히 하는 출발점이다.

 


예시 1: 경기 결과를 저장하려는 경우

DB 목적: “각 팀의 경기 결과(승/패/무, 점수 등)를 저장하고 분석한다.”

 

테이블 설계 방향 예:

  • Match (경기 일시, 장소)
  • Team (팀 이름, 리그 정보 등)
  • Match_Result (팀별 점수, 승/패 여부)

→ 이 DB는 경기 결과 통계용이다. 예를 들어:

“2025년 4월 10일, 서울 팀 vs 부산 팀, 점수는 3:2, 승자는 서울 팀”


예시 2: 선수별 기록을 저장하려는 경우

DB 목적: “선수 개인의 경기 내 활동(득점, 어시스트, 반칙 등)을 기록한다.”

 

테이블 설계 방향 예:

  • Player (선수 이름, 포지션, 소속팀)
  • Match (경기 정보)
  • Player_Stats (경기당 득점, 패스, 반칙 등)

→ 이 DB는 개인 성적 관리용이다.

“김철수 선수, 2025년 4월 10일 경기에서 2골, 1어시스트”

 


예시 3: 리그 순위 관리를 위한 DB

DB 목적: “한 시즌 동안 팀들의 순위를 계산한다.”

테이블 설계 방향 예:

  • League (시즌 정보)
  • Team
  • Team_Standing (승/무/패, 승점, 순위)

→ 이건 시즌 통계 / 리그 순위 집계용 DB이다.

“서울 팀은 10승 2무 3패, 승점 32점으로 1위”

 


✅ 결론: 목적이 다르면 DB도 다르다!

목적 주요 테이블 설명
경기 결과 저장 Match, Match_Result 누가 이겼는지를 기록
선수 통계 관리 Player, Player_Stats 개인 퍼포먼스 저장
리그 순위 계산 Team, Team_Standing 시즌 누적 승점 계산

 

똑같은 “스포츠 경기”를 다뤄도, DB의 목적이 다르면 테이블 구조도 전혀 달라짐.

 


💬 한마디 요약

DB의 목적을 명확히 한다“는 건

내가 이 DB로 뭘 알고 싶은지, 뭘 관리하고 싶은지 정확히 결정하고 나서 설계하라는 뜻임.”


 

이번에는 “목적이 불명확한 DB의 예”와 그로 인한 문제점은 무엇일까?

현업에서도 이런 DB 구조를 많이 만나게 되고, 결국은 유지보수 지옥🔥이 되기 쉽습니다.

 

📌 목적이 불명확한 DB의 예

⚠️ 예시: 스포츠 경기 DB인데… 전부 한 테이블에?

TABLE GAME_INFO (
  TEAM_NAME,
  PLAYER_NAME,
  SCORE,
  POSITION,
  GAME_DATE,
  WIN_YN,
  LEAGUE_NAME,
  COACH_NAME,
  TEAM_RANK,
  PLAYER_HEIGHT,
  STADIUM_NAME
)

 


❌ 이게 왜 문제냐면?

1. 무슨 목적의 DB인지 알 수 없음

  • 이 테이블은 경기 결과를 저장하려는 건지,팀 통계를 관리하려는 건지 모호함
  • 선수 정보를 저장하려는 건지,

👉 설계자가 아닌 이상 “이 컬럼은 뭘 위한 걸까?” 계속 헷갈림

 


2. 단일 책임 원칙 위배

  • 한 테이블에 선수 정보, 팀 정보, 경기 결과, 경기장 정보가 다 섞여 있음
  • 즉, 이 테이블은 한 가지 목적이 아니라 여러 목적이 섞인 “잡탕 구조”

👉 수정할 때마다 여러 책임이 얽혀 있어 버그 발생 가능성 UP


 

3. 데이터 중복 및 무결성 문제

  • 팀 이름이 매 경기마다 반복 저장됨 → 중복
  • 선수 키(PLAYER_HEIGHT)가 경기마다 다를 수 있음 → 모순
  • 코치 이름 바꾸려면 여러 행 다 수정해야 함 → 유지보수 지옥

 

4. 질문에 답하기 어려움

  • 예: “김철수 선수의 시즌 총 골 수는?”
  • → 정규화 안 된 구조에선 골 찾기도 어렵고, 신뢰도도 낮음

✅ 같은 사례, 목적이 명확한 구조로 바꾸면?

목적 테이블
선수 관리 PLAYER (player_id, name, height, position, team_id)
팀 정보 TEAM (team_id, team_name, coach_name)
경기 정보 MATCH (match_id, date, stadium, home_team_id, away_team_id)
기록 PLAYER_STATS (match_id, player_id, score, assist, foul)

 

 

👉 이제는 “목적별 테이블이 명확히 분리”되어 있어서 수정도 쉽고, 통계도 정확하게 낼 수 있음.


 

🔚 요약

항목 불명확한 DB 명확한 DB
목적 여러 기능이 뒤섞임 하나의 목적에 맞는 테이블
구조 중복되고 모순될 수 있음 정규화로 일관된 구조
유지보수 어렵고 위험함 유연하고 안정적
쿼리 비효율적이고 모호함 명확하고 빠름

💬 한마디 정리

DB 목적이 불명확하면:

  • 테이블은 비대해지고
  • 데이터는 중복되고
  • 유지보수는 고통이 되고
  • 아무도 그 DB를 쓰고 싶어 하지 않게 됨. 😥

이전 PostGIS는 아마존 RDS에 설치하는 방법으로 문제없이 잘 설치되었으나 로컬에 새로운 데이타베이스를 설치하다 오류 발생해서 정리해본다.

 

PostgreSQL 15 버전에서 Homebrew를 사용하여 로컬에 PostGIS를 설치할 때 발생하는 오류와 이를 해결하는 과정에 대해 알아보겠습니다.

 1. 문제 상황

PostGIS를 Homebrew를 통해 PostgreSQL 15에 설치하려 할 때, 다음과 같은 오류가 발생합니다.

CREATE EXTENSION postgis;

ERROR: extension "postgis" is not available
Detail: Could not open extension control file "/opt/homebrew/opt/postgresql@15/share/postgresql@15/extension/postgis.control": No such file or directory.
Hint: The extension must first be installed on the system where PostgreSQL is running.


이 오류는 Homebrew가 PostGIS를 PostgreSQL 14 버전을 기준으로 설치하려고 시도하기 때문에 발생하는 것으로 보입니다.

Homebrew가 PostGIS를 현재 설치된 PostgreSQL 버전에 대응하여 올바르게 연결하지 못하는 문제가 있을 수 있습니다.

 

2. 해결책: 수동 설치

위의 오류를 해결하기 위해 PostGIS를 수동으로 설치하는 과정은 다음과 같습니다.

 

# 필요한 디렉토리 생성 및 소유자 변경
sudo mkdir /opt/postgis
sudo chown $(whoami):admin /opt/postgis

# 다운로드 및 압축 해제
cd /opt
wget http://postgis.net/stuff/postgis-3.3.3dev.tar.gz
tar -xvzf postgis-3.3.3dev.tar.gz -C postgis
cd postgis/postgis-3.3.3dev

# 설정 및 빌드
./configure --with-projdir=/opt/homebrew/opt/proj \
            --with-protobufdir=/opt/homebrew/opt/protobuf-c \
            --with-pgconfig=/opt/homebrew/opt/postgresql@15/bin/pg_config \
            --with-jsondir=/opt/homebrew/opt/json-c \
            "LDFLAGS=$LDFLAGS -L/opt/homebrew/Cellar/gettext/0.22.4/lib" \
            "CFLAGS=-I/opt/homebrew/Cellar/gettext/0.22.4/include"

# 빌드
make

# 설치
make install



이후에 PostgreSQL에 연결하여 PostGIS를 로드하는 단계를 거쳐야 합니다. 이를 통해 PostGIS가 올바르게 PostgreSQL에 설치되고 사용할 수 있게 됩니다.

CREATE EXTENSION postgis;

 

이제 정상적으로 설치되는것을 확인 할 수 있습니다.

PostGIS는 PostgreSQL 관계형 데이터베이스 관리 시스템을 위한 오픈 소스 공간 확장입니다. 
고급 지리 공간 기능에 대한 지원을 추가하여 데이터베이스 내에서 공간 데이터를 저장, 관리, 쿼리 및 분석할 수 있습니다.
PostGIS를 사용하면 포인트, 라인, 폴리곤 및 다중 기하학 컬렉션과 같은 다양한 공간 데이터 유형으로 작업할 수 있습니다. 
기하학 조작, 공간 관계, 거리 계산, 공간 측정 및 공간 쿼리를 포함하여 공간 작업을 수행하기 위한 다양한 함수 및 연산자를 제공합니다.

 


PostGIS의 몇 가지 주요 기능 및 기능은 다음과 같습니다.

  1. 공간 데이터 저장: PostGIS를 사용하면 기하학 또는 지리 데이터 유형을 사용하여 데이터베이스 테이블에 공간 데이터를 저장할 수 있습니다. Geometry는 평면(유클리드) 공간 데이터에 사용되는 반면 지리는 측지(구형) 공간 데이터에 사용됩니다.

  2. 공간 인덱싱: PostGIS는 공간 데이터를 효율적으로 인덱싱하고 쿼리하기 위해 R-Tree 및 GiST(일반화 검색 트리)와 같은 다양한 인덱싱 기술을 지원합니다. 이를 통해 더 빠른 공간 쿼리와 향상된 성능을 얻을 수 있습니다.

  3. 공간 함수 및 연산자: PostGIS는 기하학 변환, 공간 분석, 측정, 오버레이, 버퍼링 등을 포함하여 공간 작업을 수행하기 위한 포괄적인 함수 및 연산자 세트를 제공합니다. 이러한 함수를 사용하면 SQL 쿼리 내에서 직접 공간 데이터를 조작하고 분석할 수 있습니다.

  4. 공간 쿼리: PostGIS는 SQL을 사용하는 공간 쿼리를 지원하므로 지정된 영역 내에서 개체 찾기, 도형 간의 공간 관계 결정, 테이블 간의 공간 조인 수행과 같은 다양한 유형의 공간 쿼리를 수행할 수 있습니다.

  5. 다른 도구 및 라이브러리와의 통합: PostGIS는 QGIS, GDAL 및 GeoServer와 같은 다른 지리 공간적 도구 및 라이브러리와 쉽게 통합될 수 있습니다. 표준 공간 데이터 형식을 지원하므로 광범위한 응용 프로그램 및 시스템과 상호 운용할 수 있습니다.

PostGIS는 지리 정보 시스템(GIS), 위치 기반 서비스, 환경 분석, 도시 계획, 교통 관리 등과 같은 공간 데이터와 관련된 다양한 도메인 및 애플리케이션에서 널리 사용됩니다. 

PostgreSQL과 같은 강력한 관계형 데이터베이스 시스템 내에서 공간 데이터를 저장, 쿼리 및 분석하기 위한 강력하고 유연한 솔루션을 제공합니다.

 

[postgis 설치 및 확장팩]

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION address_standardizer;

-- 생성 확인 및 권한 확인
SELECT n.nspname AS "Name",
       pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;

--권한 부여
ALTER SCHEMA tiger OWNER TO ubroot;
ALTER SCHEMA tiger_data OWNER TO ubroot;
ALTER SCHEMA topology OWNER TO ubroot;

--PostGIS 객체의 소유권 이전
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;

--  exec명령문을 실행하고 권한을 변경하는 함수를 실행합니다.
SELECT 
  exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO ubroot;')
FROM (
    SELECT nspname, relname
    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
    WHERE nspname in ('tiger','topology') AND
            relkind IN ('r','S','v') ORDER BY relkind = 'S')
    s;
    
-- 버전 확인
SELECT * FROM pg_available_extension_versions WHERE name='postgis';

PostgreSQL의 부분 인덱스 (Partial Index)는 테이블의 특정 부분에만 인덱스를 적용하는 기능.

전체 테이블에 인덱스를 생성하는 것이 아니라, 주어진 WHERE 조건을 만족하는 행들에만 인덱스 생성가능.

postgresql의 경우 null 데이타도 인덱스에 포함이 되기 때문에 필요이상의 용량과 성능에 영향을 주게된다. (Oracle은 null은 포함되지 않는다)

신규 컬럼을 추가할때 not null, null 에 대한 고민을 조금은 풀어줄만한 기능으로 보여진다.

 

장점

  1. 공간 효율성 : 부분 인덱스는 전체 테이블에 인덱스를 생성하는 것보다 디스크 공간을 덜 사용한다.
  2. 성능 향상 : WHERE 절의 조건이 인덱스에 매핑되는 경우, 해당 인덱스는 쿼리 성능 향상에 크게 기여할 수 있다.
  3. 유지비용 감소 : 인덱스가 작으면, 데이터베이스에서 데이터를 추가, 수정, 삭제할 때 인덱스를 유지하는 데 필요한 작업도 줄어든다.

예제

예를 들어, asset 테이블에서 delete_flag 컬럼이 true인 행은 거의 수행되지 않는다고 가정한다.

이런 경우, delete_flag가 false인 행들만을 대상으로 인덱스를 생성하면 쿼리 성능을 향상시킬 수 있다.

CREATE INDEX idx_asset_not_deleted ON asset(updated_date) WHERE delete_flag = false;

 

위의 인덱스는 delete_flag가 false인 행들의 updated_date 컬럼에만 적용됩니다.

사용 시 고려사항

  1. 쿼리 최적화: PostgreSQL 쿼리 플래너는 부분 인덱스를 사용할 수 있도록 쿼리가 작성되어야 한다. 즉, 쿼리의 WHERE 절이 인덱스의 조건과 일치해야 한다.
  2. 데이터 분포: 부분 인덱스는 특정 조건을 만족하는 행들이 일정 부분을 차지할 때 가장 효과적이다.
    데이터의 분포와 패턴을 잘 알아야 효율적인 부분 인덱스를 설계할 수 있다.

 

요약하면, 부분 인덱스는 PostgreSQL에서 특정 조건을 만족하는 행들에 대해서만 인덱스를 생성하는 기능이다.

이를 통해 디스크 공간, 인덱스 유지비용을 절약하고 쿼리 성능을 향상시킬 수 있다.

 

 

[부분 인덱스와 같이 사용 될만한 쿼리 기능]

NULLS FIRST 및 NULLS LAST

PostgreSQL에서 ORDER BY 절에서 사용할 수 있는 옵션

이 옵션들을 사용하면 NULL 값의 정렬 순서를 지정할 수 있다.

기본적으로 PostgreSQL의 B-tree 인덱스에서 오름차순(ASC) 정렬 시 NULL 값은 마지막에 위치하며, 내림차순(DESC) 정렬 시 NULL 값은 처음에 위치한다.

그러나 때로는 이러한 기본 동작과 다른 방식으로 NULL 값을 정렬해야 할 경우가 있다.

이때 NULLS FIRST 및 NULLS LAST 옵션을 사용하여 원하는 정렬 순서를 지정할 수 있다.

 

예제

1. NULLS FIRST를 사용한 오름차순 정렬이 쿼리는 column_name을 오름차순으로 정렬하되, NULL 값은 최상단에 위치시킨다.

select * from asset ORDER BY updated_user_id ASC NULLS FIRST;

2. NULLS LAST를 사용한 오름차순 정렬

select * from asset ORDER BY updated_user_id ASC NULLS LAST;

2. NULLS FIRST를 사용한 내림차순 정렬

select * from asset ORDER BY updated_user_id DESC NULLS FIRST;

 

 

주의사항

  • NULLS FIRST 및 NULLS LAST 옵션은 ORDER BY 절에서만 사용할 수 있다.
  • 인덱스와 관련하여, 특정 정렬 순서와 NULL 처리 방식을 자주 사용한다면, 해당 정렬 순서와 옵션을 고려하여 인덱스를 생성하는 것이 쿼리 성능에 도움이 될 수 있다.

AWS Lambda는 서버리스 컴퓨팅 서비스로, 개발자가 서버 인프라에 대해 걱정하지 않고 코드를 실행할 수 있게 해준다.

 

lambda의 장점

서버 관리 필요 없음: AWS Lambda를 사용하면 서버를 설정하거나 관리할 필요가 없다.

이를 통해 인프라 운영에 대한 부담을 줄이고 애플리케이션 개발에 집중할 수 있다.

자동 확장: Lambda는 트래픽 패턴에 따라 자동으로 규모를 조정한다.

코드가 동시에 수천 번 실행되어야 하는 경우에도 Lambda가 자동으로 처리한다.

고성능: Lambda는 코드를 동시에 실행하므로 응답 시간을 줄일 수 있다.

비용 효율성: AWS Lambda는 사용한 컴퓨팅 시간에 대해서만 비용을 청구한다.

코드가 실행되지 않는 경우 비용이 청구되지 않으므로, 비용 효율적이다.

이벤트 기반 실행: Lambda는 HTTP 요청에 응답하거나 AWS 서비스로부터의 이벤트를 처리하는 등 다양한 유형의 응답을 위해 트리거 될 수 있다.

통합: Lambda는 다른 AWS 서비스와 강력하게 통합되어 있어, S3 버킷에서 파일이 변경될 때마다 실행되거나, DynamoDB 테이블에 새로운 레코드가 추가될 때 실행되는 등 다양한 시나리오에서 사용될 수 있다.

보안: AWS Lambda는 기본적으로 VPC 내에서 실행되며, IAM 역할과 정책을 이용해 권한을 제어할 수 있다.

AWS Key Management Service(KMS)를 이용해 환경 변수를 암호화할 수도 있다.

개발 생산성 향상: 코드를 작성하고 즉시 업로드한 후 실행할 수 있기 때문에 개발 과정이 단순화되고, 개발 및 배포 시간이 단축된다.

이러한 이유로 인해 AWS Lambda는 웹 애플리케이션, 데이터 변환, 실시간 파일 처리 등 다양한 유형의 애플리케이션에 사용된다.

 

 

lambda의 단
AWS Lambda는 많은 이점을 제공하지만, 그 특성상 일부 단점도 존재한다:

Cold Start: Lambda 함수가 처음 실행될 때나 일정 시간 동안 실행되지 않았을 때, "Cold Start"라는 현상이 발생한다.

이는 Lambda가 실행 환경을 초기화하는데 필요한 시간으로, 이 시간 동안에는 함수의 응답 시간이 증가한다.

실행 시간 제한: AWS Lambda 함수는 최대 15분 동안만 실행될 수 있다.

이 시간 제한으로 인해 긴 작업을 수행하기 어렵다.

리소스 제한: 각 Lambda 함수는 메모리, CPU, 디스크 공간 등 리소스에 대한 제한을 가지고 있다.

특히 메모리는 128MB에서 최대 10240MB까지 설정할 수 있다.

디버깅과 모니터링의 어려움: 서버리스 아키텍처의 특성상 전통적인 디버깅과 모니터링 방법을 적용하기 어렵다.

AWS는 이를 위한 도구를 제공하지만, 학습 곡선이 있을 수 있다.

높은 트래픽에 대한 처리: 갑작스럽게 높은 트래픽이 발생하는 경우, Lambda는 요청률 제한을 초과할 수 있다.

이 경우 일부 요청이 실패할 수 있다.

상태 유지(statefulness)의 부재: Lambda 함수는 상태를 유지하지 않는(stateless) 설계로, 함수 실행 간에 데이터를 공유하거나 유지할 수 없다.

이는 일부 애플리케이션 유형에는 적합하지 않을 수 있다.

종속성 관리: Lambda 함수에서 사용하는 외부 패키지나 라이브러리를 관리하고 배포하는 것이 복잡할 수 있다.

따라서 AWS Lambda를 사용할 때는 이러한 제한 사항과 단점을 고려하여 개발 및 배포 전략을 결정해야 한다.

 

 

그러면 lambda는 어떤 서비스에 이용되면 좋을까?

AWS Lambda는 서버리스 컴퓨팅 모델을 제공하여, 개발자가 서버 인프라를 관리하는 데 걸리는 시간과 비용을 줄일 수 있다.

이러한 특성으로 인해 Lambda는 다양한 유형의 애플리케이션과 작업에 이용될 수 있다:

실시간 파일 처리: AWS Lambda는 S3 버킷에 파일이 업로드되면 자동으로 트리거될 수 있다.

이를 이용해 업로드된 파일을 실시간으로 처리하는 작업(예: 이미지 리사이징, 로그 파일 처리 등)에 Lambda를 사용할 수 있다.

백엔드 API: AWS API Gateway와 함께 Lambda를 사용하면, 확장성 있는 백엔드 API를 쉽게 구축할 수 있다.

API Gateway가 HTTP 요청을 받아 Lambda 함수를 호출하고, Lambda는 비즈니스 로직을 처리하여 결과를 반환한다.

데이터 변환: AWS Lambda는 스트리밍 데이터를 변환하거나, 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 처리하는 등의 데이터 처리 작업에 사용될 수 있다.

실시간 스트림 처리: AWS Kinesis나 DynamoDB Streams와 같은 실시간 스트림 서비스와 Lambda를 결합하면, 실시간 데이터 스트림을 효과적으로 처리할 수 있다.

배치 작업: 주기적인 배치 작업이나 크론 작업을 수행하기 위해 AWS Lambda를 사용할 수 있다.

AWS CloudWatch를 이용해 특정 시간에 Lambda 함수를 호출하도록 설정할 수 있다.

알림: Lambda는 AWS SNS(Simple Notification Service)나 SES(Simple Email Service)와 함께 사용되어, 사용자에게 이메일 알림을 보내는 등의 작업을 수행할 수 있다.

IoT 백엔드: AWS IoT Core와 Lambda를 결합하면, IoT 디바이스에서 보내는 데이터를 처리하거나, 디바이스에 명령을 보내는 등의 작업을 수행할 수 있다.


'AWS > 용어 및 설명' 카테고리의 다른 글

PostgreSQL Amazon Aurora와 Amazon RDS 차이는 무엇인가요?  (0) 2023.08.25
Amazon VPC 구성 요소들  (0) 2023.08.03
RFC 1918란?  (0) 2023.08.03
AWS VPC IP대역에 대해  (0) 2023.08.03
AWS VPC란?  (0) 2023.08.03

올해 23년차 개발자다.

테크니컬이 풍부한 개발자는 아니다. 약 15년간 지내던 회사에서 직책을 달면 매니징에 시간투자를 하며 지내게 되었고

수많은 기획안과 기술검토도 접하게 되며 경력상 PMO도 해봤기에 문서에 대해  그리 낯설지는 않다.

 

2년간의 스타트업을 다니면서 느끼는 점이 많이 있는데 하나는 수평적 문화고 하나는 경험에서 나오는 차이다.

물론 좋은 스타트업은 안그러겠지만 이곳은 아직 주니어가 많고 시니어가 거의 없는 편이다.

 

그렇다보니 정말 당연한것도 아닌것 처럼 받아드리는 사람들도 많다.

경험들이 없다보니 설득도 이해시키는것도 쉽지가 않고 수평적 문화다 보니 본인이 이해를 못하면 그냥 아니라며 끝인 경우다.

그리고 큰그림을 못보고 주어진 일만하려다 보니 연결성도 흐름도 다 제멋대로다.

 

즉 완성도 높이 마무리되는게 전혀 없는거다.

제대로된 만들어보지도 경험도 못해서 그런거라 이해는 하지만 개방성이라도 있으면 좋을련만 그렇지도 않다.

이런 동료들과 함께하면서 일부는 잘 받아드리는 동료에 대한 기쁨도 있지만 그렇지 않은 동료들을 보면 직급이 있으면 

직급으로라도 눌러주고 싶은 마음뿐이다.

 

그리고 참 이상한 조직문화가 PO 조직이 개발 조직의 상위부서 처럼 행동하는게 참 많고 개발부문은 순둥이들만 있어 잘도 따라준다.

경험도 없다보니 7~8 페이지면 충분한 기획안이 2배이상 기획안 작성 기간도 1.5M정도 나오고 개발과 리뷰를 하면 완전 새로운 기획안으로 바뀌고 그렇게 협의후 기획안 프리징이되면 말도안되는 공수로 요청을 한다.

 

정말 프로젝트에 대해 전혀 모르고 IT 기반 지식도 없는 동료들과 일하는게 참 쉽지는 않다.

23년 경력중에 정말 제일 피곤한 1년이 되어가고 있다.

 

본인들의 현실을 돌아봤으면 하는 마음이다.

1%라도의 경험이 있는자와 모르는자의 차이가 이렇게 큰줄은 몰랐다.

 

 

 

'횡설수설' 카테고리의 다른 글

다시 시작하기..  (0) 2023.07.11

Amazon Aurora와 Amazon RDS (Relational Database Service)는 AWS에서 제공하는 관계형 데이터베이스 서비스다.

PostgreSQL을 포함하여 여러 데이터베이스 엔진을 지원하며 두 서비스는 다음과 같은 주요 차이점이 있다.

 

설계 및 아키텍처

[Amazon Aurora]

Aurora는 MySQL 및 PostgreSQL과 호환되는 고성능, 고가용성 데이터베이스다.

Aurora는 분산된 스토리지 계층에 데이터를 6개의 복제본으로 저장하며, 두 개의 가용 영역(AZ)에 걸쳐서 동작한다.

이로 인해 자동 및 연속적인 백업, 빠른 복구 및 고가용성을 제공한다.

 

[Amazon RDS]

RDS는 Aurora, MySQL, MariaDB, PostgreSQL, Oracle, 및 Microsoft SQL Server와 같은 다양한 데이터베이스 엔진을 지원한다.

각 엔진에 대한 기본 설정 및 관리 작업을 단순화하며, 자동 백업, 패치 관리 및 failover와 같은 기능을 제공한다.

 

성능

[Amazon Aurora]

Aurora는 기존의 RDS MySQL 또는 PostgreSQL보다 최대 3배, 2배의 성능 향상을 제공한다고 AWS에서 주장한다.

Aurora는 자체적으로 최적화된 스토리지 시스템을 사용한다.

 

[Amazon RDS]

RDS의 성능은 선택한 데이터베이스 엔진 및 인스턴스 유형에 따라 다르다.

Aurora의 자체 최적화 기능에 비해 성능이 떨어질 수 있다.

 

가용성 및 내구성

[Amazon Aurora]

Aurora는 데이터를 자동으로 6개의 복제본으로 저장하며, 최소 4개의 복제본이 동작하는 한 데이터베이스는 계속 작동한다. 또한, 멀티 AZ 자동 failover를 지원한다.

 

[Amazon RDS]

RDS는 멀티 AZ 배포와 스탠드바이 복제본을 제공하여 고가용성을 지원한다.

또한, Read Replicas를 통해 읽기 전용 복제본을 여러 가용 영역에 생성할 수 있다.

 

비용

[Amazon Aurora]

Aurora는 고성능 및 고가용성 기능을 제공하므로 일반적으로 RDS의 특정 인스턴스 유형보다 비용이 높다.

 

[Amazon RDS]

RDS는 사용한 리소스와 선택한 데이터베이스 엔진 및 인스턴스 유형에 따라 비용이 발생한다.

일반적으로 Aurora보다는 낮은 비용으로 시작할 수 있다.

 

확장성

[Amazon Aurora]

Aurora는 자동 및 수동으로 Read Replicas를 추가하여 읽기 쿼리 성능을 확장할 수 있다.

 

[Amazon RDS]

RDS도 Read Replicas를 지원한다.

읽기 및 쓰기 작업에 대한 성능을 향상시키기 위해 인스턴스 크기를 조정하는 것도 가능하다.

 

기타 기능

[Amazon Aurora]

Aurora는 Global Databases, Aurora Serverless, Aurora Multi-Master 등과 같은 추가 기능을 제공한다.

 

[Amazon RDS]

RDS는 특정 데이터베이스 엔진과 관련된 특정 기능 및 옵션을 제공한다.
결국 선택은 워크로드, 비즈니스 요구 사항, 예산 및 기타 요인에 따라 달라진다.

'AWS > 용어 및 설명' 카테고리의 다른 글

AWS Lambda  (0) 2023.09.07
Amazon VPC 구성 요소들  (0) 2023.08.03
RFC 1918란?  (0) 2023.08.03
AWS VPC IP대역에 대해  (0) 2023.08.03
AWS VPC란?  (0) 2023.08.03

얼마전에 장애가 발생했다.

서비스가 죽은건 아니지만 CUD시 장애가 발생하기 시작했다.

월요일 오전이라 배포한것도 없고 도대체 무슨 문제지?

 

로그를 확인해보니 새벽시간에 RDS가 업그레이드 되버렸다.

PostgreSQL RDS에 Aurora PostgreSQL 읽기전용 복제본을 생성하여 사용중인데 PostgreSQL RDS만 업그레이드가 진행되 

데이타복제가 안되는 현상이였다.

 

이전에 업그레이드 메일을 받기는 하였으나 다른업무들로 인해 우선순위가 계속 밀렸고 자동 업그레이드가 된다는 내용으로

업그레이드시 문제되는 부분을 일부 체크는 해두었기에 큰 문제는 없을거라 오판을 했다.

 

자동업그레이드가 RDS만 되고 Aurora는 안될거라고는 생각도 못했다.

RDS와 Aurora PostgreSQL 는 독립적인 서비스이며 그렇기 때문에 자동 업그레이드 별도로 진행되게 된다.

 

AWS에서 RDS PostgreSQL 10 버전의 인스턴스들은 maintenance window 시간에 관계없이 강제로 업그레이드되며 

내부적으로 담당자들이 수동으로 수행하는 작업이 아니라 back-end 로 무작위 scan 후 특정 공지 없이 업그레이드를 수행되기때문에 

RDS와 Aurora PostgreSQL 동시에 진행 될 수 없다.

 

클라우드 인프라는 처음이라 쓴 경험을 쌓고 있다.

'AWS > RDS' 카테고리의 다른 글

[AWS] RDS 클러스터(Cluster)와 인스턴스(Instance)  (0) 2023.07.18
[AWS] Aurora PostgreSQL 삭제중 상태  (0) 2023.07.18

+ Recent posts