Backend (9) 썸네일형 리스트형 Cookie Cookie는 Http Response에 담겨 Client에게 전달되고 저장된다. 이 때 어떤 브라우저를 쓰는지에 따라 Cookie의 관리 방식은 달라질 수 있다. 이 글은 Chrom browser 기준으로 작성할 예정이다. ResponseCookie responseCookie = ResponseCookie.from("Authorization", tokens.get(1)) .httpOnly(true) .secure(true) .sameSite("None") .maxAge(60 * 60 * 24 * 500) .path("/") .build(); 우선 쿠키의 유효기간을 500일로 설정했을 경우이다. 2025-05-05T15:34:06.142Z - Browser에 저장되는 쿠키 위와 같이 강제로 400일로 변.. Spring data jpa를 이용한 Pagination 1. Pageable 타입 인스턴스란? Pageable은 pagination을 진행하기 위해 Spring data jpa에 알려줘야할 정보들을 포함한다. 포함하고 있는 정보들은 - 페이지 번호 - page - 한 페이지에 불러올 데이터 건수 - size - 정렬 조건 - sort 로 구성 Pageable의 구현체는 PageRequest를 사용한다. Pageable pageable = PageRequest.of(page, size, Sort.by("productId")); 여기서 Sort.by는 해당 칼럼을 기준으로 정렬을 진행한다는 조건을 추가해준다는 뜻 2. Querydsl을 사용한 Pagination 기능 구현 해당 부분은 단순하게 구현이 가능하다. 반환 객체를 Page (해당 제너릭 타입으로 Ent.. SQLRestriction 얼마나 아시나요? 현재 Where를 이용한 Entity 접근 시 조건 추가는 Deprecated 되어 사용이 불가합니다. 그래서 사용해야하는 것이 SQLRestriction Annotation입니다. SQLRestriction은 기존의 Where가 해주던 일을 대신 해주는 새로운 녀석이죠. @SQLRestriction("is_deleted = false") 사용 방법은 다음과 같이 Where Annotation을 쓰던 것처럼 똑같이 사용해주면 되지만 주의해야할 점이 있습니다. 현재 프로젝트에서는 Soft Deleted를 BaseEntity에서 모두 관리하기 때문에 해당 Entity에서 조건을 추가한다면 다른 Entity에 자동으로 적용될 것이라 생각했지만 그렇지 않고 적용하기 위해서는 Entity 각각에 저 코드를 추가해.. Querydsl을 이용한 동적 쿼리 작성 Querydsl은 엔티티 클래스에 해당되는 Q 도메인 클래스를 만들어서 타입 세이프한 쿼리를 작성할 수 있도록 도와주는 역할을 합니다. 타입 세이프한 쿼리라는 것은 컴파일 시점에 쿼리의 타입 불일치를 잡아낼 수 있기 때문에 런타임 에러가 발생할 확률을 줄일 수 있습니다. 또한 Q 도메인 클래스를 이용해 쿼리를 작성할 수 있으므로 가독성 향상의 효과가 있습니다. 하단의 코드는 Querydsl의 Q 도메인 클래스를 활용하여 동적 쿼리문을 작성한 코드입니다. 해당 코드를 보면 확인할 수 있듯이 직접 JPQL 쿼리를 작성하는 것보다 가독성이 좋고 문제가 생길 위험도가 줄어들게 됩니다. default List findProductsByDynamicQuery(String nickname, Long categoryI.. Stomp Message broker - Kafka로 변환하기 (2) Topic, Listener 동적 생성 채팅방 별로 메세지를 관리하기 위해, Kafka에서도 Topic을 기준으로 채팅방별로 Listener를 따로 두어 관리하려고 한다. 그렇게 하기 위해서는 채팅 내용을 DB에 저장한 이후에, 해당 채팅방의 PK를 기준으로 Topic을 만들고 해당 Topic을 Listen해줄 Kafka Listener가 필요하게 된다. 이것을 동적으로 생성하기 위해, KafkaUtils 클래스를 작성했다. package com.domain.community.utils; import com.domain.community.service.KafkaConsumerService; import java.util.Collections; import lombok.RequiredArgsConstructor; import org.apache.. Stomp Message broker - Kafka로 변환하기 (1) Configuration 기존에 Stomp에서 Message broker를 Spring에서 제공하는 SimpleBroker를 사용하고 있었다. 변경 전 WebSocketConfig.java package com.domain.community.configuration; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; impo.. 파이프라인 개선 안 - 로그 뷰어 HTML 삽입 미리보기할 수 없는 소스 협업 인원 프론트엔드 디자인 및 페이지 작성 : https://github.com/d2doo 크게 보면 활용한 스택은 다섯가지에 해당합니다. 기본적인 SpringBoot와 Spring Data MongoDB를 활용하여 로그에 대한 통신과 저장을 담당하였고, 통신에 대한 세부 사항은 웹 소켓을 활용하여 통신하는 방식으로 진행해 해당 소켓에 접속해있는 sendTextMessage를 하지 않는 클라이언트의 전부에게 똑같은 로그 데이터를 보내 이를 화면단에 뿌려주는 작업을 하였습니다. 아래는 이러한 과정에 대한 가벼운 아키텍쳐 그림 입니다. 저희 파이프라인은 기본적으로 FE 팀원들이 개발을 할 때 편하게 하도록 Merge시 마다 갱신되는 미러 BE 서버를 갖고 있습니다. .. JAVA Stream map().collect() vs map().toList()의 차이 팀원들과 코드리뷰를 하던 도중, stream().map 이후에 .collect해 list로 변환하고 있는것을 발견했다. 나는 평소에 toList()를 사용하고 있었는데, 두 방식 사이에 성능 차이가 있다고 알고 있었기 때문에 리뷰를 진행했다. 하지만 진짜 차이는 toList()는 immutable(불변)객체를 리턴하는것이고, collect()는 mutable 객체를 리턴하는 것이다. 비즈니스 로직 관점에서, repository에서 select한 데이터 리스트를 add하거나 sort해서 변경을 추가하는 것을 막기 위해(다른 팀원들이 해당 서비스를 사용할 때) 사용해볼 수 있을 것 같다. * immutable 객체에 데이터를 넣거나 변경하려고 하면 UnsupportedOperationException이 발생.. FetchType.EAGER, FetchType.LAZY 기존에 알고있듯이 @OneToMany와 같은 어노테이션이 붙어있는 필드 엔티티는 FetchType.LAZY가 기본값이고, @ManyToOne과 같은 어노테이션은 FetchType.EAGER가 기본값이다. FetchType.EAGER가 붙어있는 필드 엔티티는, 해당 필드를 포함한 엔티티를 조회하는 순간 해당 필드 엔티티도 조회하게 된다. @xxToOne 연관관계인 필드 엔티티에는 FetchType.LAZY를 붙이는게 대부분 좋다는 것을 김영한님 강의에서도 들어서 알고는 있었는데, 붙이지 않고 구현한 경우가 생겨 트러블 슈팅을 하게 되었다. 지금 개발중인 비즈니스 로직에는 ChatRoom(채팅방 정보), UserChatRoom(채팅방에 참여하고있는 사용자 정보), Chat(채팅 메세지 정보) 총 세개의 엔티.. 이전 1 다음