본문 바로가기

분류 전체보기160

Querydsl 소개 기존에 스프링 데이터 jpa를 사용하면서 JPQL을 사용하여 query를 진행하였다. JPQL은 복잡한 로직의 경우 그 길이가 길어져 복잡하고 반복적으로 사용하게 된다. Querydsl을 사용하면 1. java 코드를 작성하듯 쿼리를 작성하여 컴파일 시점에 오류 체크가 가능 2. IDE의 자동완성 기능의 도움을 받을수 있음 3. 동적인 쿼리 작성 편리 이 외에도 수많은 장점이 있다. @Test public void startJPQL() { //member1을 찾아라. String qlString = "select m from Member m " + "where m.username = :username"; Member findMember = em.createQuery(qlString, Member.clas.. 2022. 7. 19.
스프링 데이터 JPA 소개 그동안 JPA CRUD를 직접 작성하였다. 그런데 스프링 데이터 JPA를 이용하면 가장 기본적인 CRUD - save, delete, find, findAll, count 등 (그 이외에도 정말 많은) 다양한 기능들이 구현되있는 인터페이스를 상속받아 사용할 수 있다. 직접 사용해보았는데 신세계다. @Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em; public Member save(Member member) { em.persist(member); return member; } public void delete(Member member) { em.remove(member); } public M.. 2022. 7. 15.
API 개발 고급 - 지연 로딩과 조회 성능 최적화 실무에서 매우 중요함. 100% 이해를 목표로 공부할 것. 간단한 주문 조회 V1: 엔티티를 직접 노출 엔티티를 노출하면 양방향 연관관계 있는 부분에서 무한루프에 빠질 위험이 있다. (@JsonIgnore로 해결가능하긴함) 엔티티를 직접 노출하면 엔티티가 변경되었을 때 API의 스펙이 모두 바뀐다. 성능상에도 문제가 생긴다. 따라서, DTO로 변환해서 반환하는 것이 좋은 방법이다. 간단한 주문 조회 V2: 엔티티를 DTO로 변환 DTO를 생성하여 반환하는 값들을 선언하고 반환한다. 엔티티가 바뀌어도 API 스펙이 바뀔리가 없다. 그런데 V1과 V2 모두 LAZY_Loading으로 인한 쿼리가 너무 많이 호출된다는 문제가 있다. -> N+1 문제가 발생함 간단한 주문 조회 V3: 엔티티를 DTO로 변환 -.. 2022. 7. 10.
프록시와 연관관계 (즉시로딩, 지연로딩) 내가 이해한 방향 프록시는 가짜 객체다. 실제 클래스를 상속 받아서 만들어지고 실제 클래스와 겉모양이 같다. 프록시 객체는 실제 객체의 참조(target)을 보관하고 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. 프록시의 특징 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야함 (== 비 교 실패, 대신 instance of 사용) 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제 발생 (하이버네이트는 org.hibernate.LazyInitializationException 예외를 터트림) 즉시로딩과 지연로딩 즉시로딩은 fe.. 2022. 7. 2.
상속관계 매핑 객체는 상속관계가 있지만 관계형 데이터베이스는 상속관계라는 개념이 없다. 따라서 슈퍼타입과 서브타입의 관계를 매핑하는 방법을 사용한다. 슈퍼타입 서브타입 논리 모델을 실제 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 조인 전략 장점 테이블 정규화 외래 키 참조 무결성 제약조건 활용가능 저장공간 효율화 단점 조회시 조인을 많이 사용, 성능 저하 조회 쿼리가 복잡함 데이터 저장시 INSERT SQL 2번 호출 단일 테이블 전략 장점 조인이 필요 없으므로 일반적으로 조회 성능이 빠름 조회 쿼리가 단순함 단점 자식 엔티티가 매핑한 컬럼은 모두 null 허용 단일 테이블에 모든 것을 저장하므로 테이블이.. 2022. 6. 29.
파일 업로드 파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야 한다. 문자를 전송하는 이 방식으로 파일을 전송하기는 어렵다. 이 문제를 해결하기 위해 HTTP는 multipart/form-data 라는 전송 방식을 제공한다. 첫 예제에서는 서블릿을 이용한 파일 업로드를 구현함. application.properties logging.level.org.apache.coyote.http11=debug 이 옵션을 사용하면 HTTP 요청 메시지를 확인할 수 있다. 멀티파트 사용 옵션 spring.servlet.multipart.max-file-size=1MB : 파일의 최대 용량 제한 가능 spring.servlet.mulitpart.enabled=true (기본) : false로 설정하면 멀티파트 데이.. 2022. 6. 26.