전체 글

전체 글

    Join 알고리즘

    조인 알고리즘 다수의 테이블에서 조인을 수행할 때는 동시에 여러 개의 테이블에 접근할 수 없기 때문에, 내부적으로 접근할 순번을 정해서 차례로 테이블에 접근한 결과를 다음 순번의 테이블로 전달한다. 이때 테이블에 접근하는 선후 관계에 따라 드라이빙 테이블과 드리븐 테이블로 구분한다. 드라이빙 테이블에서 많은 건수가 반환되면 해당 결과를 가지고 드리븐 테이블에 접근하게 되므로, 가능하면 적은 결과가 반환될 것으로 예상되는 드라이빙 테이블을 선정하고, 조인 조건절의 열이 인덱스로 설정되도록 구성해야 한다. 중첩 루프 조인 (NL 조인) 드라이빙 테이블의 데이터 1건당 드리븐 테이블을 반복해 검색하며 최종적으로는 양쪽 테이블에 공통된 데이터를 출력한다. 인덱스는 인덱스로 정의된 열 기준으로 순차 정렬되지만, ..

    Lombok 생성자 어노테이션

    롬복(Lombok) 롬복이란 어노테이션을 기반으로 코드를 자동완성 해주는 라이브러리를 말합니다. 그렇다면 롬복은 왜 사용할까요?? 롬복을 사용하면 getter/setter나 생성자 같이 반복되는 코드들을 줄여주기 때문에 코드의 가독성을 높일 수 있습니다. 그렇다면 이제 대표적인 롬복 어노테이션의 종류에 대해 알아보겠습니다. 어노테이션 종류 @Getter, @Setter 특정 필드 위에 해당 어노테이션을 붙여주면 자동으로 생성된 접근자와 설정자 메소드를 사용할 수 있습니다. 아래와 같이 클래스에 붙여줄 경우 모든 필드에 접근자와 설정자가 자동으로 생성됩니다. @Getter @Setter public class Member { private final Long id; private String name; p..

    빅오 표기법 (Big-O)

    Big-O 수학에서 빅오란 입력값이 무한대로 향할 때 함수의 상한을 설명하는 표기방법을 말합니다. 컴퓨터과학에서 빅오는 어떤 알고리즘을 수행하는 데 걸리는 시간 또는 공간 복잡도를 표기하는 방법입니다. 그렇다면 왜 컴퓨터과학에서 빅오 표기법이 필요할까요?? 보통 일반 컴퓨터의 경우 1초에 억단위의 연산을 수행하기 때문에 작은 입력에 대해서는 효율적인 알고리즘과 비효율적인 알고리즘의 수행 시간의 차이를 확인하기 어렵습니다. 또한 그래프에서 볼 수 있듯이 작은 값에서는 빨리 동작하는 알고리즘도 충분히 큰 값에서는 매우 느리게 동작할 수도 있기 때문에 보통 알고리즘의 효율성을 나타내는 시간 복잡도를 표기하기 위해 빅오 표기법을 사용합니다. 시간복잡도 대부분의 알고리즘은 아래 시간 복잡도 중 하나에 속합니다. ..

    프로세스 생성

    프로세스 생성 프로세스는 실행 중인 프로그램으로, 프로그램을 실행하기 위해서는 디스크 상에 존재하는 프로그램을 메모리에 탑재해야 한다. 과정 1. 운영체제는코드와 정적 데이터를 메모리로 탑재한다. 프로그램은 디스크에 특정 실행 파일 형식으로 존재하는데, 코드와 정적 데이터를 메모리에 탑재하기 위해서 운영체제는 디스크의 해당 바이트를 읽어서 메모리의 어딘가에 저장한다. 초기 운영체제들은 프로그램 실행 전에 코드와 데이터를 모두 메모리에 탑재하였으나, 현대의 운영체제는 프로그램을 실행하면서 코드나 데이터가 필요할 때 필요한 부분만 메모리에 탑재한다. 2. 스택과 힙을 생성하고 초기화한다. 코드와 정적 데이터가 메모리로 탑재된 후, 프로세스를 실행시키기 전에 운영체제는 일정량의 메모리를 프로그램의 의 스택 용..

    NoSQL과 종류

    RDB vs NoSQL RDB 관계형 데이터베이스는 엄격한 스키마를 요구하는 테이블 기반 데이터 구조를 갖습니다. [장점] 데이터의 형태와 크기를 미리 정하고 테이블 단위로 구분하여 데이터를 저장할 수 있다. 트랜잭션을 통해 ACID를 보증하여 안정적인 데이터 관리가 가능하다. 조인을 포함해 복잡한 조건을 포함하는 데이터 검색이 가능하다. 엄격한 스키마로 인해 데이터 중복이 없기 때문에 데이터 update가 많을 때 유리하다. [문제점] 웹이 기하급수적으로 성작하면서, SNS를 통해 작성되는 자유로운 형태의 텍스트와 로그 기록 같은 다양한 유형의 비정형 데이터가 빠른 속도로 대량 생산되고 있습니다. 관계형 데이터베이스는 이러한 대량의 비정형 데이터를 저장하고 처리하기에 맞지 않습니다. 또한 여러 컴퓨터가..

    reflection

    reflection 패키지 reflection 패키지에 있는 클래스들을 사용하면 JVM에 로딩되어 있는 클래스와 메서드 정보를 읽어올 수 있다. 참고로 클래스의 메타 데이터 정보는 JVM의 Perm 영역에 저장되는데, 만약 엄청나게 많은 Class 클래스를 동적으로 생성하면 Perm 영역이 더이상 사용할 수 없게 되어 OutOfMemoryError가 발생할 수도 있다. Class 클래스 Class 클래스는 클래스에 대한 정보를 얻을 때 사용하며, 생성자는 따로 없다. Object 클래스에 있는 getClass() 메서드를 이용하면 Class 클래스를 생성할 수 있다. 주요 메서드 Stirng getName() 클래스의 이름을 리턴한다. Package getPackage() 클래스의 패키지 정보를 패키지 ..

    Optional 클래스

    Optional Optional은 T 타입의 객체를 감싸는 래퍼 클래스로, 모든 타입의 참조 변수를 저장할 수 있다. 최종 연산의 결과를 그냥 반환하는게 아니라 Optional 객체에 담아서 반환하므로, 예상치 못한 NullPointerException 예외를 피할 수 있다. 객체 생성 Optional 객체는 of() 메서드나 ofNullable() 메서드를 사용하여 생성할 수 있다. of() 메서드는 null이 아닌 명시된 값을 가지는 Optional 객체를 반환하며, 만약 null이 저장되면 예외가 발생한다. 따라서 만약 참조변수의 값이 null이 될 가능성이 있다면 ofNullable() 메서드를 사용해야 한다. 객체 접근 get() 메서드를 사용하면 Optional 객체에 저장된 값에 접근할 수 ..

    스트림 (Stream)

    스트림 API 스트림은 데이터 소스를 추상화하기 위해, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 즉, 데이터 소스가 무엇이든 간에 같은 방식으로 다룰 수 있게 함으로써 코드의 재사용성을 높인다. 스트림을 이용하면 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다. 특징 스트림은 외부 반복을 통해 작업하는 컬렉션과 달리 내부 반복을 통해 작업을 수행한다. 스트림은 재사용이 가능한 컬렉션과는 달리 단 한번만 사용할 수 있다. 스트림은 데이터 소스로부터 데이터를 읽기만 할뿐 원본 데이터를 변경하지 않는다. 스트림의 연산은 필터-맵 기반의 API를 사용하여 지연 연산을 통해 성능을 최적화한다. 스트림은 parallelStream() 메서드를 통..

    람다 표현식

    람다 표현식 람다식은 메서드를 하나의 식으로 표현한 것으로, 람다식으로 메서드의 역할을 대신할 수 있다. 또한 람다식은 메서드의 매개변수로 전달되거나 메서드의 결과로 반환될 수도 있으므로, 메서드를 변수처럼 다루는 것이 가능하다. (x, y) -> x {함수 몸체} 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다. 매개변수가 하나인 경우에는 ()를 생략할 수 있다. 함수의 몸체가 하나의 명령문으로 이루어진 경우에는 {}를 생략할 수 있다. (세미콜론 X) 함수의 몸체가 하나의 return 문으로 이루어진 경우에는 {}를 생략할 수 없다. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결과값이 된다. (세..