
검색엔진 검색엔진을 이용하다보면, 검색어를 타이핑 하는 순간 연관된 추천 검색어들이 나오는 것을 알 수 있습니다. 어떻게 사용자가 타이핑을 하는 그 '찰나'에 추천 검색어를 찾아 낼 수 있었을까요? 그리고 많은 인터넷 문서들 가운데, 검색 키워드에 맞는 문서들을 찾아 낼 수 있을까요? 일반적인 선형검색을 떠올린다면 절대로 불가능한 속도라는 것을 알 수 있습니다. 엘라스틱 서치는 왜 빠를까? 엘라스틱 서치는 Apache Lucene기반의 오픈소스 '검색엔진'입니다. 그럼 엘라스틱 서치와 같은 검색엔진들은 왜 그렇게 빠른 걸까요? MySQL과 같은 관계형 데이터베이스에 익숙하다면, 테이블이 인덱싱(색인작업) 되면 복잡한 쿼리에서 훨씬 더 나은 성능을 보여준다는 것을 잘 알고 계실겁니다. (인덱싱은 빠른 검색..
개요아주 간단하지만 아주 끔찍한(?) 클래스를 하나 보겠습니다. class MyClass { void myMethod1() { System.out.println("A"); System.out.println("B1"); System.out.println("C"); } void myMethod2() { System.out.println("A"); System.out.println("B2"); System.out.println("C"); } } public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.myMethod1(); myClass.myMethod2(); } } 위의 MyClass..
※이 포스팅은 academind의 SQL vs. NoSQL을 번역한 포스팅입니다. [개요]웹 애플리케이션 개발을 위한 첫 걸음을 내딛은 이후에 한가지 선택사항을 마주하게 됩니다. MySQL와 같은 SQL을 사용할 것인가? 아니면 MongoDB같은 NoSQL을 사용할 것인가?Node.js에 익숙하신 분들이라면 NoSQL (MongoDB)이 더 좋다는 인상을 가지고 계실지도 모르겠지만 잘못된 생각입니다.이 글에서는 SQL과 NoSQL 데이터베이스의 핵심적인 개념을 소개하고 각 솔루션의 차이점 그리고 장단점을 설명하도록 하겠습니다. [SQL (관계형 데이터베이스)]SQL은 '구조화 된 쿼리 언어 (Structured Query Language)'의 약자입니다. 그러므로 데이터베이스 자체를 나타내는 것이 아니라..
Codility - Triangle ☞ 문제 링크 문제 설명 중복되지 않는 인덱스 3가지를 선택하고, 2가지 인덱스 값의 합이 나머지 1가지의 인덱스 값보다 모두 큰 경우가 존재하는지 찾는 문제입니다. 예제로 주어진 케이스는 A[0] = 10, A[2] = 5, A[4] = 8 인 경우인데,10 + 5 > 8 (참) // A[P] + A[Q] > A[R]5 + 8 > 10 (참) // A[Q] + A[R] > A[P]8 + 10 > 5 (참) // A[R] + A[P] > A[Q]세가지 경우가 문제에 내용을 만족하는 참입니다. 이런 경우의 배열이라면 1을 반환하고, 아니라면 0을 반환해야 합니다. 풀이에 핵심은 배열을 정렬한 상태에서 인접한 세개의 인덱스간의 비교만 진행하면 됩니다.(그리고 인덱스에 대한..
참고링크 Orcal 문서 - Using Thread Dumps를 참고하여 번역한 포스팅입니다. 의역 오역이 있을 수 있습니다. 쓰레드 덤프란? 이 챕터는 Oracle JRockit JVM 쓰레드 덤프를 어떻게 얻고 사용하는지에 대해서 설명합니다. 그리고 기본적인 지식으로는 쓰레드와 쓰레드 동기화에 대해서 알고 있어야 합니다.쓰레드 덤프란 프로세스에 속한 모든 쓰레드들의 상태를 기록(snapshot)한 것입니다. 그리고 각 쓰레드들은 ‘스택 추적(stack trace)’ 형태로 보여집니다. 쓰레드들은 직접 실행시킨 Java 응용 프로그램의 쓰레드와 JVM 내부적으로 존재하는 쓰레드로 나뉘게 됩니다.쓰레드 덤프는 발생된 문제들을 분석하거나 혹은 응용 프로그램과 JVM의 성능을 최적화 하는데 도움을 주는 정보..
지연 로딩? 예를 들어 A라는 객체가 B라는 객체를 가지고 있다면, A를 데이터를 불러 올 때 해당되는 B의 데이터도 필요합니다. 하지만 B객체에 대한 정보가 굳이 필요 없는 상황에서도 B데이터까지 모두 데이터베이스에서 불러오는 작업을 한다면 비효율적인 작업이 됩니다. 이런 상황에서 성능을 올리기 위한 방법으로 JPA의 '지연 로딩'이 있습니다. 실제로 B객체의 데이터가 사용 될 때, B데이터를 불러오고, 그렇지 않다면 굳이 B객체 데이터를 사용하지 않습니다. 지연 로딩을 구현하기 위해서 JPA (정확히는 Hibernate)에서는 프록시 디자인 패턴을 사용합니다. 프록시 디자인 패턴 이미지 출처 ㅣ 위키 백과 클라이언트(Client)가 특정 객체(Subject)를 사용하게 될 때, 이를 구현한 (혹은 상..
다이아몬드 문제 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다. 위의 클래스 다이어그램과 같은 상속 구조에서 발생되는 문제가 다이아몬드 문제입니다. 마치 모양이 다이아몬드 모양이라서 붙여진 이름 같습니다. 예를들어 GrandFather이라는 클래스가 myMethod() 라는 이름의 메소드를 가지고 있다고 가정해봅시다. 그리고 FatherA와 FatherB가 각각 오버라이딩하여 구현하였다면, FatherA와 FatherB를 모두 상속받은 Son 클래스 입장에서는 어떤 부모의 myMethod()를 사용해야 할까요? 이로 인하여 충돌이 생기게 됩니다. 코드로 나타내면 아래와 같은 모습입니다..
자바(JVM)의 메모리 사용 방식 프로그램을 실행시킬 때 CPU와 조화로운(?) 작업을 위해서 저장장치에 있던 내용들이 메모리에 올리가기 시작합니다. 메모리에 데이터들이 어떤 방식으로 올라가는지 이해하는 것은 더 나은 개발자가 되기 위한 필수 과정이라고 생각합니다. 메모리 구조를 알게 된다면, 클래스 멤버, GC(가비지 컬렉터), 쓰레드가 어떤식으로 독립적으로 운영되면서 공유하는 자원이 있는지에 대한 이해를 훨씬 더 쉽고 깊게 알 수 있습니다. 메모리는 크게 4가지 영역으로 나눌 수 있습니다. 로우레벨 개발자가 아니라면 주로 우측에 static 영역, stack 영역, heap 영역을 위주로 알고 있으면 됩니다. 이 세가지 영역을 간단히 T메모리라고 부르겠습니다. static 영역패키지나 클래스 정보가 ..