모르지 않다는 것은 아는것과 다르다.

전체 글 224

HTTP

HTTP 란? HyperText Transfer Protocol HyperText: html 문서를 말한다. 모든 것이 HTTP로 통신한다해도 과언이 아니다. HTML, TEXT IMAGE, 음성, 영상, 파일 JSON, XML (API) 거의 모든 형태의 데이터 전송 가능 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용 지금은 HTTP 시대이다. HTTP 의 역사 HTTP/0.9 1991년: GET 메서드만 지원, HTTP 헤더X HTTP/1.0 1996년: 메서드, 헤더 추가 HTTP/1.1 1997년: 가장 많이 사용, 우리에게 가장 중요한 버전 RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014) HTTP/2 2015년: 성능 개선 HTTP/3..

Network 2022.02.27

프록시와 연관관계 관리

프록시 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 -> 바로 쿼리문을 날린다. em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 -> 실제로 사용될때 쿼리문을 날린다. 프록시의 구조 실제 클래스를 상속 받아서 만들어진다. 실제 클래스와 겉 모양이 같다. 사용하는 입장에서 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 프록시 객체의 초기화 client 가 getName()을 호출하면 MemberProxy 는 영속성 컨텍스트에 Member 객체를 요청한다. 영속성 컨텍스트는 DB를 조회해서 실제 엔티티 객체를 생성한다. 그리고 Member target에 생성된 엔티티 객체를 ..

Spring Jpa 2022.02.27

JPA Id 생성전략 설정하기

개요 보통 JPA 로 개발할때, @GeneratedValue(strategy = GenerationType.IDENTITY) 로 설정하고, 개발을 진행하였다. Id 값을 커스텀하게 생성할 수 있는 방법에 대해서 알아보려고 한다. @GeneratedValue @GeneratedValue는 식별자의 생성 전략을 지정하는데 사용된다. 전략은 아래와 같이 4가지 전략이 있다. IDENTITY 식별자 생성을 데이터베이스에 위임한다. 주로 MySQL, PostgreSQL, SQL Server 등에서 사용된다. 키 생성의 동시성 처리 도 데이터베이스에 위임한다. 엔티티가 persist 되는 시점에 즉시 INSERT SQL 을 실행 하고 DB 에서 식별자 값을 가져온다. SEQUENCE 데이터베이스의 시퀀스를 사용한다..

Spring Jpa 2022.02.27

영속성 컨텍스트

영속성 컨텍스트란? 엔티티를 영구 저장하는 환경 이라는 뜻이다. EntityManager.persist(entity); -> DB에 저장한다는 뜻이 아니라 엔티티를 영속성 컨텍스트에 저장한다는 말이다. 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개념이다. 엔티티 메니저를 통해서 영속성 컨텍스트에 접근한다. 애플리케이션과 DB 사이에 있다고 생각하면 된다. 엔티티 컨텍스트 동작 방식 위와 같이 고객이 요청으하면 entityManagerFactory가 entityManager를 생성한다. entityManager는 내부적으로 DB connection을 통해서 DB와 통신한다. 엔티티의 생명주기 비영속 (new/transient) -> 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member..

Spring Jpa 2022.02.27

조회 성능 최적화

최적화 방법 먼저 @ManyToOne, @OneToOne 의 경우 fetch join을 이용해서 쿼리 수를 최적화 한다. @OneToMany 의 경우 페이징이 필요 없는 경우 -> fetch join을 이용해서 쿼리 수를 최적화 한다. 페이징이 필요한 경우 -> fetch join 을 사용하지 않는다. -> hibernate.default_batch_fetch_size 를 500 정도로 설정해서 최적화 한다. Entity 관계도 와 성능 문제 상황 위와 같이 주문, 주문상품, 고객, 배달, 상품 엔티티가 있다고 가정하자. 만약 주문 목록을 조회하는데 3개의 주문이 조회됐다. 여기서 주문과 고객, 배달이 toOne 으로 연결 되어있다. -> 몇번의 쿼리가 나갈까? order 목록을 조회하는 쿼리 1번 or..

Spring Jpa 2022.02.27

값타입

값 타입 분류 기본값 타임 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 기본값 타입 기본값 타입 생명주기를 엔티티의 의존한다. 회원을 삭제하면 이름, 나이 필드도 함께 삭제된다. 값 타입은 공유하면 안된다. ex> 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안된다. int, double 같은 기본 타입은 절대 공유되지 않는다. 하지만 Integer같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경되지 않는다. 래퍼런스 참조이기 때문에 공유는 가능하지만 변경을 막아둬서 안전하게 사용할 수 있는 것이다. 임베디..

Spring Jpa 2022.02.27

OSIV

OSIV 란? OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 열어두는 기능이다. 영속성 컨텍스트가 유지되면 엔티티도 영속 상태로 유지된다. 뷰까지 영속성 컨텍스트가 살아있다면 뷰에서도 지연 로딩을 사용할 수가 있다. OSIV ON spring.jpa.open-in-view : true -> 기본값이다. 애플리케이션 시작 시점에 warn 로그를 남긴다. OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 동작 과정 1. 클라이언트의 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다. 단 이 시점에서 트랜잭션은 시작하지 않는다. 2. 서비스 계층에서 @..

Spring Jpa 2022.02.27

Spring Data Jpa

Spring Data JPA란? Spring Data JPA는 Spring에서 제공하는 모듈이다. JPA, 하이버네이트를 몰라도 되어야 한다. -> 추상화의 이점 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다. JPA 구현체의 사용을 감추고, 다양한 지원과 설정 방법을 제공한다. JPA 기본 구현체로 Hibernate 사용한다. Querydsl 지원를 지원한다. 아래와 같은 것들을 사용할 필요가 없다. EntityManager 를 직접 사용하지 않는다. JPQL을 직접 사용하지 않는다. persist(), merge(), close() 를 직접 사용하지 않는다. 트랜잭션을 get..

Spring Jpa 2022.02.27

JPA 란

JPA 가 필요한 이유 SQL 중심적인 개발의 문제점을 해결해준다. CRUD와 같은 반복적인 코드를 지원해준다. 개발자는 객체지향적으로 개발을 할 수 있다. 필드값이 추가된다거나 변경되는 상황이 발생했을때, 쿼리문을 전부 바꿔주는 작업을 줄여준다. 패러다임의 불일치를 해결해준다. 1차 개시와 동일성 보장 --> 신뢰도 보장 트랜잭션을 지원하는 쓰기 지연 지원 지연 로딩 지원 --> 성능 보장 객체 vs 관계형 데이터베이스 상속 관점 ( 객체 상속 관계 vs Table 슈퍼타입 서브타입 관계) 연관관계 관점 ( 단방향 vs 양방향) 데이터 타입 관점 데이터 식별 방법 ( 같은 참조값 기준 같은 값 vs 다른 값) 패러다임의 불일치를 해결해 줄 수 있는 기술 "JPA" 위에서 말한 객체 와 관계형 데이터베이..

Spring Jpa 2022.02.27

영속성 전이 (CASCADE)

영속성 전이 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 사용한다. 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 을 제공할 뿐이다. 아래와 같이 설정하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. 코드 예시 Child child1 = new Child(); Child child1 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.persist(child1); em.persist(child2); 위와 같이 child에 대해서도..

Spring Jpa 2022.02.27