Spring Data JPA - Repoisitory 인터페이스와 쿼리메소드

Hailey·2025년 3월 27일

SPRING

목록 보기
13/15
post-thumbnail

ModelMapper 라이브러리란?

ModelMapper는 Java에서 객체 간 데이터를 매핑(변환)하는 라이브러리.
보통 DTO와 Entity 변환에 많이 사용

map() 메서드 기능

modelMapper.map(newMenu, Menu.class)

map(newMenu,Menu.class)은 newMenu 객체를 Menu.class 타입으로 변환한다.

save()

menuRepository.save(modelMapper.map(newMenu, Menu.class))

Spring Data JPA - save()
persist()처럼 영속성 컨텍스트에 엔티티를 저장하는 역할을 한다!
하지만, 정확히 말하면 persist() + merge() 이다!

새로운 엔티티라면?(id=null)

EntityManger.persist(entity);를 호출
DB에 INSERT쿼리 실행

이미 존재하는 엔티티라면? (id != null)

EntityManager.merge(entity);를 호출
DB에 UPDATE쿼리 실행

즉, save()는 persist()보다 더 유연하게 동작하며, 기존 엔티티도 업데이트할 수 있다!

이렇게 save처럼 respository가 쓸 수 있는 메소드가 여러가지 더 존재한다! 그게 바로 repoisotyr 인터페이스의 메소드이다.

Repository 인터페이스의 메소드

Spring Data JPA 에서는 Repository 인터페이스를 통해 기본적인 CRUD 기능을 제공한다.

Repository 인터페이스란?

JpaRepository 인터페이스를 상속받아서 데이터베이스를 조작하는 인터페이스를 만든다.

public interface MenuRepository extends JpaRepository<Menu, Integer> {
}

JpaRepoistory<Menu,Integer>에서
Menu : 엔티티 클래스(DB의 menu 테이블과 매핑됨)
Integer : 기본 키의 타입(menuCode가 int이므로 Integer 사용)

이렇게만 작성해도 JPA가 기본적인 CRUD 기능을 자동으로 제공한다.

2. Repository가 제공하는 기본 메서드

save만 insert+update 다 가능하다!!

save(T entity)

엔터티 저장(등록,수정)(insert/update)

saveAll

여러 엔티티들을 한 번에 등록, 수정

Optional findById(ID id)

ID로 단일 엔터티 조회

Iterable findAll(iterable)

해당 식별키를가진 엔티티 목록 리턴

findAll vs findAllbyID?

findAllbyId(ID)

모든 엔터티 목록 리턴

delete(T entity)

엔티티 삭제

boolean exist(ID)

식별 키를 가진 엔티티가 존재하는지 확인

log count()

모든 엔티티 개수 리턴

쿼리메소드

쿼리 메서드를 사용하면 sql 없이도 원하는 데이터를 쉽게 조회

JPQL을 메소드로 대신 처리할 수 있도록 제공하는 기능
메소드의 이름으로 필요한 쿼리를 만들어주는 기능

find + 엔티티 이름 + By + 변수 이름

findMenuByCode(): Menu 엔티티에서 Code 속성에 대해 조건처리하여 조회

ex) Repository 인터페이스가 JpaRepository<Menu, Integer>를 상속받고 있다면, findByCode(): Menu 엔티티에서 Code 속성에 대해 조건처리하여 조회한다.

엔티티 이름을 생략하고 쓸 수도 있는데 이는 해당 Repository 인터페이스의 제네릭에 해당하는 엔티티를 자동으로 인식하기 때문이다.

쿼리 메소드 유형


예시) 메뉴 단건 조회(findById)

public MenuDTO findMenuByCode(int menuCode) {
    Menu menu = menuRepository.findById(menuCode)
                              .orElseThrow(IllegalArgumentException::new);
    log.debug("menu: {}", menu);
    return modelMapper.map(menu, MenuDTO.class);
}
profile
럭키헤일리

0개의 댓글