본문 바로가기

Spring36

Spring의 동적 쿼리 : JPQL , QueryDSL 1. JPQLJPQL(Java Persistence Query Language)을 사용하면 @Query 주석을 사용하여 Repository에서 직접 쿼리를 정의할 수 있다. 또한 선택적으로 동적 매개변수를 위해 @Param과 결합할 수 있다. 예시) '제품' 엔티티가 있고 '이름' 및 '카테고리'를 기준으로 제품을 필터링한다고 가정@Repositorypublic interface ProductRepository extends JpaRepository { @Query("SELECT p FROM Product p WHERE (:name IS NULL OR p.name = :name) AND (:category IS NULL OR p.category = :category)") List findPro.. 2024. 11. 20.
Spring Day 36 : RuntimeException 과 IllegalArgumentException IllegalArgumentException IllegalArgumentException은 RuntimeException의 하위 클래스. 일반적으로 메서드에 부적절한 인수가 전달되었음을 나타내는 데 사용한다. 예를 들어 메서드에서 정의한 일부 특정 기준에 따라 메서드에 전달된 인수가 유효하지 않거나 허용되지 않음을 알리기 위해 메서드에서 자주 사용한다. 그리고 확인된 예외로 throws 절을 사용하여 메서드 시그니처에서 선언해야 하거나 메서드가 정상적으로 처리할 수 없는 경우 try-catch 블록 내에서 처리해야 한다. RuntimeException RuntimeException도 Exception의 하위 클래스이지만 IllegalArgumentException은 아니다. 호출자의 잘못이 아니라 프로그.. 2024. 3. 25.
Spring Day 35 : 동시성 제어의 중요성 동시성 제어의 중요성 Race Condition 동시 실행으로 인해 발생하는 위협 중 하나로, 두 개 이상의 스레드가 공유 데이터에 동시에 액세스 하고 이를 동시에 수정하려고 시도하면 문제가 발생한다. 적절한 동기화 메커니즘이 없으면 이러한 스레드가 서로의 작업을 실수로 방해하여 예상치 못한 잘못된 결과를 초래할 수 있다. 정리: 두 개 이상의 스레드가 동시에 같은 데이터를 접근하여 값을 변경하고자 할 때, 데이터의 예상치 못한 변경이 발생할 수 있다. Dead Lock 두 개 이상의 스레드가 무기한 차단되어 각각 다른 스레드가 진행해야 하는 리소스를 해제할 때까지 기다리는 경우 교착 상태가 발생한다. 이러한 상황은 관련된 스레드 중 어느 것도 진행할 수 없는 교착 상태를 만들어 시스템을 정지하게 만든다.. 2024. 3. 22.
Spring Day 34 : @Cacheable, @CachePut, @CacheEvict 캐싱의 중요성 캐싱에는 자주 액세스하는 데이터를 임시 저장 영역에 저장하여 해당 데이터에 대한 후속 요청이 더 빠르게 처리될 수 있도록 하는 작업이 포함됩니다. 애플리케이션의 다양한 수준에서 데이터를 캐싱하면 비용이 많이 드는 계산이나 데이터베이스 쿼리를 반복적으로 수행할 필요성이 줄어들어 응답 시간이 향상되고 서버 로드가 줄어듭니다. Spring 백엔드에서는 캐싱을 사용하여 메서드 호출, 데이터베이스 쿼리 또는 전체 웹 페이지의 결과를 저장할 수 있습니다. 그러나 성공적인 캐싱 전략을 위해서는 데이터 변동성, 캐시 제거 정책, 캐시 일관성과 같은 요소를 신중하게 고려해야 합니다. 캐싱 @ @Cacheable 메서드 호출 결과를 캐시해야 함을 나타내는 데 사용됩니다. 동일한 인수를 사용하여 이후에 메서드.. 2024. 3. 20.
Spring Day 33 : 메서드 실행 시간 측정 기능 AOP Spring 프레임워크에서 실행 시간을 측정하는 기능. 어떤 메서드가 얼마나 오래 실행되는지 확인하고, 수정한 코드와 비교하면서 성능을 개선할 수 있습니다. TimeTraceAspect 클래스는 AOP(Aspect-Oriented Programming) 개념을 활용하여 메서드 실행 전후에 시간을 측정하고 로그로 출력하는 역할을 합니다. @Aspect 어노테이션을 사용하여 Aspect로 등록되며, @Around 어노테이션을 통해 대상 메서드를 감싸 실행 전후에 특정 로직을 수행합니다. @Aspect @Component @Slf4j public class TimeTraceAspect { @Around("execution(* com.sns.domain..*(..))") public Object execute(.. 2024. 3. 15.
Spring Day 32 : Booleanbuilder, Booleanexpression "BooleanBuilder"와 "BooleanExpression"은 Spring Framework에서의 Querydsl 라이브러리에서 사용되는 용어 BooleanBuilder Querydsl에서 제공하는 조건을 동적으로 구성하기 위한 빌더 클래스 복잡한 쿼리 조건을 처리하기 위해 사용되며, AND, OR 등의 논리 연산자를 사용하여 여러 개의 조건을 조합할 수 있다. ● BooleanBuilder를 사용하여 동적으로 쿼리 조건을 생성하고, 이를 쿼리 실행에 활용 BooleanExpression Querydsl에서 사용되는 논리 표현식을 나타내는 인터페이스 쿼리 조건을 정의 및 쿼리 실행에 사용한다. 또한 Querydsl의 Predicate 인터페이스를 상속받아 사용할 수 있다. ● BooleanExpr.. 2024. 3. 12.
Spring Day 31 : Soft Delete v2 이전에 soft delete 구현 방식은 deleted_at 필드에 미리 null 값을 할당하고, 객체가 삭제되는 시점에 시간을 넣어, null 이 아닌 값을 조회하도록 구현하였다. https://ws-code-diary.tistory.com/42 Spring Day 23 : Soft Delete Soft Delete 논리적으로만 삭제하는 방법 Hard Delete( 물리적 삭제, 데이터를 삭제함) 논리적으로 삭제한다 -> 유저에게 삭제된 데이터를 보여주지 않고, 데이터를 보관한다. 예를 들어 악성 댓글을 입 ws-code-diary.tistory.com 하지만 DB에 null 값을 넣는 방법은 데이터 무결성, 검색 및 정렬 어려움, 에러 발생 가능성도 있기 때문에 수정하였다. 무엇보다 @SQLRestr.. 2024. 3. 11.
Spring Day 30 : 통합 테스트, 단위 테스트 차이 테스트 코드를 작성하는 이유는 개발 생산성을 높이기 위함이다. ( e.g. 변경 사항에 대한 오류 여부 확인 ) 통합 테스트 각 컴포넌트가 제대로 상호작용하고 예상된 대로 작동하는지 확인하기 위해 수행한다. 따라서 모든 요소를 컨테이너에 등록한다. 단위 테스트 개별 모듈이 의도한 대로 작동하는지를 확인하고, 모듈 내의 각각의 기능과 동작을 테스트 정리 즉, 통합 테스트와 단위 테스트의 가장 큰 차이점은 테스트의 범위. 통합 테스트는 여러 컴포넌트 간의 상호작용, 단위 테스트는 개별 모듈의 기능 테스트 통합 테스트를 하면 내가 테스트하고 싶은 것 이외의 모든 요소를 컨테이너에 등록한다. 컨테이너를 생성하고 등록하는 과정에서 소요되는 시간이 많기 때문에 내가 테스트하고자 하는 것만 주입받아서 테스트를 한다... 2024. 3. 8.
Spring Day 29 : 페이지 반환 타입 팁 1. 모든 응답을 Page로 받지 말고 List가 필요한 경우 응답은 List . 전체 count 쿼리가 추가로 발생하는 Page 보다는 List가 대용량 처리할 때 더 안정적이고 빠르다. 2. Pageable 과 실제 페이지사이의 -1 문제 JPA 페이지는 0부터인데 화면은 1부터 시작하는 상황 => PageDTO 를 만들어서 toPageable() 메서드를 사용. public class PageDTO { @Positive // 0보다 큰수 private Integer currentPage; private Integer size; private String sortBy; public Pageable toPageable() { return PageRequest.of(currentPage-1, size.. 2024. 3. 7.