전체 글 191

즉시 로딩과 지연 로딩

지연 로딩 @ManyToOne(fetch = FetchType.LAZY) 해당 객체는 프록시 객체로 생성되며, get 할때 쿼리를 수행하여 가져옴. @BatchSize(int) 로 쿼리를 하나만 수행하게 할 수 있다. 즉시 로딩 @ManyToOne(fetch = FetchType.EAGER) 연관된 엔티티 객체 조회시 하나의 쿼리로 조회하며, 엔티티 객체가 된다. JPQL에서 (1 + N) 문제를 일으킨다.(호출하지 않은 쿼리도 EAGER 매치가 된 객체 쿼리가 수행됨) 따라서 상상하지 못한 쿼리가 수행됨. *** 실무에서는 지연 로딩을 사용하라 @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> 지연 로딩으로 설정 @OneToMany, @ManyToMany는 기본이 지연 로딩 JPQL fe..

JPA/JPA 2020.06.09

객체와 테이블 연관관계 매핑

객체와 테이블 연관관계 매핑 테이블 지향 모델링인 경우 객체 지향적이지 않음. 객체 연관관계 사용해야함. 단방향 연관관계 @ManyToOne - 1:N 관계 @JoinColumn(name ="") - 양방향 연관관계 - 양쪽에서 참조하도록 작업 ** mappedBy - 객체 연관관계 = 2개(양방향이라 부름) - 회원 -> 팀 - 팀 -> 회원 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야함 테이블 연관관계 = 1개 외래키 하나로 두 테이블의 연관관계 관리 양방향 매핑 규칙 - 객치의 두 관계자중 하나를 연관관계의 주인으로 지정 - 연관관계의 주인만이 외래 키를 관리(등록, 수정) - 주인이 아닌 쪽은 읽기만 가능 - 주인은 mappedBy 속성 사용 X - 주인이 아니면 mappedBy ..

JPA/JPA 2020.06.09

엔티티 매핑

엔티티 매핑 객체 - 테이블 : @Entity, @Table 필드 - 컬럼 : @Column 기본 키 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn ** JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 기본 생성자 필수 final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final X 기본키 매핑 @Id 직접할당 @GeneratedValue IDENTITY - commit 이전에 키값 확인이 불가능하다. - JPA 에서 persist 하는 순간 INSERT 쿼리를 자동 수행한다. 따라서 persist 이후 해당 객체에 키값을 자동으로 넣어준다. SEQUENCE - persist 하는 순간 select sequenct 쿼리를 수..

JPA/JPA 2020.06.09

영속성 컨텍스트

영속성 컨텍스트 엔티티를 영구 저장하는 환경 영속성 컨테스트에 저장 EntityManager.persist(entity); // 1차 캐시에 저장, INSERT SQL 생성하여 쓰기 지연 SQL 저장소에 저장 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 비영속 객체를 생성한 상태 Member member = new Member(); 영속 em.persist(member); 준영속 상태 em.detach(member); 삭제 em.remove(member); 영속성 컨텍스트의 이점 1차 캐시 - 동일성(identity) 보장 변경 감지(Dirty Checking) - 수정시 스냅샷을 통해 기존 엔티티와 비교하여 변경이 있는 경우 수정 쿼리 생성 지연 로딩(Lazy Loading) flush 영속성 컨텍스..

JPA/JPA 2020.06.09

객체와 관계형 데이터베이스의 차이

차이점객체와 관계형 데이터베이스의 차이 상속 연관관계(참조) - 참조 : PK, FK 객체는 단방향, DB는 양방향 데이터 조회 가능 JPA(Java Persistence API) 자바 진영의 ORM 기술 표준 Object-relational mapping(객체 관계 매핑) 객체는 객체대로 관계형 DB는 관계형 DB 대로 설계 ORM 프레임워크가 중간에서 매핑 - 패러다임의 불일치 해결 JPA 프로젝트 기본 구조 controller, web : 웹계층 service : 비지니스 로직, 트랜잭션 처리 - 대부분의 로직을 처리함 - 서비스 계층은 단순 엔티티에 필요한 요청을 위임하는 역할 repository : JPA를 직접 사용하는 계층, 엔티티 매니저 사용 domain : 엔티티가 모여 있는 계층, 모든..

JPA/JPA 2020.06.09

Spring Boot

ㄴ스프링 부트 독립적 어플리케이션을 빠르고 쉽게 만들수 있다. 빠르고 폭넓은 사용성을 제공 가장 많이 사용하는 기본 설정을 제공하고, 설정을 쉽고 빠르게 할 수 있다. 코드 제너레이션, XML 설정을 사용하지 않음 자바8 이상부터 사용 가능함. 서블릿 버전은 3.1 이상부터만 스프링 프레임워크 주요 3대 기술 IoC(Inversion of Control, 제어의 역전, 의존적 주입) 객체의 생성부터 생명주기 관리까지 모든 객체에 대한 제어권이 바뀐것을 의미 자바 객체를 생성하고 서로간의 의존관계를 연결시키는 제어권은 어플리케이션이 있으나, Servlet, EJB등을 사용하는 경우 제어권이 컨테이너로 넘어간다. - DL(Dependency Lookup) EJB, Spring - DI(Dependency I..

Spring Web Flux

reactor3 API를 기본으로 사용하도록 되어있다. MVC와 웹플러스를 공존해서 사용할 수 있도록 되어있다. 그러므로, 스프링 웹플럭스 프레임워크는 두가지 방식으로 개발이 지원된다. - 어노테이션 방식 - 함수형 모델 형식 WebFlux는 아래와 같은 상황에서 사용하는게 좋다. - 비동기 - 논블록 리액티브 개발 - 효율적으로 동작하는 고성능 웹 애플리케이션 개발 - 서비스간 호출이 많은 마이크로서비스 아키텍처에 적합 WebFlux는 ServerHttpRequest, ServerHttpResponse 객체를 사용한다. HttpServletRequest, HttpServletResponse 객체를 사용하지 않음. 설정 Dependency 추가 implementation 'org.springframewo..

Blocking I/O 처리 방안

blocking calll 부분을 별도의 쓰레드에서 background로 돌리는 방법을 사용. Mono blockingWrapper = Mono.fromCallable(() -> { return /* make a remote synchronous call */ }).subscribeOn(Schedulers.elastic()); Mono.fromCallable을 사용하여 blocking call 부분의 실행을 미루고, 이를 Schedulers.elastic()을 사용하여 blocking 자원을 기다리는 별도의 쓰레드를 생성하여 실행 DB Callback 부분을 아래와 같이 처리 public Mono save(MemoRequestDTO memoRequestDTO) { return Mono.fromCallab..

JAVA/Reactor 2020.06.08

모으기(aggregation) 연산

List 콜렉션으로 모으기(collectList) collectList()의 리턴 타입은 Mono이므로 Mono를 구독해서 값을 사용하면 된다. Mono mono = someFlux.collectList(); mono.subscribe(lst -> System.out.println(lst)); Map 콜렉션으로 모으기(collectMap) keyExtractor : 데이터에서 맵의 키를 제공하는 함수 valueExtractor : 데이터에서 맵의 값을 제공하는 함수 mapSupplier : 사용할 Map 객체를 제공(mapSupplier가 없는 메서드는 기본으로 HashMap 사용) Mono mono = someFlux.collectList(); mono.subscribe(lst -> System.out..

JAVA/Reactor 2020.06.08