[241204 TIL]

프로젝트 관리 심화

대규모 스트림 처리 강의


 

⚠️ 트러블슈팅 ⚠️


1. 문제 정의

Kafka 실습 중 Docker Compose로 Kafka 환경을 구성했으나, Kafka UI에서 클러스터가 Offline 상태로 표시되고 정상적으로 동작하지 않음.


2. 원인 추론

  1. Docker 이미지 아키텍처 문제
    • Docker Desktop에서 "image may have poor performance, or fail if run via emulation" 경고 메시지가 출력됨.
    • 이는 Docker 이미지가 호스트 아키텍처와 일치하지 않아 발생.
  2. Kafka UI 타임아웃 문제
    • Kafka UI 이미지를 다운로드하는 과정에서 TLS handshake timeout 오류 발생.
    • 네트워크 문제 또는 Docker Hub와의 연결 문제로 인해 이미지 다운로드 실패.
  3. Docker Compose 설정 문제
    • 기존 docker-compose.yml 파일이 AMD64 아키텍처용 이미지로 구성되어 ARM64 호스트 시스템에서 실행 불가.

3. 해결 방안 및 결과

1) 호스트 아키텍처 확인

  • uname -m 명령어를 실행하여 호스트 시스템 아키텍처를 확인:
    uname -m
    
  • 출력 결과: arm64
    → 호스트 시스템이 ARM64 아키텍처임을 확인.

2) Docker Compose 이미지 교체

  • 기존 Docker Compose 파일에서 AMD64 전용 이미지ARM64 지원 이미지로 교체.

변경된 Docker Compose 파일:

version: '3.8'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    platform: linux/arm64
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    platform: linux/arm64
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:29092,OUTSIDE://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:29092,OUTSIDE://0.0.0.0:9092
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    platform: linux/arm64
    ports:
      - "8080:8080"
    environment:
      KAFKA_CLUSTERS_0_NAME: local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
      KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181
      KAFKA_CLUSTERS_0_READONLY: "false"

3) Kafka UI 이미지 수동 다운로드

  • Kafka UI 다운로드 시 타임아웃 오류 해결을 위해 수동으로 이미지를 다운로드:
    docker pull provectuslabs/kafka-ui:latest
    
  • 수동 다운로드 완료 후, docker-compose up 명령어로 다시 실행.

결과

  1. Kafka UI에서 클러스터가 Online 상태로 표시됨.
  2. Zookeeper, Kafka, Kafka UI 모두 ARM64 환경에서 정상 실행.
  3. Kafka 실습을 성공적으로 진행 가능.

[241113 TIL] AI 검증 비즈니스 프로젝트

카테고리, 가게, 리뷰 CRUD API 구현

 

  • API 동작 확인
  • 리뷰 평점 스케줄러 적용
  • Soft Delete 적용

API 동작 확인

⚠️ 트러블슈팅 ⚠️

 

1. 문제 정의

  • 가게 생성 API 동작 확인 중 에러 발생 (POST)
org.springframework.dao.DataIntegrityViolationException: could not execute statement [Duplicate entry 'b\xDD\x98\xF0\xBD\x8E\x11\xED\x93\xAB2P\x96\xB3\x9FG' for key 'p_stores.UK260ia2wautdp3fq67hyklg3cu'] [/* insert for com.sparta.gourmate.domain.store.entity.Store */insert into p_stores (average_rating,category_id,created_at,created_by,deleted_at,deleted_by,is_deleted,location,name,updated_at,updated_by,user_id,id) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]; SQL [/* insert for com.sparta.gourmate.domain.store.entity.Store */insert into p_stores (average_rating,category_id,created_at,created_by,deleted_at,deleted_by,is_deleted,location,name,updated_at,updated_by,user_id,id) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]; constraint [p_stores.UK260ia2wautdp3fq67hyklg3cu]

 

 

  • org.springframework.dao.DataIntegrityViolationException
    • 데이터베이스에서 중복된 값이 삽입되려고 했을 때 발생하는 오류

2. 원인 추론

 

1) 가게 엔티티에 중복된 값을 허용하지 않는 컬럼 확인

  • id - UUID 로 자동 생성되므로 고려 대상 아님
  • user_id - 같은 유저로 여러 개의 가게 생성이 가능됨을 확인
  • category_id - 같은 카테고리의 가게를 생성하려고 할 때 위의 에러 발생

2) 카테고리 엔티티와 가게 엔티티의 연관관계 확인

  • 현재 카테고리와 가게의 연관관계 - @OneToOne
  • 한 가게 당 하나의 카테고리를 갖기에 위 연관관계 설정

3) 연관관계 고려

  • @OneToOne
    • 한 가게가 하나의 카테고리만 가질 수 있다는 것 의미
    • 예를 들어, "피자 가게" 하나가 "피자 카테고리"를 가진다면 적합
    • 여러 가게가 동일한 카테고리를 공유할 수 있다면, @OneToOne 설정은 적합하지 않음

 

 

3. 해결 방안 및 결과

  • 연관관계 변경
    • 여러 개의 가게가 하나의 카테고리를 공유 ➡️ @ManyToOne 이 적합
    • 가게 엔티티에서 @ManyToOne 사용하고, 카테고리 엔티티에서 @OneToMany 사용
@Entity
public class Store {
	// 중략
    @ManyToOne
    @JoinColumn(name = "category_id")
    private Category category;
   
}



@Entity
public class Category {
	// 중략
    @OneToMany(mappedBy = "category")
    private List<Store> storeList;
    
}
  • 연관관계 변경 후 같은 카테고리를 가진 가게 생성 성공!



[241112 TIL] AI 검증 비즈니스 프로젝트

CRUD 구현


Spring Data Jpa

Containing

  • 컬럼에 특정 문자열이 포함된 엔티티 검색
  • SQL Qurey 의 LIKE 와 같음
// SELECT * FROM Store WHERE category_id = categoryID AND name LIKE %query%;
Page<Store> storeList = storeRepository.findByCategoryIdAndNameContaining(categoryId, query, pageable);

 


 

POSTMAN 

⚠️ 트러블슈팅 ⚠️

 

1. 문제 정의

  • API 테스트 진행을 위해 POSTMAN 을 사용하여 회원가입 진행 중 에러 발생
{
    "code": null,
    "message": "Required request body is missing: public com.sparta.gourmate.domain.user.dto.UserResponseDto com.sparta.gourmate.domain.user.controller.UserController.createUser(com.sparta.gourmate.domain.user.dto.SignupRequestDto)"
}

 

 

2. 원인 추론

  • POSTMAN POST 상황

 

1) 입력 조건을 만족하지 못했나?

@NotBlank
@Size(min = 4, max = 10)
@Pattern(regexp = "^[a-z0-9]+$")
private String username;

@NotBlank
@Size(min = 8, max = 15)
@Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[!@#$%^&*)(+=._-])[a-zA-Z\\d!@#$%^&*)(+=._-]+$")
private String password;

@Email
@NotBlank
private String email;

 

  • 모든 조건 만족

 

2) NOTNULL 값만 작성하고 나머지는 작성하지 않아서 그런가?

  • 회원가입(SignupRequestDto)에 필요한 모든 값을 작성해도 같은 에러 발생

 

3) @RequestBody 가 제대로 작동되고 있는지?

  • 모든 값을 Query Params 으로 넘기고 있음을 확인

 

3. 해결 방안 및 결과

  • Boby - JSON raw 로 값 넘겨주기
{
    "username" : "customer",
    "password" : "customer1!",
    "email" : "customer@naver.com",
    "isAdmin" : false,
    "isOwner" : false

}

 

  • 성공적으로 POST
{
    "id": 3,
    "username": "customer",
    "email": "customer@naver.com",
    "role": "CUSTOMER"
}

 

 

 

사실 너무 어이없는 실수라 트러블슈팅으로 적어도 되나~ 싶지만~

그래도 나는 바보라서 똑같은 실수를 하게 될 수도 있으니 일단 적어놓자...

 


POSTMAN 

로그인 후 토큰 처리

 

Login - POST username, password Authorization

Response Header >  Authorization 값 복사

 

Request Header 에 Authorization 입력


+ Recent posts