티스토리

개발 일지
검색하기

블로그 홈

개발 일지

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.
  • [우아한 티켓팅] 대기열 시스템 응답 시간 스파이크 해결하기 들어가기에 앞서본 게시글을 우아한 티켓팅 프로젝트의 대기열 시스템 성능 개선에 관한 이야기를 다룹니다. 이전 게시글 [우아한 티켓팅]대기열 시스템 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.
  • 직접 구현한 스텁으로 이상적인 테스트 작성하기 들어가기에 앞서본 게시글은 이상적인 테스트를 작성하기 위해 했던 저의 고민과 결론을 공유하는 것에 목적을 두고 있습니다. Java, Spring 환경에서 테스트를 작성해본 경험이 있는 분들을 대상 독자로 하고 있으며 배경 지식을 위해 테스트 더블에 대해서 먼저 정리합니다. 다만, 저의 고민과 결론에 부족한 부분이 있을 수 있습니다. 부족한 부분은 지적해주시고 너그럽게 봐주시길 부탁드립니다.본 게시글은 우아한테크캠프에서 미니 세미나를 통해 동기 교육생들에게 공유한 내용을 블로그 게시글의 형태로 정리한 것입니다. 이전에 동일한 내용을 가지고 작성했던 게시글이 존재하나 우아한테크캠프의 특강 중 하나인 "테크니컬 라이팅"에서 배운 내용을 적용, 불필요한 내용을 제거하고 퇴고를 거쳐 다시 작성한 게시글입니다. 이.. 공감수 1 댓글수 0 2024. 8. 5.
  • 테스트 더블, 목과 스텁 이야기 얼마 전, 우아한테크캠프에 참여하며 미니 세미나를 통해 테스트 더블과 이상적인 단위 테스트를 작성하기 위해 했던 고민을 다른 사람들과 공유하였습니다. 본 게시글을 통해 당시 진행했던 세미나의 내용을 글로써 정리하고 다시 한 번, 이 글을 읽으실 분들과 저의 고민을 공유해보고자 합니다.테스트 더블스턴트 더블이 장면을 보신적이 있나요?이 장면은 미션 임파서블 폴아웃의 오프닝 시퀀스의 장면 일부를 따온 것으로, 톰 크루즈가 이륙하는 실제 비행기에 매달려서 스턴트를 소화하고 있는 모습입니다. 보시는 바와 같이 톰 크루즈는 이런 위험한 스턴트 장면도 대역 없이 직접 소화하는 것으로 유명한 배우입니다. 보통은 실제 배우 대신 스턴트 장면을 대신 촬영할 위한 전담 대역을 두는 것이 일반적입니다. 위 사진은 드웨인 .. 공감수 2 댓글수 0 2024. 7. 8.
  • 테스트 더블과 mock 객체 사용 시 주의점 그동안 프로젝트를 진행하고 테스트 코드를 작성하면서 협력하는 객체들은 주로 목킹(mocking)을 했습니다. 실제 구현체 대신 목 객체를 사용하면서 개인적으로 느끼는 바가 있었습니다. 이번 글에서는 테스트 더블 4가지와 느낀 점에 대해 한 번 정리해보려 합니다. 테스트 더블(Test Double) 테스트 더블(테스트 대역)은 프로덕션 코드에서 실제 상호작용하는 객체 대신 테스트 코드에서 사용하는 가짜 객체들을 뜻합니다. 영화의 스턴트맨처럼 테스트 코드에서 실제 객체 대신 활약하는 스턴트맨의 역할을 수행합니다. 목(Mock) 목은 객체가 기대한 대로 상호작용하는지 확인하기 위한 객체입니다. 자바에서는 Mockito를 이용하면 쉽게 목 객체를 생성할 수 있습니다. @ExtendWith(MockitoExten.. 공감수 0 댓글수 1 2024. 1. 27.
  • 프로젝션, 인덱스로 조회 성능 개선하기(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.
  • 낙관적 락, 데드락, 비관적 락 애니프렌즈 프로젝트는 봉사 모집 기능을 통해 봉사자들이 봉사 신청을 수행할 수 있습니다. 이 때, 각 봉사는 제한 인원이 정해져 있기 때문에 여러 인원이 한 번에 봉사 신청을 수행할 경우 제한 인원보다 많은 인원이 봉사 신청을 수행할 수 있습니다. 이러한 동시성 문제를 해결하기 위해서는 낙관적 락 또는 비관적 락을 이용해서 적절하게 처리해 줄 필요가 있습니다.저희 팀은 봉사 신청이 몰리는 인기 보호소가 있을 것으로 가정하였습니다. 따라서 빈번한 트랜잭션 충돌이 발생할 것이고, 낙관적 락을 사용하는 경우 서로 다른 트랜잭션이 공유락과 배타락을 획득하는 과정에서 데드락이 발생할 것이다라고 예측하였습니다. 다만 아직 데드락이 발생하는 상황을 직접 확인해 본 적이 없었기에 직접 두 눈과 손으로 확인해보고.. 공감수 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.
  • 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.
  • Parameter와 Argument 0. 기본적인 개념에 확신이 없어서는 안 된다. 제대로 정리하지 않아 애매하게 알고 있었던 Parameter와 Argument에 대해 제대로 정리하고 넘어가도록 한다. 1. Parameter 파라미터는 함수에 입력으로 제공되는 데이터 중 하나를 참조하기 위하여 함수에서 사용되는 특수한 종류의 변수입니다. 일반적으로 메서드의 시그니처(메서드 선언)에 파라미터의 목록이 포함됩니다. add라는 메서드를 정의해보겠습니다.public int add(int x, int y) { return x + y; } 이 때 x와 y가 파라미터, 즉 매개변수가 됩니다. 2. Argument 아규먼트, 즉 인수는 메서드 호출시 실제 입력으로 제공되는 값 입니다. 매번 메서드가 호출될 때마다 연관된 매개변수에 인수가 할당됩니다. .. 공감수 0 댓글수 0 2023. 6. 20.
  • [디자인 패턴] 옵저버 패턴 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one to many) 의존성을 정의합니다. 옵저버 패턴은 주제(Subject)와 옵저버(Observer) 간의 일대다 관계로 구성됩니다. 주제의 상태가 바뀌면 옵저버에게 정보가 제공됩니다. public interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObserver(); } public interface Observer { void update(); } Subject 인터페이스 옵저버를 등록하고, 삭제하고, 상태가 변화했음을 알립니다. Observer.. 공감수 0 댓글수 0 2023. 6. 19.
  • [디자인 패턴] 싱글턴 패턴 1. 싱글턴 패턴이란 싱글턴 패턴은 클래스 인스턴스를 하나만 만들고, 해당 인스턴스로의 전역 접근 방법을 제공합니다. 클래스에서 하나뿐인 인스턴스를 관리하도록 만듭니다. 다른 클래스에서는 해당 클래스의 인스턴스를 생성하지 못하도록 생성자는 private으로 설정합니다. 싱글턴 패턴을 적용한 클래스는 어디서든 해당 인스턴스에 접근할 수 있도록 전역 접근 방법을 제공합니다. 인스턴스가 필요할 때 해당 클래스에 요청을 하면 하나뿐인 인스턴스를 건네주도록 만듭니다. 싱글턴은 게으른 방식(lazy instantiation)으로 구현할 수 있습니다. 실제로 해당 인스턴스가 필요한 시점에 생성하도록 하여 불필요한 리소스의 낭비를 줄일 수 있습니다. 2. 싱글턴 패턴을 구현하는 방법 고전적인 방법 아래는 고전적인 싱글.. 공감수 0 댓글수 0 2023. 6. 11.
  • 단위 테스트를 위한 Mockito 사용법 목 객체 생성하기 Mockito.mock() 메서드를 사용하면 목 객체를 생성할 수 있습니다. 목 객체는 클래스, 인터페이스, 추상 클래스 어떤 것이든 대상으로 설정이 가능합니다. MemberRepository repositroy = Mockito.mock(MemberRepository.class); 목 객체를 좀 더 쉽게 만들려면 JUnit5 확장 기능을 사용하면 됩니다. 이를 사용하면 일일이 mock() 메서드를 사용할 필요 없이 필드에 @Mock 애노테이션만 붙이면 자동으로 목 객체를 생성해 줍니다. @ExtendWith(MockitoExtension.class) public class MemberServiceTest { @Mock private MemberRepository repository; .. 공감수 0 댓글수 0 2023. 6. 6.
  • Gradle에 대한 짧은 정리 Gradle이란 무엇인가? Gradle은 소프트웨어를 빌드하는데 사용하는 오픈 소스 빌드 자동화 도구입니다. .java 파일을 하나를 실행하기 위해서는 javac 명령어를 통해 컴파일하고, 컴파일을 통해 생성된 바이트 코드를 java 명령어를 통해 실제로 실행시켜야 합니다. 만일 작성한 소스 코드에서 외부 라이브러리를 사용하는 경우에는 실행시에 외부 라이브러리의 경로 역시 함께 전달해주어야 합니다. Gradle과 같은 빌드툴을 사용하면 빌드, 테스트, 패키징 등과 같은 애플리케이션을 만들기 위한 다양한 작업을 자동화 할 수 있습니다. Gradle 프로젝트 만들기 gradle init gradle init 명령어를 콘솔에 입력하면 프로젝트 Gradle 프로젝트를 만들기 위한 초기화를 진행합니다. 저는 자바.. 공감수 0 댓글수 1 2023. 6. 4.
  • [nGrinder] 부하 테스트 해보기 0. 본 게시글에서는 성능 테스트 도구인 nGrinder에 대해서 알아보고 직접 사용해보겠습니다. 1. nGrinder란 https://github.com/naver/ngrinder nGrinder는 스크립트 작성, 테스트 실행, 모니터링, 보고서 생성까지 해주는 스트레스 테스트를 위한 플랫폼입니다. 테스트 스크립트를 생성하고 테스트 실행을 수행하는 웹 애플리케이션인 nGrinder controller와 부하를 생성하는 가상 유저 생성기인 nGrinder agent 2가지 요소로 구성되어 있습니다. 2. 설치 Docker를 이용하여 설치를 진행해보겠습니다. $ docker pull ngrinder/controller $ docker run -d -v ~/ngrinder-controller:/opt/ngr.. 공감수 0 댓글수 0 2023. 5. 22.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

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

    © Kakao Corp.