분류 전체보기
-
프로젝션(SELECT)JPA/JPQL 2023. 7. 13. 23:07
프로젝션이란? SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) SELECT m FROM Member m -> 엔티티 프로젝션 SELECT m.team FROM Member m -> 엔티티 프로젝션 SELECT m.address FROM Member m -> 임베디드 타입 프로젝션 SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션 DISTINCT를 넣어서 중복 제거 가능 ("select distince m.username, m.age from Member m"처럼) 간단한 것이지만 중요한 내용이 있다. 엔티티 프로젝션을 하면 그 엔티티의 대상이 영속성 컨텍스트로 관리된다는 ..
-
JPA에서의 쿼리 언어들JPA/JPQL 2023. 7. 13. 22:03
JPA에서는 다양한 쿼리 언어들을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate을 함께 사용 1. JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발을 진행하게 된다. 문제는 검색 쿼리인데, 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 -> 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. 이런 문제를 해결하기 위해서JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVIN..
-
로그인 세션으로 자동 CRUD프로젝트/Trend-Pick 2023. 7. 12. 02:24
CRUD를 해야 할 상황에 로그인 된 아이디가 member로 들어가서 글을 쓰거나 사진을 올리거나 로직을 작성해야 했다. 이전에는 임의의 member를 만든 다음에 테스트를 진행해봤는데, 실제 컨트롤러에서는 세션에서 받아와서 글쓰기를 하면 그 회원이 자동으로 post.member로 데이터가 들어가야 한다. 이전 스프링 MVC 포스팅에서 로그인하는 게시글이 있는데, 그 게시글을 참고해서 로그인 기능을 구현했다. 로그인 기능의 일부(자세한 코드는 깃허브에 있는 코드 참조) @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class LoginService { private final MemberRepository memberRe..
-
연관관계 사이의 무한 호출프로젝트/Trend-Pick 2023. 7. 11. 22:52
댓글 리스트를 출력하려고 했는데 무한 루프를 돌면서 쿼리가 계속해서 나가는 오류가 나왔다. Post와 Comment 사이의 연관관계가 이렇게 맺어져있다. @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List commentList = new ArrayList(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post; @GetMapping("/post/{postId}") // 3번의 게시글 하나 클릭해서 들어가는 것 public PostWithCommentDto createPost(@PathVariable ("postId") Long post..
-
간단한 주문조회 API - 지연 로딩과 조회 성능 최적화(2)JPA/JPA 활용 2023. 7. 11. 18:16
저번 포스팅에서 Order 조회 버전 1과 2를 했는데, 1에서는 엔티티를 그대로 사용해서 문제점이 있었고, 2에서는 Lazy 로딩때문에 쿼리가 너무 많이 호출되는 문제점이 있었다. 이번에 Version 3에서는 fetch join으로 성능 최적화를 진행할 것이다. Version3 orderRepository에 finAllWithMemberDelivery() 메서드 추가 public List findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + // order 가져올 때 멤버까지 한방 쿼리로 가져오는 'join fetch' " join fetch o.delivery d"..
-
간단한 주문조회 API - 지연 로딩과 조회 성능 최적화JPA/JPA 활용 2023. 7. 11. 18:15
지연 로딩 때문에 발생하는 성능 문제를 단게적으로 해결하는 것이다. 버전을 1부터 4까지 늘리면서 잘 실수하는 부분을 조금씩 개선해나가는 것이다. 실험용 초기 데이터 @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void dbInit1() { Member member = new Member(); member.setName("userA"); member.setAddress(new Address("서울", "1", "1111")); em.persist(member); // 영속상태로 만듦 Book book1 = new Book(); book1.se..
-
회원 조회 APIJPA/JPA 활용 2023. 7. 11. 18:15
회원 조회를 할 수 있는 컨트롤러이다. @RestController // api 설계할 때에는 RestController 사용 @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @GetMapping("/api/v1/members") // 조회는 GetMapping public List membersV1() { return memberService.findMembers(); } @GetMapping("/api/v2/members") public Result memberV2() { List findMembers = memberService.findMembers(); List ..
-
회원 수정 APIJPA/JPA 활용 2023. 7. 11. 18:14
(등록을 진행한 컨트롤러와 같은 컨트롤러에 등록 클래스 아래에 만들었음) @PutMapping을 이용한 회원 이름 수정 @RestController @RequiredArgsConstructor public class MemberApiController { @PutMapping("api/v2/members/{id}") public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); Member findMember = memberService.findOne(id); retur..