티스토리

개발 일지
검색하기

블로그 홈

개발 일지

hseong.tistory.com/m

hseong 님의 블로그입니다.

구독자
1
방명록 방문하기

주요 글 목록

  • [Datadog 삽질기] Observability와 Trace 알아보기 들어가기에 앞서최근 담당하고 있는 서비스에 모니터링 도구인 Datadog을 도입했습니다. 대부분은 DevOps에서 설정을 잡아주고 Datadog agent가 자동으로 계측을 수행해서 손댈 것이 없었습니다. 메트릭도 자동으로 측정되고 api 요청, 스케줄러 실행 모두 잘 계측되었습니다. 딱 하나 이벤트 컨슈머를 제외하고요. 나중에 알고 보니 이벤트 컨슈머도 잘 계측되고 있었지만 Datadog의 특정 기능으로 인해 찾아보기가 어려웠습니다.이러한 배경에서 본 게시글은 Datadog 도입 과정에서 있었던 삽질을 기록하기 위해 작성했습니다. 그 첫번째 기록으로 Observability란 무엇인지, Observability를 구성하는 핵심 요소, 그리고 Trace에 대해 조금 더 알아본 내용을 기록합니다.학습은 O.. 공감수 0 댓글수 0 2025. 4. 20.
  • Jackson record 역직렬화 예외 can not set final 요약ObjectMapper의 PropertyNamingStrategy SNAKE_CASE로 설정한 뒤 record 클래스의 역직렬화를 시도했을 때 해당 예외가 발생이 외에도 @JaonNaming 등 NamingStrategy를 변경하고 record 클래스를 역직렬화하는 경우에 해당 예외가 발생해당 문제는 Jackson 라이브러리가 record 클래스를 지원하기 시작한 2.12 버전부터 해당 문제가 수정되기 이전인 2.15 버전 사이에 발생할 수 있음예외 발생 상황최근 실무를 접하면서 새로운 로직을 개발할 일이 있었습니다. 원격 저장소의 json 파일을 읽어들여 프로덕트 DB에 적재하는 일이었습니다. 해당 파일의 json 필드들은 스네이크 케이스(field_name)로 되어 있었고, bean으로 동록되어 .. 공감수 2 댓글수 1 2025. 1. 19.
  • 우아한테크캠프 7기 및 우형 최종 탈락 후기 들어가기에 앞서본 게시글은 올해 6월 21일부터 8월 30일까지 이루어진 우아한테크캠프 7기에 참여하며 제가 경험한 것, 배운 것에 대한 기록입니다. 우아한형제들 최종 면접에서 탈락한 후기도 짧게 다룰 예정입니다. 다만, 비밀유지서약서를 작성했기 때문에 면접 질문이나 상세한 절차는 다루지 않고 개인적인 감상정도만 다룰 생각입니다.이하의 기록은 회고의 성격을 가지지만 우아한테크캠프에서 어떤 것을 경험하는지 궁금하신 분들이 읽을 수도 있다는 생각하에 작성한 글입니다. 다만, 기수에 따라 교육 내용이 변경될 수도 있습니다.우아한테크캠프소켓 프로그래밍 과제 수행우아한테크캠프 전체 10주 중 초반 7주는 Java, JSP 과제를 수행했습니다. 이 과제들 중 가장 기억에 남는 것은 3주 동안 진행한 소켓 프로그래밍.. 공감수 6 댓글수 1 2024. 11. 20.
  • Jedis, Lettuce, Redisson. 레디스를 위한 세 가지 자바 클라이언트 세 가지 레디스 자바 클라이언트Jedis제디스(Jedis)는 동기식 작업을 지원하는 레디스 클라이언트입니다. 다른 클라이언트에 비해 간단하고 사용하기 쉬운 API를 제공합니다. 제디스 인스턴스는 스레드 안전(Thread-safe)하지 않기 때문에 멀티 스레드 환경에서 사용하려는 경우 제디스풀(JedisPool)을 사용해야 합니다.Lettuce레투스(Lettuce)는 동기, 비동기, 반응형 작업을 지원하는 레디스 클라이언트입니다. 제디스와 달리 스레드 안전하기 때문에 여러 스레드에서 안전하게 사용할 수 있습니다.Redisson레디슨(Redisson)은 다양한 분산 객체를 제공하는 레디스 클라이언트입니다. 다른 두 클라이언트가 레디스의 기본 자료구조를 다루는 API만 제공하는 데 비해 레디슨은 분산된 환경에.. 공감수 1 댓글수 1 2024. 10. 30.
  • [우아한 티켓팅] 대기열 시스템 응답 시간 스파이크 해결하기 들어가기에 앞서본 게시글을 우아한 티켓팅 프로젝트의 대기열 시스템 성능 개선에 관한 이야기를 다룹니다. 이전 게시글 [우아한 티켓팅]대기열 시스템 10,000명 부하 테스트하기를 통해 어떻게 부하 테스트를 했고, 결과가 어땠는지를 다뤘습니다. 해당 게시글에 이어서 이번에는테스트 결과를 살펴보던 중 발견한 응답 시간 스파이크원인 분석과 개선에 대해 다룹니다.응답 시간 스파이크 발견우아한 티켓티의 대기열 시스템은 [우아한 티켓팅]대기열 시스템 10,000명 부하 테스트하기에서 다룬 것과 것 부하 테스트를 통해 10,000명을 견딜 수 있는지 검증했습니다. 결과는 다음과 같았습니다.가상 사용자 2,500명, 테스트 시간 5분, 1초 주기 폴링일 때 95%의 요청을 600ms 내로 처리가상 사용자 10,000명.. 공감수 2 댓글수 4 2024. 10. 6.
  • [우아한 티켓팅] 대기열 시스템 10,000명 부하 테스트하기 들어가기에 앞서본 게시글은 우아한 티켓팅 프로젝트의 대기열 시스템 성능 측정에 관한 이야기를 다룹니다. 이전 게시글 [우아한 티켓팅]대기열 시스템 설계하기의 내용을 바탕으로 저희 팀은 Java 자료 구조를 이용한 대기열, Redis를 이용한 대기열을 구현하였습니다. 팀의 목표 중 하나인 10,000명을 견딜 수 있는 대기열 시스템을 검증하기 위해테스트 환경은 어떻게 구성했는지테스트 결과는 어떗는지에 대해 기록을 남기려 합니다.부하 테스트 환경 구성테스트 시나리오테스트 대상 시스템은 대기열 시스템입니다. 다른 기능과 섞어서 성능을 측정하기 보다는 대기열 시스템 자체의 성능만을 측정하기 위해 시나리오는 다음과 같이 구성했습니다.사용자 인증 정보 획득을 위한 사용자 로그인 JWT 토큰 생성티켓팅의 시작점 인 .. 공감수 3 댓글수 4 2024. 9. 29.
  • [우아한 티켓팅] 친절한 대기열 시스템 설계하기 들어가기에 앞서본 게시글은 제가 참여했던 팀 프로젝트 우아한 티켓팅에서 대기열 시스템을 설계했던 이야기를 다룹니다. 상세한 구현보다는 저희가 원하는 대기열을 만들기 위해 했던 다음과 같은 고민들을 남기려 합니다.어디서 아이디어를 얻었는지아이디어를 구현으로 옮기기 위해서 어떤 문제를 해결해야 했는지짝(페어) 프로그래밍을 진행하며 객체 간 협력 구조를 어떻게 설계했는지설계 목표우아한 티켓팅의 대기열 시스템은 새로 고침해도 사용자의 순서를 유지하는 친절한 대기열 시스템을 목표로 합니다.사용자의 실수, 지루함에 의한 새로고침 클릭 정도는 용인해주어 사용자 경험을 향상시킵니다.아이디어현실 세계에서 순서를 유지하는 대기열은 은행이나 식당 대기열에서 찾아볼 수 있었습니다. 예를 들어 은행의 대기 시스템은 다음과 같은.. 공감수 0 댓글수 0 2024. 9. 24.
  • 직접 구현한 스텁으로 이상적인 테스트 작성하기 들어가기에 앞서본 게시글은 이상적인 테스트를 작성하기 위해 했던 저의 고민과 결론을 공유하는 것에 목적을 두고 있습니다. Java, Spring 환경에서 테스트를 작성해본 경험이 있는 분들을 대상 독자로 하고 있으며 배경 지식을 위해 테스트 더블에 대해서 먼저 정리합니다. 다만, 저의 고민과 결론에 부족한 부분이 있을 수 있습니다. 부족한 부분은 지적해주시고 너그럽게 봐주시길 부탁드립니다.본 게시글은 우아한테크캠프에서 미니 세미나를 통해 동기 교육생들에게 공유한 내용을 블로그 게시글의 형태로 정리한 것입니다. 이전에 동일한 내용을 가지고 작성했던 게시글이 존재하나 우아한테크캠프의 특강 중 하나인 "테크니컬 라이팅"에서 배운 내용을 적용, 불필요한 내용을 제거하고 퇴고를 거쳐 다시 작성한 게시글입니다. 이.. 공감수 1 댓글수 0 2024. 8. 5.
  • 테스트 더블, 목과 스텁 이야기 얼마 전, 우아한테크캠프에 참여하며 미니 세미나를 통해 테스트 더블과 이상적인 단위 테스트를 작성하기 위해 했던 고민을 다른 사람들과 공유하였습니다. 본 게시글을 통해 당시 진행했던 세미나의 내용을 글로써 정리하고 다시 한 번, 이 글을 읽으실 분들과 저의 고민을 공유해보고자 합니다.테스트 더블스턴트 더블이 장면을 보신적이 있나요?이 장면은 미션 임파서블 폴아웃의 오프닝 시퀀스의 장면 일부를 따온 것으로, 톰 크루즈가 이륙하는 실제 비행기에 매달려서 스턴트를 소화하고 있는 모습입니다. 보시는 바와 같이 톰 크루즈는 이런 위험한 스턴트 장면도 대역 없이 직접 소화하는 것으로 유명한 배우입니다. 보통은 실제 배우 대신 스턴트 장면을 대신 촬영할 위한 전담 대역을 두는 것이 일반적입니다. 위 사진은 드웨인 .. 공감수 2 댓글수 0 2024. 7. 8.
  • [MySQL] B-Tree 인덱스 디스크 읽기 방식랜덤 I/O와 순차 I/O랜덤 IO와 순차 IO 모두 하드 디스크 드라이브의 플래터를 돌려 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것은 동일합니다.그러나 순차 IO가 3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜을 호출한다면, 랜덤 IO는 3번의 시스템 콜을 호출합니다. 즉, 디스크 헤드를 3번 움직이며 3배의 속도 차이가 발생합니다.쿼리를 튜닝해서 랜덤 IO를 순차 IO로 바꾸는 방법은 많지 않습니다. 쿼리 튜닝의 목적은 랜덤 IO 자체를 줄이는 것이며 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미합니다.인덱스란인덱스란 컬럼의 값과 해당 레코드가 저장된 주소를 키-값 쌍으로 만들어 둔 것을 의미합니다. 컬럼의 값을 기준으로 정렬해서 보관하기 .. 공감수 2 댓글수 0 2024. 6. 18.
  • 스프링 @Retry를 이용한 재시도 처리하기 Spring RetrySpring Retry 프로젝트는 스프링 애플리케이션에 대해 명령형 또는 선언적 재시도 처리를 지원합니다. 의존성이를 사용하기 위해서는 다음의 의존성을 추가해주어야 합니다. Spring Retry는 스프링 AOP를 이용하여 선언적 방식을 제공합니다. 따라서 AOP 의존성이 필요하며 다른 스타터 의존성에 AOP 의존성도 포함되어있다면 생략해도 됩니다.implementation 'org.springframework.boot:spring-boot-starter-aop'implementation 'org.springframework.retry:spring-retry'Retryable사용 방식은 간단합니다. 별도의 configuration에 @EnableRetry를 추가한 뒤, 재시도 처리를.. 공감수 0 댓글수 0 2024. 6. 12.
  • 스프링 @Async를 이용한 비동기 실행 적용하기 Spring Async@Async비동기 실행을 위한 @Async를 사용하기 위해서는 먼저 적당한 @Configuration 클래스에 @EnableAsync를 추가해주어야 합니다.@EnableAsync @Configuration public class AsyncConfig {}그런 다음 비동기적으로 실행되길 원하는 메서드에 @Async 어노테이션을 추가하면 됩니다. 다음은 Spring Event의 이벤트 리스너의 비동기 실행을 적용하기 위해 @Async를 사용하는 코드입니다.@Async @TransactionalEventListener public void createDefaultLinkBundle(CreateMemberEvent event) { CreateLinkBundleCommand.. 공감수 0 댓글수 1 2024. 6. 11.
  • [MySQL] InnoDB 스토리지 엔진 아키텍처 InnoDB 스토리지 엔진 아키텍처프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 프라이머리 키를 기준으로 클러스터링되어 저장됩니다. 따라서 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용합니다.쿼리의 실행 계획에서 클러스터링 된 프라이머리 키는 기본적으로 세컨더리 인덱스에 비해 비중이 높게 설정됩니다.외래 키 지원InnoDB에서 외래 키는 부모 테이블과 자식 테이블 모두 해당 컬럼에 인덱스 생성이 필요하고, 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 체크하는 작업이 필요하므로 잠금이 여러 테이블로 전파됩니다. 그로 인해 데드락이 발생할 때가 많으므로 개발할 때도 외래 키의 존재에 주의해야 합니다.외래 키가 복잡하게 얽혀있는 경우 데.. 공감수 0 댓글수 0 2024. 6. 9.
  • [MySQL] MySQL 엔진 아키텍처 MySQL 스레딩 구조MySQL 서버는 스레드 기반으로 작동하며, 포그라운드(Foreground)와 백그라운드(Background) 스레드로 구분할 수 있습니다.포그라운드 스레드(클라이언트 스레드)포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재하며, 각 클라이언트가 요청하는 쿼리 문장을 처리합니다. 클라이언트가 작업을 마치고 커넥션을 종료하면 스레드는 스레드 캐시(Thread cache)로 돌아갑니다.스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드를 종료시켜 일정 개수의 스레드만 유지합니다. 스레드 캐시에 유지할 수 있는 최대 스레드 개수는 thread_cache_size 시스템 변수로 결정합니다.포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로.. 공감수 0 댓글수 0 2024. 6. 9.
  • 스프링에서 외부 API 호출을 테스트하는 방법(feat. RestClient) RestClient는 Spring 6.1 버전부터 추가된 동기식 HTTP 클라이언트로 기존의 동기식 HTTP 클라이언트인 RestTemplate에 비해 훨씬 더 현대적인 API를 제공합니다.RestClient의 테스트 방법을 찾던 중 유효하게 사용할 수 있는 두 가지 방법에 대해 알게 되어 기록합니다. @RestClientTest@RestClientTest를 사용하면 Jackson, GSON 등의 클라이언트 테스트와 관련된 bean 구성만 적용하여 최소한의 컨텍스트로 테스트가 실행됩니다.이 때, 테스트를 위해 사용하는 MockRestServiceServer와 RestClient가 바인드되어야 하기 때문에 RestClient를 사용하는 bean은 생성자에서 RestClient.Builder를 파라미터로 .. 공감수 0 댓글수 0 2024. 5. 20.
  • [MySQL] 옵티마이저의 데이터 처리 방식 MySQL은 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장되어 있는지 통계 정보를 참조합니다. 그러한 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요합니다.쿼리 실행 절차MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나누어질 수 있습니다.사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이애할 수 있는 수준으로 분리(파스 트리)한다.SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.이 중 두 번째 단계가 "최적화 및 실행 계획 수립" 단계로 옵티마이저가 처리합니다. 이 단.. 공감수 1 댓글수 2 2024. 5. 15.
  • Java의 데이터 입출력 스트림 코딩 테스트 연습할 때를 제외하면 Java의 스트림을 이용하여 직접 입출력 코드를 작성하는 경우가 드물었던 것 같습니다. 그런만큼 Java의 스트림을 통한 데이터 입출력에 대해 리마인드하고 부족했던 부분이 있었다면 채워넣을 겸 정리하는 시간을 가져보려 합니다.입출력 스트림자바에서 데이터 입출력은 스트림을 통해서 이루어집니다. 스트림(stream)은 단방향으로 데이터가 흐르며 키보드, 파일, 프로그램 등 다양한 출발지로부터 입력되고 모니터, 파일, 프로그램 등 다양한 도착지로 출력됩니다.프로그램을 기준으로 데이터가 들어오는 것을 입력 스트림(InputStream), 데이터가 나가는 것을 출력 스트림(OutputStream)이라 합니다. 프로그램이 다른 프로그램과 데이터를 교환하기 위해서는 입력.. 공감수 0 댓글수 0 2024. 4. 24.
  • SOLID 원칙 SOLID 원칙은 우리에게 좋은 소프트웨어 구조를 만들기 위한 원칙을 제공해줍니다. 클린 아키텍처에 따르면 SOLID 원칙의 목적은 중간 소프트웨어 구조가 다음과 같도록 만드는 데 있습니다. 변경에 유연하다. 이해하기 쉽다. 많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트의 기반이 된다. SOLID는 이를 구성하고 있는 다섯 가지 원칙의 첫 번째 글자들로 만든 단어입니다. 이는 다음과 같은 원칙들로 구성되어 있습니다. 단일 책임 원칙(Single Responsibility Principle, SRP) 각 소프트웨어 모듈은 오직 하나의 책임만 가져야 한다. 개방-폐쇄 원칙(Open-Closed Principle, OCP) 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에.. 공감수 0 댓글수 0 2024. 3. 23.
  • CORS는 왜 필요할까? CORS란 교차 출처 리소스 공유(Cross Site Resource Sharing, CORS)는 애플리케이션을 통합하기 위해 서로 다른 출처 간 요청을 허용하기 위한 메커니즘입니다. 기본적으로 모든 브라우저는 보안 상의 이유로 동일 출처 정책(SOP)을 구현하고 있으며 이로 인해 교차 출처 리소스 공유라는 별도의 메커니즘을 이용하여야 합니다. CORS는 웹 어플리케이션 개발자라면 기본적으로 숙지해야 하는 내용입니다. 왜 동일 출처의 요청만을 허용하게 되었는지, 다른 출처의 요청을 허용하기 위한 CORS의 기본 메커니즘이 어떻게 되는지 알아야합니다. 왜 다른 출처의 요청을 허용하지 않는가? 과거에는 프론트엔드, 백엔드의 구분 없이 요청을 처리하고 브라우저를 렌더링하였습니다. 시간이 흐르면서 프론트엔드와 .. 공감수 0 댓글수 0 2024. 3. 17.
  • 스프링 이벤트(Spring Event) 사용해보기 스프링 이벤트를 사용하면 관심사를 분리하고 패키지 간의 의존성을 줄일 수 있습니다. 개인 프로젝트를 진행하면서 이래저래 사용하고 있어 짤막하게 정리해보려고 합니다. 1. 스프링 이벤트 개요 다음의 내용은 스프링 공식 문서 Standard and Custom Events 항목의 소개를 번역한 것입니다. ApplicationContext의 이벤트 핸들링은 ApplicationEvent 클래스와 ApplicationListener 인터페이스를 통해 제공됩니다. ApplicationListener 인터페이스를 구현하는 bean이 컨텍스트를 통해 배포되면 ApplicationEvent가 컨텍스트에 발행될 때마다 bean이 알림을 받습니다. 이는 표준 옵저버 디자인 패턴입니다. 스프링 이벤트의 발행은 이벤트를 발행.. 공감수 0 댓글수 0 2024. 2. 12.
  • 테스트 더블과 mock 객체 사용 시 주의점 그동안 프로젝트를 진행하고 테스트 코드를 작성하면서 협력하는 객체들은 주로 목킹(mocking)을 했습니다. 실제 구현체 대신 목 객체를 사용하면서 개인적으로 느끼는 바가 있었습니다. 이번 글에서는 테스트 더블 4가지와 느낀 점에 대해 한 번 정리해보려 합니다. 테스트 더블(Test Double) 테스트 더블(테스트 대역)은 프로덕션 코드에서 실제 상호작용하는 객체 대신 테스트 코드에서 사용하는 가짜 객체들을 뜻합니다. 영화의 스턴트맨처럼 테스트 코드에서 실제 객체 대신 활약하는 스턴트맨의 역할을 수행합니다. 목(Mock) 목은 객체가 기대한 대로 상호작용하는지 확인하기 위한 객체입니다. 자바에서는 Mockito를 이용하면 쉽게 목 객체를 생성할 수 있습니다. @ExtendWith(MockitoExten.. 공감수 0 댓글수 1 2024. 1. 27.
  • 오브젝트와 함께 한 객체 지향 스터디 마무리 회고 지난 6월 중순에 시작한 객체 지향 스터디가 종료되어 회고를 작성해보려 합니다. 사실 스터디가 종료된 것은 지난 11월 중순이나 그동안 프로젝트를 진행하고 배운 내용을 정리하면서 조금씩 미루다 보니 무려 한 달이 지나서야 작성을 하게 되었습니다. 지난 1차 스터디에서 이어지는 이번 스터디의 방식과 짧은 내용 정리, 생각보다 길어진 스터디 기간동안 느낀점에 정리하며 마무리하겠습니다. 스터디 방식 기간: 7월 18일 ~ 11월 14일 사용한 자료: 오브젝트 초기에는 스터디원이 돌아가면서 그 주 챕터에서 대해서 요약하여 발표하고 각자 어려웠던 점에 대해서 공유하는 시간을 가졌습니다. 그러나 어느정도 진행했을쯤 어차피 모두 읽고 오는 내용인데 정리는 각자 진행하고 어려웠던 부분, 각자 프로젝트를 진행하면서 고민.. 공감수 1 댓글수 0 2023. 12. 18.
  • 프로젝션, 인덱스로 조회 성능 개선하기(feat.ngrinder) 이전 일대다 페이지네이션 최적화하기에서 애니프렌즈 프로젝트의 코드 일부를 예로 들며 BatchSize와 프로젝션을 이용한 일대다 컬렉션 페이징 쿼리를 최적화하였습니다. 이후 QA를 진행하던 중 보호 동물 목록 조회에서 1000ms 이상의 시간이 소요되는 것을 인지하였습니다. 보호 동물 서비스는 애니프렌즈 프로젝트에서 메인에 노출되는 기능이기 때문에 사용자에게 최대한 빠른 응답을 돌려줄 수 있어야 합니다. public record FindAnimalResponse( Long animalId, String animalName, String shelterName, String shelterAddress, String animalImageUrl ) { public static FindAnimalResponse .. 공감수 0 댓글수 0 2023. 12. 16.
  • 일대다 페이지네이션 최적화하기 일대다 컬렉션에 대한 페치 조인과 페이지네이션을 함께 사용하는 경우 다음과 같은 로그를 확인할 수 있습니다. 일대다 조인을 수행하는 경우 다 쪽의 데이터만큼 결과 row가 증가하기 때문에 DB에서 페이지네이션을 수행할 수 없습니다. 하이버네이트는 메모리 상에서 페이징을 시도하게 되면서 applying in memory라는 경고 로그를 남깁니다. 이러한 페이지네이션을 개선하기 위해서는 다음 2가지 방법을 사용할 수 있습니다. BatchSize 프로젝션 + IN절 쿼리 -> 애플리케이션 상에서 조인 수행 BatchSize BatchSize를 사용하기 위해서는 hibernate.default_batch_size를 이용해 글로벌로 설정하거나 @BatchSize를 일대다 컬렉션에 추가하여 개별적으로 설정할 수 있.. 공감수 0 댓글수 0 2023. 12. 13.
  • 낙관적 락, 데드락, 비관적 락 애니프렌즈 프로젝트는 봉사 모집 기능을 통해 봉사자들이 봉사 신청을 수행할 수 있습니다. 이 때, 각 봉사는 제한 인원이 정해져 있기 때문에 여러 인원이 한 번에 봉사 신청을 수행할 경우 제한 인원보다 많은 인원이 봉사 신청을 수행할 수 있습니다. 이러한 동시성 문제를 해결하기 위해서는 낙관적 락 또는 비관적 락을 이용해서 적절하게 처리해 줄 필요가 있습니다.저희 팀은 봉사 신청이 몰리는 인기 보호소가 있을 것으로 가정하였습니다. 따라서 빈번한 트랜잭션 충돌이 발생할 것이고, 낙관적 락을 사용하는 경우 서로 다른 트랜잭션이 공유락과 배타락을 획득하는 과정에서 데드락이 발생할 것이다라고 예측하였습니다. 다만 아직 데드락이 발생하는 상황을 직접 확인해 본 적이 없었기에 직접 두 눈과 손으로 확인해보고.. 공감수 0 댓글수 1 2023. 12. 10.
  • 로그 세팅하기 2탄. 프롬테일, 로키, 그라파나 애니프렌즈 프로젝트에는 AOP와 로그백을 이용해서 클라이언트 요청과 예외를 로깅하고 로그 레벨 별로 파일을 출력하도록 설정하였습니다. 개발 환경에서 클라이언트와 통신하면서 발생하는 문제를 좀 더 쉽게 파악할 수 있을 것이라고 기대했지만 여전히 문제가 되는 부분이 있었습니다. 다음과 같이 로그 파일을 확인하기 위해서는 몇 번의 단계를 거쳐야 했는데 이것이 쌓이면서 피로감이 점점 커져갔습니다. 1. 문제 발생 2. ec2 연결 3. 로그 파일 출력 경로 이동 4. 레벨 별 로그 파일 확인 터미널을 통해 로그를 확인하는 것도 쉬운 일이 아니었습니다. 적어도 지금보다 더 쉽게 로그를 확인 할 수 있는 방법이 필요했습니다. Loki Loki는 Grafana에서 만들어진 로그 수집 시스템입니다. Prometheus.. 공감수 0 댓글수 1 2023. 12. 2.
  • 존재하지 않는 객체와 협력하기 로버트 C. 마틴의 저서인 클린 코드 8장 경계와 클린 아키텍처의 17장 경계: 선긋기에서는 코드와 코드 사이의 경계를 나누는 것의 중요성에 대해서 다루고 있습니다. 인상 깊었던 내용으로는 외부 API와 우리 코드 사이에 선을 긋고 인터페이스와 협력하며 코드를 우리 통제 하에 둬라, 아직 존재하지 않는 코드를 사용하기 위해 경계를 파악하라가 있습니다. 이번 애니프렌즈 프로젝트를 진행하며 아직 존재하지 않는 객체와 협력해야 하는 상황이 있었습니다. 마치 책에서 설명하던 것과 유사하였습니다. 그리고 해당 문제를 해결하기 위한 방법을 생각하며 책에서 설명한 내용에 대해서 약간은 더 이해할 수 있는 기회였기에 이에 대해서 정리하고자 합니다. 구현되지 않은 기능 사용하기 저희 팀은 이번 프로젝트를 기획하면서 이미.. 공감수 1 댓글수 1 2023. 11. 20.
  • 로그 세팅하기 지난 금요일, 애니프렌즈 프로젝트의 백엔드와 프론트엔드 API 연동을 시작했습니다. 하지만 중간 중간 api가 연동이 잘 안될 때마다 문제를 확인하기 위해 INFO, WARN 여러 레벨의 로그가 기록된 콘솔을 들여다보는 것은 번거로운 일이라는 것을 절실히 느꼈습니다. 따라서 이번 이슈를 해결함으로써 달성하고자 하는 목표는 두 가지 입니다. 첫째, 예외와 API 요청 로깅하기 둘째, 로그 레벨 별 파일로 출력하기 이를 통해 클라이언트로부터의 요청에 응답하는 과정에서 어떤 문제가 발생했는지 훨씬 쉽게 파악할 수 있을 것이라 기대합니다. AOP 적용하기 프로젝트 초기, 예외 상황에 대해서는 AOP를 통해 로그를 남기는 것으로 계획하였습니다. 그러나 이번에 프론트엔드와 연동을 진행하며 어떤 요청이 들어왔는지에 .. 공감수 0 댓글수 1 2023. 11. 19.
  • AWS CodeDeploy를 이용한 배포 성공 이후 발생하는 permission denied 개요 현재 제가 진행하고 있는 프로젝트인 애니프렌즈 백엔드의 개발 환경 배포는 Github Action + AWS S3 + CodeDploey로 이루어집니다. 배포 환경 설정을 위해 ec2 인스턴스에 S3와 CodeDeploy 접근 권한을 가진 역할을 부여하였고 CodeDeploy 역시 기본 생성 시 부여되는 권한을 가지고 있습니다. 문제는 배포까지 성공적으로 이루어졌음에도 애플리케이션이 실행되지 않았습니다. 원인 이유를 찾기 위해서 뒤져볼 로그는 /opt/codedeploy-agent/deployment-root/deployment-logs 디렉터리 하위의 codedeploy-agent-deployments.log 입니다. 로그를 읽기 위해 다음 명령어를 입력해줍니다. cat codedeploy-age.. 공감수 0 댓글수 0 2023. 11. 7.
  • @WebMvcTest와 테스트 코드 개선하기 개요 프로젝트를 진행 초기에 반복적인 테스트 실행을 위해서 해결해야 하는 문제점이 두가지 있다고 판단하였습니다. 첫째, 애플리케이션 컨텍스트 초기화 횟수를 줄여 테스트 시간을 개선할 것 둘째, 문서화 코드 중복을 줄일 것 저는 해당 문제를 해결하기 위해 테스트 코드를 최적화한 테스트 컨벤션을 제시하였습니다. 프로젝트 종료 후 테스트 수행 시간을 체크하였을 때 약 30% 정도 테스트 시간이 감소한 것을 확인할 수 있었습니다. 이번 게시글에서는 상기한 문제의 해결 방법에 대해서 다루겠습니다. 컨텍스트 캐싱 스프링 부트는 통합 테스트를 지원하기 위해 다양한 어노테이션을 지원합니다. @WebMvcTest는 표현 계층 통합 테스트를 지원하기 위한 어노테이션으로 Spring MVC를 구성하는 빈들을 스캔하여 어플리.. 공감수 0 댓글수 0 2023. 10. 4.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.