private Map<String, SseEmitter> emitterMap = new HashMap<>();
public Optional<SseEmitter> get(Integer userId) {
// userId에 해당하는 SseEmitter를 emitterMap에서 가져옴
SseEmitter result = emitterMap.get(getKey(userId));
// 가져온 결과를 로그에 기록
log.info("Get Emitter from Redis {}", result);
// 결과를 Optional로 감싸서 반환
return Optional.ofNullable(result);
}
private String getKey(Integer userId) {
return "emitter:UID:" + userId;
}
SseEmitter는 서버에서 클라이언트로 단방향 푸시 가능, 텍스트 기반으로 JSON으로 전송하는 것이 일반적이다.
@DynamicInsert
@DynamicUpdate
=> 필요한 필드만 동적으로 insert, update 되게 사용함
@Where(clause = "is_deleted=false")
=> JPA 조회시 where 조거문으로 is_deleted=false 인 것 만 조회되게 default로 설정
implements Serializable
=> 직렬화는 파일 저장이나 db저장시에 바이트 스트림으로 변환하여 전송하기에 필요하다.
@JsonInclude
=> json에서 비어있거나 null 인 경우 필드에서 제외해서 데이터 효율적 사용
@RestControllerAdvice
=> @ControllerAdvice 와 @ResponseBody의 조합으로 모든 @RestController에서 발생하는 예외처리 가능
@ExceptionHandler(BaseException.class)
=> BaseException 타입의 예외가 발생할 때 호출
private final ModelMapper modelMapper;
=> Entity와 Dto간에 매핑할때 자동으로 매핑 ( db에서 조회한 엔터티를 클라이언트에게 전달할 dto로 변활할때 사용)
@PrePersist
처음 DB에 등록할때 아래와 같이 사용가능
@PrePersist
void registeredAt() {
this.registeredAt = Timestamp.from(Instant.now());
}
그 후 DB수정시에는 자동으로 되게 할수 있음
@PreUpdate
void updatedAt() {
this.updatedAt = Timestamp.from(Instant.now());
}
@SQLDelete(sql = "UPDATE \"comment\" SET removed_at = NOW() WHERE id=?")
sql 삭제시에 컬럼삭제 안되고 삭제 날짜만 지정 가능
@Where(clause = "removed_at is NULL")
그리고 삭제 날짜 없는것만 자동조회하게 한다.
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
jsonb타입을 처리하기 위한것인데 postgresql 을 사용하기 위해 보통 쓴다.
@JsonIgnore
이것을 지정하면 json에서 해당필드를 인식하지 않는다.
@Modifying
@Query("UPDATE CommentEntity entity SET removed_at = NOW() where entity.post = :post")
리포지토리에서 수정형태로 삭제할 때 @Query로 할수 있고 @Modifying은 @Query와 함께 수정할때 쓰인다.
LIST
'4차산업혁명의 일꾼 > Java&Spring웹개발과 서버 컴퓨터' 카테고리의 다른 글
스프링부트에서 React 연결 (0) | 2024.12.26 |
---|---|
카프카와 레디스 사용법 정리 (0) | 2024.12.26 |
성장욕구와 기부의 보람 [항해 99 잔디기부 캠페인] (1) | 2024.12.24 |
스프링부트 3.x 연구 (0) | 2024.12.04 |
스프링부트 2.x 연구 (2) | 2024.12.04 |