Backend
이전 포스팅에서 QueryDSL 사용을 Repository에서 할 수 있도록 설정하는 방법에 대해서 다루어 보았었다. 이제 실제로 자주 사용되는 SQL문을 QueryDSL을 통해 작성해보도록 하자. JpaRepository는 인터페이스 단에서 기본적인 쿼리를 제공해주지만 동적이고 복잡한 쿼리를 작성이 필요할 때에 QueryDSL 사용을 하는 것이 유리할 수 있다. 아래 포스팅은 Spring Boot 3점대 이상에서 QueryDSL을 설정하고, Repository에서 사용하는 방법을 정리한 글이니 만약 설정방법을 알고 싶다면 참조하면 좋을 것 같다. https://sjh9708.tistory.com/174 [Spring Boot/JPA] QueryDSL 설정과 Repository에서의 사용 이번 포스팅에서..
이번 포스팅에서는 Spring Boot에서 이전에 사용했던 JPQL와 JpaRepository 보다 조금 더 객체지향스럽고 유동적인 동적 쿼리를 작성할 수 있도록 QueryDSL 사용을 위한 설정을 해보도록 하자. QueryDSL에 사용에 대한 견해를 미리 말해보자면 유연한 쿼리 작성과 안정적인 코드를 작성하기 위해서 매우 유용할 것이라는 말을 하고 싶다. 개인적으로는 C# .NET 진영에서 사용했던 Entity Framework와 유사하게 Builder 패턴을 이용한 동적 쿼리 작성과 객체지향 코드라는 점이 유사하여 진입하기가 괜찮았기도 했다. 다른 진영의 객체지향 ORM을 사용해보았다면 적응하기 쉬울 것 같다. QueryDSL의 필요성 return em.createQuery("select a, co..
작년 말, Spring 2점대 버전의 지원이 공식 중단되면서, 이제 웬만하면 Spring 3 버전대를 사용할 것을 Spring 진영에서 권장하고 있다.그 중 Spring Security의 경우 변화한 내용이 조금 있는 편이라 이 참에 Spring Security를 이용한 JWT 인증과 인가를 해당 버전대에 맞추고, 정리하여 다시 작성해보려고 한다. 아래는 Spring 2점대 버전에서의 JWT Security를 설정했던 포스팅들인데, 3점대 버전에서도 근본적인 과정들이 바뀐 것은 아니다. 만약 2점대 버전에서의 설정이 궁금하다면 아래 포스팅들의 내용을 참고하자.회원 가입 : 해당 부분은 Security에 의존하지 않아, 회원 가입 로직이 필요하다면 참고하면 될 것 같다.https://sjh9708.ti..
이전에 Spring Boot 프로젝트에 Swagger를 연동해 본 적이 있었다. 최근 Spring Boot의 지원 버전이 3점대로 올라감과 동시에, 2점대에서 Swagger 사용 목적으로 많이 사용되는 SpringFox가 안타깝게도 제대로 지원되지 않는다. 3점대의 Spring Boot에서는 지원과 활동이 활발한 SpringDoc을 통해 Swagger 설정을 하는 것이 유리할 것이다. 2점대의 Spring에서 Swagger를 설정했던 방법은 다음 포스팅에 있다. https://sjh9708.tistory.com/78 [SpringBoot] API 문서 생성 - Swagger 연동하기 이번 포스팅에서는 API 문서 생성을 위해서 Swagger를 연동하는 방법을 알아보도록 하겠다. API 문서의 필요성 서비..
이번 포스팅에서는 Spring Boot에서 예외가 발생했을 때, 이를 처리하기 위한 계층을 정의해서 만들어보려고 한다. Exception Handler 정의의 필요성 @Override @Transactional public Long addMember(MemberJoinRequestDto inputMember) { Member exist = memberJpaRepository.findMemberByEmail(inputMember.getEmail()); if(exist != null){ throw new AlreadyExistElementException("이미 존재하는 이메일입니다."); } //... } 다음과 같은 Exception이 발생했다고 가정해보자. 아래는 Handler가 있는 경우와 없는 경우..
Spring Data JPA는 JPA를 기반으로 하는 데이터 액세스 계층을 쉽게 구현할 수 있게 도와주는 도구이다. 일반적인 Repository 사용에 필요한 기본적인 인터페이스와 필요에 따라 확장가능하기 때문에 개발자들이 데이터 액세스 레이어를 더 쉽게 작성하고 유지보수할 수 있도록 도와준다. Repository 인터페이스: Spring Data JPA는 Repository 인터페이스를 제공하며, 이를 통해 데이터베이스 조작을 위한 메서드를 정의할 수 있으며, 기본적인 쿼리를 제공한다. 쿼리 메서드: Repository 인터페이스에 메서드를 정의할 때, 메서드 이름만으로 자동 인식하여 쿼리를 생성할 수 있다. 개발자는 별도의 SQL 쿼리를 작성하지 않고도 간단한 메서드 호출을 통해 데이터베이스 조작을..
앞선 포스팅에 이어서 이번 포스팅에서는 JPA를 이용하여 To Many 관계의 컬렉션을 조회할 때의 최적화 방법에 대해서 다루어 보려고 한다. 컬렉션 조회 { "orderId": 4, "name": "userA", "orderItems": [ { "orderId": 4, "itemName": "JPA1 BOOK", "orderPrice": 10000, "count": 1 }, { "orderId": 4, "itemName": "JPA2 BOOK", "orderPrice": 20000, "count": 2 } ] } 컬렉션을 조회한다는 것은 다음 JSON과 같이 엔티티가 1:N 관계를 가질 때, 연관된 N (Collection) 을 함께 가져오는 것을 의미한다. 컬렉션에서의 Fetch Join public..
이번 포스팅에서는 JPA를 이용하여 데이터를 조회할 때의 유의해야 할 내용들에 대해서 다루어 보려고 한다. 즉시 로딩과 지연 로딩 지연 로딩(Lazy Loading)은 엔터티의 관계를 로딩할 때, 실제로 필요한 시점까지 로딩을 지연시키는 방법이다. 이는 데이터베이스에서 필요한 데이터를 가져오는 시점을 늦추어서, 불필요한 데이터를 미리 로딩하지 않도록 한다. 즉시 로딩 (Eager Loading): 엔터티를 조회할 때, 연관된 엔터티의 데이터도 함께 조회하는 방법. @ManyToOne, @OneToOne과 같은 관계에 대해 디폴트로 적용되는 방식. fetch = FetchType.EAGER는 즉시 로딩을 사용하겠다는 뜻이다. 지연 로딩 (Lazy Loading): 연관된 엔터티의 데이터는 실제로 사용될 때..
이전 포스팅에서 서로 다른 서비스들 간의 데이터 동기화를 Kafka를 이용하여 수행해보았다.이번에는 같은 서비스가 여러개의 인스턴스를 가지는 경우, 데이터의 불일치를 해결하는 일부 방법에 대해 살펴보려고 한다.사실 해당 내용은 공부를 하면서 여러가지 의문사항이 많이 남았는데 이 내용은 마지막에 서술하려고 한다. 문제점 Microservice에서는 여러개의 서비스 뿐 만 아니라, 같은 서비스가 여러개의 서버로 Scale-out되어 여러 인스턴스가 동작하고 있을 수 있다. 이들이 각자의 데이터베이스를 가지고 동작한다면 데이터 동기화의 문제가 발생할 수 있다. 예를 들어 Order-service의 주문을 100건 한다고 치면, 위의 3개의 Order-service들이 요청을 각각 나누어 처리하게 될 것이다.그..