분류 전체보기
-
InnoDB 인덱스와 클러스터링 인덱스책/Real MySql 2021. 5. 26. 16:52
InnoDB는 MySQL의 저장 엔진 중 하나로, 높은 성능과 데이터 무결성을 제공한다. InnoDB의 인덱스 구조와 클러스터링 인덱스에 대해 알아보자. InnoDB 인덱스 구조InnoDB에서 인덱스는 B-tree 구조를 사용한다. B-tree는 데이터베이스 인덱싱에서 널리 사용되는 구조로, 데이터를 정렬된 상태로 유지하고 검색, 삽입, 삭제 작업을 효율적으로 수행할 수 있도록 돕는다.B-tree 인덱스B-tree 인덱스는 여러 노드로 구성되며, 각 노드는 다음과 같은 구성 요소를 포함한다:루트 노드(Root Node): 트리의 최상위 노드로, 데이터베이스가 인덱스 검색을 시작하는 지점이다.내부 노드(Internal Node): 루트 노드와 리프 노드 사이에 위치한 노드로, 자식 노드로의 포인터를 포함..
-
아이템44. 표준 함수형 인터페이스를 사용하라JAVA/Effective java 2021. 5. 9. 15:55
자바가 람다를 지원하며 API를 작성하는 모범 사례도 크게 바뀌었다. 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴의 매력이 크게 줄었다. 이를 대체하는 현대적 해법은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다. 이 내용을 일반화하면 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 한다. 자바 표준 라이브러리에는 같은 모양의 인터페이스가 준비되어 있다. java.util.function 패키지를 보면 다양한 용도의 표준 함수형 인터페이스가 담겨있다. 필요한 용도에 맞는게 있다면, 직접 구현하지 말고 표준 함수형 인터페이스를 활용하자. java.util.function의 총 43개의 인터페이스 중 기본 인터페이스 6개만 기억한다면..
-
아이템43. 람다보다는 메서드 참조를 사용하라JAVA/Effective java 2021. 5. 8. 22:54
람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다. 그런데 자바에는 함수 객체를 람다보다도 더 간결하게 만드는 방법이 있으니, 바로 메서드 참조이다. 다음 코드는 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부다. 깔끔해 보이는 코드지만 거추장스러운 부분이 남아 있다. 매개변수인 count와 incr는 크게 하는 일 없이 공간을 차지한다. 이 람다는 두 인수의 합을 단순히 반환할 뿐이다. 자바 8이 되며 Integer 클래스는 이 람다와 기능이 같은 정적 메서드 sum을 제공하기 시작했다. 따라서 람다 대신 이 메서드의 참조를 전달하면 똑같은 결과를 더 보기 좋게 얻을 수 있다. 람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다. 람다로 작성할 코드를 새로운 메서드..
-
아이템42. 익명 클래스보다는 람다를 사용하라JAVA/Effective java 2021. 5. 5. 13:55
예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했다. 이런 인터페이스의 인스턴스를 함수 객체라고 하여, 특정 함수나 동작을 나타내는 데 썼다. 다음 코드를 예로 살펴보자. 문자열을 길이순으로 정렬하는데, 정렬을 위한 비교 함수로 익명 클래스를 사용한다. 이 코드에서 Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻하며, 문자열을 정렬하는 구체적인 전략을 익명 클래스로 구현했다. 하지만 익명 클래스 방식은 코드가 너무 길기 때문에 자바는 함수형 프로그래밍에 적합하지 않았다. 자바 8에 와서 추상 메서드 하나짜리 인터페이스는 특별한 의미를 인정받아 특별한 대우를 받게 되었다. 지금은 함수형 인터페이스라 부르는 이 인터페이스들의 인스턴스를 람다식을 사용해 만..
-
아이템41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라.JAVA/Effective java 2021. 5. 4. 21:15
아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 마커 인터페이스라 한다. Serializable 인터페이스는 좋은 예인데, 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸 수 있다고, 즉 직렬화할 수 있다고 알려준다. 마커 애너테이션의 등장으로 마커 인터페이스는 구식이 되었을까? 사실이 아니다. 두 가지 면에서 나은 면이 있다. 첫째는, 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 애너테이션은 그렇지 않다. 마커 인터페이스는 어엿한 타입으로, 마커 애너테이션을 사용했다면 런타임에야 발견될 오류를 컴파일 타임에 잡을 수 있다. 마커 인터페이스가 나은 점 두 번째는 적용 대상..
-
RabbitMQ의 Exchange카테고리 없음 2021. 4. 22. 16:54
RabbitMQ는 메시지 브로커 시스템으로, 메시지를 생산자(Producer)로부터 소비자(Consumer)에게 전달하는 데 사용된다. 이 과정에서 Exchange는 중요한 역할을 한다. RabbitMQ의 다양한 Exchange 타입과 그 동작 원리에 대해 알아보자. Exchange란?Exchange는 생산자로부터 받은 메시지를 적절한 큐(Queue)로 라우팅해주는 역할을 한다. 각 Exchange는 고유의 라우팅 메커니즘을 가지고 있으며, 이를 통해 메시지가 정확한 큐로 전달된다. RabbitMQ에서는 주요 Exchange 타입으로 Direct, Topic, Fanout, Headers가 있다. 1. Direct ExchangeDirect Exchange는 라우팅 키(Routing Key)를 기반으로..
-
kotlin @UnsafeVariance카테고리 없음 2021. 4. 20. 17:11
@UnsafeVariance는 Kotlin에서 사용되는 어노테이션 중 하나로, 특정 상황에서 타입 변성(type variance)을 무시하도록 한다. 이는 주로 제네릭 클래스나 함수에서 사용되며, 타입 안정성을 보장하기 위해 컴파일러가 강제하는 타입 제약을 우회할 수 있게 한다. 주의사항@UnsafeVariance를 사용할 때는 런타임 타입 안정성이 깨질 수 있으므로 주의해야 한다. 이는 타입 안전성을 컴파일러가 보장해 주지 않기 때문에, 잘못된 타입이 사용될 경우 런타임 예외가 발생할 수 있다.타입 변성이 안전하게 사용되는지 확신이 있을 때만 사용.컴파일러가 강제하는 타입 안정성을 무시함으로써 발생할 수 있는 모든 부작용을 고려해야 한다.이러한 점들을 유념하면서 @UnsafeVariance를 사용한다..
-
1주차 스프링 스터디Spring/Spring 2021. 4. 19. 22:11
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크 객체 지향 프로그래밍? 객체 지향 프로그래밍은 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 객체 지향 프로그래밍을 위한 세가지 요소 캡슐화 다형성 상속 캡슐화 객체 지향의 중요한 원리는 캡슐화이다. 캡슐화는 외부에서 알 필요가 없는 부분을 감춤으로써 대상을 단순화하는 추상화의 한 종류다. 객체는 자신이 어떤 데이터를 가지고 있는지를 내부에 캡슐화하고 외부에 공개해서는 안된다. 객체는 스스로의 상태를 책임져야 하며 외부에서는 인터..