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 |