본문 바로가기

TIL

(50)
[TIL 2022-2-25] JPA, DFS JPA 값 타입 엔티티 타입 - @Entity로 정의하는 개체 - 데이터가 변해도 식별자로 지속해서 추적 가능 값 타입 -식별자가 없고 값만 있으므르 변경시 추적 불가 ex) String, int, Integer 등 값 타입의 종류 기본값 타입 - 자바 기본 타입(int, double) - 래퍼 클래스(Integer, Long) - String primitive 타입은 값 자체가 복사되므로 공유되지 않는다. 래퍼클래스나 String은 참조값을 공유하는 객체지만 변경될 수 없으므로 사이드 이펙트를 발생시키지않는다.(불변 객체라 그런 것 같다) 임베디드 타입(복합 값 타입) 엔티티에서 의미적으로 묶을 수 있는 값 타입을 모아서 새로운 값 타입으로 만들어 사용한다. @Embedded 를 엔티티에서 값타입을 사..
[TIL 2022-02-23] 지연로딩, 순열 알고리즘 즉시로딩과 지연로딩 연관관계 매핑을 통해 @ManyToOne, @OneToMany등으로 설정된 변수에 (fetch = FetchType.LAZY) 로 설정하면 지연로딩으로 설정되어 부모객체(참조를 가지고 있는 객체)를 조회할 때 참조에 프록시 객체를 만들어 집어넣는다. 프록시 객체는 실제객체를 상속받아 만들어지고, 실제 데이터를 조회하려고 할때 데이터베이스를 조회한다. 즉시로딩의 문제점 - 예상하지 못한 SQL 발생 연관관계가 복잡해지면, 예상할 수 없는 조인이 수없이 연결되어 심각한 성능 저하를 발생시킬 수 있다. - N + 1 문제 jpql을 통해 조회를 할 경우, SQL문으로 변환되어 실행된다. SQL문 실행 후 즉시로딩되어있는 객체에는 꼭 데이터를 채워줘야하므로 추가적인 SQL을 발생시킨다. 기본..
[TIL 2022-02-22] JPA 프록시에 대해서, Set의 equals JPA 프록시(Hibernate에서) 하이버네이트는 EntityManger의 getReference() 메소드 호출시, 조회하고자 하는 객체를 상속받는 프록시 객체를 만들어 반환한다. 프록시 객체는 메소드 호출 즉시 데이터베이스에 select를 호출하는 것이 아니라, 개발자가 실제 매핑된 데이터를 조회하고자 할 때 데이터베이스에서 데이터를 가져온다. 아래 코드와 실행 결과를 보면 getRefernce() 호출이 아닌 getName() 메소드 호출 시점에 데이터베이스에 select 쿼리를 날리고 데이터를 가져오는 것을 알 수 있다. 위의 결과처럼 getName()메소드 호출 시 Member 객체와 매핑되어있는 테이블에서 데이터를 조회한다. 프록시 객체는 실제 엔티티 객체를 참조하는 target을 보관한다...
[TIL 2022-2-20] JPA 연관관계 매핑, 프로그래머스 다양한 연관관계 매핑 다중성 데이터베이스와 연관관개를 매핑하기 위해 존재하는 개념이다. 두 테이블간에 일대다, 다대일, 일대일, 다대다 로 나뉘는 상대적인 연관관계들 말한다. JPA 에선 아래의 어노테이션을 통해 엔티티의 연관관계를 매핑한다. 일대다: @OneToMany 다대일: @ManyToOne 일대일: @OneToOne 다대다: @ManyToMany 단방향과 양방향 테이블에선 외래키 하나를 통해 양쪽 두 테이블을 모두 Join할 수 있기 때문에 방향이라는 개념이 없다. 하지만 객체에서는 참조값 필드가 있는 방향으로만 조회가 가능 하기 때문에, 필요에 따라 연관관계 필드를 설정 해줘야만 조회가 가능하다. 연관관계의 주인 위에서 말한 것 처럼 엔티티 객체의 연관관계에서 한 객체를 통해 다른 객체를 조회..
[TIL 2022-2-15]JPA 양방향 매핑 양방향 매핑 테이블의 연관관계에는 방향이라는 개념이 필요없다. 하지만 객체에서는 외래키가 아니라 객체의 참조값을 이용하기 때문에 하나의 엔티티를 통해 다른 연관관계의 엔티티에 접근하기 위해선 양방향 매핑을 사용 해야한다. 꼭 연관 관계를 통해 양쪽 객체 모두에서 접근할 필요가 없다면 단방향 매핑으로 구현하는 것이 좋다. 하지만 실무에서는 다양한 상황들이 존재하고 양방향 매핑이 이를 손쉽게 해결해 주기 때문에 잘 알고 사용하면 좋다고 한다. (객체지향 관점에서도 두 객체가 서로 참조하고 있는 것은 좋지는 않음) 연관관계의 주인 객체와 테이블간은 연관관계를 맺는 방식이 다르다. 테이블은 외래키 '하나'로 양뱡향으로 모두 조인할 수 있는 양방향 연관관계를 갖지만, 객체에서는 연관관계에 있어서 한 쪽이 다른 객..
[TIL 2022-2-12] JPA 필드와 컬럼 매핑 필드와 컬럼 매핑 @Entity @Getter @Setter @NoArgsConstructor @SequenceGenerator(name="member_seq_generator",sequenceName = "member_seq", initialValue = 1, allocationSize = 50) public class Member { /* * > * 기본키 생성을 데이터베이스에 위임. 세가지 전략이 있음 * * - IDENTITY * 데이터베이스에 전략을 위임. MySQL의 경우 Auto_Increment. persist()시 바로 Insert, 그 이후에만 ID값을 알 수 있음 * * - Sequance -> 이걸로 전략 만들어서 사용할 것! * 시퀀스 객체를 생성에 기본키값을 받아 세팅. 시퀀스 ..
[TIL 2022-2-11] JPA 영속성 콘텍스트(Persistence Context) 영속성 콘텍스트 - 엔티티를 영구 저장하는 환경. 왜 영구라는 단어를 쓰는지는 아직 안와닫는 것 같다. 지금 생각은 하나의 트랜잭션이 끝날 때까지 조회, 수정, 생성된 엔티티 객체를 관리하는 공간 정도로 이해된다. (아니면 엔티티를 영구 저장하는(역할을 관리하는) 환경은 아닐까 추측해본다) - persist() 메소드는 엔티티객체를 영속화(영속성 컨텍스트에 저장)하는 역할 - 엔티티 매니저가 생성되면 그안에 영속성 콘텍스트와 1:1로 생성(스프링에선 다르게 동작) 스프링에서 @Transactional 를 통해 트랜잭션을 관리하는데 이렇게 설정된 메소드안에서는 엔티티 매니저가 서로 다르더라도 같은영속성 컨텍스트를 공유한다.(엔티티 메니저 객체:영속성 컨텍스트 가 1:1 이 아니라 N:1) https://w..
[TIL 2022-2-10]JPA 기본, 피보나치 EntityManagerFactory EntityManagerFactory는 이름 그대로 EntityManger를 생산하는 공장과 같은 역할을 한다. Thread-safety 하기 때문에 하나만 생성해서 애플리케이션 전체에서 공유하는 방식으로 사용한다. EntityManager EntityManager 또한 이름그대로 엔티티를 관리하는 객체이다. EntityManagerFactory와는 다르게 쓰레드 공유에 안전하지 않기 때문에 트랜잭션마다 새로운 EntityManger를 사용해 처리한다. 아래 코드를 보면 EntityManagerFactory를 통해 EntityManager를 생성하고 EntityManager를 통해 트랜잭션과 영속성 컨텍스트를 관리하는 역할을 하는 것을 볼 수 있다. 스프링에서는 En..