페이스북이나 인스타그림 등의 open api를 사용하기 위해서는 인증을 위한 토큰 값이나 키 값을 사용해야 할 때가 있습니다. 민감할 수 있는 정보라 git 에 커밋하는게 그리 달갑지 않아, 이런 경우 직접 코드를 삭제하고 커밋하곤 했습니다. 커밋 전에 뭔가 diff 에 걸러져 나오는 코드에 특정 문자열이 포함되어 있는 경우에 커밋이 불가능하도록 하고 싶어 찾아 보았습니다.

git 에는 어떤 이벤트가 생겼을 때 자동으로 특정 스크립트를 실행 하도록 할 수 있도록 git hook 이라는 기능을 제공하고 있습니다.

Read More

MySQL 공식 문서 중 14.7.1 InnoDB Locking 을 번역한 것입니다. 영어가 익숙하지 않아 의미가 잘 전달되지 않는 부분이 있을 수 있습니다. 틀렸거나 잘못 번역된 부분이 있다면 피드백 부탁드리겠습니다.


InnoDB Locking

이번 섹션에서는 InnoDB 가 사용하고 있는 잠금의 종류들에 대해서 알아봅니다.

  • Shared and Exclusive Locks
  • Intention Locks
  • Record Locks
  • Gap Locks
  • Next-Key Locks
  • AUTO-INC Locks

Read More

MySQL 공식 문서 중 14.15.2.2 InnoDB Lock and Lock-Wait Information 을 번역한 것입니다. 영어가 익숙하지 않아 의미가 잘 전달되지 않는 부분이 있을 수 있습니다. 틀렸거나 잘못 번역된 부분이 있다면 피드백 부탁드리겠습니다.


트랜잭션이 하나의 행을 수정하거나 SELECT … FOR UPDATE 로 잠금을 획득할 때, InnoDB는 행에 대한 잠금 목록이나 큐를 생성한다. 유사하게, InnoDB 는 테이블-레벨 잠금들을 위한 잠금 목록을 유지한다. 만약 두 번째 트랜잭션이 행을 UPDATE 하거나 이미 선행 트랜잭션에 의해서 호환되지 않는 모드로 테이블을 잠그길 원하면, InnoDB 는 잠금 요청을 해당 큐에 추가한다. 트랜잭션에 의해서 얻어진 잠금을 위해서 우선적으로 잠금 큐에 들어간, 호환되지 않는 모든 잠금 요청은 커밋되거나 롤백되어 큐에서 제거 되어야 한다.

Read More

JPA 특징

  1. 1차 캐쉬 - 엔티티 조회
  2. 쓰기 지연 - 엔티티 등록
  3. 변경 감지 - 엔티티 수정

Read More

이미 일년도 넘은 내용이지만 에버노트에서 꺼내보면서 이것 저것 정리도 해볼겸 RequestBody의 내용을 로그로 남기고 싶다. 에 이어서 좀 더 관련 내용을 적어보았다. filter 를 이용해서 request body 를 로그로 찍어보자.

우선 문자열과 input stream 의 편리한 처리를 위해서 다음과 같이 의존성을 추가한 다음에 진행하였다.

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>

Read More

카프카, 데이터 플랫폼의 최강자 의 5장 카프카 컨슈머 요약

컨슈머의 주요 기능

  • 특정 파티션을 관리하고 있는 파티션 리더에게 메시지를 가져오도록 요청
    • 각 요청은 로그의 오프셋을 명시
    • 그 위치로 부터 로그 메시지를 수신
    • 이를 통해 가져올 메시지의 위치를 조정, 필요한 경우 이미 가져온 데이터도 다시 수신 가능
  • 버그를 수정한 후 가져왔던 메시지들을 다시 가져올 수 있음
    • 래빗 엠큐와 같은 일반적인 메시지큐 솔루션에서는 제공하지 않는 기능

Read More

카프카, 데이터 플랫폼의 최강자 의 4장 카프카 프로듀서 요약

카프카 프로듀서

  • 프로듀서의 주요 옵션
  • 프로듀서 활용 예제
  • 다양한 메시지 전송 방법

카프카 프로듀싱 - 자바

  • send() 로 메시지를 보내는 방식은 3가지
  1. 메시지를 보내고 확인하지 않기
  2. 동기 전송
  3. 비동기 전송

메시지를 보내고 확인하지 않기

  • 프로듀서에서 서버로 메시지를 보내고 난 후에 성공적으로 도착했는지 까지 확인하지 않음
  • 프로듀서가 자동으로 재전송하기 때문에 대부분의 경우 성공적으로 전송
    • 일부 메시지는 손실 될 수도 있음
  • 메시지는 버퍼에 저장되고 별도의 스레드를 통해 브로커로 전달
  • send() 는 자바 퓨처(Future) 객체로 RecordMetadata를 리턴 받음
    • 리턴값을 무시하기 때문에 메시지가 성공적으로 전송되었는지 알 수 없음
    • 메시지 손실 가능성이 있기 때문에 일반적인 서비스에서는 사용하지 않음
  • 브로커에게 메시지를 보낸 후의 에러는 무시하지만, 보내기 전에 에러가 발생하면 예외를 처리할 수 있음

Read More

카프카, 데이터 플랫폼의 최강자 의 3장 카프카 디자인 요약

카프카 디자인

  • 대용량 데이터 처리
    • ex 실시간 로그 집계
    • 어플리케이션의 처리량이 높아야
    • 배치 전송, 파티션, 분산 처리
  • 데이터의 안정적인 저장
    • 리플리케이션 기능
  • 분산된 서버에서 자동으로 파티션의 리더를 선출

카프카 디자인의 특징

  • 필요
    • 분산된 데이터 파이프 라인의 표준화/통합
    • 높은 처리량
  • 목적
    • 높은 처리량
    • 빠른 메시지 전송
    • 운영 효율화
  • 구현
    • 분산 시스템
    • 페이지 캐시
    • 배치 전송 처리

카프카 디자인 1 - 분산 시스템

  • 분산 시스템은 네트워크로 이루어진 컴퓨터들의 그룹
  • 시스템 전체가 공통의 목표를 공유
  • 같은 역할을 하는 여러 대의 서버로 이뤄진 서버 그룹
  • 장점
    • 단일 시스템보다 더 높은 성능을 얻을 수 있음
    • 분산 시스템 중 하나의 서버 또는 노드 등이 장애가 발생하면 다른 서버 또는 노드가 대신 처리
    • 시스템 확장이 용이

Read More

다음은 최초에 제가 가졌던 니즈입니다.

  1. POST 방식으로 호출되는 http request의 payload를 로그로 남기고 싶다.
  2. controller 내부에서 한땀 한땀 로그로 남기는 방법 말고 다른 방법으로 남겨보고 싶다.

스프링 프레임워크 위에서 비즈니스 로직을 구현하고 있지만, 스프링 기반의 프로젝트의 구조에 관심을 이제서야 조금씩 가지다 보니 새롭고 좋네요. 한번도 완독해본적 없는 토비의 스프링이나 스프링 인 액션을 찬찬히 다시 한번 봐야겠습니다. 올해는 꼭 성공하면 좋겠네요.

일단 서비스가 돌아가고 있는 프로젝트의 소스 코드를 쭉 훑어보았습니다. 우선 기존에 쌓이고 있는 로그를 읽어가며 역으로 소스코드를 따라 들어가보았습니다. config 관련된 클래스들을 별도의 패키지에서 관리하고 있는데요. WebMvcConfigurationSupport 클래스를 상속받은 ServletApplicationContextConfig 가 있고, HandlerInterceptorAdapter 를 상속하여 구현한 인터셉터들이 있네요. 구현된 인터셉터들은 ServletAppliationContextConfig 내에서 등록하여 사용하고 있었습니다. 인터셉터의 내부에서 HttpRequest의 내용을 간략하게 남기고 있는 것을 보아하니, 별도의 인터셉터 클래스를 만들어 주어 request의 body를 찍어주게 하면 될 것 같은 느낌을 받았습니다.

스트림을 읽어들인 다음 문자열로 변환 시킨 후 로그로 남기도록 구현하였습니다. HandlerInterceptorAdapter 를 상속하여 만든 ApiLoggingInterceptor 클래스의 afterCompletion() 메소드에 이쁘게 로그를 찍어주도록 만들었습니다. 기쁜 마음으로 톰캣 인스턴스를 띄우고, http request를 하나 날려보았습니다. 찍히길 기대했던 로그는 안찍히고 다른 로그가 올라오네요. 별거 아니라고 생각하며 기쁜 마음으로 서버 로그가 찍히길 기다렸는데, 이미 스트림이 닫혀있다는 예외 메시지만 출력되었습니다. 다음과 같이요.

Read More

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×