Java 71

모니터링 습관화하기

최근들어 근무시간에 틈이 날때마다 서버 모니터링을 습관화하려고 모니터링 솔루션을 이용해 자주 들여다보곤한다. 우리가 기대하는 서버의 히트맵은 아래와 같지만, 특정 API, 특정 로직, 특정 쿼리에 병목지점이 있다면 아래와 같이 히트맵이 위로 튀곤한다. 이걸 분석해서 병목지점을 해소하고 원인을 파악하는 재미가 은근 쏠쏠하다고 느꼈다. 대부분의 경우에는 정말 간단한 휴먼 에러의 경우가 많은 것 같은데, 이런 것들을 잡아내기 어려운 이유가 간헐적으로 발생하며 서버 모니터링을 주기적으로 하지 않는 이상 병목 지점이라는 것조차 느끼기 힘든 것 같다. 서버에 대해 에러 응답 비율이 높아지면 알림을 받을 수 있도록 별도의 설정을 하더라도 간헐적으로 발생하기 때문에 방치되는 경우가 많다. 실제로 모니터링 중 발견한 간..

TroubleShooting 2024.01.11

입사 첫 프로젝트 회고

😉 할만한데? 팀에 배치된지 얼마 되지 않았을 무렵 요구 사항이 팀으로 들어왔고 간단한 서비스였기 때문에(현재는 실 서비스가 아닌 사내에서 사용) 팀장님께서 업무 프로세스도 익힐 겸 사수님, 동기와 함께 프로젝트를 진행해보라고 하셨다. 진행될 프로젝트에 대한 기획 및 설계를 들으면서 처음에 들었던 생각은 "어? 할만한데?"였다. 간단히 프로젝트에 대해 설명하자면, DB 데이터에 대해 특정 Event가 발생하면 Kafka로부터 메시지가 발행되고 이를 Consume하여 서비스 로직을 수행하는 프로젝트이다. Event가 발생했을 때 특정 Topic으로 Kafka가 메시지를 발행하는 부분은 이미 다른 곳에서 구현되어 있어 이를 Consume하는 부분만 신규 프로젝트에서 만들면 됐기 때문에 크게 어려울 것 같지 ..

잡담/회고 2022.05.14

yml에서 List Object 사용법

yml에서 변수를 리스트 형식으로 사용하는 법 로컬환경, 개발환경, 상용환경으로 환경을 분리할 때, yml에 변수를 넣어두고 코드에서 불러와 사용하는 방법을 흔히 사용하곤 한다. person: name: '민철' 이런 방식으로 말이다. 사용하는 쪽에서는 아래와 같다. @Value("${person.name:}) private String name; 추가적으로 yml은 List나 Map과 같은 다양한 데이터 유형을 지원하고 있다. programming: language: - C - Java - Python - JavaScript 이를 가져오려면 @Value("${programming.language[0]:}") private String language; // C @Value("${programming.l..

Spring 2022.04.29

Spring Kafka를 사용해 Slack에 메시지 보내기

🚀 들어가며 입사 후, 첫 업무로 Spring과 Kafka를 연동하고 특정 이벤트에 따라 Slack에 알림을 보내는 일을 맡게되어 학습을 목적으로 간단한 애플리케이션을 만들어 보았다. 나는 이번 계기로 Kafka를 처음 사용해보았기 때문에 내가 구현한 방법이 맞다고 확신할 수 없다. 단순 학습 목적임을 염두해주길 바란다. ⚙️ 환경 java 17 Spring Boot 2.6.4 Spring Web Spring Kafka lombok jackson ✨ Slack Incoming Webhooks 먼저, 슬랙에 메시지를 보내기 위해 Incoming Webhooks라는 슬랙 앱을 사용하였다. 메시지를 전송할 채널의 세부정보로 들어가 앱 추가를 클릭한다. Incoming Webhooks을 슬랙 채널에 설치하면 아..

Spring/Spring Kafka 2022.03.23

일급 컬렉션

First Class Collection, 일급 컬렉션이란 무엇일까? Collection을 Wrapping 하면서, 그 외의 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고한다. 이는 두 그룹을 같은 묶거나 그룹의 각 원소에 규칙을 적용하는 동작을 처리할 수 있다. 각설하고 일급 컬렉션을 예제 코드로 만들어보고 왜 일급 컬렉션을 사용해야하는지를 알아보자. List cars = new ArrayList(); Car 객체 인스턴스를 담는 cars라는 List를 생각해보자. 이를 일급 컬렉션으로 한번 감싸서 사용하면 아래와 같이 만들 수 있다. public class Cars { private final List cars; public Cars(List cars) { this.cars = cars; } } 이..

Java 2021.08.25

중급 문법

1. 프로젝션과 결과 반환 1-1. 프로젝션과 결과 반환 - 기본 프로젝션 : select 대상을 지정 프로젝션 대상이 하나 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있다. 둘 이상이면 튜플이나 DTO로 조회한다. 튜플 조회 "com.querydsl.core.Tuple" 리스트의 타입이 Tuple형식으로 반환된다. 데이터를 사용할 때는 get()을 사용하여 값을 꺼낸다. 1-2. 프로젝션 결과 반환 - DTO 조회 (중요!!) JPA에서 DTO를 조회할 때는 new 오퍼레이션을 사용하는데, DTO의 패키지명을 다 적어줘야해서 매우 지저분해지고 생성자 방식만 지원한다는 단점이 존재한다. Querydsl 빈 생성 - 프로퍼티 접근 - 필드 직접 접근 - 생성자 사용 먼저 프로퍼티 접근을 사용하는 방..

Spring/Querydsl 2021.06.29

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점 / 해결법

스프링 컨테이너에 프로토타입 스코프의 빈을 요청하면 항상 새로운 객체 인스턴스를 생성해서 반환한다. 하지만 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의해야 한다. 프로토타입 빈 직접 요청 클라이언트 A는 스프링 컨테이너에 프로토타입 빈을 요청 스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환(x01)한다. 해당 빈의 count 필드 값은 0이다. 클라이언트는 조회한 프로토타입 빈에 addCount()를 호출하여 count필드를 +1한다. 결과적으로 프로토타입 빈(x01)의 count 필드의 값은 1이다. 클라이언트 B는 스프링 컨테이너에 프로토타입 빈을 요청한다. 스프링 컨테이너는 프로토타입 빈을 새로 생성하여 반환(x02)한다. 해당 빈의 count 필드 값은 0이다. 클라..

Spring/Spring Core 2021.03.27

조회한 빈이 모두 필요할 때 - List / Map 사용하기

의도적으로 해당 타입의 스프링 빈이 다 필요한 경우도 있다. 예를 들어, 할인 서비스를 제공하는데 클라이언트가 할인의 종류를 선택할 수 있다면? 스프링을 사용하여 해결해보자. 위와 같이 테스트 코드를 작성하였다. 전에 만들어놓았던 AutoAppConfig를 통하여 컴포넌트 스캔을 진행하여 스프링 빈으로 등록한다.(@Component가 붙은 클래스 모두 등록) 그리고 우리가 static으로 만든 DiscountService또한 스프링 빈으로 등록시키는데 의존관계 주입시 List와 Map형태로 RateDiscountPolicy와 FixDiscountPolicy를 주입할 것이다. 테스트를 실행시켜보면 다음과 같이 Map와 List에 조회된 모든 빈들이 들어가있고, discountService 또한 정상적으로 ..

Spring/Spring Core 2021.03.21

애노테이션 직접 만들기

@Qualifier("mainDiscountPolicy") 이렇게 코드를 작성하면 컴파일시 타입 체크가 안된다. 컴파일 중에 오류를 잡을 수가 없다는 의미이다.("mainnDiscountPolicy"라고 오타를 내도 컴파일은 되고 그 이후에 Exception이 발생한다.) 이를 애노테이션을 만들어서 해결해보자. 위와 같이 "mainDiscountPolicy"를 Qualifier로 가지는 애노테이션을 생성하였다. 이제 우리는 @MainDiscountPolicy를 가져다가 사용하면 되는 것이다. 위와같이 오타를 발생하면 컴파일 전에 오류를 잡아낼 수 있어진다. 이제 OrderServiceImpl의 생성자 주입에 우리가 만든 애노테이션을 넣어주면 스프링이 어떤 타입의 할인정책을 사용해야하는지 알게되는 것이다...

Spring/Spring Core 2021.03.21

조회하는 빈이 2개 이상 😱😱

@Autowired는 타입으로 조회한다. 타입으로 조회하게 되면 선택된 빈이 2개 이상일 때 문제가 발생한다. DiscountPolicy의 구체인 FixDiscountPolicy와 RateDiscountPolicy 둘 다 스프링 빈으로 등록시키고 DiscountPolicy타입으로 조회를 하면 Exception이 발생한다. 하위 타입으로 지정할 수도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다. 그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결이 안된다. @Autowired 필드 명 매칭 @Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름 / 파라미터 이름으로 빈 이름을 추가 매칭한다. 위와 같이 파라미터이름을 보고 같은 타..

Spring/Spring Core 2021.03.19
반응형