반응형

Develop 51

[Querydsl] 성능개선 - 2편 ( N + 1 )

이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. N + 1 Entity 기반인 Jpa, Querydsl 을 사용하다 보면 N + 1은 한번 씩 겪는 문제라고 생각합니다. N + 1이 무엇이고 왜 발생하는지 알아보겠습니다. 먼저 아래의 코드를 살펴보겠습니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @DynamicUpdate @DynamicInsert public class House { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String n..

Develop/spring-data 2021.02.01

[Querydsl] 성능 개선 1편

이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. 1. 동적 쿼리 사용 시 BooleanExpression을 사용하자! Querydsl에서 동적쿼리 사용방법은 조건문에 null을 넣으면 조건문이 무시되는 방법을 사용하면 됩니다. public Staff dnamicQuery(String name) { return queryFactory .selectFrom(staff) .where(name == null ? null : name) .fetchOne(); } 위처럼 코드를 작성한다고 가정했을 때 동적 조건이 많아진다면 쿼리는 매우 복잡해질 것입니다. 그래서 BooleanExpression을 리턴하는 메소드를 생성하여 사..

Develop/spring-data 2021.01.29

[백기선님의 자바 라이브 스터디] 5주차 - 클래스

www.youtube.com/watch?v=HLnMuEZpDwU 목표 자바의 Class에 대해 학습하세요. 학습할 것 (필수) 클래스 정의하는 방법 객체 만드는 방법 (new 키워드 이해하기) 메소드 정의하는 방법 생성자 정의하는 방법 this 키워드 이해하기 클래스 클래스란 변수와 메서드 집합체이며, 객체를 정의하는 설계도입니다. 객체란? 자바는 객체지향 프로그램입니다. 객체지향 프로그램에서 모든 데이터를 객체로 취급합니다. 하나의 예로 스토어가 있고 스토어에서 일하는 직원들이 있다고 가정해보겠습니다. 아래의 코드를 참조해주세요. public class StoreClass { private String storeName; // 변수 private String address; // 변수 /** * 메서드..

Develop/java 2021.01.04

[Querydsl-JPA] Querydsl JPA를 사용하며.. "*" 아스타리스크 사용방법

개발할 때 테이블의 모든 컬럼을 조회할 경우가 있습니다. 그때 Querydsl-JPA를 사용할 때 어떻게 사용할 수 있는지 작성해보겠습니다. 모든 소스는 github에 올려두었습니다. 먼저 하고 싶은 쿼리가 어떤 것인지 작성해보겠습니다. select s.* , etc_option from staff s join store st on s.store_id = st.id where s.name = 'staffV' limit 1 이것과 동일한 Querydsl을 작성해보겠습니다. 먼저 Vo를 생성합니다. @Getter @Setter @ToString public class StaffEtcVo { private Staff staff; private String address; } 필드에 Staff Entity를 선..

Develop/spring-data 2020.12.20

[Querydsl] Querydsl을 적용하며.. class 파일명 주의

querydsl을 적용한 프로젝트를 진행하면서 나온 이슈를 정리해보겠습니다. JPARepository에서 Querydsl을 사용할 수 있게 Custom(interface), impl 로 세팅이 되어있었습니다. 세팅방법은 여기를 참조해주세요. 데일리 미팅 도중 Custom Interface의 naming을 변경이 확정되었습니다. AS-IS : CustomizedDomainRepository TO-BE : DomainQueryRepository Customized란 단어는 너무 포괄적이어서 변경하기로 결정! 증상 Class명을 변경하고 Application을 실행하자 에러가 발생하였습니다. No property search found for type Staff! Staff는 Entity 객체입니다. 구현 된..

Develop/spring-data 2020.12.18

[Monitoring] Actuator, Prometheus를 이용한 monitoring해보자! - 3편 (Grafana docker로 띄우기)

모니터링 서비스가 없으면 정말 불편합니다. 간단한 예로 ~ 하루는 출근했는데 "** 서비스가 실행이 안되는데?" 확인해보니 메모리 초과로 셧다운되있었습니다. 개발 서버에서 테스트 중에 public망에 있던 서비스와 통신 중에 계속 에러가 발생 확인해보니 셧다운되있었습니다. ** 서비스 죽었어? 잠시만요... 터미널 열고 타자 다다다다다 ps -ef... docker ps .. 매번 이럴순 없습니다. 소스는 github에 올려놓았습니다. 1편 - actuator 적용한 application을 띄우기 2편 - monitoring application, prometheus docker로 띄우기 3편 - Grafana docker로 띄우기 4편 - AlertManager 적용 actuator는 Spring In..

Develop/devops 2020.12.12

[JPA] Querydsl에 pageable을 적용하며... 2가지 방법을 소개하겠습니다.

Querydsl을 적용하고 paging 처리를 위해 pageable을 적용한 내용을 정리하겠습니다. Querydsl을 적용방법은 지난 글에 정리해놓았습니다. 지난글에서 정리한 Querydsl 3가지 방법 중 제가 테스트를 해본 2가지 방법 모두 적용방법을 알아보겠습니다. QuerydslRepositorySupport 상속받아서 사용 @Repository public class StoreRepositorySupport extends QuerydslRepositorySupport { private final JPAQueryFactory jpaQueryFactory; private final EntityManager entityManager; /** * Creates a new {@link QuerydslRe..

Develop/spring-data 2020.12.10

[Querydsl] Querydsl 사용방법 3가지

직장 동료의 조언 덕분에 Querydsl 설정 방법에도 여러가지가 있다는 것을 알았습니다. 지난번에 작성한 Spring Data JPA 기반 Querydsl 사용해보자. ( Entity 관계 매핑 편, 테스트 코드 포함 )글에서는 QuerydslRepositorySupport를 상속받아 사용하는 방법에 대해서 작성하였습니다. 이번글에서는 이 것외에도 2가지가 더 있고 어떤 것을 선택했는지까지 작성하겠습니다. 모든 소스는 Github에 있습니다. 이동욱님의 티스토리를 참조해서 작성하였습니다. (https://jojoldu.tistory.com/372) Querydsl 사용방법 3가지 QuerydslRepositorySupport 상속받아 사용 JpaRepistory에서 Querldsl 사용 가능하도록 설정..

Develop/spring-data 2020.12.07

[JPA] JPA를 적용하며... mysql 함수 2번 호출되는 문제

왜 querydsl로 조회할때 mysql 함수가 두 번 발생하는 문제가 나타났습니다. 먼저 Spring Data JPA를 사용하면서 왜 mysql 함수를 썼어야 했는지부터 설명드리겠습니다. 진행중인 프로젝트는 mybatis를 사용했었습니다. 그리고 새로운 버전으로 업그레이드하면서 JPA를 도입했고 기존 mapper 쿼리를 걷어내면서 작업을 진행하고 있습니다. 그래서 mybatis를 걷어내기 전까지는 mysql를 함수를 사용하기로 하였습니다. ( 관리포인트를 2개로 나누는 것은 좋지 않다고 판단 ) 증상 querydsl로 아래 소스처럼 mysql function을 이용하여 조회하는 로직이 있습니다. 그런데 function이 두번 호출되고 있습니다. public StoreVo findByName(String..

Develop/spring-data 2020.12.06

[Java] if, else 에서 탈출해보자! interface활용

프로젝트를 진행하다보면 프로세스 로직에서 수많은 분기를 처리하기 위해 if, else가 무수히 달리는 것을 확인할 수 있습니다. 이번 글에서는 if, else를 최대한 줄이고 가독성을 높이는 작업을 진행해보겠습니다. 모든 예제 소스는 github에 올려두었습니다. 이번에 작성하는 글은 주관적인 생각입니다. 전 if, else가 많으면 확장성, 가독성이 좋치 않다고 생각하는 개발자1이기 때문에 이글을 작성합니다. 늘 그랬듯이 개발자는 소스를 보면 가장 이해가 빠르기 때문에 예제소스를 작성해보겠습니다. ProcessService.java @Slf4j @Service @RequiredArgsConstructor public class ProcessService { private final StoreReposi..

Develop/java 2020.12.03

[Monitoring] Actuator, Prometheus를 이용한 monitoring해보자! - 2편 ( monitoring application, prometheus docker 띄우기 )

모니터링 서비스가 없으면 정말 불편합니다. 간단한 예로 ~ 하루는 출근했는데 "** 서비스가 실행이 안되는데?" 확인해보니 메모리 초과로 셧다운되있었습니다. 개발 서버에서 테스트 중에 public망에 있던 서비스와 통신 중에 계속 에러가 발생 확인해보니 셧다운되있었습니다. ** 서비스 죽었어? 잠시만요... 터미널 열고 타자 다다다다다 ps -ef... docker ps .. 매번 이럴순 없습니다. 소스는 github에 올려놓았습니다. 1편 - actuator 적용한 application을 띄우기 2편 - monitoring application, prometheus docker로 띄우기 3편 - Grafana docker로 띄우기 4편 - AlertManager 적용 actuator는 Spring In..

Develop/devops 2020.12.02

[Optional] Java 유용한 Null 처리

Java 코드를 짜면서 가장 많이 발생하는 에러는 무엇일까?? 바로 NullPointException 입니다. 이 Exception을 최대한 줄일 수 있는 Optional에 대해서 정리하겠습니다. Java 8부터 Null처리로 Optional이 나왔다. 그러나 개발자들이 기대했던 것과 다르게 만들어져 말이 많았다.... NullPointException를 완벽하게 방어해낼 것이라는 예상과는 다르게 구멍이 있는 기능이다. Optional의 get()같은.. 그래서 주의사항이 26가지가 된다. 이 글에서는 주의사항에 다루기 전에 Optional이 무엇인지, 어떤 메소드가 있는지에 대해서 알아보겠습니다. Optional이란? T 타입의 객체를 Wrapper하는 Wrapper 클래스입니다. 코드를 작성하다보면 ..

Develop/java 2020.12.01

[JPA] JPA를 적용하며.. ( field convert 편 )

오늘도 JPA를 적용한 프로젝트를 진행 중입니다. 지난글 [JPA] JPA를 적용하며.. ( insert, update 분기 편 ) 에서는 insert, update 분기를 if문 없이 처리하는 유틸리티 함수를 적용했습니다. 이번글에서는 Entity의 field를 convert하는 방법에 대해서 정리하겠습니다. 사건 전말 Database Table 컬럼 중 동적으로 변하는 데이터가 있었습니다. 우리는 해당 컬럼을 varchar 타입으로 주고 Json 방식으로 저장하기로 하였습니다. 아래에 관련 table과 필드 ddl입니다. create table staff ( id bigint auto_increment primary key, age int null, name varchar(255) null, meta..

Develop/spring-data 2020.11.30

[Monitoring] Actuator, Prometheus를 이용한 monitoring해보자! - 1편 ( actuator 적용한 application을 띄우기 )

모니터링 서비스가 없으면 정말 불편합니다. 간단한 예로 ~ 하루는 출근했는데 "** 서비스가 실행이 안되는데?" 확인해보니 메모리 초과로 셧다운되있었습니다. 개발 서버에서 테스트 중에 public망에 있던 서비스와 통신 중에 계속 에러가 발생 확인해보니 셧다운되있었습니다. ** 서비스 죽었어? 잠시만요... 터미널 열고 타자 다다다다다 ps -ef... docker ps .. 매번 이럴순 없습니다. 소스는 github에 올려놓았습니다. 1편 - actuator 적용한 application을 띄우기 2편 - monitoring application, prometheus docker로 띄우기 3편 - Grafana docker로 띄우기 4편 - AlertManager 적용 actuator는 Spring In..

Develop/devops 2020.11.28

[JPA] JPA를 적용하며.. ( insert, update 분기 편 )

프로젝트를 진행하면서 JPA를 도입하였습니다. 지난글( [JPA] 프로젝트에 JPA를 적용하며.... ( save편 ) )에서는 JPA의 영속성을 이용하여 insert, update를 처리하는 방법에 대해서 정리하였습니다. 도입 배경 및 JPA 적용방법에 대해서 궁금하시면 제 블로그에 "JPA" 로 검색하시면 Querydsl, 로깅 처리방법까지 정리해두었습니다. insert, update를 메소드로 분리하여 각각 처리하였습니다. 그런데 한 메소드에서 처리할 수 없을까? 하고 고민하고 적용한 내용을 정리하겠습니다. 같은 API로 데이터가 있으면 update하고 없으면 insert하는 메소드 예제를 작성해보겠습니다. @Service @RequiredArgsConstructor // 의존성 주입 public ..

Develop/spring-data 2020.11.27
728x90
반응형