JAVA

    java CompletableFuture

    CompletableFuture 비동기 프로그래밍을 지원하면서, 함수형 프로그래밍 패러다임이 적용된 자바 라이브러리이다. 비동기 작업 실행 작업 콜백 작업들의 조합 예외 처리 와 같은기능들을 제공한다. 태스크 실행 (runAsync, supplyAsync) CompletableFuture.runAsync(() -> { System.out.println("비동기 작업"); }); CompletableFuture.supplyAsync(() -> { final String e = "비동기 작업"; System.out.println(e); return e; }); runAsync는 리턴값이 없을 때 사용한다. supplyAsync는 리턴값이 있을 때 사용한다. 태스크 콜백 (thenApply, thenAccep..

    JPA @ElementCollection

    @ElementCollection @Entity 가 아닌 기본 자바 클래스나 @Embeddable 클래스로 정의된 컬렉션을 다루며, OneToMany 의 관계를 갖는다. @Entity public class Sample extends AbstractAggregateRoot { @Id @GeneratedValue private Long SampleNo; @ElementCollection private Set tags = new HashSet(); @ElementCollection @CollectionTable(name = "SampleScore", joinColumns = @JoinColumn(name = "SampleNo")) private List scores = new ArrayList(); } @E..

    java annotation

    어노테이션은 기본적으로 메타 어노테이션으로 구성되어 있다. 메타 어노테이션 @Retention 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정 종류 RetentionPolicy.SOURCE - 컴파일 전까지만 유효하고 컴파일 하면 사라진다. RetentionPolicy.CLASS - 컴파일러가 클래스를 참조할때 까지만 유효하다. (class파일 에서도 존재는 하지만, invisible옵션을 통해 런타임 메모리에서는 제거됨) RetentionPolicy.RUNTIME - 런타임에도 어노테이션이 유효하므로 reflection사용 가능 @Target 어노테이션이 적용될 수 있는 위치를 선택하는 메타 어노테이션 종류 ElementType.PACKAGE ElementTy..

    Jackson 어노테이션 정리

    jackson은 기본적으로 프로퍼티 기반이므로 getter, setter 에 적용된다. @JsonProperty 해당 필드를 프로퍼티로 적용한다. json으로 변환시 키값 표기를 변경할 수 있다. @JsonProperty(value="member_id") String memberId; @JsonIgnore 어노테이션이 적용된 필드는 JSON변환시 적용되지 않는다. @JsonInclude 클래스 레벨에서 json변환에 사용될 설정을 추가할 수 있다. @JsonInclude(JsonInclude.Include.ALWAYS) public class Member { .... } JsonInclude.Include.ALWAYS: 모든 값을 json변환시 포함한다. JsonInclude.Include.NON_NUL..

    JPA 캐시

    캐시 기본적으로 영속성 컨텍스트를 1차 캐시라고 한다. 애플리케이션 범위의 2차 캐시가 있다.(공유캐시) 영속성 컨텍스트에 존재하지 않으면 2차 캐시를 조회한다. 2차캐시에도 엔티티가 없으면 데이터베이스를 조회해서 2차 캐시에 보관한다. 2차 캐시는 자신이 보관하고 있는 엔티티를 복사해서 반환한다. 2차캐시에서 얻어온 객체는 영속성 컨텍스트가 다르면 동일성(a==b)를 보장하지 않는다. @Cacheable @Entity public class Member { .... } 애플리케이션 전체에 캐시를 어떻게 적용할지 shared-cache-mode 를 설정 해줘야 한다. (EntityManagerFactory) SharedCacheMode 설정 종류 ALL: 모든 엔티티를 캐시한다. NONE: 캐시를 사용하..

    JPA 락 처리

    락 제어 트랜잭션 격리수준 4가지 READ UNCOMMITTED = DIRTY READ, NON-REPEATABLE READ, PHANTOM READ 발생 READ COMMITTED = NON-REPEATABLE READ, PHANTOM READ 발생 REPEATABLE READ = PHANTOM READ 발생 SERIALIZABLE DIRTY_READ : 트랜잭션 1이 수정중이고, 커밋하지 않은 데이터를 트랙잭션2가 조회 가능한 것 NON-REPEATABLE READ: 트랜잭션 1이 A를 조회하고, 다른작업을 진행중에 트랜잭션 2가 A를 수정하여, 트랜잭션1이 다른작업 후 다시 A를 조회했을때 다른 테이터가 조회되는 것. PHANTOM_READ: 트랜잭션 1이 10살 이하 회원을 조회 하였을때 카운트가..

    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..