반응형

개발/스프링 9

Redis 도입을 통한 데이터 캐싱 처리

레디스는 값을 처리하는 두 가지 방식이 있다✅ 문자열 방식"user:test@example.com" => "{\"email\":\"test@example.com\", \"name\":\"홍길동\", \"service\":\"helpdesk\"}"값을 하나의 문자열(JSON 또는 직렬화된 객체)로 처리한다.단순하고 빠르다.한 번에 저장하고 조회를 하는 것이 가능하다.하지만 내부 필드별 접근을 하려면 파싱 처리를 추가적으로 해야 함정렬, 조건별 필터링 어려움 ✅ 해시 방식HMSET user:test@example.com   email       test@example.com   name        홍길동   service     helpdesk필드 단위로 접근이 가능하다.그렇기 때문에 특정 필드 기준으로 ..

개발/스프링 2025.04.06

Websocket-STOMP 및 DB 통합 테스트해보자

웹소켓 연결 및 메시지를 전송해서 MongoDB에 데이터를 등록해보려고 한다.클라이언트 앱이 아직 준비가 안 돼서 다른 방법으로 테스트해볼 것이다.  WebSocket Debug Tool jiangxy.github.io포스트맨에서는 STOMP 서브 프로토콜을 지원하지 않는다.위의 페이지에 접속하여 테스트해보자.  설정 파일/** * 엔드포인트 설정 * @param registry */@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {    registry.addEndpoint("/ws")            .setAllowedOriginPatterns("*");            .withSockJS();} 컨트롤..

개발/스프링 2025.04.05

[Trouble-shooting] 클라이언트에서 Websocket-STOMP 연결 요청 시 FALLBACK이 사용되는 현상

서버 쪽 핸들러에 문제가 있는 건가 했는데, 결론적으로는 클라이언트에서 웹소켓 연결 요청할 때 전달되는 쿼리스트링에 인코딩 되지 않은 특수문자가 포함되어 있던 것이 원인이었다. Websocket-STOMP & SockJS 코드 일부분✅ 클라이언트 코드const socket = new SockJS('http://localhost:8083/ws?token=' + username); ✅ 서버 코드@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {    registry.addEndpoint("/ws")            .setAllowedOriginPatterns("*")            .setHandshakeHan..

개발/스프링 2025.03.28

[Trouble-shooting] 중첩 클래스명 중복으로 Swagger가 고장났다

스웨거로 사용자를 등록하려고 하는데, API 문서 내 DTO가 제대로 매핑이 되고 있지 않다는 걸 알게 됐다. @Schema(description = "공지사항 요청 DTO")class NoticeRequestDto {    @Schema(description = "공지사항 등록 요청")    class CREATE (        @Schema(description = "제목")        val title: String,        @Schema(description = "내용")        val content: String,        @Schema(description = "작성자 이메일")        val writerEmail: String    )}@Schema(descriptio..

개발/스프링 2025.03.21

Faker가 만들어 주는 테스트 데이터, 또 나만 몰랐지

본인은 여태 테스트용 데이터는 무조건 만들어진 기능을 통해 생성해 왔다.기존 시퀀스에 영향을 주거나 특정 기능에 연쇄돼서 생성되어야 하는 데이터가 존재하기 때문에 SELECT 쿼리 외에는 DB를 통해 데이터를 조작하는 걸 꺼려했던 것이다.그런데, 반대로 생각하면 기존 데이터나 다른 테이블에 영향을 주지 않는 선에서는 DB 조작을 통해 데이터를 생성해도 무방하다는 것이다.오늘 공지사항 화면을 개발하고, 페이지네이션 버튼이 잘 생성되는 지 확인하기 위해 테스트용 더미 데이터가 필요했다. 그런데 DB에 ID, 제목, 내용, 등록일자, 수정일자, 작성자 이메일 등 직접 컬럼 값을 작성하기가 너무 귀찮은 것이다. 그래서 테스트용 더미 데이터를 생성할 수 있는 라이브러리 Faker를 들고 왔다. Faker는 Jav..

개발/스프링 2025.03.19

[Trouble-shooting] MyBatis는 카멜케이스 설정을 직접 해야 한다

@Schema(description = "공지사항 목록 조회 응답 DTO")class NoticeResponseDto (    @Schema(description = "작성자 이메일")    val writerEmail: String,    @Schema(description = "작성자 이름")    val writerName: String,    @Schema(description = "제목")    val title: String,    @Schema(description = "내용")    val content: String,    @Schema(description = "등록일자")    val createdDate: String,    @Schema(description = "수정일자")   ..

개발/스프링 2025.03.18

Swagger씨, API 문서 작성해주세요 !

이번 포스팅에선 API 문서를 자동화해주는 Swagger에 대해 알아볼 것이다.  API 문서는 왜 작성할까?단순 문서화개발 협업(프론트 개발자 - 백엔드 개발자)버전 관리테스트예전에 팀 프로젝트에서 모바일 개발자님에게 API 공유를 위해 API 명세서를 일일이 노션으로 작성한 적이 있다.당시 문서화하면서 머리가 나쁘면 몸이 고생한다는 그 말이 생각났다.하지만 당시에는 아는 게 없으니 별 다른 수가 없어서 그냥 했었다. 멤버 등록 API를 문서화해 보자build.gradle/* Swagger */implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' application.ymlspringdoc:  api-docs:    enabl..

개발/스프링 2025.03.06

P6Spy를 도입하여 쿼리 로깅을 개선해보자

의존성 주입build.gradle/* p6spy */implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'스프링 3.x.x 이상은 1.9.0 이상 버전을 사용해야 한다.  2025-03-06T00:08:48.284+09:00  INFO 8720 --- [nio-8080-exec-6] p6spy                                    : #1741187328284 | took 0ms | statement | connection 19| url jdbc:oracle:thin:@localhost:1521:xeselect m1_0.member_email,m1_0.member_name,m1_0.member_descr..

개발/스프링 2025.03.06

QueryDSL을 사용해보자

QueryDSL이 뭐야? 자바 및 코틀린에서 객체지향적으로 SQL / JPQL 쿼리를 작성할 수 있도록 돕는 쿼리 빌더 라이브러리다.작성자는 동적 쿼리를 처리하기 위해 QueryDSL을 도입했다. 가령 공지사항에서 게시물을 조회할 때 사용자는 제목 조건을 포함하여 조회할 수도 있고, 포함하지 않을 수도 있다.이러한 상황을 처리하기 위한 것이 동적 쿼리이다.JPA에서도 Criteria API를 제공하여 동적 쿼리를 처리할 수 있게 하지만 문법이 굉장히 복잡하다.코드 유지보수성도 개발에 있어 굉장히 중요하기 때문에 다른 방안이 필요했다. SQL Mapper Framework MyBatis를 통해 동적 쿼리를 처리할 수도 있다.현업에서는 아마 MyBatis를 더 많이 쓸 것이다.그 이유로는 직접 SQL을 작성..

개발/스프링 2025.02.15