본문 바로가기

분류 전체보기433

트랜잭션과 잠금 MySql의 InnoDB 스토리지 엔진은 MyISAM, MEMORY 스토리지 엔진과 달리 트랜잭션을 지원해준다. 트랜잭션은 작업의 완전성을 보장해 주는 것. 데이터의 정합성을 보장하기 위한 기능이다.즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 오류가 발생해서 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다. 트랜잭션은 **"모두 완벽하게 처리(Commit)되거나, 원 상태로 복구(Rollback)되어 일부만 적용되지 않음"**[ 초기 데이터 상태 ] │ ▼===================================================[ 트랜잭션 시작 (Logical Work Set) ] .. 2026. 4. 2.
N + 1 문제 방지 판매 내역에 관한 데이터를 담은 DTO를 반환할 때 N + 1 을 고려하지 않고 JPA가 제공해주는 일반 메서드로만 설계. findAllBySellerId() 는 파라미터로 받은 판매자id에 해당하는 SaleCard가 Repository에서 조회되지만, SaleCardResponseDto.from() 내부에서 saleCard.getCardMaster().getCardName()이나 saleCard.getImages() 등으로 연관관계로 맺어진 엔티티의 값을 호출하게된다. 지금 현재 카드 이미지 테이블에는 4개의 이미지가 존재함. 동일한 masterCard임. seller에 들어가는 member는 동일.이 경우에 쿼리가 18개가 나가는 것을 확인함. Hibernate: select m.. 2026. 3. 26.
포트폴리오 수정 정리 - 커버링 인덱스를 통한 조회 성능 개선 어떤 부분에 인덱스를 걸면 빨라질 것이라고 생각했는지?> MySQL의 Leftmost Prefix Rule ( = 복합 인덱스에서 인덱스의 왼쪽 컬럼부터 순서대로 사용되어야 한다는 규칙 ) 에 기반하여 인덱스 효율성을 극대화하는 순서로 설계복합인덱스를 걸면 순서가 중요한데 순서는 왜 이렇게 해주셨는지?복합 인덱스의 Leftmost Prefix Rule을 준수하여 설계했습니다. 동등 비교(=) 조건인 source를 선두에 배치해 데이터 탐색 범위를 먼저 최소화하고, 이후 정렬 및 범위 조건인 created_at을 배치하여 별도의 정렬 연산(Filesort) 없이 데이터를 순차적으로 읽을 수 있도록 최적화했습니다.선행 컬럼 (source): 카디널리티가 낮더라도 동등 비교(=) 조건을 사용하는 컬럼을 가장 .. 2025. 11. 25.
글모아 프로젝트 개선점 3 알람 기능을 추가하기 위해서 1. collector-service를 eureka에 등록하고 2. memer-service와 통신을 하여 member가 설정한 키워드들을 가져온 다음 3. 해당 키워드들을 통해 새 게시물에 키워드와 매치되는 게시글이 들어오면 4. member-service로 알람을 생성하는 api를 호출하여 feignClient를 이용하여 member-service로 dto들을 보내도록 만들었음. 하지만 유레카에 등록된 member-service로 api를 호출하자 에러코드가 발생. 이유로는... collector-service는 외부 사이트(크롤링 하는 사이트들)의 차단을 피하기 위해서 Tailscale의 "Exit Node(출구 노드)" 기능을 사용하여 IP를 우회 하고 있는 상황이었.. 2025. 11. 25.
엘라스틱 서치 analyzer와 searchAnalyzer 엘라스틱서치를 제대로 이해하려면 analyzer vs searchAnalyzer 차이를 반드시 알고 있어야 한다. @Field(type = FieldType.Text, analyzer = "korean_ngram", searchAnalyzer = "korean_ngram")private String title;analyzer = 인덱싱할 때 사용searchAnalyzer = 검색어를 분석할 때 사용이렇게 “역할이 다르다”는 걸 이해하는 게 핵심이다.지금부터 아주 쉽게, 이해폭발하게 설명해줄게.🔥 1. analyzer — 데이터를 저장할 때(인덱싱) 사용하는 분석기✔ 데이터가 저장될 때(인덱싱 시)문서(title, author 등)가 들어오는 순간,엘라스틱서치는 이 analyze.. 2025. 11. 17.
엘라스틱 서치 인덱스 설정 파일 설명 { "analysis": { "tokenizer": { "korean_ngram_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 3, "token_chars": ["letter", "digit"] } }, "analyzer": { "korean_ngram": { "type": "custom", "tokenizer": "korean_ngram_tokenizer", "filter": ["lowercase"] } } }} 엘라스틱 서치 인덱스가 텍스트를 어떻게 잘라서 저장하고, 검색어를 어떻게 분석할지(토큰화.. 2025. 11. 17.
글모아 프로젝트 개선점 2 현재 글모아 사이트에서 mysql로 jpa를 통한 검색쿼리를 이용했을 시 응답 속도는 대략 1초 정도 걸린다. 이 이유는 like 쿼리를 이용하여 db에서 full table 스캔으로 테이블을 찾기 때문이다. 이것을 개선하기 위해서는 엘라스틱 서치를 이용해서 성능을 개선할 생각이다. ㄱㄱkorean 분석기를 사용하는 인덱스를 만들자. PostDocument에서 analyzer = "korean"을 지정했기 때문임.엘라스틱 서치 컨테이너를 재시작하자. db에 저장되어 있는 데이터들을 엘라스틱 서치로 보내면 시간이 9시간이 더해져서 나오게 된다. 그 이유는 엘라스틱 서치는 UTC+9 시간대이기 때문에 KST로 저장 시 9시간이 보정값으로 자동으로 더해준다. 그래서 나는 DB에서 꺼낸 데이터의 시간 값을 I.. 2025. 10. 22.
글모아 프로젝트 개선점 1 현재 특정 커뮤니티의 최신글을 불러오는 api를 호출할 때 1초정도의 대기 시간 후 응답을 받는 것이 확인 되었음. 왜 그렇게 오래걸리는 지 확인을 해보니까 HTTP/1.1의 동시 연결 제한(6개) 때문에 6개의 요청을 보내고 응답을 받아야만 그 다음의 요청이 가능하기 때문이었음. 지금 13개의 커뮤니티에 대한 데이터를 요청하고 받고 있으니 6개, 6개, 1개 이렇게 요청 응답을 받고 있어서 오래걸리던것. 해결 방법으로는 HTTP/2를 사용하면 6개의 요청이 아닌 그 이상의 요청을 보낼 수 있음.근데 찾아보니까 SSL 인증해야되고 귀찮다.. 그래서 나는 REDIS로 캐싱 처리해서 조회 속도를 향상시키로 결정했다.2025-10-15 사용자들이 자주 이용할 것 같은 1 ~ 5페이지는 redis에 미리 저장시.. 2025. 10. 14.