분류 전체보기26 데이터베이스 Optimizer(옵티마이저) 옵티마이저(Optimizer)의 개념 옵티마이저는 SQL을 빠르고 효율적으로 수행하도록 '실행계획'을 수립하는 DBMS의 엔진입니다. 사용자가 쿼리를 입력하면, 옵티마이저는 쿼리를 분석해서 어떤 순서로 테이블을 조회할 지, 어떤 인덱스를 사용할 지등 여러가지 기준에 따라 여러가지 실행계획을 세웁니다. 세워진 실행계획들 중 비용을 계산하여, 가장 효율적인 실행계획에 따라 쿼리를 수행합니다. 옵티마이저(Optimizer)의 종류 옵티마이저는 실행 계획을 세우는 기준에 따라 크게 규칙 기반 옵티마이저(RBO, Rule Based Optimizer)와 비용 기반 옵티마이저(CBO, Cost Based Optimizer)로 나뉩니다. 규칙 기반 옵티마이저(RBO)는 여러가지 규칙을 만들어 두고, 규칙에 따라 실행.. 2023. 9. 19. Thread 별로 가지는 저장공간 ThreadLocal ThreadLocal 이란? ThreadLocal은 쓰레드 별로 가지는 각각의 저장공간을 제공하는 컨테이너입니다. 멀티 스레드환경에서 쓰레드별로 고유한 저장공간을 제공하여, 하나의 서비스를 여러 쓰레드가 공유하는 경우에 활용할 수 있습니다. 예를들어, 사용자 인증이 완료되면 서버의 자원을 반환하는 기능이 있다고 합시다. 멀티쓰레드 환경에서 이 기능은 하나의 쓰레드에서 인증이 완료되었다고 해도, 다른 쓰레드에서 인증이 완료되지 않았다면 다음 단계로 넘어가서는 안됩니다. 하지만 Spring 프레임워크를 통해 만든 서비스라면, Spring Bean은 싱글톤 패턴을 이용해 생성되기 때문에 하나의 객체를 공유합니다. 아마 따로 처리를 하지 않는다면 인증이 완료되지 않은 쓰레드에서도 서버의 자원에 접근이 가능할 것.. 2023. 9. 8. 인터페이스 구현체 동적 선택을 활용한 리팩토링 개요 개인프로젝트를 진행하면서 클라이언트가 전송한 파일을 종류에 따라 외부 저장소와 내부 저장소에 나눠서 관리해야 하는 기능이 필요했습니다. 상품의 이미지들을 등록하는 기능에서, 이미지의 종류 혹은 크기에 따라 다른 저장소에 저장을 하는 기능입니다. 먼저, 저장소를 크게 내부 저장소와 외부저장소로 구분해서 서버 내부에 저장할 이미지와 서버 외부에 저장할 이미지로 분류하고 분류한 이미지를 처리할 서비스가 2개 필요합니다. 그리고 이미지를 등록할 때, 적절한 서비스를 동적으로 선택합니다. 다음에는 클라이언트가 등록할 상품의 이미지들을 전송하면, 이미지들을 각각 적절한 저장소에 저장하고, 클라이언트가 등록한 이미지들을 조회할 때는 이미지의 경로를 반환하고, 이미지를 요청하면 서버가 저장소에서 이미지를 가져와 .. 2023. 9. 7. [JPA Hibernate] 1:N 관계의 Entity Collection 참조 변경 문제 발생 JPA를 사용해 프로젝트 진행하는 과정에서 단방향 1:N의 관계를 가진 엔티티에서 참조하고 있는 필드의 값을 변경하려고 시도하다가 발생한 문제입니다. 상품의 이미지를 등록하는 기능을 구현하던 중이었습니다. 상품 엔티티와 이미지 엔티티는 1:N의 관계를 가지고 있고, 상품에서 이미지를 참조할 수는 있지만 이미지에서 상품을 참조할 수는 없는 구조입니다. 두 엔티티의 코드는 아래와 같습니다. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "product") @Entity public class Product extends BaseTimeEntity { @EmbeddedId @Column(name = "product_.. 2023. 9. 6. 람다 캡처링(Capturing Lambda) 의미 람다 표현식(Lambda Expression)은 기본적으로 (파라미터) -> 동작의 구조를 가집니다. 전달받은 파라미터를 가지고 동작을 정의하는 표현식입니다. 람다 캡처링은 전달받은 파라미터가 아닌 람다식 외부에서 정의된 변수를 람다식 내부에 저장하고 사용하는 것을 의미합니다.이 때 람다식 외부에 정의된 변수를 자유 변수(free variable) 이라고 합니다. public int concatStr(List strs) { String seperator = " and "; return strs.stream().collect(Collectors.joining(seperator)); } 람다식 내부에서 사용되는 지역 변수의 제약 조건 람다는 인스턴스 변수와 정적 변수를 람다식 내부에 저장하는 방식(Ca.. 2023. 9. 4. AOP (Aspect Oriented Programming) AOP 란? AOP는 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍을 의미합니다. 개발자가 프로그램의 기능을 구현할 때, 기능의 핵심적인 부분과 부가적인 부분으로 나누고, 각 부분을 분리하여 모듈화 하겠다는 의미입니다. 핵심적인 부분(관점) : 기능이 의미하는 핵심 비즈니스 로직 부가적인 부분(관점) : 핵심 로직은 아니지만, 기능에 필요한 부가적인 부분(로깅, 파일 입출력, DB 연결(JDBC) 등...) AOP 의 목적 우리가 주문 기능을 API 형태로 구현한다고 가정해 봅시다. 주문 기능을 구현하러면 구매한 상품, 구매한 상품들의 가격, 결제 등 주문의 핵심적인 부분과 주문 API를 요청했을 때, 주문을 처리하는 데 걸리는 시간, 주문을 구성하는 여러과정을 처리하는 도중 한 가지가 실패했을.. 2023. 9. 4. Spring Event를 활용한 Slack 메시지 전송 프로젝트 소개 Spring Event 기능을 활용해서 주문 시스템에서 주문이 발생하면, Slack에 '주문알람' 메시지가 전송되는 기능을 구현한 프로젝트입니다. REST API 만으로 구현했을 때 도메인계층에서 로직이 섞이는 부분이 있어서 Spring Event를 활용하면 로직이 도메인 계층에서 섞이지 않고, 주문했을때 문자메시지를 발송하는 기능과 같은 추가기능을 필요로 할 때도 확장이 용이할 것 같다는 생각에 구현해보았습니다. 요구사항 상품 기능 상품 등록 주문 기능 상품 주문 UML Spring Event를 사용한 이유 어플리케이션을 개발하고 운영하다보면 다양한 추가기능이 생기고 수정사항이 생깁니다. 주문 기능을 생각해봅시다. 처음에는 정말 주문기능 하나만 가지고 개발이 되었더라도 서비스가 발전하면서.. 2023. 9. 1. 프로그래머스 - 여행경로 : Java 풀이 모든 티켓을 이용하여 경로를 완성시켜야 하고 순서에 따라 다른 결과가 나오기 때문에 순열을 사용하여 모든 경우를 만들어 보면 됩니다. 처음 생각해 보아야 하는 점은 티켓의 재사용가능 여부입니다. 넘어온 tickets 배열에서 티켓을 사용하면 그 티켓은 다시 사용할 수 없습니다. 이 문제 뿐만 아니라 노드들을 연결하는 그래프 문제나 트리형태의 자료구조를 탐색하는 문제에서는 원소를 배치하면 그 원소를 다시 사용할 수 없는 경우가 많습니다. 이런경우에 원본 배열을 수정하거나 복사해서 원소를 제거하는 것보다는 그 원소의 사용여부에 대한 정보를 저장하는 컬렉션을 이용하면 편리합니다. 이 문제에서는 티켓들의 사용여부를 저장하는 배열을 만들어서 구현을 할 것입니다. 다음으로 생각해볼 것은 탐색의 깊이입니다. 위.. 2023. 8. 31. 프로그래머스 - N으로표현 : Java 1. 문제 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 / 5 12 = (55 + 5) / 5 5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다. 이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요. 2. 입력 N은 1 이상 9 이하입니다. number는 1 이상 32,000 이하입니다. 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다. 최솟값이 8보다 크면 -1을 return 합니다. 3. 예제 N number return 5 .. 2023. 8. 30. 이전 1 2 3 다음