• Docker Kafka + ELK 연동

    Kafka + ELK 연동 모니터링 및 데이터를 수집하기위해 많이 사용하고있는 조합인 Kafka, ELK를 간단하게 사용해보면서 이해하기 위해 어플리케이션 로그를 수집해보겠습니다. Kafka, ELK 간단한 개념정리 Kafka 확장성과 가용성이 높고, Pub/Sub 모델 지원하는 메시지 플랫폼 producer : 메시지 생산자(발행) consumer : 메시지 소비자(구독) broker : 카프카의 서버, 동일한 노드내에 여러개의 broker을 띄울수있다....


  • Spring Data JPA의 연관관계 매핑

    연관관계 매핑 정의 객체는 참조로 연관관계를 가지고, 테이블은 외래키로 연관관계를 가진다. 테이블은 기본 양방향 관계지만, 객체는 설정된 방향에 따라서 다르다. 단방향 : 한객체가 다른객체를 참조 양방향 : 두 객체가 서로참조 객체에는 양방향 연관관계라는것이 없다. 단반향연결이 양쪽에 되어있을뿐 매핑 어노테이션 @OneToOne 1 : 1 관계 매핑 fetch() default EAGER @ManyToOne N...


  • Spring Data JPA의 Open Session In View (OSIV)

    준영속 상태에서 FetchType.Lazy접근 문제 기본적으로 영속성 컨텍스트 전략은 트랜잭션 범위입니다. Spring에서 Transaction의 시작은 보통 Service로 설정되고 사용되어집니다. 문제는 트랜잭션 범위를 벗어난 Controller, View의 경우 준영속상태에서 페치전략이 FetchType.Lazy인 엔티티에 접근시 LazyInitializationException이 발생하게 됩니다. memberService.findAll().stream() .forEach(member -> { // Proxy 객체를 참조하고있어서 에러 발생하지 않는다. member.getOrders(); // LazyInitializationException 발생!! member.getOrders().get(0); }); FetchType.Lazy와...


  • Spring 비동기 처리의 이해 5(Webflux with R2DBC, 게시판 만들기)

    이번엔 MySQL DB를 추가하고, thymeleaf를 사용하여 View를 추가하도록 하겠습니다. Library 추가 build.gradle에 mysql driver, thymeleaf Library를 추가해줍니다. implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'dev.miku:r2dbc-mysql' MySQL Table 생성 및 데이터 추가 create table users ( id BIGINT AUTO_INCREMENT NOT NULL, `name` VARCHAR(50) NOT NULL, age INT NOT NULL, profile_picture_url VARCHAR(200) NULL, updated_at datetime NOT...


  • Spring 비동기 처리의 이해 4(Webflux with R2DBC, 게시판 만들기)

    이전 포스트에서 H2 DB를 설정하고 dummy 데이터 초기화까지 해보았습니다. (Spring 비동기 처리의 이해 3) 이제 간단한 User API를 만들어보겠습니다. Package 추가 다음과같이 controller, service, repository, model 4개의 package를 추가합니다. User Model 추가 model/User.java를 생성하고 다음과 같이 작성합니다. package com.example.webfluxboard.model; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; import...