일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 커뮤니티 탐지
- 고루틴
- 자격증
- 정리
- n8n
- concurrency
- 그래프 데이터베이스
- arangodb
- 쿼리프로파일링
- SQLD
- apoc 라이브러리
- go
- GraphDB
- token bucket
- 엔터티
- go best practices
- 그래프데이터베이스
- cypher 쿼리
- cypher쿼리
- basic golang
- cypher
- 프로그래밍
- 중심성 측정
- Neo4j
- Database
- neo4j성능
- 데이터모델링
- graph
- Golang
- cypher팁
- Today
- Total
목록전체 글 (47)
Jamie the programmer
1. 시스템 보안1.1. 정보 시스템의 범위 및 이해1.1.1. 단말 및 서버 시스템단말 시스템 (PC, 모바일, 프린터, IoT/IIoT 등)시스템 서버 (DB, DNS, E-mail, WEB/WAS, 파일서버, Cloud, 보안제품 등)1.1.2. 운영체제단말 운영체제 (Window, Linux, Android, iOS, Embeded OS 등)서버 운영체제 (Windows, Linux, Unix 등)1.1.3. 시스템 정보시스템 환경정보, 인증정보, 시스템/감사 로그 1.2. 시스템 보안위협 및 공격기법1.2.1. 시스템 보안위협관리적 보안위협: 보안설정, 권한설정, 내부자 위협 등기술적 보안위협: 보안취약점에 의한 도청, 정보유출‧변조, 비인가 접근 등1.2.2. 시스템 공격기법APT 공격, 알려..

Go 언어를 사용해 프로젝트를 진행하다 보면, 패키지, 모듈, 그리고 워크스페이스라는 개념을 자주 접하게 된다.이 글에서는 이 세 가지 개념을 각각 살펴보고, 최신 Go 개발 환경에서 어떻게 사용하는지 간단히 정리해보자.1. Go 패키지(Package)1.1 패키지란?Go에서 **패키지(package)**는 코드의 물리적, 논리적 묶음을 의미한다.모든 Go 소스 파일은 반드시 package 키워드로 시작하며, 같은 디렉터리에 있는 소스 파일들은 같은 패키지로 묶인다.// mypackage.gopackage mypackagefunc Hello() { println("Hello from mypackage!")}1.2 패키지의 특징소문자로 시작하는 식별자(함수, 변수 등)는 패키지 내부에서만 접근 가능 ..

대규모 트래픽을 다루는 서버나 API에서는 **Rate Limiting(속도 제한)**이 매우 중요하다.보안 관점에서도, 무차별 암호 대입 공격(Brute Force)이나 Dos/DDoS 공격과 같은 악의적 트래픽을 효과적으로 제한하기 위해서는 Rate Limiting이 필수적이다.또한, 계정 도용 방지, API Key 남용 방지, 자원(네트워크, CPU, DB 등) 보호 등 다양한 측면에서 보안 강화를 기대할 수 있다.Go 언어에서는 표준 라이브러리에 포함된 확장 패키지 golang.org/x/time/rate와, 오픈소스로 제공되는 go.uber.org/ratelimit 라이브러리가 대표적이다. 이 글에서는 이 두 라이브러리가 구현하고 있는 대표적인 알고리즘인 Token Bucket과 Leaky Bu..

1. Rate Limiting이란?*속도 제한(Rate Limiting)*은 리소스에 대한 접근을 일정 시간당 특정 횟수로 제한하는 메커니즘을 말한다.예: API 요청, 디스크 I/O, 네트워크 트래픽 등주요 목적서비스의 품질 유지: 지나치게 많은 요청이 몰려와도 안정적으로 처리악의적 공격 방어: 무차별 암호 대입 공격(Brute force)이나 Dos/DDoS 등 방지공정성(Fairness): 특정 사용자나 특정 작업이 과도하게 자원을 사용하지 않도록 제어시스템 부하 관리: 지나친 트래픽으로 인한 시스템 장애 예방Go에서는 고루틴(goroutine), 채널(channel), 그리고 **티커(ticker)**를 활용하여 쉽게 Rate Limiting 기능을 구현할 수 있다.예시 자료: Go By Exam..

Go 언어로 프로그래밍할 때, 여러 고루틴이 동시에 동작하다 보면 언제, 어떻게 안전하게 종료시킬지 고민하게 된다. 단순히 프로세스를 종료하는 것이 아니라, 자원 해제, 데이터 무결성 보장, 작업 마무리 등 여러 요소를 고려해야 하는데, 이를 "Gracefully 하게 죽인다"라고 표현한다.그럼, Gracefully 하게 죽인 다는 기준은 무엇일까?안전한 자원 해제: 열려있는 파일, 데이터베이스 연결, 네트워크 소켓 등 모든 자원을 올바르게 닫아야 한다.데이터 무결성 유지: 진행 중인 작업이나 처리 중인 데이터가 중간에 끊겨 데이터 불일치나 손실이 발생하지 않아야 한다.예측 가능한 종료: 고루틴이 종료될 때, 어떠한 예외 상황 없이 명시된 절차에 따라 종료되어야 한다.이 글에서는 두 가지 방법을 살펴본다..

1. 중첩을 피하고 에러를 먼저 처리하라✅ 핵심 로직을 깊게 중첩하지 않도록 에러를 먼저 처리// Bad: 중첩이 깊어지는 코드func process(value int) error { if value > 0 { if value = 100 { return errors.New("value must be less than 100") } if value%2 != 0 { return errors.New("value must be even") } return nil}2. 중복을 피하라✅ 반복되는 코드를 함수로 추출하여 재사용// Bad: 중복 코드 발생func printHelloWorld() { fmt.Println("Hello, World!")}func printHelloUser(name string) { ..

1. UML Diagram1.1. GraphvizGitHub - ondrajz/go-callvis: Visualize call graph of a Go program using Graphviz# Latest releasego install github.com/ofabry/go-callvis@latest# Development versiongo install github.com/ofabry/go-callvis@mastergo-callvis 적용 사례1.2. PlantUMLGitHub - jfeliu007/goplantuml: PlantUML Class Diagram Generator for golang projectsgo get github.com/jfeliu007/goplantuml/parsergo i..
labelCount, relTypeCount, propertyKeyCount, nodeCount, relCount, labels, relTypes, stats 조회CALL apoc.meta.stats() 모델 데이터 한눈에 보기CALL apoc.meta.graph 모든 relationship 타입 조회MATCH () 모든 라벨 조회CALL db.labels() 특정 노드의 라벨 조회MATCH (a: {name:'Jane Doe'})RETURN distinct labels(a)

1. 정규화(Normalization)정규화는 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정이다.정규화는 데이터 중복을 제거하고 데이터 모델의 독립성을 확보하기 위한 방법이다.정규화를 수행하면 비즈니스에 변화가 발생하여도 데이터 모델의 변경을 최소화할 수가 있다.정규화는 제1정규화부터 제5정규화까지 있지만, 실질적으로 제3정규화까지만 수행한다. 정규화를 하지 않으면 발생되는 문제 정규화를 수행하지 않은 것으로 부서 테이블과 직원 테이블을 하나로 합쳐 둔 것이다.만약 위의 테이블에서 새로운 직우너이 추가되는 경우 부서 정보가 없으면 부서코드를 임의의 값으로 넣어야 한다.즉, 불필요한 정보가 같이 추가되는 것이다.또한 새로운 '총무부'가 추가되어야 ..

식별자라는 것은 엔터티를 대표할 수 있는 유일성을 만족하는 속성이다.일반적으로 회원 ID, 계좌번호, 주민들록번호, 외국인등록번호, 여권번호 등이 있다. 1. 주식별자(기본키, Primary Key)유일성과 최소성을 만족하는 키이다.엔터티를 대표할 수 있어야 한다.엔터티의 인스턴스를 유일하게 식별한다.자주 변경되지 않아야 한다. 2. 키의 종류기본키(Primary Key)후보키 중에서 엔터티를 대표할 수 있는 키이다.후보키(Candidate Key)후보키는 유일성과 최소성을 만족하는 키이다.슈퍼키(Super Key)슈퍼키는 유일성은 만족하지만 최소성(Not Null)을 만족하지 않는 키이다.대체키(Alternate Key)대체키는 여러 개의 후보키 중에서 기본키를 선정하고 남은 키이다. 3. 식별자의 종..

API 레퍼런스가 필요한 이유SIGDOC에서 개발자가 새로운 API를 마주했을 때 어떤 행동을 하는지를 주제로 실험을 해 본 결과 API 레퍼런스에 2번째로 가장 많이 시간을 할애한다고 합니다. API 레퍼런스 자동화 기술SwaggerJavadocAsciiDocGoDoc 자동화 기술을 사용하지 않는 이유 FeedbacksAPI 수정할 때마다 컨플문서 수정하기 너무 힘듭니다..문서는 문서대로 테스트는 포스트맨.. 관리 포인트 너무 많아..문서가 너무 무겁.. 경량화 혹은 분할 필요.스웨거, Asciidoc, 컨플루언스.. 통일화 필요! SSG을 통한 Docs as code정의Docs as code는 기술 문서를 소스 코드처럼 취급하고 관리하는 접근법입니다.Docs like Code로도 불립니다.D..

암호 해독의 최후의 수단? "고무 호스"의 위협암호를 푸는 방법에는 여러 가지가 있습니다. 수학적으로 복잡한 알고리즘을 분석하거나, 슈퍼컴퓨터를 이용해 무차별 대입 공격(Brute Force Attack)을 시도하는 등 다양한 방식이 존재하죠. 하지만 가장 "효율적인" 방법 중 하나는 놀랍게도 기술적인 접근이 아닙니다. 바로 "고문 암호 해독(Rubber Hose Cryptanalysis)" 이라는 다소 섬뜩한 방법이죠.이 용어는 1990년 마커스 라넘(Marcus J. Ranum)이 처음 사용한 것으로, "암호를 수학적으로 푸는 것보다, 그냥 사람을 두들겨 패서 알아내는 게 더 빠를지도 몰라"라는 다소 극단적인 발상에서 나온 말입니다. 고무 호스를 휘두르는 상상을 해보세요. (물론 실제로 그러면 안 되..

Neo4j Community Edition은 오픈 소스 버전으로, 기본적인 그래프 데이터베이스 기능을 제공하지만, **Graph Data Science Library(GDS)**의 고급 알고리즘은 지원하지 않습니다. GDS 라이브러리의 고급 알고리즘을 사용하려면 Neo4j Enterprise Edition 또는 Neo4j AuraDS(클라우드 버전)가 필요합니다.그러나 Neo4j Community Edition에서도 Cypher 쿼리를 활용하여 일부 기본적인 그래프 알고리즘을 구현할 수 있습니다. 아래에서는 Community Edition에서 사용 가능한 알고리즘과 그 한계를 설명드리겠습니다.1. Neo4j Community Edition에서 지원하는 알고리즘Neo4j Community Edition은 ..

Neo4j는 그래프 알고리즘을 효율적으로 실행할 수 있도록 Neo4j Graph Data Science Library(GDS)를 제공합니다. 이 라이브러리는 다양한 그래프 알고리즘을 지원하며, 대규모 그래프 데이터에 대해 빠르고 확장 가능한 분석을 수행할 수 있습니다. 아래에서는 Neo4j가 사용하는 주요 그래프 알고리즘과 그 활용 사례를 설명드리겠습니다.1. Neo4j Graph Data Science Library(GDS)란?목적: 그래프 데이터에 대한 고급 분석 및 알고리즘 실행을 지원합니다.기능:노드(Node)와 관계(Relationship)로 구성된 그래프 데이터에 대한 분석.다양한 그래프 알고리즘 제공.대규모 데이터셋에 대한 확장성과 성능 최적화.사용 방법: Cypher 쿼리와 통합되어 쉽게 ..

Neo4j에서 CALL {} IN TRANSACTIONS OF X ROWS는 대량의 데이터를 처리할 때 사용되는 강력한 기능입니다. 이 구문은 큰 작업을 작은 트랜잭션으로 나누어 실행함으로써 메모리 사용량을 최적화하고, 성능을 향상시키며, 데이터 일관성을 유지합니다. 아래에서 이 기능에 대해 자세히 설명드리겠습니다.1. CALL {} IN TRANSACTIONS OF X ROWS의 역할대량 데이터 처리: 대량의 데이터를 처리할 때 한 번에 모든 데이터를 처리하면 메모리 부하가 커지고, 트랜잭션 시간이 길어져 데이터베이스 성능에 부정적인 영향을 미칠 수 있습니다. 이 기능은 큰 작업을 작은 트랜잭션 단위로 나누어 실행합니다.트랜잭션 분할: X ROWS는 각 트랜잭션에서 처리할 행(row)의 수를 지정합니다..

1.1. 소개1.1. 클라이언트-서버 모델이란?컴퓨팅에서 클라이언트는 사람이 컴퓨터 서버에 요청을 보내기 위해 상호 작용하는 웹 브라우저 또는 데스크톱 애플리케이션일 수 있습니다.서버는 일종의 가상 서버인 Amazon Elastic Cloud Compute(Amazon EC2)와 같은 서비스일 수 있습니다.예를 들어 클라이언트가 뉴스 기사, 온라인 게임 점수 또는 재미있는 동영상을 요청한다고 가정해 보십시오.서버는 이 요청의 세부 정보를 평가하고 클라이언트에 정보를 반환하여 요청을 이행합니다.1.2. 클라우드 컴퓨팅1.2.1. 클라우드 컴퓨팅 배포 모델클라우드 전략을 선택하는 기업은 필요한 클라우드 애플리케이션 구성 요소, 선호하는 리소스 관리 도구, 레거시 IT 인프라 요구 사항과 같은 요소를 고려해야..

RFC1918국제 인터넷 표준화 기구 (IETF)에서 공포한 표준으로, 지정된 IP주소를 사설망으로 규정하고 해당 IP주소들은 공인망으로 사용하지 않고 각 기업 내에서 사설망으로만 사용하는 것을 지키기로 한 원칙을 말한다.아래 주소까지가 RFC1918에서 규정한 사설 IP 주소의 범위이다.CIDR 표기IP 범위10.0.0.0/810.0.0.0~10.255.255.255172.16.0.0/12172.16.0.0~172.31.255.255192.168.0.0/16192.168.0.0~192.168.255.255서브넷의 CIDR 계산법IP주소를 표기할 때 /8, /16, /24, /32 같은 것을 보게 된다./8은 1.1.1.1이면 1로 시작하는 IP모두/16은 1.1.*.*이면 1.1로 시작하는 IP모두/2..

Neo4j는 그래프 데이터베이스로, 데이터의 구조(형상)가 동적으로 변경될 수 있습니다. 노드, 관계, 속성, 라벨 등을 추가하거나 삭제하는 명령어를 실행하면 데이터베이스의 상태가 바뀌게 됩니다. 이러한 변경 사항을 정확히 이해하고 모니터링하기 위해 apoc.meta.stats()를 사용하는 것이 매우 유용합니다.1. apoc.meta.stats()의 역할apoc.meta.stats()는 데이터베이스의 현재 상태를 통계적으로 요약해 줍니다. 주요 정보는 다음과 같습니다:노드 관련:전체 노드 수라벨(Label)별 노드 수관계 관련:전체 관계 수관계 유형(Relationship Type)별 관계 수속성 관련:속성의 분포 및 사용 빈도이 정보를 통해 데이터베이스의 전체적인 구조와 상태를 한눈에 파악할 수 있습..

데이터베이스 시스템은 전통적으로 엄격한 스키마(schema)를 요구했습니다. 스키마는 데이터의 구조를 미리 정의하고, 이를 준수하도록 강제합니다. 하지만 현대의 데이터 환경은 빠르게 변화하며, 복잡하고 유연한 데이터 모델링이 필요해졌습니다. 이러한 요구에 부응하여 Neo4j와 같은 그래프 데이터베이스는 Schemaless(스키마리스) 개념을 도입해 유연성과 확장성을 제공합니다. 이 글에서는 Neo4j와 Schemaless 개념을 중심으로, 그래프 데이터베이스의 장점과 활용 방안을 살펴보겠습니다.1. Neo4j란?Neo4j는 그래프 데이터베이스(Graph Database)의 대표적인 예시로, 데이터를 노드(Node)와 관계(Relationship)로 표현합니다. 전통적인 관계형 데이터베이스(RDBMS)와 ..

서버를 운영하다 보면 아웃바운드 포트를 어떻게 설정해야 할지 고민되는 순간이 옵니다. 보통 보안이 중요한 환경에서는 불필요한 포트는 닫아두는 것이 원칙이죠. 하지만 아웃바운드 포트를 무작정 열어둔다면 보안 위협과 포트 충돌 같은 문제가 발생할 수 있습니다. 그렇다면 왜 아웃바운드 포트를 임시 포트(Ephemeral Port)로 설정해야 하는지, 구체적으로 살펴보겠습니다. 🧐1. 해킹 위험 🚨아웃바운드 포트를 1~65535까지 무작정 열어둔 서버는 해킹 공격에 매우 취약해집니다. 특히 Reverse Connection 공격의 주요 대상이 될 수 있습니다.🔹 Reverse Connection 공격이란?보통 공격자가 내부 네트워크로 침투하려면 방화벽이 막아서기 때문에 어려움을 겪습니다. 하지만 아웃바운드..