본문 바로가기
반응형

전체 글14

QueryDSL을 활용한 동적 쿼리 처리 이번 게시글에서는 QueryDSL을 활용하여 동적 쿼리를 처리하는 방식에 대해서 다루도록 하겠습니다.QueryDSL이란 오픈소스 프로젝트로 JPQL을 Java 코드로 작성할 수 있게 해주는 라이브러리입니다.QueryDSL의 장점은 @Query로 바로 JPQL을 사용하는 경우 런타임에 Exception이 발생하지만 QueryDSL을 사용한다면 잘못된 쿼리를 작성했을 때 컴파일 시점에 에러가 발생하기 때문에 빠르게 문제를 파악할 수 있다는 것입니다.또한 QueryDSL은 복잡한 동적 쿼리를 작성하는 것을 간단하게 해주는 장점이 있습니다.먼저 제가 프로젝트에 QueryDSL을 도입하게 된 상황에 대해서 소개해드린 후 QueryDSL을 사용하기 위한 설정과 어떻게 적용했는지를 설명하도록 하겠습니다.QueryDS.. 2024. 7. 17.
join 제거, dto projection, covering index를 활용한 성능 최적화 이 게시글은 프로젝트를 진행하면서 발생한 쿼리를 최적화하는 과정에 대한 내용을 담고 있습니다.우선 요구 사항은 아래와 같습니다.유저는 자신만의 문제를 등록할 수 있다. 유저가 등록한 문제는 등록한 유저 본인만이 풀 수 있어야 하고 관리자가 등록한 기본 문제들도 풀 수 있다. 이때 api를 요청할 때마다 정말 랜덤한 문제가 N개씩 불러와져야 한다.지금부터 리팩토링하면서 코드가 어떻게 변경되었는지 설명드리겠습니다.각각의 단계에서의 성능 비교에 대한 내용은 글의 마지막 부분에 있습니다.기존 코드처음 이 요구사항을 들었을 때 정말 랜덤한 문제를 어떻게 가져올 수 있을까에 대한 고민이 있었습니다. 따라서 처음 생각했던 방식은 해당 유저가 풀 수 있는 문제가 몇 개인지 확인 후 그 문제가 K개라고 하면 0 ~ K .. 2024. 7. 4.
spring 프로젝트에서 더미 데이터 사용 & 테스트용 fixture 사용하기 spring 프레임워크를 이용하여 프로젝트를 진행하다 보면 만든 코드가 정상적으로 동작하는지 확인할 필요가 있습니다.이때 테스트 코드를 이용하여 비즈니스 로직이 잘 작동하는지, Controller 부분이 정상적으로 동작하는지 확인하는 것도 중요하고 실제로 요청을 보냈을 때도 테스트 결과와 같이 의도한 대로 잘 동작하는지 확인하는 것이 필요합니다.이번 포스트에서는 개발 환경에서 실제 api 요청을 보냈을 때 응답을 위한 데이터를 넣는 방식과 테스트 코드를 위한 데이터를 넣는 방식에 대해서 다루도록 하겠습니다.DB에 더미 데이터 넣기서버를 작동시킨 후 실제 요청에 맞는 데이터를 응답으로 보내주기 위해서는 DB에 실제로 데이터를 넣어야 합니다.이때 서버를 실행시킨 다음에 sql을 이용하여 DB에 데이터를 넣어.. 2024. 6. 16.
spring security 적용시 @WebMvcTest 코드에서 csrf() 없애기 이번 포스트에서는 프로젝트에 spring security 적용에 따른 Controller 단위 테스트에서 겪었던 문제 상황을 해결하는 과정에 대해서 다루도록 하겠습니다.spring security를 적용하면서 테스트 코드에서도 변경이 필요했습니다.테스트 코드는 spring security의 범위에서 제외를 하거나 각각의 controller 단위 테스트에서 authentication을 임의로 만들어주는 해결 방법이 존재했고 이 중에서 authentication을 만들어주는 방식을 선택하였습니다.위와 같이 선택한 이유는 controller에 대한 단위 테스트는 실제와 같은 요청이 들어오는 것을 확인하고 이에 대한 응답이 제대로 내려가는지 확인하는 것이 중요하다고 생각하여 spring security를 테스트.. 2024. 6. 6.
트랜잭션 격리 수준 트랜잭션이 가져야 하는 특성으로는 ACID가 존재합니다. 우선 이에 대해서 간략히 살펴보도록 하겠습니다. A(Atomicity) 원자성을 의미합니다. All or Nothing으로 하나의 트랜잭션은 내부에서 하나의 실패라도 발생한다면 전부 실패한 것으로 보고 트랜잭션이 시작하기 이전의 상태로 복구해야 합니다. Spring에서 java를 이용하여 트랜잭션을 진행할 때 RuntimeException이 발생하거나 rollbackFor 옵션을 주어서 해당 Exception이 발생했을 때 commit을 하지 않고 rollback을 진행하는 것이 이러한 특성을 지키기 위한 것입니다. C(Consistency) 일관성을 의미합니다. 트랜잭션에 의해서 데이터의 일관적인 상태가 바뀌면 안 된다는 것을 의미합니다. 데이터.. 2024. 3. 18.
N + 1 문제와 해결 방법 N + 1 문제가 무엇인지와 그 해결 방법에 대해서 알아보도록 하겠습니다.우선 N + 1이 일어나는 상황을 만들기 위해서 ERD와 스프링 프로젝트를 생성해 보도록 하겠습니다.팀에 여러 명의 팀원이 속할 수 있고, 이 각각의 팀원이 여러 개의 게시글을 쓸 수 있는 상황을 가정하여 ERD를 설계하였습니다. 이제 이에 맞는 스프링 프로젝트를 생성해 보도록 하겠습니다.아래는 순서대로 팀, 유저, 게시글의 엔티티입니다.@Entity@Table(name = "team")@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) .. 2024. 2. 14.
반응형