728x90
반응형
- [트러블 슈팅] Nginx 502 Bad Gateway 에러 발생2025-04-29 10:11:02문제상황개발 서버에서 새로운 기능들을 구현한 뒤 배포 서버에 적용하는 과정에서 문제가 발생했는지 서비스가 502 Bad Gateway 에러를 뱉어내고 있었다.혹시나 GitActions 가 실패했는지 다시 확인해 보았지만 문제는 없었다. CI/CD 가 제대로 적용되어 docker에 제대로 올라갔는지 확인해 보기 위해 docker ps를 통해 확인해 보았지만 정상적으로 포트가 열려있었다.NAMESTATUSPORTSori-api-serverUp 49 minutes8080 openori-frontendUp About an hour3000 openori-nginxUp 4 months80 openori-redisUp 6 months6379 open Nginx에 문제가 있나 확인하기 위해 로그를 확인해봤다.172..
- JPA Fetch Join과 페이징을 함께 사용할 때 주의점2025-04-28 15:01:28~ToMany 관계에서 Fetch Join과 페이징을 함께 사용하면 OutOfMemoryError가 발생할 수 있다는 점을 주의해야 한다.예를 들어, 아래와 같이 Product(1)-ProductCategory(N) 관계가 있을 때, ProductJpaRepository의 findProductWithSlice 처럼 Fetch Join과 페이징을 함께 사용하는 경우에 OOM이 발생할 수 있다.@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(ma..
- Elasticsearch란?2025-04-24 00:18:371. Elasticsearch에 대해 알아보자.Elasticsearch는 Apache Lucene 기반의 Java 오픈소스 분산형 RESTful 검색 및 분석 엔진이다.방대한 양의 데이터에 대해 실시간으로 저장과 검색 및 분석 등의 작업을 수행할 수 있다.특히 정형 데이터, 비정형 데이터, 지리 데이터 등 모든 타입의 데이터를 처리할 수 있는데,Elasticsearch는 JSON 문서(Document)로 데이터를 저장하기 때문이다. Elasticsearch는 단독 검색을 위해 사용하거나, ELK(Elasticsearch & Logstash & Kibana) 스택을 기반으로 사용한다.ELKELK는 Elasticsearch + Logstash + Kibana를 같이 연동하여 사용한다는 의미이다. Filebe..
- 검색 쿼리 개선 (LIKE -> Full Text Search)2025-04-23 00:02:11LIKE현재 Ori 서비스의 검색 기능은 다음과 같은 쿼리로 짜여져 있다.SELECT new CodePostResponseDto(c,m) FROM CodePost c INNER JOIN Member m ON c.writerId = m.id WHERE c.title LIKE %:keyword% ORDER BY c.id DESC기본적으로 검색 쿼리를 구현한다고 하면, 가장 먼저 생각할 수 있는게 LIKE 문이다.많은 양의 데이터가 있는 테이블이 아니고, 검색도 빈번하게 발생하는게 아니라면 별 문제없겠지만,데이터가 100만건, 1000만건 또는 억 단위가 되면 문제가 발생할 것이다.LIKE 문의 동작 방식과 Index와의 관계Like 구문을 사용한 검색 쿼리 성능 이슈100명이 동시에 1초동안 검색을 하는 상..
- Full-Text Search 사용법2025-04-22 19:04:29Full-Text Search는 첫 글자 뿐 아니라 중간의 단어나 문장으로도 인덱스를 생성해주기 때문에, Full-Text Index를 통해 순식간에 검색 결과를 얻을 수 있다. 전체 텍스트 검색은 긴 문자의 텍스트 데이터를 빠르게 검색하기 위한 MySQL의 부가적인 기능이다.일반 인덱스와 차이로는, 풀텍스트 인덱스는 긴 문장 전체를 대상으로 인덱싱 하며, InnoDB와 MyISAM 테이블에만 지원하며, char, varchar, text 타입 문자만 인덱싱이 가능하다. 또한 여러 개의 열에 풀텍스트 인덱스 지정이 가능하다.Full-Text Index 사용법풀텍스트 인덱스 생성 3가지 방식CREATE TABLE 테이블이름( ... 열이름 데이터형식, ... FULLTEXT 인덱스이름..
- [MySQL] LIKE 문의 동작 방식과 Index와의 관계2025-04-21 18:29:47post 라는 테이블의 title이라는 컬럼에 Index가 걸려있다고 가정한다.SELECT * FROM post WHERE title LIKE 'test%';SELECT * FROM post WHERE title LIKE '%test';SELECT * FROM post WHERE title LIKE '%test%'; LIKE 문은 특정 문자열의 포함 여부를 체크하는 기준에 따라서 3가지 형태로 구분할 수 있다.여기서 중요한 점은 데이터의 앞부분에 문자열이 포함되는지 체크하는 경우에만 Index를 타게 된다는 점이다. 즉, 첫 번째 쿼리는 title에 대한 Index가 데이터 조회에 사용되지만, 나머지 쿼리들은 테이블 풀스캔을 하게되는 것이다. 왜 이렇게 동작하는 것일까?LIKE와 INDEX위에서 이야기한..
- 방어적 복사에 대해서 설명해주세요.2025-04-17 15:55:39방어적 복사(Defensive Copy) 는 원본과의 참조를 끊은 복사본을 만들어 사용하는 방식이며, 원본의 변경에 의한 예상치 못한 사이드 이펙트를 방지하여 안전한 코드를 만들 수 있는데 도움이 됩니다. 방어적 복사는 2가지 시점이 존재하는데요. 생성자의 인자로 받은 객체의 복사본을 만들어 내부 필드를 초기화하거나, getter 메서드에서 객체를 반환할 때, 복사본을 만들어 반환할 수 있습니다. 만약 컬렉션 자료구조를 반환하는 경우라면 자바의 Unmodifiable Collection을 사용하여, 외부에서 Collection에 대해 조회만 할 수 있도록 강제할 수 있습니다. 자바에서 Unmodifiable Collection은 set(), add(), addAll() 처럼 컬렉션에 요소를 추가하거나 변..
- Call By Value와 Call By Reference에 대해서 설명해주세요.2025-04-16 19:36:24특정 메서드를 호출하는 경우 인자로 전달하는 방법은 크게 2가지가 존재하는데요.값에 의한 호출(Call By Value), 참조에 의한 호출(Call By Reference)이 이에 해당됩니다. 값에 의한 호출(Call By Value) 은 메서드를 호출할 때, 값 자체를 넘겨주는 방식입니다.메서드를 호출하는 함수의 변수와 호출된 함수의 파라미터는 서로 다른 변수입니다. 반면, 참조에 의한 호출은(Call By Reference) 는 메서드를 호출할 때, 참조를 직접 전달하는 방식입니다.참조를 직접 전달하기 때문에 호출하는 함수의 변수와 호출된 함수의 파라미터는 동일한 변수입니다.따라서, 파라미터를 수정하는 경우 그대로 원본에도 영향을 미칩니다.자바는 어떤 방식을 채택하나요? 🤓자바는 값에 의한 호출(..
728x90
반응형