스프링
-
성능 개선을 진행해보자3스프링 2024. 7. 17. 00:55
Paging 적용하기성능을 좀 더 올리고 싶었는데 프론트 개발자와 협의 하에 페이징을 적용하기로 하였다.위에서 적용하고자하는 JPA 의 DTO 직접 조회보다 더 깔끔하게 처리할 수 있다.public Page findAllByOrderByModifiedDateDesc(Pageable pageable) { QueryResults result = queryFactory .select(Projections.fields(AllBookMarkResponseDto.class, bookMark.id.as("id"), bookMark.modifiedDate.as("date"))) ..
-
성능 개선을 진행해보자 2스프링 2024. 7. 7. 22:18
IndexbookMark의 modifiedDate에 대한 컬럼에 내림차순 인덱스를 만들어준다.@Table(name = "book_mark", indexes = { @Index(name = "idx_modified_date_desc", columnList = "modifiedDate DESC")}) 그러나 실행계획을 분석해보면 인덱스를 타지 않음을 알 수 있었다. 강제로 인덱스를 타도록 쿼리 힌트를 주었다. EXPLAIN SELECT * FROM book_mark FORCE INDEX (idx_modified_date_desc) ORDER BY modified_date DESC; 실행결과는 아래와 같다. 보시다시피 속도가 반절이상 빨라진 것을 볼 수 있다.그러나 문제점은 queryDSL..
-
성능 개선을 진행해보자 1편스프링 2024. 7. 3. 04:44
" data-ke-type="html">HTML 삽입미리보기할 수 없는 소스 성능 개선하기서론현재 bookMark에 100만개의 데이터를 넣어놓았다.이에따라 연속 독서기록량을 체크할 때 성능이 매우 좋지 않았다.전체 책갈피 조회 쿼리를 다시 점검해보았는데, 약 8s 정도로 시간이 다소 걸리는 것을 확인할 수 있었다.시간을 좀 더 개선시켜보는 것이 목표이다.쿼리 DSL로의 변경전체 책갈피 리스트를 조회하는데 JPA를 이용하여 다음과 같은 메소드를 사용하고있다.public Map> showAllBookMarkList() { List list = bookMarkRepository.findAllByOrderByModifiedDateDesc().stream() .map(A..
-
빈 등록과 주입을 아라보자스프링 2024. 5. 15. 23:26
Spring Bean 등록하기컴포넌트 스캔과 자동 의존관계 설정스프링 부트에서 사용자 클래스를 스프링으로 등록하는 가장 쉬운 방법은 @Component를 사용하는 것이다.@contorller, @service, @reposiotory는 모두 @Component를 포함하고 있다.해당 어노테이션으로 등록된 클래스는 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.자바 코드로 직접 등록수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용해야 한다. 스프링 부트가 아닌 그냥 스프링을 사용하면 XML파일을 이용하여 빈을 등록해야 한다. 설정 클래스를 만들고, @Configuration을 클래스 선언부 위에 추가하면 된다.이후 특정 타입을 return 하는 메소드를 만든 후, @B..
-
[Spring] springBoot2.4 이상에서의 application설정스프링 2023. 12. 29. 02:15
1. spring.profiles.active default로 사용될 프로파일을 명시하는 기능 해당 값을 명시하지 않는 경우 default 프로파일(application.yml)이 사용됨 2. spring.config.activate.on-profile 해당 프로파일이 선택되었을 때만 활성화 프로파일 활성화시 사용할 속성을 정의할 수 있다. dev, prod, local, test 등으로 나눠서 사용 가능 반대로 spring.config.activate.on-profile 프로퍼티가 없는 영역은 활성화된 프로파일과 무관하게 모든 프로파일들에서 공통적으로 사용된다. 3. spring.profiles.group.{group-name} 그룹에 작성한 프로파일을 활성화할 수 있다. ex) spring.profi..
-
[Spring] Error - Parameter 0 of constructor in ~ required a bean of type 'java.lang....' that could not be found.스프링 2023. 12. 29. 01:02
해당 에러를 찾아보니까 다양한 타입이 나왔었다. 필자같은 경우는 java.lang.long에 대한 에러가 발생하였다. 에러 내용들을 상세히 해석해보자면 해당 클래스의 생성자 매개변수는 long타입의 bean이 필요한데, 찾지 못한다 라는 것이다. @Value("${jwt.live.atk}") private final long ACCESS_PERIOD; @Value("${jwt.live.rtk}") private final long REFRESH_PERIOD; 필드 매개변수의 존재하는 문제의 코드는 다음과 같다. 해당 매개변수는 @RequiredArgsConstructor를 사용하고 있다. final을 사용하기 때문에 해당 필드에 대해 생성자가 만들어져 의존성이 주입이 된다. 그러나 해당 변수들은 기본타입..
-
[JUnit5] @ParameterizedTest, @ValueSource, @CsvSource스프링 2023. 11. 1. 17:56
@ParameterizedTest JUnit5에서 추가된 새로운 기능 중 하나이다. 매개변수를 사용해서 단일 테스트를 여러 번 실행할 수 있다. Example public Class Example{ private set numbers; @BeforeEach void setUp() { numbers = new HashSet(); numbers.add(1); numbers.add(1); numbers.add(2); numbers.add(3); } } @ValueSource를 활용한 단순 값 비교 numbers 변수 안에 1,2,3 값이 들어있는지 확인하는 단위 테스트를 작성해보자 @Test @DisplayName("numbers 1,2,3 값이 존재하는지 확인") void contains() { assert..
-
Service계층의 의존스프링 2023. 8. 30. 23:00
개발을 하다보면 늘 걸리는 것이 있다. Service계층이 Repository를 의존하고 있는 것은 좋다. 그렇다면 Service계층이 다른 Service계층을 의존하는 것은 괜찮을까? 이를 허용하게되면 그 시간대의 개발관점에서 이보다 편한 것은 없다. 그러나 이를 허용하면 안되는 이유 몇가지를 정리해보았다. 1. 트랜젝션의 원자성 객체지향적인 관점에서도 중요하지만 별개로 서비스 계층에서 하는 가장 큰 것 중 하나는 트랜잭션 원자성이라고 생각한다. R이 아닌 CUD의 명령형 트랜잭션의 경우... DB의 일관성이 깨질 수 있기 때문에 서비스 운영상에 치명적인 해를 입힐 수 있다. 서비스가 다른 서비스를 알거나 할 때는 이 @transactional 처리를 할 때 코드를 추적하기 다소 어려울 수 있다. 되도..