본문 바로가기

개발일기장

(34)
DDD 아주 살짝 맛보고 후기 남기기 목차 1. DDD를 접하게 된 이유와 매력 유비쿼터스 언어 간접 참조와 수직적인 의존 관계의 늪 DDD를 접하게 된 이유와 매력 도메인 주도 설계를 처음 접하게 된 건 위 책의 구판인 DDD START!다. 프로젝트에서 알림 기능을 구현해야 했다. 실시간 알림이었는데 SSE로 구현하기로 결정했었다. 관련 소스를 찾아보았는데 어떤 사이트에서 EventListenter를 사용하는걸 보았다. 도대체 저건 무엇일까? 여기 저기 찾아보다가 공식문서를 보게 되었는데 도통 무슨 말인지 알 수 없었다. 그러다가 위 책에서 이벤트리스너에서 대해 다루는 것까지 알게되어 바로 구매하게 되었다. 그렇게 후반부에 있었던 이벤트 리스너를 공부하고 책을 덮게 되었다. 그렇게 프로젝트를 마무리하고 취업 공고를 보는데 종종 도메인 주..
Bulk INSERT로 그룹 시작 기능 성능을 최적화 해보겠습니다. 안녕하세요. 예비 개발자를 위한 스터디 중개 서비스 Xuni를 개발하고 있는데요. 오늘은 스터디 시작 기능을 최적화한 내용을 설명해보려고 합니다. 최적화에 앞서 스터디 시작 기능에 대해 가볍게 설명해보려고 합니다. 기본적으로 Xuni에서 스터디를 진행하기 위해서는 책 혹은 공식 문서를 가지고 스터디를 진행합니다. 책, 공식 문서의 공통점은 목차가 존재합니다. 스터디를 시작하면 아래와 같이 그룹원마다 체크리스트가 생깁니다. (참고로, 해당 테이블은 컬렉션 테이블이기 때문에 엔티티에 생명주기를 의존합니다.) 이정도면 그룹 시작 기능에 대해 어느 정도 이해가 되셨을거라고 생각합니다:) 목차 1. JPA의 쓰기 지연과 변경 감지 2. 벌크성 쿼리를 통한 개선 3. 성능 개선 요약 및 결정 JPA의 변경 감지와 ..
동시성 문제 - 원인과 해결 (2) 포스팅은 동시성 문제 - 재현 (1)에 의존합니다. 본 포스팅에서는 다음 세 가지를 다루겠습니다:) 목차 1. 경쟁 상태(Race Condition) 2. 데이터베이스 레벨의 동시성 문제 해결책(JPA/Hibernate 기준) 3. 정리 4. xuni 낙관적 락 채택 경쟁 상태(Race Condition) 경쟁 상태는 동시성 문제를 유발하는 원인 중 하나입니다. 아래는 스레드간 경쟁 상태가 발생하는 상황을 표현한 내용입니다. 한 트랜잭션이 커밋되기 이전에 트랜잭션 A, B가 공유 자원(Study Group)에 접근했습니다. 공유 자원에 접근했을 시점에 트랜잭션 A,B는 모두 Study Group의 left_capacity가 100을 가지게 됩니다. 이로 인해 두 트랜잭션 모두 비즈니스 로직을 실행(lef..
동시성 문제 - 재현 (1) 테스트 코드가 아닌 클라이언트 요청에 따른 동시성 문제를 재현해보려고 합니다. 목차 1. 환경세팅 2. API 간단 설명 3. 동시성 문제 발생 재현 환경세팅 준비물 : 포스트맨, 크롬 브라우저 1. 포스트맨 아래 사진에서 DDD, JPA 연습, xuni 등을 포스트맨에서는 Collection이라고 부릅니다. collection에는 반복 요청을 수행할 수 있는 기능이 존재합니다. API를 Collection에 저장을 마치고 Run collection 클릭합니다. 그러면 아래와 같은 화면이 나타날 것 입니다. iterations는 요청을 보낼 횟수를 말합니다. 이를 통해 반복 요청을 보낼 수 있습니다. 저는 포스트맨을 통해서 요청을 50번 보낼것이기 때문에 아래와 같이 설정하겠습니다. 2. 크롬 크롬은 간..
엑추에이터 접근이 제한된 상태에서 프로메테우스 설정 엑추에이터에는 중요한 정보들이 담길 가능성이 높습니다. 그래서 접근을 제한해야 합니다. 영한님의 스프링 부트 강의에 따르면 일반적으로 내부망을 사용해서 접근을 제한하거나 에플리케이션 단에서 보안 처리를 한다고 하셨다. 내부망을 설치하기에는 많이 빙빙 돌아가는 것 같아서 애플리케이션 단에서 처리해보겠습니다. 목차 1. 프로메테우스 의존성을 추가하자. 2. 프로메테우스에서 요청을 보낼 때 토큰을 보내는 방식 bearer_token 1. 프로메테우스 의존성을 추가하자. 지표를 못 받아오길래 뭔가 싶었다. 생각해보니 의존성을 추가하지 않았다. 머쓱.. 꼭 프로메테우스를 추가하자. implementation 'io.micrometer:micrometer-registry-prometheus' 2. 프로메테우스에서 ..
엑추에이터 엔드포인트에 인가를 부여하자! 엑추에이터 보안 처리를 하다가 마주한 문제를 공유해보려고 합니다. 목차 1. 엑추에이터의 필요성과 아주 조금 알아보기 2. 엑추에이터 보안 처리하기 엑추에이터의 필요성과 아주 조금 알아보기 엑추에이터를 활용하면 에플리케이션 모니터링을 쉽고 빠르게 할 수 있습니다. 쉽게 말해 톰캣 CPU 사용량, JVM 메모시 소모량, 커넥션 풀 상황 등을 쉽게 살펴볼 수 있습니다. 운영 단계가 아니더라도 개발 단계에 테스트를 거치면서 주요 자원들을 효과적으로 사용하고 있는지 여부를 확인할 때도 도움이 될 것이라고 생각합니다. 엑추에이터를 사용하려면 아래 의존성을 추가합니다. implementation 'org.springframework.boot:spring-boot-starter-actuator' 로컬에서 서버를 작동..
local DB H2에서 MySQL으로 변경 로컬 환경에서 개발할 때 H2 인메모리 DB를 주로 사용했는데요. 꺼림찍한 면과 한 가지 불편한 부분이 있어 MySQL로 변경합니다. 1. 온전히 테스트하기 힘들다. H2는 인메모리 DB기 때문에 조금 빠르지 않을까 하는 생각이 들어요. 응답 시간을 테스트할 때도 첫 요청 이후에는 응답 속도가 굉장히 빨라집니다. 인메모리 내부에 캐시가 설정되어 있나? 라는 추측... 2. 시작 데이터를 매번 넣기가 귀찮다. 물론 sql 파일을 작성해놓기 때문에 수기로 입력할 필요는 없지만 프로덕트 디렉토리 내부에 데이터를 주입하는 sql 파일이 있는게 조금 거슬렸어요. 테스트 환경에도 따로 셋팅을 해야되고 추후 서버를 배포할 때 요놈이 문제를 일으킬 것 같다는 생각이 들었습니다. 그럼 바로 설치해보고 프로젝트에 적용해봅..
Junit5 조금 알은 채 하기 (1) 사이드 프로젝트를 진행하고 있습니다. 사이드 프로젝트에서 중점을 둔 부분 중 하나는 효율적인 테스트입니다. Junit5와 관련된 자그맣지만 저는 몰랐었던 이야기를 해보려고 합니다. 목차 @ParameterizedTest AssertionThrowby, AssertThatCode @ParameterizedTest 사용 효과 : 테스트 코드 작성 시간 및 분량 감소로 개발 효율성 향상 및 이해하기 쉬운 테스트 코드에 기여 참고 소스 : Junit 5 공식 문서 Junit5 2.15. Repeated Tests 사용 방법 @ParameterizedTest는 @XxxSource 와 함께 작성해야 합니다. 위 예시를 @ParameterizedTest 를 사용하여 해결한 코드를 보여드리겠습니다. @ValueSour..