Spring
-
[Spring] controller pageable에 디폴트값 넣어주기Spring 2022. 3. 3. 17:04
개발을 하는데, 최대한 동적으로 데이터의 정렬 기준을 잡고 싶었고, pageable의 getSort값 기준으로 값을 동적으로 정렬할 수 있도록 개발하였다. 하지만 문제가 생겼는데 값을 호출할 때마다 목적이 분명한 api호출임에도 계속 sorting값을 명시해줘야하는 일이 발생했다. 그래서 이 문제를 해결하기위해 방법을 찾아봤고, controller단에서 파라미터 pageable에 기본값을 매겨 따로 명시하지않으면 해당값이 들어갈 수 있도록 하는 방법을 찾았다. 속성으론 다음 종류가 있다. size = 한 페이지의 사이즈를 정할 수 있다. sort = 정렬의 기준이 되는 속성을 알 수 있다. direction = 오름차순, 내림차순을 정할 수 있다. @PageableDefault 어노테이션을 Pageabl..
-
[Querydsl] querydsl로 동적으로 sort하기Spring 2022. 3. 2. 15:35
querydsl을 쓸 때 항상 난 두가지 점이 불편했다. 1. 동적인 소팅이 쉽지 않다는 점, 2. slice을 위한 코드가 저렇게 지저분하게 남는다는 점 querydsl에서 paging으로 sort을 하려고 하면 OrderSpecifier등을 써 해야하는데 그 과정이 생각보다 참 복잡시럽다. 그래서 찾아본 결과 김영한 선생님께서 정말 멋있고 간편한 방법을 만들어놓으셨다. Querydsl 지원클래스 커스텀 하기 스프링 데이터가 제공하는 QuerydslRepositorySupport가 지닌 한계를 극복하기 위해 직접 만든 김영한선생님의 Querydsl 지원 클래스의 이름은 Querydsl4RepositorySupport 다. Querydsl4RepositorySupport의 장점 - 스프링 데이터가 제공하..
-
[Spring]Assertions의 contains 상황별로 달리 사용하기Spring 2022. 2. 20. 22:48
contains라는 함수는 복수로 요소들을 체크해야할 때 꽤나 편리한 함수다. void containsTest() { List list = Arrays.asList(1, 2, 3); // Success: 모든 원소를 입력하지 않아도 성공 assertThat(list).contains(1, 2); // Success: 중복된 값이 있어도 포함만 되어 있으면 성공 assertThat(list).contains(1, 2, 2); // Success: 순서가 바뀌어도 값만 맞으면 성공 assertThat(list).contains(3, 2); // Fail: List 에 없는 값을 입력하면 실패 assertThat(list).contains(1, 2, 3, 4); } 특이한 점은 string에도 쓸 수 있는 동..
-
[Spring] 개발 편의 오픈소스 spring devtoolsSpring 2022. 1. 18. 22:46
devtools란 spring boot에서 제공하는 개발 편의 모듈이다. 코드 수정시에 어플리케이션 리로드를 하는 등 귀찮은 일이 발생하는데 devtools의 기능들이 그 불편함을 없애준다. dvtools에는 5가지 기능을 제공한다. 밑줄친 것이 주요기능 - Property Defaults : Thymeleaf는 기본적으로 성능을 향상시키기 위해서 캐싱 기능을 사용한다. 하지만 개발하는 과정에서 캐싱 기능을 사용한다면 수정한 소스가 제대로 반영되지 않을 수 있기 때문에 cache의 기본값을 false로 설정할 수 있다. 캐싱을 사용하면 속도를 높일 수 있어서 운영과 개발 시 설정 값을 다르게 두어야 한다. - Automatic Restart : classpath에 있는 파일이 변경될 때마다 애플리케이션을..
-
[Spring] Cascade관계에서 추가로 활용하면 좋을 옵션 orphanRemovalSpring 2022. 1. 18. 22:16
cascade에는 remove라는 옵션이 있다. 이는 부모 엔티티가 삭제되면 자식 엔티티가 삭제되는 옵션이다. 즉 부모가 자식의 삭제 생명주기를 관리하게 되는 것이다. cascade의 persist까지 쓰게 된다면, 부모가 자식의 전체 생명주기를 관리하게 된다. 하지만 이 옵션들에는 구멍이 있는데, 바로 부모자식관계를 끊어 냈을 때 즉, 고아를 만들었을 때 삭제되지 않는다. orphanRemoval 옵션없이 cascasde 옵션만 설정했을 때 자식관계를 끊어내봤다. // JpaLearningTest.java @DisplayName("CascadeType.REMOVE - 부모 엔티티(Team)에서 자식 엔티티(Member)를 제거하는 경우") @Test void cascadeType_Remove_InCas..
-
[Spring] 프록시와 연관관계 관리Spring 2022. 1. 18. 22:01
spring에서 연관관계설정시 두가지 설정방법이 있다. eager loading(즉시로딩), lazy loading(지연 로딩) eager loading은 엔티티 조회 시 한번에 모두 조회된다는 장점이 있으나, 필요없는 연관관계까지 전부 조회를 한다는 단점이 있어 실제로 쓰이진 않는다. 때문에 연관관계를 전부 lazy loading을 하게 되는데, fetchjoin을 하지 않는다면 프록시 객체로 대체된다. 프록시란? - 실제 클래스를 상속 받아서 만들어짐 - 실제 클래스와 겉 모양이 같다. - 사용하는 입장에서는 진짜 객체인지 프록시 객체인지는 구분하지 않고 사용할수있음(이론적으로) - 프로시 객체는 실제 객체의 참조(target)를 보관 - 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출..
-
[Spring] spring boot 라이브러리 버전관리Spring 2022. 1. 15. 00:21
최근에 swagger를 써보려고 하다가 swagger 버전과 spring boot 버전을 맞춰야하는 일이 생겨 라이브러리의 버전을 명시해서 써야할 필요성을 느꼈다. 그래서 버전명시 없이 자동으로 적용되있는걸 buildscript.ext를 이용해 적용해보았다. 적용전 각 라이브러리는 스프링부트의 버전에 맞게 최적화된 버전이 있다. 해당 정보는 스프링 사이트에서 확인이 가능하다. Spring | Home Spring makes Java simple. Level up your Java code and explore what Spring can do for you. spring.io 이런식으로 버전을 전부 찾아볼수있다. 하지만 이것만으론 라이브러리에 직접적으로 버전을 명시해야 해서 지저분해보일 수 있고 비효율적..
-
[Spring] MultipleBagFetchExcption 발생 시 해결 방법Spring 2022. 1. 9. 16:39
jpa의 n+1문제를 해결하기 위해 fetch join을 종종 사용한다. 그런데 list로 구현된 연관테이블들에 fetchjoin을 두개이상 하면 발생하는 오류가 있다. 바로 MultipleBagFetchExcption 이다. 주로 2개이상의 ToMany 테이블들을 fetch join을 했을 때 발생한다. ToOne의 경우 여러번 fetch join을 해도 되지만 ToMany의 경우 한번밖에 fetch join을 쓰지 못한다. 이를 해결하는 방법은 두가지가 있는데 - List로 구현된 ToMany테이블들을 Set으로 바꾸는것 - 하이버네이트의 default_batch_fetch_size 옵션 적용 두가지 방법이 있다. List로 구현된 ToMany테이블을 Set으로 바꾸는법 MultipleBagFetch..