개발 나누고 더하기
-
모니터링 체계 구축 - Spring Actuator, Prometheus, Grafana개발 나누고 더하기/자바, 스프링 2024. 2. 15. 22:50
들어가며 이전 글에서 간단한 스프링부트 애플리케이션을 만들어 보고(https://baby-care-dev.tistory.com/65), 이걸 도커 이미지로 만드는 템플릿까지 작성(https://baby-care-dev.tistory.com/66)해 보았다. 이제 부하 테스트 시 지표를 분석(시각화)하는 틀만 만들면 된다. 사실 jMeter나 nGrinder 같은 도구를 사용하면 관련 지표를 시각화해서 보여주긴 하지만, 운영 환경에서와 동일한 지표를 보고 싶기 때문에 운영 환경과 동일한 모니터링 체계를 로컬에 구축하려는 것이다. 우리 회사에서는 Spring Actuator, Prometheus, Grafana로 모니터링하므로 똑같이 구성해주면 된다. 그럼 부하 테스트를 통해 나온 지표를 참고하여 트래픽이 ..
-
스프링 가이드 - 간단한 RESTful API 만들어보기개발 나누고 더하기/자바, 스프링 2024. 2. 13. 11:38
들어가며 토비의 스프링 유튜브 채널(https://www.youtube.com/watch?v=wlOR5ehWSjE&list=PLv-xDnFD-nnnZUzISvE6a8JnKZme-tRGU&index=2)에서 스프링 가이드를 따라하며 15분 만에 API만드는 예제가 있어 나도 따라해보았다. 다른 목적도 하나 있는데, 부하 테스트용 샘플 API가 필요했다. 새로 입사한 회사에서 백엔드팀 전체 부하테스트를 했었다. 환경 설정에 힘들어하는 주니어들도 있고 일관된 테스트 환경과 지표 분석을 위해 애플리케이션과 그라파나를 도커로 구성하는게 좋을 것 같았다. 일단 집에서 도커 테스트 환경을 만들고 회사 프로젝트에 적용할 계획이다. 준비물 IDE와 JDK - 여기선 IntelliJ Community Edtion과 자바..
-
leetcode easy - Palindrome Number개발 나누고 더하기/코딩 테스트 2023. 7. 30. 15:26
문제 Given an integer x, return true if x is a palindrome, and false otherwise. Integer x가 주어졌을 때 이게 회문인지 검사하는 코드를 만들어야 한다. 121은 거꾸로해도 121이라 true, -121은 거꾸로하면 121- 이라 false, 10은 거꾸로하면 01이라 false가 된다. palindrome은 회문이라는 뜻이며, 어떤 단어나 구를 거꾸로해도 원본과 같은 경우를 일컫는다. 예를 들면 우영우, 기러기, 토마토, 스위스, 인도인, 별똥별과 같은 단어가 있다. 예전에 모기업에 지원할때 코딩테스트 문제로도 나왔어서 쉬운 문제임에도 불구하고 리뷰해보았다. 제약 사항 -2의31승 -1
-
Rest API 설계 기본 팁 : 계층 구조에 대한 식별자를 명확히 하기개발 나누고 더하기/기타 2023. 7. 25. 22:28
시스템을 설계하다보면 1:1 또는 1:N 관계로 계층 모델이 많이 나온다. 이커머스를 예로 들면 상품과 하위 아이템인 경우인데, 상품에 상품명(PSG 이강인 티셔츠), 상세 설명(상세 이미지)와 같은 정보를 담고, 이 상품을 참조하는 아이템에는 사이즈(S, M, L)와 재고 등을 담는 구조이다. 백오피스 같은 관리 시스템에서 상품과 아이템별로 관리해야 하는 요구가 있다고 치자. 이를 조회하는 API 스펙은 대충 다음과 같이 나올 수 있다. 상품 조회 API url : {host}/api/v1/goods/{id} method : GET param : id - 상품 ID response : name - 상품명, description - 상세 설명 아이템 조회 API url : {host}/api/v1/goo..
-
이펙티브 자바 : 제네릭과 배열 그리고 리스트개발 나누고 더하기/자바, 스프링 2023. 7. 6. 21:37
배열과 제네릭 타입에는 중요한 차이가 두 가지 있다. 첫 번째, 배열은 공변(covariant)이다. 어려워 보이는 단어지만 뜻은 간단하다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다(공변, 즉 함께 변한다는 뜻이다). 반면, 제네릭은 불공변(invaraint)이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. 이것만 보면 제네릭에 문제가 있다고 생각할 수도 있지만, 사실 문제가 있는 건 배열 쪽이다. 다음은 문법상 허용되는 코드다. 하지만 다음 코드는 문법에 맞지 않는다. 어느 쪽이든 Long용 저장소에 String을 넣을 수는 없다. 다만 배열에서는 그 실수를 런타임에야 알게..
-
이펙티브 자바 : toString개발 나누고 더하기/자바, 스프링 2023. 6. 30. 21:16
toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다. 아래 PhoneNumber 클래스를 예로 들면 PhoneNumber@adbbd처럼 단순히 클래스_이름@16진수로_표시한_해시코드로 반환하기 보다는 707-867-5309처럼 전화번호를 직접 알려주는 형태가 훨씬 유익하다. 또한 toSting의 규약은 "모든 하위 클래스에서 이 메서드를 재정의하라"고 한다. 새겨들어야 할 조언이다. public final class PhoneNumber { private final int areaCode, prefix, lineNum; //... } toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. toStr..
-
이펙티브 자바 - equals & hashcode개발 나누고 더하기/자바, 스프링 2023. 6. 28. 22:29
equals와 hashcode는 루트 클래스인 Object에서 제공하는 오퍼레이션이고 모든 클래스들은 이 두 메서드를 재정의하지 않는 이상 Object에 정의되어 있는대로 쓰게 된다. 실무에서는 주로 식별자로 두 객체가 동일한지 비교하고 가끔 값 객체 비교에 써서 equals를 직접 구현했던 일이 적었다. HashMap, HashSet에 key로 enum이나 Integer, String같은 기본 랩퍼 클래스를 써서 hashcode는 볼일이 거의 없었지만 이 기회에 다시 한번 짚어보는것도 좋을 것 같다. equals는 일반 규약을 지켜 재정의하라 equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어서 자칫하면 끔찍한 결과를 초래한다. 문제를 회피하는 가장 쉬운 길은 아예 재정의하지 않..
-
Set에 대하여 2 : 주요 구현체개발 나누고 더하기/자바, 스프링 2023. 6. 25. 22:59
이전 글(https://baby-care-dev.tistory.com/47)에서는 Set의 구조와 메서드에 대해 알아봤다. 메서드 동작은 알았지만 구현체별로 어떻게 내부가 처리되는지도 궁금하다. 예를 들면 TreeSet이나 LinkedHashSet은 어떻게 순서를 보장하는지 등 말이다. 이번에는 구현체별 특징과 공통점/차이점에 대해 알아보자. Set 상속 구조 위 그림에 나온 구현체들 보다 많은 구현 클래스들이 존재하는데, 일단 이정도만 알아도 될 듯 싶다. 모두 공통적으로 AbstractSet이라는 추상 클래스를 상속받고 있다. 이 AbstractSet에서 추상화된 공통점을 파악할 수 있으니 먼저 알아보자. AbstractSet 제공하는 메서드는 equals, hashCode, removeAll이다. ..