반응형 분류 전체보기133 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. java에서의 static의 의미와 사용법 우선 static의 사전적 의미는 '정적', '고정된'이라는 것입니다. java에서 static은 정적이라는 키워드로 자주 사용되고 static method(정적 메서드), static field(정적 변수)로 주로 사용됩니다. 이 두 가지 사용법은 instance가 아니라 class에 고정된 함수와 변수로 사용됩니다. 지금부터 이 두 가지에 대해서 자세히 알아보도록 하겠습니다.JVM Runtime Data Area위의 그림은 JVM을 나타내는 그림입니다. 간단히 설명을 드리면 .java 확장자를 가진 java source 파일을 java 컴파일러가 컴파일하여. class 확장자를 가진 class 파일로 만든 다음 이 class 파일을 class loader가 필요할 때 loading 하여 runtime.. 2024. 5. 18. 자바에서 PECS란? PECS란 Producer Extends Consumer Super의 줄임말입니다. 이를 직역하면 Producer 역할을 맡을 때는 extends를 사용하고 Consumer의 역할을 맡을 때는 super를 쓴다는 말입니다. 위에서 언급한 Producer 역할과 Consumer의 역할을 맡는 개체는 Collection에 해당합니다. extends와 super는 자바의 키워드로 상속 관계에서 자신을 상속한 타입인지, 자신의 부모 타입인지를 나타냅니다. 지금부터 PECS가 무엇인지 자세히 알아보도록 하겠습니다. 우선 PECS를 이해하기 위해서는 자바 제네릭스와 wildcard에 대한 개념을 이해해야 합니다. 우선 자바 제네릭스란 하나의 메서드나 클래스에서 여러 종류의 타입을 받아서 공통으로 쓸 수 있게 하는 .. 2024. 3. 20. 트랜잭션 격리 수준 트랜잭션이 가져야 하는 특성으로는 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. 이전 1 2 3 4 5 ··· 17 다음 반응형