전체 글 (10) 썸네일형 리스트형 [Network] HTTPS 통신 (SSL/TLS) 학부과정에서부터 SSL, TLS, HTTPS, HTTP에 대해서 무지 많이 들어왔었을 것이다.나 역시 마찬가지였었고, 회사에서 R&D 프로젝트의 프로토타입이 완성되어 도메인과 HTTPS 인증서를 갱신해주어야 하는 업무가 있었다.Q. HTTP와 HTTPS의 차이점이 뭔가요? A. HTTP는 평문으로 데이터를 주고받아 보안 위험성이 존재하여 그걸 암호화 한것입니다....? 나의 지식 밑바닥을 보여준 답변이 아닐까싶다. 이번 기회에 제대로 한 번 알아보고자 한다. 먼저, SSL/TLS는 인터넷 통신의 보안을 위한 암호화 프로토콜이다.SSL(Secure Sockets Layer)과 TLS(Transport Layer Security)는 네트워크 통신에서 데이터를 안전하게 주고받기 위한 기술이다. TLS는 SSL.. [Database] MySQL 문자열 대소문자 구분 사용자의 검색 키워드와 그에 따른 결과를 보기 위해서 검색 기능을 개발하는 중 이상한 점을 발견했다. 검색 키워드를 넣고 검색을 하게 되면 아래와 같이 대소문자가 구분이 되지 않는 상태로 결과가 조회된다. MySQL 세팅 시, 대소문자 구분하지 않는 설정을 안했는데 왜 'apple'을 검색키워드로 넣었는데 왜, 'Apple', 'APPLE333'이 조회가 되는걸까?1. Application Level 분석 (Querydsl) 먼저 대소문자 구분 문제를 확인할 때, 데이터베이스 레벨보다는 애플리케이션 레벨에서의 쿼리 및 ORM(Querydsl) 설정을 살펴보았다. 애플리케이션 레벨에서 문제를 수정하는 것이 일반적으로 더 간단하고 빠르고, 쿼리나 조건을 수정하는 것이 데이터베이스 설정을 변경하는 것보다 용.. [자료구조] HashMap 내부 동작 - 2 일반적으로 get() 및 put() 연산은 평균적으로 O(1)의 시간 복잡도를 갖는다.(Key 값을 알고 있으면 바로 인덱스로 접근 가능) 하지만 최악의 경우(모든 키가 같은 버킷 인덱스로 매핑되는 경우), 연결 리스트나 균형 이진 트리에서 선형 탐색이 필요하므로 O(n)까지 증가할 수 있다.충돌 관리는 어떻게 할까?1. HashMap의 전체 크기(size)가 threshold (capacity * load factor, 기본적으로 초기 용량 16에 로드 팩터 0.75를 곱한 값인 12) 값을 초과할 경우, HashMap은 배열 크기를 두 배로 확장하고 모든 엔트리들을 새 배열에 재배치하는 재해싱 과정을 거친다. 기존 배열 크기 16에서 32가 되고, threshold도 2배인 24가 된다.static .. [Spring] Data JPA Delete() Query가 실행되지 않는 문제 문제CRUD 비즈니스 로직을 구현하는 중 특정 엔티티의 삭제를 위해 쿼리를 날렸지만 JPA의 DELETE 쿼리가 실행되지 않았다. SELECT 쿼리만 로그에 찍힐 뿐 분명 삭제쿼리를 실행했음에도 데이터베이스에는 데이터가 그대로 남아있고, 로그에도 DELETE의 'D'도 찾을 수 없었다. 현재 데이터베이스내에 테이블간 관계는 다음과 같다.비즈니스 로직은 아래와 같다.캠페인이 광고를 진행하면 일반적으로 캠페인 내 광고제품을 등록, 수정, 삭제를 할 수 있다. 캠페인 수정 API 호출수정을 하려는 캠페인 ID(PK)를 파라미터로 넣는다.RequestBody에 광고제품명의 수정(UPDATE), 삭제(DELETE) , 등록(INSERT)에 맞게 작성한다. (등록의 경우에는 AUTO INCREMENT 전략을 사.. [자료구조] HashMap 내부 동작 - 1 개발자라면 한 번쯤은 HashMap을 써봤을 것이다. (필자는 현업에서 비즈니스 로직 구현 시 종종 활용하고 있다.) HashMap의 용도Java에서 HashMap은 매우 중요한 데이터 구조로, 키-값 쌍을 내부적으로 해싱이라는 기법을 사용하여 저장하고 검색한다.해싱은 특정 객체를 고유한 숫자 값인 해시 코드로 변환하는 과정이다. HashMap에서 이 해시 코드는 해당 객체가 저장되어 있는 버킷이라고 하는 위치를 결정한다.데이터 검색 속도: HashMap은 키-값 쌍을 저장하고 검색할 때 일반적으로 상수 시간 복잡도 (O(1))이다. 즉, 맵의 크기에 관계없이 거의 일정한 시간 안에 데이터를 검색할 수 있다.중복 키 방지: HashMap에서 각 키는 유일해야 한다. 동일한 키로 값을 저장하려고 하면 기존.. [Spring] CascadeType.ALL와 orphanRemoval = true에 대해서 JPA로 개발을 진행하다보면 테이블간 맵핑관계에서 CascadeType.ALL(또는 REMOVE, PERSIST)와 orphanRemoval = true를 붙이는 경우를 볼 수 있다. 나 역시 그랬다. CascadeType.ALL을 쓰게되면 부모 엔티티 생성 또는 삭제 시, 자식의 생명주기까지 관리할 수 있어서 깊이 생각하지 않고 사용했었다. 그러나 orphanRemoval는 자식이 연관관계가 끊어질 경우 고아객체가 되는 것을 방지한다. 정도로만 알고 있었지 CascadeType.ALL와 orphanRemoval의 상관관계에 대해서는 크게 신경쓰지 않았다. 각각은 어떤 속성을 가지고 있는 걸까?결론부터 말하면 다음과 같다.상황CascadeType.REMOVEorphanRemoval=true부모 엔티티 삭.. [자료구조] 우선순위큐(PriorityQueue)에 대한 고찰 우선순위 큐(Priority Queue)는 각 요소에 우선순위(priority)를 부여하여, 우선순위가 가장 높은 요소가 먼저 처리되는 자료구조이다. 일반적인 큐와 다른 점은, 큐에서는 FIFO(First In, First Out) 원칙에 따라 요소가 처리되지만, 우선순위 큐에서는 우선순위에 따라 요소가 처리된다. 우선순위: 각 요소는 우선순위를 가지고 있으며, 우선순위가 높은 요소가 먼저 큐에서 제거된다.동적 크기: 우선순위 큐는 동적으로 크기가 변할 수 있으며, 요소를 추가하거나 제거할 수 있다.구현 방식: 우선순위 큐는 보통 힙(Heap) 자료구조를 사용하여 구현된다. 최소 힙(Min-Heap)이나 최대 힙(Max-Heap)을 사용하여 우선순위를 관리한다.우선순위 큐는 동적으로 크기가 변할 수 있다.. [Spring] @RequiredArgsConstructor에 @Qualifier 적용하기 @RequiredArgsConstructor는 Lombok에서 제공하는 어노테이션으로, 클래스의 final 필드나 @NonNull로 선언된 필드에 대해 자동으로 생성자를 생성해주어 의존성 주입을 간편하게 만들어준다. 문제의 코드는 아래와 같다.@Service@RequiredArgsConstructorpublic class MyService { @Qualifier("restClientSSE") private final RestClient restClient; ...} @Qualifier를 사용하여 특정 빈(restClientSSE)을 주입하여 "http://localhost:8080/"의 baseUrl을 포함한 API를 호출하려고 했는데, 다른 빈(restClient)이 주입되어 "www... 이전 1 2 다음