본문 바로가기

전체 글

(124)
[spring boot] 파라미터 바인딩 위치 기반 이름 기반 (무조건 이름 기반 사용하자) 위치, 이름 기반의 차이 파라미터 바인딩 @Query 속 :name에 집중 import org.springframework.data.repository.query.Param public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username = :name") Member findMembers(@Param("name") String username); } 위치기반은 순서 실수가 일어날 수 있음. 컬렉션 파라미터 바인딩 Collection 타입으로 in절 지원 @Query("select m from Member m where m.user..
[spring boot] @Query, 메서드 이름으로 생성, NamedQuery 스프링 데이터 JPA가 제공하는 기능 (사용 순위) @Query 어노테이션을 사용해서 repository interface에 쿼리 직접 정의 메소드 이름으로 쿼리 생성 (메서드 이름에 파라매터 많아지면 지저분) 메소드 이름으로 JPA NamedQuery 호출 1. @Query, 리포지토리 메소드에 쿼리 정의하기 //member repository public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username= :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int..
[spring boot] 3차 정리 (페치 조인, 벌크 연산) 페치 조인 (fetch join) 페치 조인 1 - 기본 fetch LAZY 지연로딩으로 설정해놔도 jpql날릴 때 join fetch 하면 이게 더 우선순위 높아서 팀을 프록시가 아닌 진짜 엔티티로 들고옴. 따라서 그 아래(system.out.println(member.getTeam().getName())도 프록시가 아닌 다 진짜 객체로 사용하는 것. 팀A는 실제 영속성 컨텍스트에 올라간건 1개지만 팀A인 데이터(회원)가 2개이기 때문에 그 1개를 참조하는 값이 2개인것임. 원래 distinct는 완전히 같은 데이터만 중복을 제거해주지만 jpa는 일대다 관계에서 뻥튀기되는 데이터까지 중복제거해준다. 페치 조인 2 - 한계 fetch join은 나랑 연관된 애들 전부를 끌고오겠다라는 뜻이며 중간에 몇개(..
[spring boot] 3차 정리 (값 타입) 기본값 타입 Integer, String같은 래퍼 클래스는 참조값이 복사되는데 대신 변경 자체가 불가능함. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체됨. (so. side effect 안 생김) 임베디드 타입 4:18 참고 임베디드 타입은 isWork(): 지금 일하는 기간에 속하는지 알아보는 메소드 만들 수 있음 임베디드 타입은 값타입에 속하며, 모든 값타입은 엔티티 생셩주기에 의존된다. (엔티티가 삭제되면 값 타입도 삭제됨) 17:58 참고 Member 필드에 임베디드 타입(Address)을 두 개 사용하고 싶을 때 private Address homeAdress; private Address workAddress; ------------- 임베디드 타입은 joinColumn할 필요 ..
[spring boot] 변경감지(dirty checking)와 병합(merge) 변경 감지 동작 원리 변경 내용을 JPA가 자동으로 인식해 commit할 때 반영해줌. EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); // [트랜잭션] 시작 // 영속 엔티티 조회 Member memberA = em.find(Member.class, "memberA"); // 영속 엔티티 데이터 수정 memberA.setUsername("hi"); memberA.setAge(10); //!!!!! em.update(member) 이런 코드가 있어야 하지 않을까? transaction.commit(); // [트랜잭션] 커밋 !! em.up..
[spring boot] 영속성 전이 (cascade)와 orphanRemoval 차이 영속성 전이(CASCADE)와 고아 객체 CASCADE는 즉시로딩이나 연관관계와 상관 x parent만 persist해주면 chlid도 자동으로 persist됐으면 좋겠을 때 사용 @OneToMany (mappedBy="parent", cascade = CascadeType.ALL) one에 사용하는 것이며 cascade all로 해주면 그 field childList에 들어가는 child들은 다 자동으로 persist됨. ---------------- ALL : 전체 다 life cycle 맞춰야 할 때 (orphanRemove안해도 parent 지우면 chlid도 다 지워짐) persist : 저장할때만 life cycle 맞추고 싶을 때 사용, 나머지(remove)는 위험하니까 따로 두고 싶을 때 ..
[spring boot] 실전! 1. entityManager를 이용하려면 @Transactional이 필수이다. 기본 (쓰기용) : @Transactional (readOnly = false) 단순 조회용 : @Transactional(readOnly = true) = 읽기 전용이니 DB야 너무 큰 부하를 잡아먹지마 Service위에 쓰기가 많으면 @Transactional, 단순 조회가 많으면 @Transactional(readOnly = true) 아래 method 중 반대되는건 따로 개별적으로 @Transactional적어주기 2. lombok @AllArgsConstructor : 필드 모두 생성자 만들기 @RequiredArgsConstructor : final(수정x) 필드만 생성자 만들기 3. roll back (test..
[spring boot] 각 join 특징 (+ on, where 차이) on과 where 차이 ON : join하기 전 필터링 WHERE : join한 후 필터링 각 join 특징 팁 inner join은 on이 아닌 where을 사용하자 (on과 where의 결과는 같으나 where이 더 친숙하기 때문)