+= 방식 hexNumber := ""for i := 0; i 매 반복마다 새로운 문자열을 생성합니다문자열은 불변(immutable)이므로, 연결할 때마다 새로운 메모리 할당이 발생합니다시간 복잡도: O(n²) - n은 문자열 길이 strings.Builder 방식var sb strings.Buildersb.Grow(length) // 미리 필요한 용량만큼 메모리 할당for i := 0; i 내부적으로 바이트 슬라이스를 사용하여 메모리를 효율적으로 관리합니다필요한 용량을 미리 할당하여 재할당을 방지합니다(Glow())시간 복잡도: O(n) 벤치마크func BenchmarkStringConcat(b *testing.B) { for i := 0; i 실행 결과B..
분류 전체보기
A* 알고리즘 다익스트라 알고리즘을 확장하여 만들어진 최단 경로 탐색 알고리즘 g(x) : 출발 위치에서부터 현재 위치까지 오는 비용 h(x) : 휴리스틱 알고리즘을 통해 계산한 현재 위치부터 도착지점까지 예상 비용 f(x) = g(x) + h(x)일때 f(x)가 최소가 되는 노드부터 탐색하는 BFS 방식의 알고리즘 참고로 다익스트라 알고리즘은 f(x) = g(x)인 경우 A* 알고리즘의 성능은 h(x)에 따라 좌우된다 h(x)가 과소평가를 한다면 최단 거리는 보장되지만 더 넓은 노드를 탐색하게되서 성능이 저하될 수 있다 반면 과대평가한다면 빠르게 답을 구할 수 있지만 최단 거리가 보장되지 않는다 결국 h(x)가 얼마나 실제 비용과 가깝게 비용을 예상할 수 있는지가 A* 알고리즘 성능에 있어서 중요하다
샤딩(Sharding) 한번에 관리하기 힘든 거대 데이터를 정해진 규칙에 따라 나눠서 분산 저장하는 데이터 처리 기법 수평적 파티셔닝의 일종으로 파티셔닝한 테이블들을 각기 다른 DB에 저장하는 것이 샤딩 샤딩에 의해 나누어진 저장 공간이 샤드 샤드 클러스터, 애플리케이션과 샤드 클러스터 간의 인터페이스를 제공하는 몽고스, 샤딩 관련 설정과 샤드 클러스터의 메타 데이터를 저장하는 설정 서버(Config server)로 구성된다 장점 데이터 처리 속도 향상 I/O를 처리하는 DB가 1개에서 여러개로 증가 -> 병렬 처리 한 DB에서 처리하는 데이터의 양이 줄었기 때문에 속도 향상 확장성 Scale-Out이 쉽다 고가용성 DB 장애가 샤드 단위로 일어나기 때문에 다른 샤드들은 당장의 장애로부터 안전하다 단점 ..
A 테이블에서 관계가 맺어진 B 테이블의 내용을 같이 조회하는 경우 쿼리를 통해 원래 의도한 A 테이블의 N개의 레코드를 조회한다(1회 쿼리 실행) SELECT * FROM A; N개 레코드 각각에 연결된 B 테이블 레코드를 조회한다(N회 쿼리 실행) SELECT * FROM B WHERE A_id = 0; SELECT * FROM B WHERE A_id = 1; ... SELECT * FROM B WHERE A_id = N; 1개의 쿼리를 실행했는데 결과적으로 총 N+1개의 쿼리가 실행됨 이를 N+1 문제라고 한다 ORM을 사용할 경우 쉽게 발생한다 데이터를 실질적으로 사용할 때 로드하는 Lazy Loading 방식으로 인해 그때그때 조회 작업을 실행해서 N+1 문제가 발생한다 이러한 문제가 생기지 않..
var var의 범위(scope)는 전역 범위 or 함수 범위이다 함수 외부에서 사용되면 전역 범위 함수 내부에서 사용되면 사용된 함수 내부 범위 var는 재선언될 수 있고, 업데이트 될 수 있다 var test = "TEST VAR 1"; console.log(test); // "TEST VAR 1" 출력 var test = "TEST VAR 2"; // 재선언 console.log(test); // "TEST VAR 2" 출력 test = "TEST VAR 3"; // 업데이트 console.log(test); // "TEST VAR 3" 출력 재선언이 가능하기 때문에 개발자의 실수로 여러 변수를 같은 변수명으로 만들어도 에러가 발생하지 않는다 이전의 변수가 없어져서 문제가 생길 수 있다 var는 호..
객체지향 프로그래밍 Object-Oriented Programming, OOP 컴퓨터 프로그래밍을 순차적으로 실행되는 명령어의 목록으로 보는 것이 아니라 여러 부품들의 조합 및 상호작용으로 파악하고자하는 패러다임 여기서 말하는 부품이 바로 객체 객체는 추상화를 통해 속성과 기능으로 분류하고 각각 변수와 함수로 구현된다 장점 프로그램을 보다 유연하고 변경이 용이하게 만든다 -> 코드 변경을 최소화하고 유지보수하는데 유리하다 코드 재사용을 통해 반복적인 코드를 최소화하고 코드를 최대한 간결하게 표현할 수 있다 인간 친화적이고 직관적 코드 작성에 유리하다 특징 추상화 Abstration 객체의 공통된 속성과 기능을 추출하여 정의하는 것 많은 언어에서 클래스로 추상화를 구현한다 상속 Inheritance 기존의..
트랜잭션 격리 수준 Transaction Isolation Level DB를 최대한 효율적으로 활용하기 위해서는 여러 트랜잭션을 동시에 처리할 필요가 있다 하지만 트랜잭션을 동시에 처리하다보면 다른 트랜잭션 결과로 인해 의도화는 다른 트랜잭션 결과가 나오는 동시성 문제가 발생할 수 있다 여러 트랜잭션을 동시에 실행할 때 데이터 무결성을 확보하기 위해 데이터에 접근할 때 제약을 두어야 한다 제약이 많을수록 동시성 문제는 줄어들지만 성능은 떨어지게 된다 어떤 제약을 두었는지에 따라 나눈 것이 트랜잭션 격리 수준이다 Read Uncommited -> Read Commited -> Repeatable Read -> Serializable 성능과 무결성을 저울질해야하기 때문에 DB 사용방식에 따라 적절한 격리 수..
Vue.js을 활용해서 Frontend 작업중 간단한 Input을 별도의 View를 만들지 않고 Modal을 통해 받으려고 했다 그러다보니 Pension과 Room을 관리하는 View에서 여러 개의 Modal이 필요했다 Input 형식에 따른 Modal을 각각 별개의 컴포넌트로 만드는 것은 비효율적이라고 생각해서 BaseModal 컴포넌트를 하나 만들어서 활용하고자 했다 ... ... !!Contents!! ... BaseModal 컴포넌트에서는 Modal의 기본 틀만 만들고 을 활용해서 그때그때 상황에 맞는 Modal을 만들려고 했다 그 과정에서 2가지 고민이 있었다 1. Modal을 열고 닫는 변수 관리를 어떻게 할 것인가 Modal을 열고 닫는 변수를 Props를 통해 관리할지, 전역 상태로 관리할..