일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- querydsl
- Kafka
- JPA
- 코테공부
- 스프링공부
- Flutter
- nestjs공부
- 스프링
- 알고리즘공부
- 스프링 공부
- K8S
- 카프카
- 스프링부트
- DDD
- 스프링부트공부
- JPA공부
- 기술공부
- 자료구조공부
- 플러터 공부
- 코테준비
- 프로그래머스
- JPA 공부
- Axon framework
- JPA예제
- 플러터 개발
- 기술면접공부
- nestjs스터디
- nestjs
- JPA스터디
- 자바공부
- Today
- Total
목록Develop (320)
DevBoi
카프카 토픽을 사용할때 가장많이 사용하는 도구이다. 프로듀서 애플리케이션을 개발해서, 토픽에 메시지를 발행하고 일반적인 환경에서는 Producer 애플리케이션을 개발해서 토픽에 메시지를 넣는다. 카프카의 데이터는 시작점이 프로듀서이다. 프로듀서 애플리케이션은 카프카에 필요한 데이터를 선언하고 브로커의 특정 토픽의 파티션에 전송한다. 프로듀서는 리더 파티션이 있는 브로커와 통신하게 된다. 즉 프로듀서는 토픽의 리더파티션을 가지고있는 브로커와 통신하고 다른 팔로워 파티션은 이를 복제한다. 또한 이런 애플리케이션이 자바가 아닌 라이브러리를 사용하면, 공식적으로 지원하는 라이브러리가 아니기떄문에 문제가 발생할 수 있다. 따라서 자바로 개발하는게 좋다. 파티셔너,배치생성 단계를 거치고 데이터를 브로커로 전송하게 ..
Entity 에서 properties로 아래와 같이 저장하고싶을때가 있다. List tags 이를 해결하고 JPA는 어떻게 관리하는 지 알아보자 우선 내가 사용하는 Entity 타입이다. package com.boiler.flutterbackend.app.group.dto; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.time.LocalDateTime; import java.util.List; @AllArgsConstructor @NoArg..
dead letter queue는 이름에서 유추 할 수 있듯이 실패한 레코드를 보관하는 별도의 큐이다. 이름에서 알 수 있듯이. 실패한 레코드를 보관하는 별도의 큐이다. 카프카는 2.0 부터 자체 plug in으로 실패한 레코드의 메타정보도 포함 시켜 저장하는 기능을 제공한다. 설정 방법은 간단하다. Connect 설정에 아래와 같이 추가해주면 된다. connect_dlq에서 아래와 같이 설정한다. errors.tolerance = all errors.deadletterqueue.topic.name = {토픽} // 유효하지 않다고 판단된 레코드의 메타데이터 header에 저장 errors.deadletterqueue.context.headers.enable = true // 로그 파일에 유효하지 않는 ..
0.2버전은 레퍼런스도 많고, 좀더 자료가 많아서 진행했는데 다른 라이브러리 때문에 자꾸 충돌이 난다. 그래서 대규모 버전 변경 작업을 한다. 작업 내용은 deprecate된 부분을 변경하면서 수정하고, 설계에 대한 수정사항을 수정한다. 1. @EntityRepository deprecated 0.3 버전에서는 사용할 수 없다. 왜 typeorm의 버전을 올리면서 스택자체를 날려버린건지 이해는 안되지만 무튼.. CustomRepository Decorator + CustomRepository Module이 필요하다. import { SetMetadata } from "@nestjs/common"; export const TYPEORM_EX_CUSTOM_REPOSITORY = "TYPEORM_EX_CUST..
비즈니스 로직은 정리를 안하는 편이지만 정리를 해보자 QueryDsl을 사용하다가 두개의 테이블을 조인 나랑 친구인 상태인 유저는 제외, 이외 모든 유저정보를 불러모으지만, 내가 친구를 신청했던 상태에 대한 정보는 추가로 들고 와야하는 비즈니스 로직 작성 -> LeftOuterJoin + SelfJoin + Projections.fields 다대일 연관관계 매핑 안한이유 = N+1에 대한 위험 요소가 높고, 두개를 조인했을때 오히려, 친구라는 엔티티의 자유도가 떨어진다고 판단 @Override public List findFriendRecommandList(String userId) { QFriend subFriends = new QFriend("subFriends"); List result = quer..
1) BooleanBuilder, BolleanExpression 사용 비슷한 용도이지만 내 생각에 두개의 용도는 다르다. BooleanExpression은 null인 경우 null을 반환해주면서, 조건에서 제외가 된다. 즉 특정 조건에 따라서 다이나믹하게 조건절이 추가되어야 하는경우, 심하면 없어도되는경우 BooleanExpression을 사용한다. BooleanBuilder는 항상 객체가 생성이 되지만 복잡한 조건절의 쿼리를 생성해야할 때 이걸 사용하게 되면, 그나마 보기 쉽고 조합을 자유롭게 해줄수있다 다만 무조건 사용해야하고 복잡한 조건절의 조합 도구라고 보면된다. 물론 두개다 때에 따라서 용도와 장점과 어긋나게 사용은 가능하지만 장단이 있으니 그에 따라 맞게 사용하면 좋을 것 같다. Boolea..
Spring 에서 기본 필터를 제공해주거나, 빈으로 등록하는데 스프링 버전이 변경되면서 Response를 내리는 필터의 설정 방법도 조금 바뀌었다. server: servlet: context-path=/: encoding: charset: UTF-8 force: true 위 처럼 진행하면 된다.(application.yaml)
추천친구 (나랑 아무런 친구 요청이 없는 것) 친구 요청(추천친구에서 친구 요청) 친구 검색(닉네임 기준 친구 검색) 친구 리스트 (본인과 친구관계인 사람) 친구 수락(친구 요청에 대한 승인) 친구 요청 내역 확인(본인 기준 친구 요청을 보낸사람) 우선 이렇게 3가지에 대한 API를 개발할 것이고, 포스팅은 한개만 예시로 할 것이다. 해당 API는 플러터에서 사용 목적으로 개발한다. 친구 controller @GetMapping("/recommand-friends") public List recommandFriends(@RequestParam("userId") String userId) { return friendService.recommendFriends(userId); } @PostMapping("/..
친구데이터 관련 설계를 하고 있었다. 뭐가 좋을까. 고민 되었다. 특히 추천 친구라는 기능을 하나 만들고 싶었다. 우선 Entity간의 연관관계를 두기 싫었다. 그래서... 나는 이렇게 설계했다. 회원가입하면, Friends 테이블에 자기 자신도 넣어주는 것이다. 자세한건 아래 로직을 보자 1) 회원가입 로직 @PostMapping("/user") public User saveUser(@RequestBody UserDto userDto) { return userService.saveUser(userDto); } public User saveUser(UserDto userDto) { List result = userRepository.findByUserId(userDto.getUserId()); if(re..