4차산업혁명의 일꾼/Java&Spring웹개발과 서버 컴퓨터

비동기 클라이언트 수신 SseEmitter 사용법과 어노테이션 끄적

르무엘 2024. 12. 25. 22:28
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