분류 전체보기 126

[JAVA] 변경감지와 병합(merge)

준영속 엔티티 영속성 컨텍스트가 더이상 관리하지 않는 엔티티 준영속 엔티티를 수정하는 방법 변경감지 기능 사용(Dirty Checking) 병합(merge) 사용 변경감지기능 사용(itemService에서 작성) /** * 변경감지 */ @Transactional public void updateItem(Long itemId, Book param){ Item findItem = itemRepository.findOne(itemId); findItem.setName(param.getName()); findItem.setPrice(param.getPrice()); findItem.setStockQuantity(param.getStockQuantity()); } 여기서 itemRepository.save 를 ..

JAVA 2022.02.10

[JAVA] AllArgsConstructor vs RequiredArgsConstructor

@AllArgsConstructor Autowired로 repository를 바로 주입하면 변경이 불가능하다 따라서 아래 처럼 메소드가 필요 private final MemberRepository memberRepository; // 생성자 인젝션을 주입함 -> autowired 를 지워도 spring에서 자동으로 주입해줌 // 이게 AllArgsConstructor를 주입하는것과 같음 @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } 위처럼 생성자 인젝션을 쓰면 한번 생성될때 모든게 완성되서 나중에 누군가 set 할 수 없다. 또한 테스트 케이스를 작성..

JAVA 2022.02.10

[JAVA] 쿼리 파라미터 남기기

쿼리 파라미터란? 콘솔에 뜨는 SQL 구문들에 들어가는 파라미터들이 ? 로 찍히는 부분을 말한다. 이 물음표에 들어가는 값들을 실시간으로 콘솔에서 확인하고 싶으면 아래의 경우를 참고하자! 1. 설정파일 logging에 다음을 추가하기 org.hibernate.type: SQL 실행 파라미터를 로그로 남긴다 2. 외부 라이브러리 추가 https://github.com/gavlyukovskiy/spring-boot-data-source-decorator GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s Spring Boot int..

JAVA 2022.01.20

[JAVA] fetch join

실무에서 너무 자주쓰임 중요! SQL 조인의 종류가 아님 JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회( 한방 쿼리 ) join fetch 명령어 사용 회원을 조회하면서 연관된 팀도 함께 조회(SQL 한번에) SQL을 보면 회원 뿐만 아니라 팀(T.*) 도 함께 select 함 예시 ) 회원 1, 2는 팀 A / 회원3은 팀B 라고 가정한다. 1. 일반 조인을 사용했을 시 String query = "select m from Member m join m.team t"; List findMember = em.createQuery(query, Member.class).getResultList(); // 이때의 결과값은 프록시 데이터 이때 회원리스트를 뽑아 콘..

JAVA 2022.01.18

[JAVA] JPA 조인과 서브쿼리

1. 내부조인 select m from Member m inner join m.team t 2. 외부조인 select m from Member m left join m.team t 3. 세타조인 select count(m) from Member m, Team t where m.username=t.name 서브쿼리 - JPA 서브쿼리의 한계 JPA는 where, having 절에서만 서브 쿼리 사용 가능 select 절도 가능(하이버네이트 지원) from 절의 서브 쿼리는 현재 jpql에서 불가능: 조인으로 풀어서 사용할 수 있으면 해결

JAVA 2022.01.18

[JAVA] 프로젝션과 페이징

프로젝션이란? select 절에 조회할 대상을 지정하는 것 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입 ( 숫자, 문자 등 기본 데이터 타입 ) select m from Member m → 엔티티 프로젝션 select m.team from Member m → 엔티티 프로젝션2 select m.address from Member m → 임베디드 타입 프로젝션 select m.username, m.age from Member m → 스칼라 타입 프로젝션 distinct 로 중복 제거 가능 엔티티 프로젝션 웬만하면 sql하고 jpql 문법하고 거의 비슷하게 명시 해야한다.( 예측이 가능하기 때문에 ) Member에서 Team 정보를 가져올 때 1번처럼하나 2번처럼 하나 쿼리는 같게 나가지만 개발자가..

JAVA 2022.01.13

[JAVA] 값 타입 컬렉션

값 타입을 하나 이상 저장할 때 사용 @ElementCollection, @CollectionTable 사용 데이터베이스는 컬렉션을 같은 테이블에 저장 할 수 없다. 컬렉션을 저장하기 위한 별도의 테이블이 필요 Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity","Street", "10000")); member.getFavoriteFoods().add("족발"); member.getFavoriteFoods().add("치킨"); member.getFavoriteFoods().add("피자"); member.getAddressHistory().add(new Address..

JAVA 2022.01.13

[JAVA] 값 타입과 불변객체

값타입은 단순하고 안전하게 다룰 수 있어야 한다. 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함 부작용(side effect) 발생 한다. 예시 ) member1과 member2 모두 city, street, 1234 의 주소를 가진다. 이때 member1의 city명만 newCity로 변경해보자 Address address = new Address("city", "street", "1234"); Member member = new Member(); member.setUsername("hello"); member.setHomeAddress(address); em.persist(member); Member member2 = new Member(); member2.setU..

JAVA 2022.01.11

[JAVA] 임베디드 타입(복합값)

우리는 엔티티에 대해 설명할 때 보통 아주 상세 하게 설명하기 보단 추상적으로 설명한다. ex ) 회원 엔티티에는 이름, 근무 시작 날짜 , 근무 종료 날짜 , 주소 도시, 주소 번지, 주소 우편번호가 있다가 아닌 → 회원엔티티는 이름, 근무일, 집주소를 가지고 있다라고 추상적으로 설명 → 이렇게 묶어 낼 수 있는걸 객체로 뽑아내는게 임베디드 타입! 임베디드 타입 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입이라 함 주로 기본 값 타입을 모아서 만들어서 복합값 타입이라고도 함 여기서 기본 값 타입이란 int, String과 같은 값 타입 임베디드 타입 사용법 @Embeddable : 값 타입을 정의하는 곳에 표시 @Embedded : 값 타입을 사용하는 곳에 표시 기본생성자 필수 임베디드..

JAVA 2022.01.11

[JAVA] 영속성 전이(CASCADE) + 고아객체

CASCADE ALL : 모두 적용 PERSIST : 영속 REMOVE : 삭제 MERGE : 병합 REFRESH : refresh DETACH : DETACH Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.persist(child1); em.persist(child2); 위 처럼 코드를 작성하면 parent, child1/2가 잘 들어감 근데 만약 persist를 세번 안하고 parent를 persist 하는 동시에 child 까지 동시에 넣고 싶다면?? → CASCA..

JAVA 2022.01.06