Server 121

QueryDSL - Repository 구조잡기 (extends / implements 사용 X)

해당 포스팅은 "[우아콘2020] 수십억건에서 QUERYDSL 사용하기" 라는 영상의 내용을 정리한 글입니다. 해당 영상은 아래 Reference에서 시청할 수 있습니다. - https://www.youtube.com/watch?v=zMAX7g6rO_Y extends / implements 사용하지 않기 현업에서 JPA & QueryDSL-JPA를 많이 사용한다. Repository를 구현할 떄는 다음의 같은 구조로 구현할 수 있다. 사용할 Repository가 JpaRepository를 상속받고 RepositoryCustom이라는 별도의 인터페이스를 추가적으로 상속을 받는다. 그리고 해당 인터페이스의 구현체인 RepositoryImpl을 생성하게 된다. 해당 방법은 매번 Interface와 Impl 구..

Server/Spring 2022.05.29

JUnit5 - Parameterized Tests

Parameterized Tests @ParameterizedTest 애노테이션을 @Test 애노테이션 대신 사용하면 여러 개의 파라미터 값에 대해 각각 테스트를 수행하는 코드를 간편하게 작성할 수 있다. @ParameterizedTest @ValueSource(ints = {0, 1, 3, 5, 15, -10, -200 Integer.MAX_VALUE}) void isInteger_ShouldReturnTrueForIntegers(int number) { assertTrue(Numbers.isInteger(number)); } ValueSource @ValueSource 애노테이션에 지정한 배열을 파라미터 값으로 넘기면 각 인수에 대해 테스트를 각각 실행한다. @ParameterizedTest @Val..

Server/JUnit, Spock 2022.05.29

Gradle이란 무엇인가? (+ Ant, Maven 비교)

Gradle이란 그래들(Gradle)은 그루비(Groovy)를 기반으로 한 빌드 도구이다. Ant, Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 자동화 도구이다. 빌드 자동화의 목적은 소프트웨어 개발자가 반복적으로 해야 하는 코딩을 잘 짜여진 프로세스를 통해 자동으로 실행하며, 믿을 수 있는 결과물을 생산해내는 일련의 과정을 말한다. 짧게 요약하면 라이브러리를 간편하게 추가하고 관리할 수 있고, 버전도 효율적으로 동기화해서 개발자가 비즈니스 로직에 집중할 수 있게 도와준다. 빌드 도구는 Ant -> Maven -> Gradle 순으로 발전되어 왔다. 이전 세대 빌드 도구의 특징 앞서 언급했듯 이전 세대 빌드 도구는 대표적으로 Ant, Maven이 ..

Server/Gradle 2022.05.28

Java - LazyConnectionDataSourceProxy란? (+Dynamic DataSource)

LazyConnectionDataSourceProxy Spring은 트랜잭션에 진입하면 즉시 미리 DataSource의 커넥션을 가져온다. 가령 ServiceLayer Method에 @Transactional이 걸려있다고 가정하자. 쿼리를 날리기 전에 여러가지 복잡한 작업이 있을 수 있다. 그런데 Spring에서는 @Transactional에 진입한 순간 바로 커넥션을 걸어버린다. 이런 방식은 여러 단점이 있다. Ehcache같은 캐시를 사용하는 경우 실제 DB에 접근하지 않지만 불필요한 커넥션을 점유 JPA의 영속성 컨텍스트에서 엔터티가 존재함에도 불필요한 커넥션을 점유 Dynamic DataSource 환경에서 DataSource도 정해지지 않았는데 트랜잭션에 진입하면서 에러 터짐 커넥션 점유시간이 ..

Server/Spring JPA 2022.05.21

Spring - Multi DataSource 환경에서 Transaction, QueryDSL 사용하는 방법

다중 데이터 소스다중 데이터 소스 환경에서 Transaction과 Querydsl을 사용하는 방법에 대해 알아보자.먼저 데이터소스부터 보자.@Configuration@EnableJpaRepositories( basePackageClasses = { OrderRepository.class }, entityManagerFactoryRef = "masterEntityManagerFactory", transactionManagerRef = "masterTransactionManager")@EnableTransactionManagementpublic class MasterDatasourceConfiguration { @Autowired private Environment env; ..

Server/Spring 2022.05.21

QueryDSL - 벌크(Bulk) 연산 시 주의할 점!

벌크(Bulk) 연산 주의사항 Querydsl에서 Bulk 연산을 할 때 주의사항이 있다. 예를 통해 살펴보자. 아래 메서드는 모든 member의 money를 0으로 초기화한다. public void bulkUpdate() { // init Money queryFactory .update(member) .set(member.money, 0) .execute(); } 문제는 이때 쿼리를 날려서 DB에 반영은 하지만, 영속성 컨텍스트에 반영하지 않는다. 문제 상황 기존에 아래와 같이 Member가 3개가 있다고 가정하자. - id: 1, money: 10000 - id: 2, money: 20000 - id: 3, money: 30000 해당 Member들이 영속성 컨텍스트에 들어 있을 때 Bulk 연산을 ..

Server/Spring JPA 2022.05.08

Querydsl - 동적 쿼리(Dynamic SQL) 사용하기 !

동적 쿼리란 ? 동적 쿼리란 상황에 따라 다른 문법의 SQL을 적용하는 것을 말한다. 예를 들면 DB에서 값을 조회할 때 조회 조건이 동적으로 바뀌어야 하는 경우가 많다. 이런 상황을 Querydsl을 사용하면 손쉽게 해결할 수 있다. name 값이 들어오면 WHERE name = ${name} age 값이 들어오면 WHERE age = ${age} name과 age가 모두 들어오면 WHERE name = ${name} AND age=${age} name과 age 모두 들어오지 않으면 WHERE 절을 사용하지 않는다. 이를 해결하기 위한 방법을 살펴보자. 1. BooleanBuilder 동적 쿼리를 해결하려고 BooleanBuilder를 사용하는 걸 자주 볼 수 있다. private List search..

Server/Spring JPA 2022.05.07

Sequelize - FROM 절에 SubQuery 사용하기 !

SubQuery in FROM clause Sequelize ORM을 사용중인 프로젝트에 FROM 절에 SubQuery를 사용해야 하는 이슈가 생겼다. "Sequelize subquery in from clause" 등의 키워드로 검색해봤는데, 결과가 나오지 않았다 ㅠ 관련해서 어떻게든 삽질해서 검색을 해봤는데 JPA, JPQL, Sequelize 등 대부분의 ORM에서 from 절에서 서브쿼리를 사용하는 것(이하 "인라인뷰")를 지원하지 않는다고 한다. 대처방안으로는 아래와 같은 방법이 있다. 서브쿼리보다는 Join을 사용한다. 쿼리를 2개 이상으로 분리한 후 가공 작업을 한다. 또는 작업을 분할하고 특정 기능은 App Layer나 Presentation Layer에서 수행한다. RawQuery(이하 ..

Server/Node.js 2022.05.05

Spring - 샤딩 모듈 개발 이야기 (feat. AbstractRoutingDataSource)

동적 데이터 소스와 스키마 이름API를 개발할 때 Java Spring으로 프로젝트를 진행하고 싶었는데 어려움이 있었다.해당 문제를 해결하고 세미나에서 발표한 내용에 대해 정리한다.모든 아키텍처나 코드는 실제 서비스와 무관하며 설명을 위해 만든 부분임을 알린다.API를 Java Spring으로 할 수 없었던 이유는 서비스의 DB구조 때문이었다.구조를 보면 DB 서버를 여러 대로 샤딩(Sharding) 하고 있고, 스키마도 분산되어 있다.데이터를 저장할 때 유저가 속한 지역별로 데이터를 특정 DB서버의 특정 스키마에 저장해서 사용한다.board_01에서 01을 파티션이라고 칭한다.특정 유저의 정보가 어떤 DB 서버의 몇 번째 파티션(스키마) 에 저장되어 있는지는 Region DB에 저장되어 있고, DB를 ..

Server/Spring JPA 2022.05.05

Spring - 필터(Filter)와 인터셉터(Interceptor)의 차이

필터(Filter) / 인터셉터(Interceptor) / AOP 스프링에서 요청이 구현한 Controller Layer로 들어오기 전에 처리해야 하는 작업이 있다. 대표적으로 인증 인가, XSS 방어, 데이터 압축, 인코딩 등이 있다. 이러한 작업들은 공통 관심사로 보고 분리하는 것이 것이 효율적이다. 이때 사용할 수 있는 것이 필터(Filter)와 인터셉터(Interceptor), Spring AOP이다. 문제는 해당 기술들이 어떠한 장단점이 있으며, 어떤 경우에 적합한 지 또는 어떤 경우에 부적절한 지 등이 정리가 잘 되어있지 않다. 해당 포스팅에서는 그러한 기준을 정리한다. 필터(Filter) 필터(Filter)는 스프링이 지원하는 기능이 아닌, J2EE 표준 스펙에 있는 기능으로 가장 앞단에 존..

Server/Spring 2022.04.27