728x90

Programming/Spring 86

Spring Data JPA - @EntityGraph

- ManyToOne의 관계에서 One의 관계에 있는 엔티티가 LAZY일 경우 One의 데이터를 조회할 때마다 쿼리가 실행된다. @Test public void findMemberLazy() { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 10, teamA); memberRepository.save..

Programming/Spring 2023.07.26

Spring Data JPA - (벌크성 수정 쿼리)

- JPA에서 벌크 연산은 executeUpdate()를 통해 JPQL에 update, delete를 지원하였다. - 또한 벌크 연산은 DB에 직접 쿼리를 날리기 때문에 영속성 컨텍스트에 영향을 주지 않았다. - JPA를 이용한 벌크 수정 쿼리 public int bulkAgePlus(int age) { int resultCount = em.createQuery( "update Member m set m.age = m.age +1" + " where m.age >= :age") .setParameter("age", age) .executeUpdate(); return resultCount; } - 벌크 연산과, 파라미터 바인딩을 통해 JPQL에 update 쿼리를 작성하였다. - Test 코드 @Test..

Programming/Spring 2023.07.26

Spring Data JPA - 쿼리 메소드 (메소드 이름으로 쿼리 생성, @Query)

- 쿼리 메소드 기능 3가지 1. 메소드 이름으로 쿼리 생성 2. 메소드 이름으로 JPA NamedQuery 호출 3. @Query 어노테이션을 사용해서 Repository 인터페이스에 쿼리 직접 정의 - 메소드 이름으로 쿼리 생성 - 순수 JPA Repository public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } ..

Programming/Spring 2023.07.24

Spring Data JPA - 공통 인터페이스 기능

- Member (Entity) @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //매개변수가 없는 생성자 생성과 동시에 접근 지정자를 PROTECTED로 설정한다. @ToString(of = {"id", "username", "age"}) //ToString에 범위를 지정해주지 않으면 양방향 연관관계에 의해 //무한 루프가 발생할 수 있기 때문에 필요한 정보만 입력한다. public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(..

Programming/Spring 2023.07.24

Spring - 스프링 트랜잭션 전파2 - 활용

- 트랜잭션 전파 활용1 - 예제 프로젝트 시작 - 비즈니스 요구사항 1. 회원을 등록하고 조회한다. 2. 회원에 대한 변경 이력을 추적할 수 있도록 회원 데이터가 변경될 때 변경 이력을 DB LOG 테이블에 남겨야 한다. 2.1. 여기서는 예제를 단순화 하기 위해 회원 등록시에만 DB LOG 테이블에 남긴다. - Member @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; public Member() { } public Member(String username) { this.username = username; } } - JPA를 통해 관리하는 회원 엔티티이다..

Programming/Spring 2023.07.08

Spring - 스프링 트랜잭션 전파1 - 기본

- 스프링 트랜잭션 전파1 - 커밋, 롤백 package hello.springtx.propagation; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annota..

Programming/Spring 2023.07.08

Spring - 스프링 트랜잭션 이해

- 스프링 트랜잭션 추상화 - JDBC 트랜잭션 코드 예시 public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); //트랜잭션 시작 //비즈니스 로직 bizLogic(con, fromId, toId, money); con.commit(); //성공시 커밋 } catch (Exception e) { con.rollback(); //실패시 롤백 throw new IllegalStateException(e); } finally { release(con); } } - JPA..

Programming/Spring 2023.07.07

Spring - 데이터 접근 기술 - 활용 방안

- 스프링 데이터 JPA 예제와 트레이드 오프 - 중간에서 JpaItemRepositoryV2 가 어댑터 역할을 해준 덕분에 ItemService 가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고 클라이언트인 ItemService 의 코드를 변경하지 않아도 되는 장점이 있다. - 선택지 1 1. 구조를 맞추기 위해서, 중간에 어댑터가 들어가면서 전체 구조가 너무 복잡해지고 사용하는 클래스도 많아지는 단점이 생겼다. 2. 실제 이 코드를 구현해야하는 개발자 입장에서 보면 중간에 어댑터도 만들고, 실제 코드까지 만들어야 하는 불편함이 생긴다. 3. 유지보수 관점에서 ItemService 를 변경하지 않고, ItemRepository 의 구현체를 변경할 수 있는 장점이 있다. 그러니까..

Programming/Spring 2023.07.07
728x90