분류 전체보기

    JPA 성능 최적화

    JPA 성능최적화 N+1 문제 fetchType 이 Eager 로 설정 되어 있는 엔티티를 jpql로 조회할때 발생한다. @Entity public class Member { ... @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) private List orders = new ArrayList(); } ... List members = em.createQuery("select m from Member m", Member.class) .getResultList(); //먼저 Member 들을 조회하는 쿼리를 수행 후 엔티티에 할당하는데 //할당하는 동중에 FetchType.Eager 를 발견하게 되고, 각 MemberId마다 Order조회 쿼리를 수행한..

    JPA 엔티티 그래프

    엔티티 그래프 엔티티 조회시점에 연관된 엔티티들을 함께 조회하는 기능이다. Named 엔티티 그래프 //둘 이상 정의하려면 @NamedEntityGraphs 사용. @NamedEntityGraph(name = "Order.withMember", attribueNodes = { @NamedAttributeNode("member") }) @Entity public class Order { .... @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "MEMBER_ID") private Member member; ... } 사용 EntityGraph graph = em.getEntityGraph("Order.withMember"); ..

    JPA 엔티티 생명주기에 리스너 등록

    엔티티 생명주기에 리스너 등록하기 생명주기 종류 : prePersist, postPersist, postLoad, preRemove, postRemove.. 방법 엔티티에 직접 적용 @Entity public class Duck { @PrePersist public void prePersist(Duck duck) { log.info("prepersist"); } @PostPersist public void postPersist() { log.info("postpersist"); } .... } 별도의 리스너 등록 public class DuckListener { @PrePersist private void prePersist(Object obj) { log.info("prePersist"); } } @E..

    JPA Entity와 DB값 간 매핑

    Entity 값과 DB값 간 매핑 엔티티의 boolean 값을 DB에 저장시에는 Y, N 값으로 저장하고 싶을때 등 사용. @Entity public class aaa { ... @Convert(converter=BooleanToYnConverter.class) private boolean isExist; } @Converter //@Converter(autoApply = true) autoApply를 true로 설정하면 //모든 AttributeConverter로 설정한 타입 값을 가진 엔티티 필드 타입에 자동 적용된다. public class BooleanToYnConverter implements AttributeConverter { @Override public String convertToDat..

    JPA 지연로딩

    JPA 지연로딩 문제 jpa를 이용해서 엔티티의 연관 객체를 지연로딩(fetch = FetchType.LAZY)로 선택한 경우, 트랜잭션 범위 밖에서 로딩되지 않은 객체를 조회할 경우 exception 이 발생한다. 위 방법을 해결하기 위한 방법을 알아보자. 즉시로딩 설정 FetchType.EAGER 로 설정하면 즉시 로딩 전략으로 트랜젝션 밖인 프레젠테이션 계층 등에서 조회시 문제가 발생하지 않는다. 즉시로딩이지만, 사용하지 않는 프레젠테이션 계층에선 필요없는 데이터까지 조회하게 된다. em.find()를 이용하는 경우 문제가 발생하지 않지만, jpql을 사용하는 경우 N+1 문제가 발생한다. jpql을 이용해 select m from Member m 을 실행하면 Member만 가져온후, Member수..

    JPA @ManyToMany

    객체간 다대다 연관간계를 직접 매핑할 때 사용한다. 당연하지만 RDB 에는 직접 다대다 연관관계를 지정할 수 없기 때문에 중간 연결테이블이 있다. @Entity public class Category { @ManyToMany @JoinTable(name = "CATEGORY_ITEM", joinColumns = @JoinColumn(name = "CATEGORY_ID"), inverseJoinColumns = @JoinColumn(name = "ITEM_ID)) private List items = new ArrayList(); } @Entity public class Item { @ManyToMany(mappedBy = "items") private List categories = new ArrayLi..

    JPA @Inheritance

    @Inheritance JPA 를 사용하여 Entity를 정의할 때 상속구조를 사용하기 위해 선언한다. ex) @Entity @Inheritance(strategy = InheritanceType.SINGLE\_TABLE) @DiscriminatorColumn(name = "DTYPE") public abstract class Item { @GeneratedValue private long id; ...... } @Entity @DiscriminatorValue("B") public class Book extends Item { private String author; ..... } @Inheritance annotation 으로 상속하여 사용하는 부모 객체임을 선언한다. InheritanceType 종..

    JPA CASCADE 종류

    CascadeType.RESIST – 엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다. 만약 연관 엔티티가 DB에 등록된 키값을 가지고 있다면 detached entity passed to persist Exception이 발생한다. CascadeType.MERGE – 트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 되면 변경사항이 적용된다.(연관 엔티티의 추가 및 수정 모두 반영됨) CascadeType.REMOVE – 삭제 시 연관된 엔티티도 같이 삭제됨 CascadeType.DETACH – 부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티..

    Spring RestTemplate

    RestTemplate 이란 http server 와 통신을 단순화 하고 Restful 원칙을 지키도록 구성된 클래스 json과 xml 을 쉽게 받을 수 있도록 헤더 및 파서가 구성되어 있다. RestTemplate 작동 순서 어플리케이션이 RestTemplate를 생성하고, URI, HTTP메소드 등의 헤더를 담아 요청한다. RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다. RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다. ClientHttpRequest 는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다. RestTemp..

    JAVA Optional 기초

    변수 선언 //null을 담고있는(비어있는) Optional 객체 Optional 변수명 = Optional.empty(); //null이 아닌 객체름 담는 Optional 객체, null이 넘어오면 NPE를 던지므로 조심해서 사용해야 한다. Optional 변수명 = Optional.of(param); //null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성, null이 넘어올 경우 NPE를 던지지 않고, 비어있는 Optional 객체를 얻어온다. Optional 변수명 = Optional.ofNullable(변수); Optional이 담고 있는 객체 접근 //Optional 이 담고 있는 객체 접근 .get() //비어있는 Optional 객체에 대해서 other를 반환 ..