Project/Spring

DB Control

east-wind 2025. 3. 26. 11:22

JPA에서 인덱스 생성 가능

@Table(name = "item", indexes=@Index(columnList = "title", name="titleIndex"))

 

아래와 같은 형태에서 LIKE문법을 사용하기 때문에 느림 - full text index 사용

@PostMapping("/search")
String postSearch(@RequestParam String searchText){
    var result = itemRepository.findAllByTitleContains(searchText);//like 문법 사용 - 느림, full text index 사용

    return "list";
}

 

full text index - 문장에서 단어들만 추출하여 정렬, 각 단어들이 어떤 행에 들어있는지도 저장

한국어는 n-gram parser 이용 - 문자를 n자씩 추출하는 것

create fulltext index fulltext_index
on shop.item(title) with parser ngram;

error

403

Forbidden

/search

Forbidden

-csrf 토큰 폼에 안넣었을 때

 

웹상의 모든 기능은 글 발행과 비슷함

 

비교적 정확하게 유지할 필요가 없는 데이터는 굳이 정규화해서 제거하지 않아도 됨

 

@Query를 통해 SQL문 직접 삽입 가능

package com.example.shop.item;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

//interface를 만들어도 class ItemRepository도 생성해줌 - DB 입출력 함수 잔뜩 들어있음

public interface ItemRepository extends JpaRepository<Item, Integer> {
    Page<Item> findPageBy(Pageable page);
    List<Item> findAllByTitleContains(String title);
    @Query(value = "select * from shop.item where id = ?1", nativeQuery = true)
    Item rawQuery1(Long id);

    @Query(value = "SELECT * FROM shop.item WHERE MATCH(title) AGAINST(?1)",  nativeQuery = true)
    Page<Item> fullTextSearch(String text, Pageable pageable);
}

 

JPA 문법을 활용하여 foreign key컬럼을 출력할 때 가리키고 있는 다른 테이블 데이터를 가져와서 붙여서 출력할 수 있음

 

foreign key 컬럼에

- @ManyToOne, @JoinColumn 

- 가리키는 다른 테이블의 타입

public class Sales {

  (생략)

  @ManyToOne
  @JoinColumn(
          name="member_id",
          foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)
  )
  private Member member;

}

 

@ManyToOne 붙이면 성능 문제 야기 가능

- JPA에서 JOIN을 쓰지 않아 N+1문제 발생

- 다른 테이블의 칼럼 전부 가져옴

 

@ManyToOne사용할 때 fetchType설정도 넣어줄 수 있는데

- FetchType.EAGER를 넣으면 "이거 필요없어도 다른 테이블 항상 가져와주세요" 라는 뜻

- FetchType.LAZY를 넣으면 "게으르게 필요할 때만 가져와주세요" 라는 뜻

채우고 쓰는 게 좋음

 

JPQL - SQL을 좀 더 쓰기쉽게 만든 문법, JPA에서만 사용 가능

JOIN이 필요하면 JPQL에 있는 JOIN FETCH라는 문법 사용하면 정확하고 안정적임(이것도 다가져옴)

 

@OneToMany - 내 키를 쓰고있는 모든 테이블의 행 가져옴

 

JPA에서DB에 삽입/수정/삭제 여러가지를 하는 함수하나를 만들고 @Transactional 붙이면 트랜잭션 처리 됨

최소한의 꼭 필요한 기능에만 @Transactional 붙이기 - Transaction이 시작되면 DB connection 하나가 그것 때문에 묶이는데

네트워크가 지연되어서 처리가 안되고 그러면 DB connection fail되기 때문

 

integration test 할때도 @Transactional 많이 씀

'Project > Spring' 카테고리의 다른 글

Retention, Reflection, Annotation  (0) 2025.04.01
이미지 업로드  (0) 2025.03.25
Object DTO/페이지네이션  (0) 2025.03.25
로그인 기능  (0) 2025.03.25
로그인 방식  (0) 2025.03.24