Project (31) 썸네일형 리스트형 Nuwa Project - Querydsl 적용기 이번 프로젝트 진행에서 처음으로 Querydsl을 사용을 해보고자 했습니다. 이전까진 항상 JPQL을 사용을 해서 쿼리를 구현을 했었는데 동적 쿼리를 구현을 할 때 굉장히 힘들게 구현을 했습니다. 검색을 구현을 하더라도 검색 조건이 두가지라면 두 개의 JPQL을 만들어서 작업을 했습니다. 그러면 더욱 많아진다면 코드 자체가 매우 지저분해지고 불필요한 로직이 생겨났습니다. 이전에 코드를 만들 때는 파라미터로 검색 조건을 받아서 직접 if문을 사용하여 나눠주는 작업을 했습니다. 예를 들면 public ResponseEntity search(@RequestParam String type) { if (type.equals("id") { memberService.findId(type); } else { membe.. Nuwa Project - CustomPage Annotation (issue) Nuwa Project - Custom Annotation 작업을 진행을 하던 도중 갑작스럽게 매번 쓰던 토큰 값을 가져오는 로직 간단하게 할 수 없을까 생각을 했습니다. @RequestHeader("Authorization") String accessToken @RequestHeader처럼 어노테이션으로 만들어 classruntime.tistory.com 페이지네이션 정보를 받을 수 있는 Pageable을 커스텀 어노테이션으로 사용을 하던 도중 파라미터로 아무리 값을 넘겨도 받을 수 없는 일이 생겼습니다.. 무조건 default 설정으로만 동작을 했고 어디서 문제인가 했더니 CustomPageableHandlerMethodArgumentResolver 클래스에서 파라미터로 넘어오는 값을 받아주지 않고 .. Nuwa Project - 채팅방 조회 (마지막 채팅 값을 넣어서 조회) 다이렉트 채팅방을 조회를 하는 로직을 작성했습니다. API 반환을 할 때 채팅방 정보와 마지막 채팅 그리고 마지막 채팅의 생성된 시간을 반환하려고 했습니다. 처음엔 이 난관을 어떤 방식으로 극복을 해야하나 싶었습니다. 채팅방을 생성한 시간 순으로 조회를 하는 것은 Spring Data를 사용하여 페이징도 간편하게 작성이 가능했습니다. 또한 MongoRepository를 사용해도 Spring Data Jpa와 동일하게 ListPagingAndSortingRepository 위의 부분을 상속을 받고 있기에 채팅 내역 또한 페이징을 간편하게 가능했습니다. 여기서 서로 각각 조회를 진행하고 dto로 각각 넘겨주면 되지 않나? 라고 생각을 했습니다. 그래서 처음엔 모든 데이터를 다 가져와 int i = 0; fo.. Nuwa Project - SSE(Server-Side-Event) Connect 현재 STOMP와 SockJS를 사용하여 채팅을 구현하고 있습니다. 채팅을 구현을 하던 도중 알림 기능도 추가가 되어야 하는 것 아닌가란 얘기가 나왔습니다. 이 부분에 대해서 고민을 하던 도중 SSE를 사용하여 구현을 하기로 했습니다. 웹소켓은 처음 연결을 진행하고 연결이 끊기기 전까지 지속적으로 양방향 통신이 가능합니다. 웹소켓으로 알림 구현을 생각하면 어플리케이션의 전반적인 웹소켓을 로그인 시점에 열어두고 해당 웹소켓을 이용하여 이벤트가 일어나면 해당 웹소켓을 이용하여 알림을 보내주는 방식을 구현 해볼까 생각을 했지만 알림을 위해 전반적으로 웹소켓을 열어두고 사용하는 것은 많은 비용이 소모가 되지 않을까 생각했습니다. 서버에서 특정 이벤트가 생기면 해당 이벤트를 전송하는 방식이 비용 소모가 적지 않을.. Nuwa Project - AWS S3 (Issue) AWS S3에 관련해서 설정 하는 부분은 많은 분들이 너무 설명을 잘 해주신 블로그가 많기에 저는 이 부분을 넘기고 제가 코드를 만지던 도중 생겼던 오류에 대해 작성하려고 합니다. Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting 분명 AWS S3를 정책 편집기로 Public이 가능하게 정책을 설정 했습니다. 그런데 코드를 돌려보니 해당 오류가 지속해서 나왔습니다. 이곳 저곳에서 찾아보니 BucketOwnerEnforced 설정과 출동하는 ACL 설정을 시도 했다고 합니다. 그래서 ACL 설정을 하는 코드가 어디에 있지? 하고 찾아보니 amazonS3.putObject(new PutObjectRequest(buck.. Nuwa Project - JPA 상속 관계 맵핑 프로젝트를 진행하면서 다양한 채팅 채널 구현이 필요해졌습니다. 필요한 채널은 단순하게 채팅만 이루어지는 채널, 1:1 다이렉트 채널, 음성 채널 이렇게 나누어서 구현을 해야하는데 맨 처음엔 구현 클래스마다 테이블을 생성을 했습니다. 이렇게 구현을 하다보면 중복이 되는 내용이 많아졌습니다. 예를 들면 채널 이름, 채널 이름 등 공통으로 가진 속성이 많았습니다. 그래서 단일 테이블로 작성을 하게 되면 문제가 해결이 되지 않을까 생각을 했습니다. 그래서 단일 테이블로 생성을 하고 Enum으로 각 채널의 타입을 나눠서 관리를 하려고 하고 ChannelMember 테이블을 따로 생성하여 멤버를 따로 작성을 하려고 했습니다. 그런데 다이렉트 메세지 같은 경우 두 명의 인원이 존재하도록 테이블을 설계를 해야한다고 생.. Nuwa Project - Nginx, WebSocket, SSE(Server side Event) 이번에 WebSocket, STOMP, SockJS를 사용하면서 Nginx conf 파일이 변경이 되었습니다. 아직 구현은 하지 않았지만 미리 Server Side Event(SSE) 설정도 같이 넣어줬습니다. 기본 nginx의 설정은 Nuwa Project (1) - Project Setting 이번에 새롭게 협업 프로젝트를 진행을 하기로 했습니다. 처음엔 이것 저것 어떤 프로젝트를 진행을 할까 고민을 하다 협업툴을 만들어보기로 결정을 했습니다. 협업툴이면 이것 저것 다양한 classruntime.tistory.com 이 쪽을 참고하시면 됩니다. WebSocket 또는 SSE(Server Side Event)는기본적으로 http version을 1.1을 사용하기 때문에 변경을 해주었습니다. user w.. Nuwa Project - Failed to validate connection 서버의 로그를 확인 해보니 Warn이 나오고 있었습니다. warn은 방치를 해두면 좋지 않기에 어떤 기능이 문제인지 알아보기로 했습니다. HikariCP에 대한 경고가 발생을 했고 Possibly consider using a shorter maxLifetime value. 짧은 maxLifetime value를 사용하라는 경고가 나왔습니다. 구글링 결과 제가 RDS에 설정을 해둔 파라미터 그룹 wait_timeout의 시간 설정 때문이였습니다. wait_timeout은 사용하지 않는 커넥션이 닫히는 데까지 서버가 대기하는 시간입니다. 해당 시간보다 maxLiftetime value가 길기 때문에 발생한 경고였습니다. 그래서 yml 설정에 maxLifetime value를 wait_timeout보다 조금.. 이전 1 2 3 4 다음