전체 글 43

[클러버] @Builder을 활용한 독립적이고 가시적인 Fixture Setup

이전 Fixture Set Up 방법 별도의 ServiceTest라는 단일 클래스 파일을 두어 @BeforeEach를 활용하여 모든 set up 데이터를 native query를 통해 저장하고 있었다. 하지만, 테스트 코드 양이 증가하면서 다음과 같은 문제가 발생하였다.  1. 현재 테스트 코드와 관계가 없는 데이터까지 set up되며 코드 양이 많아진다.  2. 1번의 이유로, 현재 테스트에서 필요한 fixture가 어떤 값으로 set up 되었는지 힘들어진다.  목표1. 독립적이고 가시적인 Set Up 독립된 테스트 함수에서 Fixture을 한 눈에 보기 위한 필요성이 느껴졌다.예를 들면, 간단한 Update를 수행하는 Service더라도 기존에 Set Up되어 저장된 필드 값과 새로 수정하려는 Re..

클러버 2025.03.17

[클러버] Java Enum을 활용한 프로젝트 개선기 (3)

저번 블로그 포스팅에서는, code와 title만 존재하는 카테고리성 데이터들로 구성된 코드 테이블을 Enum을 활용해 마이그레이션 하는 방법을 구현했다.https://minjun98.tistory.com/108 [클러버] Java Enum 활용 프로젝트 개선기 (1)문제 상황 현재 진행하고 있는 클러버(clubber) 프로젝트에서는 변경되지 않는 값들의 모음이 많은데, 이러한 값들을 별도의 테이블로 분리해서 관리를 해야할 지 고민이 많았다. 대표적인 항목minjun98.tistory.com  문제 하지만 이러한 Enum 항목들에 있어서, code와 title 이외에 별도의 필드가 추가되는 경우가 생겼다. 대표적인 예시로 해시태그이다. 해시태그는 code와 title이외에 imgaeUrl (이미지 저장 ..

클러버 2025.02.13

[클러버] 운영을 위한 초기 인프라 구축 과정

실제 운영을 위해 인프라를 구성하였다. 프리티어 EC2 인스턴스 하나로 운영 예정인 작은 사이드 프로젝트이긴 하지만, 장애가 발생하였을 때 대처할 수 있는 시스템을 구축하는 것 자체가 의미있는 경험이라고 생각하고 있다.  [로그, 모니터링 시스템] 1. Promatil , Loki , Grafana 기존에는 Spring Boot에서 발생한 로그를 도커 볼륨을 이용해서 EC2에 저장하고, 해당 파일들을 조회했다. 일일히 파일 열고, vi로 에러 로그를 검색하는 것 자체에 대한 불편함이 계속 있었던 거 같다. 이를 해결하기 위해 PLG 스택을 위한 로그 수집기 & 모니터링 시스템을 구축하였다. vs ELK ELK 스택의 경우 질의가 훨씬 정교하지만, 현재 EC2의 리소스 상황으로는 운영되긴 힘든 무게였다. ..

클러버 2025.02.12

[Docker] host.docker.internal

host.docker.internal이란? host.docker.internal은 Docker 컨테이너가 호스트 머신(컨테이너를 실행하는 실제 컴퓨터) 에 접근할 수 있게 해주는 호스트 이름이다. 왜 필요한가?Docker 컨테이너는 기본적으로 격리된 네트워크 환경에서 동작한다.하지만 가끔 컨테이너 내부에서 호스트 머신에 있는 서비스(예: DB, API 서버)에 접근해야 할 때가 있다. vs localHost컨테이너 내부의 localhost는 자기 자신을 가리킨다. 컨테이너의 관점에서, Ec2와 같은 호스트 머신을 의미하는 것이 아니다.  예시 아래 예시의 서비스들은 모두 컨테이너로 배포되었다고 가정한다. Prometheus & Spring Actuator Prometheus 컨테이너에서는 같은 호스트이지..

Docker 2025.02.04

5.4 MySQL의 격리 수준

트랜잭션 격리 수준이란? 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것 READ UNCOMITTED(Dirty Read 발생)은 일반적인 데이터베이스에서 사용하지 않는다. SERIALIZABLE은 동시성이 중요한 데이터베이스에서 거의 사용되지 않는다. SERIALIZABLE 격리 수준이 아니라면 크게 성능의 개선이나 저하는 발생하지 않는다. REPEATABLE READ 격리수준에서 PHANTOM READ는 Inno DB 한정해서 발생하지 않는다.  READ UNCOMMITED 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보인다. 해당 예시에서 사용자 A가 Inse..

Real MySQL 2024.08.15

[JPA] Fetch join과 pagination

문제상황현재 프로젝트에서는 모집글(Recruit)와 모집글에 들어갈 이미지(RecruitImage)가 1대다의 관계로 존재하며 양방향 매핑이 되어있는 상황이다. N + 1문제를 방지하고자 둘을 fetch join하여 가져오려고 하였다.  위의 쿼리를 실행하였더니 다음과 같은 경고 메시지가 발생하였다.  HHH000104: firstResult/maxResults specified with collection fetch; applying in memory! 사실 페이징하려는 대상이 join 이후에 컬럼을 페이징하는 것이 아니라 모집글을 대상으로 하여 페이징을 처리를 하고 다의 관계에 있는 모집글 이미지를 양방향 매핑 조회 객체를 통해 끌어오기 위함이기 때문에, 결과 자체는 원하는 대로 반환이 되었다.  하..

JPA 2024.08.12

[클러버] Java Enum을 활용한 프로젝트 개선기 (2)

지난번엔 클러버 프로젝트에서의 동아리 리뷰 작성 시 고정된 키워드, 동아리의 소속 분과 등과 같이 값이 변경될 일이 거의 없는 값들의 모음들을 별도의 테이블이 아니라 Enum을 활용해 관리하는 방법에 대해 포스팅을 했다. https://minjun98.tistory.com/108 [java] Java Enum 활용 프로젝트 개선기 (1)문제 상황 현재 진행하고 있는 프로젝트에서는 변경되지 않는 값들의 모음이 많은데, 이러한 값들을 별도의 테이블로 분리해서 관리를 해야할 지 고민이 많았다. 대표적인 항목으로는 다음과minjun98.tistory.com 이번에는 프로젝트의 Enum 항목들 중 둘 사이의 포함관계를 가지고 있는 값들을 어떻게 구성하고 관리했는 지에 대해 얘기해보고자 한다.  문제 상황 프로젝트..

클러버 2024.07.07

[클러버] Java Enum을 활용한 프로젝트 개선기 (1)

문제 상황 현재 진행하고 있는 클러버(clubber) 프로젝트에서는 변경되지 않는 값들의 모음이 많은데, 이러한 값들을 별도의 테이블로 분리해서 관리를 해야할 지 고민이 많았다. 대표적인 항목으로는 다음과 같다. - 중앙 동아리 분과 (교양분과, 연행예술분과 등 7개) - 소모임 소속 학과 및 단과대 (학과 약 20개 , 단과대 약 8개)- 동아리 리뷰 키워드 항목 5개 (회비가 적당, 커리어에 도움 등 5개)   - 동아리 분류 해시 태그 (개발, 요리, 시사 등 약 10개)  리팩토링 이전에는 프론트엔드와 백엔드 간의 요청, 응답은 문자열로 주고 받았고 (ex: 해시태그가 요리인 동아리 조회) 별도의 테이블로 저장하지 않았기 때문에 프런트엔드에서 문자열로 하드코딩해서 넘겨주기로 했다. 하지만 이런 방..

클러버 2024.07.07

[java] enum 클래스에서의 @AllArgsConstructor

enum에서의 생성자를 사용하기 위해 lombok의 @AllArgsConstructor을 함께 사용하는 경우가 많다. 프로젝트에서 생성자의 접근제어자를 최대한 좁게 설정하는 중에 enum에서도 @AllArgsConstructor를 생성한 기억이 났다. 근데 문제는  1. enum은 package-private, private 생성자를 허용한다. (아니면 아예 컴파일 에러가 난다.) 2. @AllArgsConstructor의 기본 접근 제어자는 이 둘이 아니라 public이다.  나는 따로 accesslevel을 private, package-private 하게 설정을 안해줬는데 왜 컴파일이 되지?라는 생각을 했다. 그래서 컴파일된 파일을 보니까 값을 따로 지정 안해줬는데 생성자가 private하게 생성되..

java 2024.06.27

[클러버] JPA 상속 매핑에 대한 고민

클러버 프로젝트에서 마주친 테이블 설계 중 상속 매핑에 관련된 고민이 있어 이를 정리하고자 한다.  [문제상황] 현재 프로젝트에서는 동아리 테이블이 있는데 종류는 크게 중앙동아리(centerclub)과 소모임(smallclub) 2가지가 있다. DB에는 상속 관계가 없지만 편의를 위해 시각화를 하자면 다음과 같다.  [공통점] 동아리 이름, 소개, 해시태그 등이 있다.  [차이점] 중앙동아리는 소속 분과(학술, 봉사 ..)가 있으며 소모임은 중앙동아리와 다르게 분과는 존재하지 않지만 소속 단과대나 학과는 존재한다. [중앙 동아리] - 분과 O, 단과대 X, 학과 X [소모임] - 분과 X, 단과대 O, 학과 O  DB 테이블 설계 위에서 언급한 이유들로 인해 상속 매핑을 생각해보았다. JPA 상속 매핑을..

클러버 2024.06.23