본문 바로가기
  • Where there is a will there is a way.

개발/java27

JPA 락 2020/04/23 - [개발/spring-boot] - spring transaction 이란 이전에 트랜잭션과 격리수준에 대해서 알아봤다. 트랜잭션의 격리수준을 보장하기 위해서 JPA 에서 락을 제공한다 이번 글에서는 JPA 의 락에 대해서 정리했다. JPA 락 락은 낙관적인 락과 비관적인 락이 있다. 낙관적인 락 트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하는 방법이다. 데이터베이스가 제공하는 락을 사용하지 않고 애플리케이션이 제공하는 락이다. 비관적인 락 트랜잭션은 충돌이 발생한다고 가정하고 우선 락을 건다. 두번 갱신 분실 문제 ( second lost updates problem ) 두명이 동시에 같은 내용을 수정한다고 가정해보자 두명이 비슷한 시기에 수정완료 버튼을 눌렀다면 결.. 2020. 4. 25.
JPA 기초 프록시란 무엇인가 프록시란? JPA 구현체들은 연관된 객체들 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 이와 관련 된 기술이 프록시 인데, 이 프록시를 통해서 즉시로딩 ( EAGER ) 과 지연로딩 ( LAZY ) 을 할 수 있다. JPA 표준 명세는 지연 로딩 구현방법을 JPA 구현체에 위임했다. 하이버네이트는 지연 로딩을 지원하기 위해 프록시를 사용하는 방법과 바이트코드를 수정하는 두 가지 방법을 제공하는데 바이트코드를 수정하는 방법은 복잡하다. 프록시의 기초 JPA 에서 식별자로 엔티티를 하나 조회할 때 EntityManger.find(); or repository -> findById(); 이 메소드는 영속성 컨텍스트에 엔티티가 없으면 데이터베이스를 조회.. 2020. 4. 12.
Java Collection 프레임워크 자바 collection 프레임워크 배열은 크기가 고정되어 있고 객체를 삭제했을 대 해당 인덱스가 비고 새로운 객체를 저장할 때 어디가 비는지 확인해야하는 과정들을 거쳐야 하는 경우가 있다. 자바는 이러한 문제점을 해결하기 위해서 우리가 알고있는 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이들을 총칭해서 컬렉션 프레임워크라고 한다. List 컬렉션 ArrayList 배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만, ArrayList 는 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다. 기본 생성자로 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는.. 2020. 3. 22.
heap 메모리와 Garbage Collector 개발을 하면서 대용량 데이터를 인메모리에 저장해서 DB 의 부하를 최소화 하고 속도를 개선하는 작업을 한적이 있다 인메모리에 저장하는 데이터는 대용량 데이터로 주기적으로 스케줄링을 통해서 업데이트 되었다. 여기서 레디스를 사용하여 2가지의 개선점을 두었는데 1. 블루그린 배포시에 인메모리에 데이터를 채우는데 시간이 소모되므로 레디스 캐시를 이용하여 데이터를 불러온다. 2. 스케줄링을 돌릴때 모든 aws 인스턴스에서 ( java project 가 인스턴스당 1개 ) 모두 돌아가면 n 만큼 db에 부하가 걸린다. 따라서 레디스에 시간차 키를 두어서 선별적인 스케줄링을 실행하게 한다. 여기서 문제가 발생하였다. 인메모리에 데이터를 최신화 하는 과정에서 레디스를 사용했는데 레디스 스트림 객체가 heap 메모리를.. 2020. 3. 21.
spring 에서 pageable custom 구현 spring 에서 pageable custom 구현 spring 에서 jpa page 를 사용하면 편리하겠지만 가끔씩은 필요한 요구조건에 맞춰 내가 직접 pagenation 을 해야할 일이 생긴다. 간단하게 list 와 pageable 을 컨트롤러 layer 에서 받았을때 사용할 수 있는 custom pageable 을 작성해보았다. private Page makePageFromGoodsIds(List goodsIds, Pageable pageable) { int start = (int) pageable.getOffset(); int end = Math.min((start + pageable.getPageSize()), goodsIds.size()); return new PageImpl(goodsIds... 2019. 12. 19.
java 복잡한 Comparator 예제 comparator 를 사용할때 가끔은 복잡한 정렬이 필요할 때가 있다.. 항상 쓸때마다 헷갈림으로 남겨놓습니다.. @Test public void test() { List test = Lists.newArrayList(9, 10, 5, 4, 6, 7, 7, 8, 8, 9); Comparator sortList = Comparator.comparingInt(o -> o); Collections.sort(test, sortList); System.out.println(test); } @Test public void test_복잡한정렬조건() { List areaSortTests = new ArrayList(); areaSortTests.add(new AreaSortTest(0, 10, LocalDateTi.. 2019. 12. 19.