WEB/JPA

실전! Spring Data JPA 4,5 (스프링 데이터 JPA 분석, 나머지 기능들)

Tony Lim 2021. 4. 14. 13:58
728x90
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> 

실제 구현체가 들어있는 클래스이다.

@Repository

1. Component Scan 의 대상이 되어 Spring Container 에 올라감

2. JDBC, JPA Exception 이 터질때 이것들을 Spring Exception 으로 바꿔서줌

 

Spring data jpa 에서의 save는 

	@Transactional
	@Override
	public <S extends T> S save(S entity) {

		Assert.notNull(entity, "Entity must not be null.");

		if (entityInformation.isNew(entity)) {
			em.persist(entity);
			return entity;
		} else {
			return em.merge(entity);
		}
	}

새것이 아니면 즉 id 값이 null 이 아니면 merge를 호출한다. 

@GenerateValue 를 통해서 Entity 의 ID를 생성하게 된다면 persist한후에 ID가 db에 의해서 생성됨으로 처음에 isNew

에서 null 로 서 참이되겠지만

그게아니라 자기가 임의로 ID값을 임의로 생성자를 통해 부여하게 된다면 merge를 호출하게 되는데 merge는 db에 이미 같은 ID가 있다고 가정하고 select 쿼리를 한번 날리기 떄문에 비효율적이다. 

이럴떄는

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item implements Persistable<String>
{
    @Id
    private String id;

    @CreatedDate
    private LocalDateTime createdDate;
    
    @Override
    public String getId()
    {
        return null;
    }

    @Override
    public boolean isNew()
    {
        return createdDate == null;
    }
}

isNew를 로직을 실무에서는 이렇게 사용한다고 한다.

 

복잡한 Specification , Criteria 쓰는것 (안씀)

Projection = Dto 처럼 원라는 column만 조회할 수있게 도와줌

native Sql

    @Query(value = "select * from member where username =?", nativeQuery = true)
    Member findByNativeQuery(String username);

Query Dsl 을 써야한다.

728x90