분류 전체보기

Caused by: java.lang.NoSuchMethodError: 'java.lang.Object org.hibernate.ScrollableResults.get(int)'QueryDsl 의 , 그룹화하여 받을 수 있는 transform + GroupBy 사용시 SpringBoot 3.x 버전에서 나오는 에러이다.JPQLTemplates.DEFAULT 를 추가해주자.@Configurationclass QueryDSLConfig(val entityManager: EntityManager) { @Bean fun jpaQueryFactory(): JPAQueryFactory { return JPAQueryFactory(JPQLTemplates.DEFAULT,entityManager..
Pub/Sub(발행-구독)형태는 현대 애플리케이션에서 비동기 이벤트를 처리하고 확장성을 확보하는 데 자주 사용되는 설계 방식이다.하지만 이벤트 브로커는 메시지를 발행하고 구독자(Subscriber)가 가져가는 구조에서 몇 가지 중요한 점을 고려해야 한다.RedisRedis 의 pub/sub 은 스트림 형태로publish 한 즉시 데이터가 subscriber 에게 전달되고 소멸되는 특성을 가지고 있다 (휘발성 데이터)각 이벤트/메세지 브로커 마다 특성이 있으니 사용시 주의 하도록 하자1. 메시지 중복publisher 는 멱등성 프로듀서를 지원하는 이벤트 브로커도 있다하지만 주는쪽 말고 받는 쪽에서도 중복처리에 대한 멱등성 처리를 신경써야 한다.Unique key를 두어 데이터의 중복을 방지한다 ( 타임스탬..
멱등성멱등성이랑 데이터가 중복으로 요청되더라도 응답과 시스템 상태가 항상 같아야(일관성이 있어야) 한다.응답fun print(text: String) = text특정 문자를 받아서 문자 그대로를 리턴하는 코드처럼 같은 요청에 같은 응답을 받는것이다.시스템 상태특정 인스턴스를 생성해서 저장하는 요청이라고 하면 리소스가 시스템에 계속 생성이 될 것이다.이러면 시스템 상태에 영향을 주어, 멱등성이 없다라고 한다.멱등성 보장멱등성을 보장 해주기 위해 비즈니스 로직에서 처리하는 방법으로는ID 키를 활용한 중복 생성방지요청마다 유니크한 필드를 기준으로 db에 저장시켜준다.데이터 저장시 특정 필드를 조회하여 비교 후 존재하면 존재하는 데이터를 응답시켜주기도 , 예외를 던져주기도 한다.캐시요청 후 생성된 유니크한 ID..
Here - 익명 커뮤니티 플랫폼익명 커뮤니티 앱은 사용자들이 자유롭게 의견을 나눌 수 있는 공간을 제공하지만, 이러한 익명성이 오히려 악용될 가능성도 존재한다.잘못된 방향으로 사용될 경우 커뮤니티가 의도치 않게 부정적인 영향을 받을 수 있기 때문에, 이를 예방하고 건강한 커뮤니티 문화를 유지하기 위해 여러 기술적 장치를 도입을 했다.이메일 OAuth2 등 기본적인 계정 생성은 계정차단을 회피 할 수 있기 때문에 핸드폰 인증시스템을 도입하게 되었다.Simple & Easy Notification Service가격가격은 다른 플랫폼에 비해 비교적 싼 편이다. 월 50건을 제공하고 건당 9원의 가격이 과금된다. 준비사항발신 번호 ( 전화 , 개인 핸드폰 )듀얼넘버 X ( 안됌 ) 해봄...결국 인터넷 전화를..
problem요청처리가 완료된 후 ServletRequest 의 body 를 log 로 남기려고 했다.ServletRequest 는 inputStream 이므로 한번 밖에 읽을 수 없다.Controller 는 RequestBody 로 서블릿 request 를 읽는다. 그래서 인터셉터로 구현한 log인터셉터에서 body 가 빈값으로 들어오는 것이었다.검색해보니 ContentCachingRequestWrapper 로 request를 래핑 해주라는 말이 있었는데ContentCachingRequestWrapper(request)필터에서 래핑해줘도 스프링시큐리티에서Servlet3SecurityContextHolderAwareRequestWrapper 클래스로 래핑해서 컨트롤러에 전달하는 상황이 발생했다.solu..
동시에 몇개의 요청을 받았을때 서버의 에러가 급격하게 늘까 ? ( 임계점 식별 )각 HTTP 메서드마다 얼마의 요청을 버틸 수 있을까 ? ( 병목 구간 개선 )각 테스트는 가장 무겁고 처리 로직이 복잡한것으로 선택한다.테스트는 POST / GET 이 있다.GET게시물 조회를 선택했다.게시물 조회는 현재 게시물의 좋아요 개수, 댓글 개수 , 각 댓글의 좋아요 갯수 , 대댓글 갯수 , 페이징 처리 , 차단 유저 제외데이터를 가져오도록 설계되어, 많은 테이블의 조인과 서브쿼리가 사용되어 무겁다고 판단 하였다.Post 게시물 생성 API 를 선택했다.게시물 생성로직은 여러 파일이 전송 되어야 해서 선택 하게 되었다.RPS: 초당 요청 수(request per sec)TPS: 초당 트랜잭션 처리 수 (transa..
엔그라인더로 파일 전송 테스트를 하거나 multipart-form 형식 요청의 스크립트 작성 방법scriptimport groovy.json.JsonBuilderimport static net.grinder.script.Grinder.grinderimport static org.junit.Assert.*import static org.hamcrest.Matchers.*import net.grinder.script.GTestimport net.grinder.script.Grinderimport net.grinder.scriptengine.groovy.junit.GrinderRunnerimport net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess..
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet requestNVPair param1 = new NVPair("markerId", "marker01");NVPair param2 = new NVPair("content", "경기도고양시");NVPair[] params = [param1, param2];def data = Codecs.mpFormDataEncode(params, null, headers)HTTPResponse response = request.POST("http://localhost:8080/api/abc", data);데아터를 parm 이로 만들어줘서 보냈는데 서버로 전달이 안됐다...
imSoo
'분류 전체보기' 카테고리의 글 목록