1-카프카 시작하기

데이터의 모든 부분은 의미가 있으며, 그 다음 처리되어야 하는 작업과 같이 뭔가 중요한 정보를 담고 있다. 이것이 무엇인지 알기 위해서는 데이터를 생성된 곳에서 분석할 수 있는 곳으로 옮겨야 한다. 데이터를 옮기는 작업을 빠르게 해낼 수록 조직은 더 유연해지고 더 민첩해질 수 있다. 우리가 데이터를 이동시키는 작업에 더 적은 노력을 들일수록 핵심 비즈니스에 더욱 집중할 수 있다. 발행/구독 메시지 전달 발행/구독 메시지 전달 패턴의 특징은 전송자가 데이터를 보낼 때 직접 수신자로 보내지 않는다는 것이다....

2025-05-04 · 7 min · 1444 words

2-디버깅 기법으로 앱 로직 이해하기

코드 분석만으로는 불충분한 경우 코드 읽는 법이 시 읽는 법과 다른 점 코드는 선형적이지 않다. 코드는 한 라인 한 라인 그냥 읽는 대상이 아니다. 시와 달리 코드는 항상 모든 사람에게 동일한 의미를 지닌다. 아무리 작은 코드 조각이라도 커맨드를 더 자세히 들여다봐야 할 때가 많다. 어떤 커맨드는 조사를 생략해서 전체 프로세스를 단순하게 가져갈지, 아니면 프로세스가 더 복잡해지더라도 자세히 살펴보고 개별 커맨드를 확실하게 이해할지 선택해야 한다. 디버거를 이용한 코드 조사 디버거를 사용하면 조사 프로세스가 간소화된다....

2025-04-28 · 2 min · 387 words

1-앱에서 모호한 부분 밝히기

디버깅은 원래 ‘문제를 찾고 해결하는 것’이라는 뜻이지만, 개발자는 코드의 작동 방식을 분석하는 다양한 목적으로 디버깅을 수행한다. 새로운 프레임워크 배우기 문제의 근본 원인 찾기 기본 로직을 이해하여 새로운 기능으로 확장하기 앱을 더 쉽게 이해하는 방법 코드 조사: 소프트웨어 기능의 특정한 동작을 분석하는 프로세스 ‘소프트웨어 에러를 찾아 고치는’ 디버깅이라는 용어를 혼용해서 사용하고 있다. 코드 조사를 하는 이유 어떤 문제를 찾아낸다. 어떤 소프트웨어의 기능이 어떻게 작동되는지 알아야 개선할 수 있다. 어떤 기술 또는 라이브러리를 학습한다....

2025-04-10 · 3 min · 535 words

16-트랜잭션과 락, 2차 캐시

트랜잭션과 락 트랜잭션과 격리 수준 트랜잭션 특성 원자성: 트랜잭션 내에 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다. 일관성: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 트랜잭션은 원자성, 일관성, 지속성을 보장한다. 문제는 격리성인데 트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 차례대로 실행해야 한다. 이렇게하면 동시성 처리 성능이 매우 나빠진다....

2025-03-19 · 6 min · 1249 words

Kotlin Couroutine 기본 개념

목표 코루틴의 기본 개념을 이해한다. 코투린을 사용하기 위한 기본 kotlin 문법을 이해한다. 코루틴 특정 코드 블럭을 다른 커드와 동시에 실행한다는 점에서 스레드와 비슷하다. 하지만 코루틴은 특정 스레드에 바인딩되지 않는다. 한 스레드에서 실행을 일시 중지했다가 다른 스레드에서 다시 시작할 수 있다. 스레드를 사용하면 메모리를 많이 소모하게되지만, 코루틴은 JVM에서 사용 가능한 메모리 제한에 부딪히지 않고 표현할 수 있다. fun main() = runBlocking { // this: CoroutineScope launch { // launch a new coroutine and continue delay(1000L) // non-blocking delay for 1 second (default time unit is ms) println("World!...

2025-03-18 · 2 min · 397 words

Spring Boot Applicatoin Event 와 애플리케이션 시작 과정

배경 SpringApplicationEvent 에서 Spring 프레임워크가 애플리케이션에 관련된 이벤트를 발행하는 것을 이해할 수 있었다. Spring Boot에서 어떤 이벤트를 전송하고 있는지 이해한다. 이벤트 목록 애플리케이션 실행 시 아래 순서대로 이벤트가 발생한다. ApplicatoinStartingEvent: 애플리케이션 실행 이전에 발생한다. ApplicationContextInitializer 들과 ApplicationListener 들의 등록을 제외한 모든 처리 이전에 발생한다. ApplicationContextInitializer: ApplicationContext가 초기화되기 전에 실행되어야 하는 로직이 있을 때 정의하는 콜백 인터페이스 ApplicationListener: 애플리케이션에서 발생하는 이벤트를 감지하고 처리하는 역할의 인터페이스 ApplicationEnvironmentPreparedEvent: Environment가 준비 되었지만, ApplicationContext가 생성되기 전에 발생한다....

2025-03-17 · 2 min · 250 words

3-이론

소프트웨어 설계는 인간관계 속에서 벌어지는 활동 팀원끼리 견해 차이가 있을 때는, 이론적인 틀을 공유하는 것이 유용하다. 원칙에 동의하지 않더라도 서로의 원칙에 대해 논의할 수 있다면 더 빨리 합의할 수 있는 기회가 생긴다. 요소들을 유익하게 관계 맺는 일 소프트웨어 설계의 의미: 요소들을 유익하게 관계 맺는 일 요소: 경계가 있고 계층 구조를 선호한다. 관계: 요소들은 서로 관계를 가진다. 함수 호출 발행(publish) 대기(listen) 참조 유익하게: 기계를 위한 명령어가 아닌, 일종의 중간 요소들이 서로 도움이 되도록 예) 함수 A는 함수 B가 계산의 복잡한 부분을 덜어간다....

2025-03-16 · 2 min · 241 words

13-웹 애플리케이션과 영속성 관리

트랜잭션 범위의 영속성 컨텍스트 스프링 컨테이너의 기본 전략 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다. 다양한 위치에서 엔티티 매니저를 주입받아 사용해도 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용한다. 따라서 엔티티 매니저는 달라도 같은 영속성 컨텍스트를 사용한다. 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다. 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다....

2025-03-10 · 5 min · 861 words

4-ElasticSearch 기본 개념

클러스터와 노드의 개념 클러스터: 여러 대의 컴퓨터 혹은 구성 요소들을 논리적으로 결합하여 전체를 하나의 컴퓨터, 혹은 하나의 구성 요소처럼 사용할 수 있게 해주는 기술 ElastSearch 클러스터 역시 여러 개의 ElasticSearch 프로세스들을 논리적으로 결합하여 하나의 ElasticSearch 프로세스철머 사용할 수 있게 해준다. 다수의 노드로 클러스터를 구성하면 하나의 노드에 장애가 발생해도 다른 노드에 요청할 수 있기 때문에 안정적으로 클러스터를 유지할 수 있고 이를 통해서 높은 수준의 안정성을 보장할 수 있다. 다수의 노드로 구성된 ElasticSearch 클러스터는 고유의 클러스터 이름과 UUID를 가진다....

2025-03-05 · 4 min · 728 words

14-컬렉션과 부가 기능

컬렉션 JPA는 자바에서 기본으로 제공하는 Collection, List, Set, Map 컬렉션을 지원하고 다음 경우에 이 컬렉션을 사용할 수 있다. @OneToMany, @ManyToMany를 사용해서 일대다나 다대다 엔티티 관계를 매핑할 때 @ElementCollection을 사용해서 값 타입을 하나 이상 보관할 때 JPA와 컬렉션 하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 하이버네이트에서 준비한 컬렉션으로 감싸서 사용한다. Collection, List ArrayList로 초기화하면 된다. Collection, List는 중복을 허용한다고 가정하므로 add() 메소드는 내부에서 어떤 비교도 하지 않고 항상 true를 반환한다. 같은 엔티티가 있는지 찾거나 삭제할 때는 equals() 메소드를 사용한다....

2025-03-05 · 4 min · 716 words

12-스프링 데이터 JPA

JPA를 사용해서 데이터 접근 계층을 개발할 때도 유사한 코드를 반복해서 개발해야 한다. 이런 문제를 해결하려면 제네릭과 상속을 적절히 사용해서 공통 부분을 처리하는 부모 클래스를 만들면 되지만, 공통 기능이 부모 클래스에 너무 종속되고 구현 클래스 상속이 가지는 단점에 노출된다. 스프링 데이터 JPA 소개 스프링 데이터 JPA는 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있다. MemberRepository.findByUsername() 처럼 직접 작성한 메소드도 메소드 이름을 분석해서 다음 JPQL을 실행한다....

2025-03-05 · 5 min · 869 words

Valid vs Validated

목표 @Valid와 @Validated의 차이점을 이해한다. @Valid와 @Validated의 사용법을 이해한다. 공통점 컨트롤러 파라미터에 @Valid, @Validated 를 붙이면, 글로벌 Validator로 검증이 된다. Spring Boot는 JSR-380의 기본 구현인 Hibernate Validator를 글로벌 Validator로 사용한다. 컨트롤러에서 @Valid vs @Validated @Valid는JSR-303의 어노테이션으로 메서드 수준의 유효성 검사에 사용한다. @Validated는 Spring에서 @Valid를 확장하기 위해 만든 어노테이션이다. @Validated는 validation group이라는 기능을 제공한다. 컨트롤러에서는 validation group 기능 유무 차이가 존재한다. 컨트롤러에서 @ReqeustBody, @ModelAttribute, @RequestPart가 붙어있는 파라미터는 ArgumentResolver에서 처리되며, @Valid나 @Validated가 있을 때 검증 실패시 MethodArgumentNotValidException 예외가 발생한다....

2025-02-25 · 2 min · 423 words

10-객체지향 쿼리 언어

객체지향 쿼리 소개 JPQL 특징 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리다. SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 다음은 JPA가 공식 지원하는 기능이다. JPQL Criteria 쿼리: JPQL을 편하게 작성하도록 도와주는 API, 빌더 클래스 모음 네이티브 SQL: JPA에서 JPQL 대신 직접 SQL을 사용할 수 있다. 다음은 JPA가 공식 지원한느 기능은 아니지만 알아둘 가치가 있다. QueryDSL: Criteria 쿼리처럼 JPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음, 비표준 오픈소스 프레임워크다. JDBC 직접 사용, MyBatis 같은 SQL 매퍼 프레임워크 사용: 필요하면 JDBC를 직접 사용할 수 있다....

2025-02-25 · 10 min · 2084 words

Liveness, Readiness, Startup Probe

목표 Liveness probe, Readiness probe, Startup probe의 차이점을 이해한다. Liveness probe 컨테이너를 재시작 해야되는지 판단할 때 사용한다. liveness probe에 반복해서 실패하면, 컨테이너가 재시작된다. 반복해서 실행되므로 liveness probe에는 무거운 작업을 하면 안된다. liveness probe는 readiness probe가 성공하는 것을 기다리지 않고 실행된다. 만약 liveness probe가 실행되기 전에 지연이 필요하면, startup probe를 사용하거나 initialDelaySeconds 값을 설정함녀 된다. 예시: 애플리케이션이 데드락에 빠졌으면 이를 탐지하여 재시작한다. Readiness probe 컨테이너가 트래픽을 받을 수 있는 상태인지 판단할 때 사용한다....

2025-02-20 · 1 min · 165 words

Spring에서 로깅 시 각 요청마다 식별자 만들기

배경 로그 모니터링할 때 각 로그가 서로 연관이 있는지, 한 요청에 대해서 어떤 순서로 로그가 남았는지 확인이 필요한 상황이 있었다. 로그를 남길 때 요청마다 고유한 식별자를 만들어서 로그에 같이 남도록 구현한다. 현재 프로젝트는 Logback을 사용해 로그를 남기고 있다. MDC MDC는 log4j나 logback이 로그를 남길 때 Appedner가 접근할 수 있는 데이터로 Map과 같은 구조로 작성할 수 있다. MDC의 고주논 ThreadLocal을 사용하여 실행 중인 스레드에 내부적으로 연결된다. 아래 사진과 같이 MDC 클래스 내에는 MDCAdapter 라는 인터페이스의 static 필드를 가지고 있다....

2025-02-20 · 1 min · 184 words

maven.test.skip vs skipTests

목표 jar 빌드할 때 테스트를 제외하는 옵션인 -Dmaven.test.skip=true와 -DskipTests의 차이를 이해한다. 차이점 -Dmaven.test.skip=true: 테스트 코드를 컴파일하지 않고, 테스트를 실행하지도 않는다. -DskipTests: 테스트 코드를 컴파일하지만 실행하지는 않는다. 참고 자료 https://stackoverflow.com/questions/21933895/what-is-the-difference-between-dmaven-test-skip-exec-vs-dmaven-test-skip-tr

2025-02-20 · 1 min · 29 words

8-경계 간 매핑하기

각 계층의 모델을 매핑 두 계층 간에 매핑을 하지 않으면 양 계층에서 같은 모델을 사용해야 하는데 이렇게 하면 두 계층이 강하게 결합된다. 각 계층의 모델을 매핑하지 않음 두 계층 간에 매핑을 하게 되면 보일러플레이트 코드를 너무 많이 만들게 된다. 많은 유스케이스들이 오직 CRUD만 수행하고 계층에 걸쳐 같은 모델을 사용하기 때문에 계층 사이의 매핑은 과하다. ‘매핑하지 않기’ 전략 웹 계층, 애플리케이션 계층, 영속성 계층 모두 같은 Account 모델을 사용한다. 장점: 매핑할 필요가 전혀 없어서 단순하다....

2025-02-17 · 3 min · 567 words

1-코드 정리법

보호 구문 아래와 같은 코드를 본다면 if (조건) ...코드... if (조건) if (다른 조건 부정) ...코드... 아래와 같이 정리할 수 있다. if (조건 부정) return if (다른 조건) return ...코드... 안 쓰는 코드 일단 지워라. 리플렉션을 사용한 코드일수도 있지 않은가? 로그를 활용해 지우고 나서 다시 실행해서 확인 해본다. 확신이 된다면 지울 수 있다. 지웠다가 나중에 필요할 경우는? 형상 관리 도구가 이를 해결해준다. 정리 과정에는 코드를 조금만 삭제해라. 그렇게 하면 잘못 고친 것으로 밝혀져도 비교적 쉽게 복구할 수 있다....

2025-02-17 · 4 min · 746 words

3-ElasticSearch 모니터링

Head를 이용해서 모니터링하기 Head는 클러스터의 상태를 한눈에 살펴볼 수 있는 모니터링 도구 중 하나이다. Head는 클러스터의 여러 정보를 웹 UI를 통해 확인할 수 있도록 해준다. 특히 Head의 가장 큰 장점 중 하나는 샤드 배치 정보를 시각적으로 확인할 수 있다는 것이다. 프로메테우스를 활용한 클러스터 모니터링 프로메테우스는 데이터를 시간의 흐름대로 저장할 수 있는 시계열 데이터베이스의 일종이며, 수집된 데이터를 바탕으로 임게치를 설정하고 경고 메시지를 받을 수 있는 오픈소스 모니터링 시스템이다. 각종 메트릭을 저장하는 TSDB(Time Series Data Base)의 역할을 하는 Prometheus Server가 중앙에 있다....

2025-02-11 · 2 min · 277 words

2-ElasticSearch 기본 동작

문서 색인과 조회 색인 API 4가지 API PUT /<target>/_doc/<_id> POST /<target>/_doc/ PUT /<target>/_create/<_id> POST /<target>/_create/<_id> 문서 ID를 지정해서 새 문서를 추가하려면 PUT /<target>/_create/<_id> 형식을 사용해야 된다. <target>: 인덱스 이름 대상이 존재하지 않고 데이터 <_id>: 문서 식별자 예시 색인 API 호출시 flow 기존에 숫자 형태로 정의된 필드에 문자 형태의 값이 들어오면 스키마 충돌이라고 판단하고 에러를 출력한다. 에러가 출력되면 해당 문서는 기본적으로는 색인되지 않는다. 기존 문서를 업데이트하면 문서의 _version 값이 올라간다. 문서 색인 없이 인덱스만 색인할 수도 있다....

2025-02-10 · 2 min · 269 words