분류 전체보기 (160) 썸네일형 리스트형 API 개발을 위한 JPA 1 - crud 메서드 작성시 유의점 JPA를 사용하면 엔티티라는 개념이 있기 떄문에 API를 개발할 때 주의해야할 부분들이 많다. 공통으로 예외처리를 하거나 할때 패키지나 구성 단위로 공통처리를 하는 경우가 많다 . 예외 처리의 경우 API같은 경우에는 에러 API 스팩을 반환하고 서버사이드 랜더링은 에러 페이지를 반환한다 . 위의 차이점들과 같이 API 와 서버사이드랜더링 사이에 차이점들이 있기 떄문에 API 컨트롤러와 서버사이드 랜더링 컨트롤러를 나눠 주는 것이 좋다 1. 엔티티를 직접 Dto의 역할로 쓰지 말자 . 엔티티를 요청 데이터를 바인딩 받는 용도로 사용하거나 , 응답 데이터를 반환하는 용도로 사용할 경우 엔티티의 수정이 생길 경우 API 스펙이 바뀌어 버린다. 또 엔티티는 여러 곳에서 함께 사용하기 떄문에 presentati.. spring-boot JUnit Test시 유의 할 점 1. Junit 5 에서의 예외상황 Test 테스트 코드 작성시에 예외 상황을 테스트할 때 Junit 4 까지는 해당 테스트의 @Test에 속성으로 excepted=예외클래스이름.class 로 지정하여 해당 예외를 예상하는데 사용했지만 Junit5 부터는 Assertions.assertThrows()를 사용해서 예외 상황을 테스트 한다 . 예외를 받아서 예외 상황에 대해 더 자세히 테스트 할 수 있다 . 자세한 내용은 아래 링크로 https://junit.org/junit5/docs/current/user-guide/ // assertThrows에 첫번째 파라미터로 예상하는 예외 타입과 // 두번쨰 파라미터로 예외가 터질 것으로 예상하는 코드를 excutable로 넣어 준다. @Test void null.. JPA 공부 20 - JPQL . 9 벌크 연산 재고가 10개 미만인 모든 상품의 가격을 10% 상승시키는 쿼리를 날려야 한다면? JPA의 변경 감지 기능으로 실행하기에는 너무 많은 SQL이 실행된다 . 1. 재고 10개 미만 재품을 리스트로 조회하고 , 2. 상품 엔티티 가격을 10% 증가시키고 3.트랙잭션 커밋 시점에 변경 감지 동작 변경된 데이터 수만큼 업데이트 문이 나갈 것이다. 이런 문제를 위해 JPA에서는 벌크연산을 제공한다. 쿼리 한 번으로 여러 테이블 로우를 변경할 수 있다. 간단한 예시로 멤버의 나이를 모두 20살로 바꿔야 한다고 하자 int resultCount = em.createQuery("update Member m set m.age = 20") .executeUpdate(); 쿼리는 한번만 나가고 모든 값이 20으로 변경됬다... JPA 공부 19 - JPQL . 8 Named 쿼리 ?named 쿼리 - 미리 정의해서 이름을 부여해두고 사용하는 JPQL 이다 - 정적 쿼리만 가능하다 . - 어노테이션 xml 정의가 가능하다 -애플리케이션 로딩 시점에 초기화 후 재사용한다. 로딩 시점에 sql 로 만들어 놓고 캐싱한다. -애플리케이션 로딩 시점에 쿼리를 검증할 수 있다. @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :username" ) public class Member { @Id @GeneratedValue private Long id; priv.. JPA 공부 18 - JPQL . 7 페치조인 fetch 조인? SQL의 조인 종류가 아니고 JPQL에서 성능 최적화를 위해 제공하는 기능이다 , 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다 join fetch 명령어를 통해 사용한다 . 1. 엔티티 fetch join 회원을 조회하면서 연관된 팀도 함께 조회 하고싶은 경우를 예로들면 1. // 만약 연관관계에 있는 Team이 모두 다르다면 쿼리가 n+1번으로 나간다. String query = "select m from Member m "; List result = em.createQuery(query, Member.class) .getResultList(); for (Member member : result) { System.out.println("member=" +member.. JPA 공부 17 - JPQL . 6 경로 표현식 JPQL 에서 객체의 원하는 필드를 .을 찍어 경로를 탐색한다. 상태필드 , 단일값 연관필드, 컬렉션 값 연관 필드 3가지 방식이있다 . 상태필드는 단순히 값을 저장하기위한 필드이다 . m.username, m.age 값 타입에 대한 필드들을 말한다 . 단일값 연관필드는 @ManyToOne @OneToMany 등의 연관관계에서 대상이 단일 엔티티 일 경우를 말한다 ( ex) m.team ) 컬렉션 값 연관 필드는 @OneToMany , @ManyToMany 처럼 연관관계 대상이 엔티티 컬렉션일 경우를 말한다 (ex ) m.orders ) 경로 표현식 특징 -상태필드 : 경로 탐색의 끝, 탐색 -단일 값 연관 경로 : 묵시적 내부조인 발생 탐색 -컬랙션 값 연관 경로 :묵시적 내부조인 발생 , From 절.. JPA 공부 16 - JPQL . 4 JOIN Team team = new Team("team1"); em.persist(team); //샘플 데이터 Member member = new Member("user",10); member.setTeam(team); em.persist(member); em.flush(); em.clear(); // inner join (inner 생략가능) String query = "select m from Member m inner join m.team t"; List result = em.createQuery(query, Member.class) .getResultList(); // left outer join (outer 생략가능) String query2 = "select m from Member m left ou.. JPA 공부 15 - JPQL . 3 페이징 JPA 에서는 페이징에 필요한 기능들을 추상화 해놨기 때문에 편하게 페이징 처리가 가능하다 , Spring Data JPA 에서는 Page 라는 클래스를 지원하는데 페이징에 대한 기능들을 한번터 추상화해 더욱 사용하기 편리하다 . //샘플 데이터 for (int i = 0 ; i 이전 1 ··· 5 6 7 8 9 10 11 ··· 20 다음