본문 바로가기

JAVA

(17)
[JPA] 성능 최적화하기_N+1 문제 회사에서 맡은 서비스맵을 성능적인 측면에서 개선할 수 있는 포인트들을 찾아 기록하기 N+1 문제 개선하기 하이버네이트의 연관관계를 사용할 때, 고려해야 할 가장 기본적인 요인이라고 생각한다. 즉시 로딩과 N+1 Member 엔티티와 Order 엔티티의 관계가 1:N, N:1 양방향 연관관계라고 가정하자. 이런한 상황에 특정 회원 하나를 em.find() 메소드를 조회하면 즉시 로딩으로 설정한 주문(Order) 정보도 함께 조회된다. SELECT M.*, O.* FROM MEMBER M OUTER JOIN ORDERS O ON M.ID=O.MEMBER_ID여기까지만 보면 즉시 로딩이 상당이 좋아보이지만, 문제는 JPQL을 사용할 때 발생한다. 다음 코드를 보면, List
[동시성] 동시성 문제 해소하기(JPA)_개념 동시성은 모든 소프트웨어 시스템의 핵심적인 요구 사항이다. 이러한 동시성을 만족시킬 수 있는 소프트웨어 개발 시 겪을 수 있는 난관이 있는데, 시스템의 상태를 최신으로 유지하고 데이터베이스의 race contions(경쟁상태)나 stale state(부실 상태)를 피해야 하는 것이다. 동시성 문제란 두 개 이상의 세션이 공통된 자원에 대해서, 모두 읽고 쓰는 작업(Read -> Write)을 하려고 하는 경우 발생할 수 있는 문제를 가리킨다. 동시성 문제는 "완전한 해결"이 아닌 "적절한 해결(제어)"이다. "정확성"과 "활동성"을 어떻게 하면 모두 최대로 할 수 있을까"에 대한 고민 "활동성(빠르기)"를 포기하면 정확성을 높일 수 있고, 반대로 "정확성"을 포기하면 "활동성"을 높일 수 있다. 동시성 ..
ManyToOne 관계와 연관관계 맵핑을 효율적으로 사용하기[기본] ManyToOne 관계를 가지고 있는 자식 엔티티를 등록할 때, 단순히 외래키만을 사용하지만 엔티티 자체를 조회해서 사용하는 모습이 더러보였다. 불필요한 리소스 낭비이기 때문에 좀 더 효율적으로 연관관계를 사용하는 게 필요해 보여 정리하게 됐다. @ManyToOne 관게는 가장 흔한 관계이기 때문에, 어떻게 적절하게 맵핑하는 지를 아는 것은 App의 성능에 큰 영향을 준다. 테이블 관계 post_comment 테이블은 post테이블의 id를 외래키로 가지는 ManyToOne 관계 @Entity @Table public class PostComment { @Id @GeneratedValue private Long id; private String review; @ManyToOne(fetch = FetchT..
자바에서 스레드와 스레드풀 활용 서비스를 구현하다면 성능 측면에서의 효과를 극대화하기 위해 메서드 레벨에서 명시적인 방식으로 멀티스레드를 구현할 필요가 있다. 대용량 데이터의 처리 시간을 줄이기 위해 데이터를 분할 후 병렬로 처리 UI를 가지고 있는 애플리케이션에서 네트워크 통신을 위해 사용 다수 클라이언트의 요청을 처리하는 서버를 개발할 때 사용 특히, 외부 서비스를 반복적으로 호출해야하는 경우, 실행 순서에는 상관없이 여러 번 동일한 메서드를 호출해서 결과값을 Aggregation을 해야할 필요가 있다면 Single Thread 방식과 Multi Thread에 따라 효과 차이가 더 극명하게 드러난다. 배경 지식 프로세스와 스레드 운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스(process) 라고 부른다. 사용자가 애플리케이..
[JAVA] 람다식 map(), filter(), reduce(), collect() 활용(스크랩) 자바 8 에서 람다식이 나오면서 stream 인터페이스가 나왔습니다. stream 인터페이스를 사용하여 람다식을 기존 JAVA코드(명령형 스타일)와 비교해보겠습니다.아래에 소개하는 4개의 메서드를 간단히 설명하면 map()은 엘리먼트 변경,filter()는 엘리먼트 선택, reduce(), collect()는 엘리먼트를 하나로 리턴 이다. 1. map() map 메서드는 입력 컬렉션을 출력 컬렉션으로 매핑하거나 변경할 때 유용하다. 예제 코드 list의 엘리먼트 값을 모두 대문자로 변경하여 출력.public static void main(final String[] args) {final List names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk"..
[JAVA] String.split()와 StringTokenizer()의 차이(스크랩) 알고리즘 문제를 풀다가, String.split()와 StringTokenizer()이 어떤 차이점을 가지고 있을지 궁금해 검색을 하게 됐다. 요약 : 1. 속도면 : String.split()
[Hibernate] @Notnull vs @ NotEmpty vs @NotBlank 속성에 null 값을 금지할 때 @Notnull을 많이 사용했었다. 이와 비슷한 annotation이면서 조금씩 차이가 있는 @NotEmpty, @NotBlank가 있는데 그 차이를 알아보자. ==================================================================== 1. @NotNull : CharSequence, Collection, Map or Array의 객체가 null일 수 없다. 그러나 empty는 가능하다. 2. @NotEmpty : CharSequence, Collection, Map or Array의 객체가 null과 empty 값(size > 0)이 될 수 없다 3. @NotBlank : 'String'이 null일 수 없으며, legnt..
[JAVA8] Optional을 이용하여 NullPointException 처리 및 Stram의 사용 JAVA8을 활용하면 복잡하거나 코드가 길어졌던 단점들을 많이 보완할 수 있는 거 같다. 그 중 optional & Stream을 활용하면 좋을 거 같다. 스크랩 : https://medium.com/@joongwon/optional을-이용하여-java의-nullpointerexception을-피해보자-e9cac719a2d6 https://github.com/gonghojin/spring-webservice/blob/master/src/main/java/com/gongdel/webservice/dto/post/PostMainResponseDto.java ===================================================================그렇다면 forEach문을 이용해..