분류 전체보기

    Gradle Composite Build 기반 Monorepo 전환기

    Gradle Composite Build 기반 Monorepo 전환기

    오랜만에 글을 작성합니다.사내에서 여러 spring, kotlin 프로젝트를 monorepo 로 이전하게 되면서 배운 점, 과정을 기록하기 위해 작성합니다.1. Monorepo를 도입한 이유1.1 기존 Polyrepo 구조에서의 문제사내, 그리고 저희 팀은 Spring 프로젝트를 담당하는 개발자가 2~3명뿐이었습니다.하지만 운영해야 할 서비스는 10개 이상으로, 각 서비스가 개별 저장소(Polyrepo)로 관리되고 있었습니다.Polyrepo 방식이 처음에는 큰 문제가 없어 보였지만, 서비스가 늘어나고 운영 기간이 길어지면서 다음과 같은 한계가 발생했습니다. 1) 공통 라이브러리 관리의 어려움각 프로젝트에서 동일한 공통 코드와 라이브러리를 사용하고 있었지만, Polyrepo 구조에서는 라이브러리 관리가 서..

    QueryDSL을 쓰다보니 Q-Class가 뭘까 싶네?

    QueryDSL을 쓰다보니 Q-Class가 뭘까 싶네?

    필자는 개발중 JPA를 위주로 사용한다. JPA를 사용하다보면 Command의 쿼리는 정말 손쉽게 개발이 가능하지만 가끔 JPA로만 조회 쿼리를 작성할 때는 힘들때가 많았다. 동적쿼리나 복잡한 쿼리를 작성할 때는 정말 힘들 때도 많았다. (JPQL ...) 사실 개발 시점에 IDE에서 알아차리기도 힘들고 테스트 작성도 어려움이 있었다. 그래서 조회쪽을 MyBatis와 같은 Mapper 를 별도로 사용해볼까? 고민이 들었지만 그럼 ORM을 사용하는 이유가 뭘까? 라는 의문도 나오게 되었다. 이부분에 대해 모순되는 점들이 있는 것 같아 검색을 해보니 Criteria, QueryDsl 등 여러 방법이 존재하였다. 그래서 QueryDsl 문법을 공부하고 실무에서 잘 사용중였는데 최근 Java Reflection..

    JPA N + 1, FetchJoin, EntityGraph

    JPA N + 1, FetchJoin, EntityGraph

    필자는 Spring Data JPA 를 많이 사용 중에 있다. 초반에 해당 문제로 골머리를 앓았던 기억이 있는데 그때 기억도 나는 겸 다시 정리도 하는 겸하여 정리해보고자 한다. 준비 우선 테스트를 진행해 볼 엔티티를 작성하자. 책과 작가를 엔티티로 삼았으며 책 → 작가를 의존하는 ManyToOne 관계를 맺어주었다. 코드는 아래와 같다. Entity @Entity @Getter @NoArgsConstructor @ToString public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @ManyToOne private Author author; public..

    MariaDB 간단 성능 테스트

    MariaDB 간단 성능 테스트

    작년 진행했던 프로젝트 중 성능 이슈로 인한 성능 개선 작업을 맡은 적이 있다. 이중 가장 재밌게 진행한 부분은 기존 Spring Web MVC 로 모든 API 가 작업이 되어있었는데, 조회 쪽 부분을 별도로 분리하여 WebFlux를 활용하여 조회 서버를 구축 했던 부분이다. 이 과정에서 많은 부분을 배울 수 있었는데 MQ 활용 CQRS MongoDB (NoSQL) WebFlux 등이 있다. 이중 당시에 MariaDB 와 MongoDB 성능 테스트를 진행 했었는데 최근 사이드로 진행하는 프로젝트에서 어떤 DBMS를 사용할 까 고민하던 찰나 다시 직접 비교도 해볼 겸 기억하려 이렇게 포스팅하게 되었다. 나머지도 시간이 나면 포스팅하려한다. 일단 환경은 M1 Macbook Pro 13 고급형 (Docker)..

    JAVA 객체 정렬하기 - Comparable, Comparator

    JAVA 객체 정렬하기 - Comparable, Comparator

    기본적으로 자바에서 제공하는 정렬 기능인 Sort 는 다양한 Attributes로 이루어진 객체를 일반적으로 정렬할 시 에러는 뿜는다. 그렇다면 객체를 어떻게 어떤 기준으로 정렬할 수 있을 까? 에 대한 고민이 들었다. 보통 정렬하면 아래 코드를 생각하기 쉽다. Integer iArr = new Integer[]{2, 5, 3, 1}; Arrays.sort(iArr); System.out.println("iArr : " + iArr.toString()); // iArr : [1, 2, 3, 5] 그렇다면 객체 정렬을 어떻게 할까? 일단 객체를 정렬하기 위해서는 정렬 기준이 있어야한다. 예를 들어 아래 객체가 있다고 하자 public class Edge { private Integer distance; p..

    Spring JPA - Hibernate 에서 field가 Enum일때 @ColumnDefault는 어떻게?

    Spring JPA - Hibernate 에서 field가 Enum일때 @ColumnDefault는 어떻게?

    Spring Boot 기반에 JPA 를 사용하는 중에 Enum 으로 Field를 관리하는 일이 많아졌습니다. 이때 Enum 에 초기값을 DB 단에서 설정해주어도 되고 Entity 객체를 생성할 때 기본으로 할당해주는 방법을 주로 사용하고 있었습니다. 근데 @ColumnDefault 로는 설정을 못해줄까? 라는 의문점이 생겨 적용을 해보았습니다. 아래는 예제 코드입니다. // enum public enum BoardType { NOTICE, FREE, COMMUNITY, ORGANIZATION; } // Entity Class ... @Column(name = "type") @NotNull @Enumerated(value = EnumType.STRING) private BoardType type; ... ..