728x90
반응형
- JVM에서 GC 대상 객체를 판단하는 기준은 무엇인가요?2025-05-04 11:52:36GC(Garbage Collection)는 자바의 메모리 관리 방법의 하나이며, JVM의 힙 영역에서 동적으로 할당했던 메모리 중에서 필요 없어진 객체를 주기적으로 제거하는 것을 의미합니다.GC는 특정 객체가 사용 중인지 아닌지 판단하기 위해서 도달 가능성(Reachability) 라는 개념을 사용하는데요.특정 객체에 대한 참조가 존재하면 도달할 수 있으며, 참조가 존재하지 않는 경우에 도달할 수 없는 상태로 간주합니다.이때, 도달할 수 없다는 결론을 내린다면 해당 객체는 GC의 대상이 됩니다.도달 가능성은 어떻게 판단하나요? 🤓힙 영역에 있는 객체에 대한 참조는 4가지 케이스가 존재하는데요.힙 내부 객체 간의 참조스택 영역의 변수에 의한 참조JNI에 의해 생성된 객체에 대한 참조(네이티브 스택 영역)..
- 어떤 예외가 발생하면 트랜잭션을 롤백하나요?2025-05-02 19:29:52예외 종류에 따른 트랜잭션 롤백은 개발 환경에 따라 다르게 동작합니다.Spring 트랜잭션 예외 처리 동작Checked Exception 기본적으로 Checked Exception이 발생하더라도 트랜잭션을 롤백하지 않습니다.Checked Exception은 컴파일 시점에 예외 처리를 강제하는 예외로, 개발자가 예외 발생 가능성을 예상하고 이를 적절히 처리할 수 있는 정상적인 예외 상황이라고 가정하기 때문입니다.Unchecked Exception(RuntimeException, Error) Spring은 기본적으로 Unchecked Exception 또는 Error가 발생하면 트랜잭션을 롤백합니다. 이는 Unchecked Exception이 보통 프로그래머의 실수나 시스템적인 문제로 인한 회복하기 어려운 ..
- [트러블 슈팅] 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위에서 이야기한..
728x90
반응형