Java Record의 등장 최신 프로그래밍 언어들은 간결하고 효율적인 코드 작성을 중요하게 여깁니다. 데이터를 담는 객체를 정의할 때, 이러한 현대적인 언어들이 제공하는 기능 중 하나가 바로 불변성을 가진 데이터 홀더입니다. Kotlin의 data class 가 개발자들에게 큰 인기를 끌면서, Java도 이에 대한 답변으로 record 를 제시했습니다. record 는 데이터를 운반하는 간단한 구조를 정의할 때 사용되며, 내부적으로 불변성을 가진 필드와 함께, 필수적인 메소드들을 자동으로 생성합니다. Record와 Data Class 비교 Kotlin의 data class 와 마찬가지로, Java의 record 는 개발자가 수동으로 equlas(), hashCode(), toString() 등을 정의할..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/p4yRo/btszNQWTC4C/XqDMjscaGTsU0dMNh5i5T0/img.png)
Node-Exporter란? Node-Exporter는 서버의 하드웨어 및 OS 메트릭을 수집하는 오픈 소스 에이전트입니다. 이는 CPU, 메모리, 디스크 사용량, 네트워크 상태, 시스템 부하 등과 같은 다양한 서버 메트릭을 수집합니다. Node-Exporter는 Prometheus 모니터링 툴과 함께 사용되어 이러한 메트릭을 시각화하고 분석하는 데 도움을 줍니다. Prometheus란? Prometheus는 오픈 소스 모니터링 시스템으로, 시계열 데이터를 수집하여 저장하고, 규칙 기반의 경고와 쿼리를 실행할 수 있습니다. Prometheus는 다양한 소스에서 메트릭을 수집하는 여러 에이전트와 통합할 수 있는 강력한 도구로, 이 데이터를 활용하여 시스템의 건강 상태를 모니터링하고, 잠재적 문제를 신속하게..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/IjpHv/btsvDkT5Thg/mY89m1C9W4KKznRySeisA0/img.png)
안녕하세요! 오늘은 JPA를 사용하다보면 한 번쯤 만나게 되는 에러인 N+1문제와 MultipleBagFetchException문제를 해결하는 방법에 대해 공유하고자 합니다. 🥲 문제 상황 제 프로젝트에서 한 엔티티가 2개의 연관된 엔티티를 List 타입으로 가지고 있었습니다. 그리고 게시글 전체를 조회할 때 JobPost의 WorkDay(요일)와 Job(하는 일)은 모두 보여줘야 했습니다. { "data": { "numOfPost": 0, "posts": [ { "jobPostId": null, "title": "string", "storeName": "string", "latitude": 0.0, "longitude": 0.0, "salary": 0, "salaryType": "연봉", "curren..
Java에서 객체를 정렬하거나 비교하는 방법에 대해 알아보고자 합니다. 이를 위해 필요한 것이 바로 Comparable 인터페이스와 그 안의 compareTo 메소드입니다. 또한, 이를 이용한 PriorityQueue의 사용법도 함께 알아보도록 하겠습니다. 📚 Comparable 인터페이스란? Comparable은 Java에서 제공하는 인터페이스 중 하나로, 어떤 클래스가 비교 가능하다는 것을 나타내줍니다. Comparable 인터페이스를 구현하는 클래스는 자신의 인스턴스를 다른 객체와 비교할 수 있습니다. 🔍 compareTo 메소드란? Comparable 인터페이스에는 단 하나의 메소드인 compareTo가 포함되어 있습니다. 이 메소드는 두 개의 객체를 비교하고 그 결과를 정수형으로 반환합니다. p..
Firebase Cloud Messaging(FCM)은 백엔드 서비스나 서버간 통신을 위한 메시지 전달을 위해 Firebase에서 제공하는 무료 메시징 솔루션입니다. 이 글에서는 Spring Boot를 이용해서 FCM을 사용해 Android 앱에 푸시 알림을 보내는 방법에 대해 다루겠습니다. 왜 FCM을 사용했을까? 서버에서 어떤 데이터를 앱에 전달하려면 네트워크 연결은 필수입니다. 앱은 서버에서 데이터가 언제 송신될지 모르기 때문에 서비스 컴포넌트로 네트워크에 항상 연결되어 있어야 하는 것입니다. 문제는 백그라운드 제약 때문에 앱이 포그라운드 상황이 아니라면 서버와 연결을 지속할 수 없다는 것입니다. 하지만 클라우드 메시징은 서버의 데이터를 앱에 직접 전달하지 않고 FCM 서버를 거쳐서 앱에 전달하는 ..
- 빠른 성능: 인메모리 기반인 Redis는 빠른 응답 속도를 제공합니다. - 유연한 데이터 만료 관리: Redis는 각 키에 대해 만료 시간을 설정할 수 있어, Refresh Token의 유효기간 관리가 용이합니다. - 내구성: Redis는 데이터를 디스크에도 저장할 수 있어 서버 재시작 시에도 데이터를 유지할 수 있습니다. 이러한 이유 때문에 Redis를 이용해서 토큰을 재발급받았습니다. 1️⃣ Access Token과 Refresh Token 발급 사용자가 성공적으로 로그인하면, JWT를 사용하여 사용자의 ID와 기타 정보를 포함한 Access Token과 Refresh Token을 발급합니다. Access Token은 짧은 유효 시간을 가지며, Refresh Token은 상대적으로 긴 유효 시간을..
Spring Security에서 인증 메커니즘을 구현하기 위해 JWT 필터를 사용했습니다. 이 필터는 Exception Handler로 처리를 못하기 때문에 별도의 메커니즘이 필요합니다 ! 왜 그럴까? JWT 필터는 OncePerRequestFilter를 상속받아 매 요청마다 한 번씩 실행됩니다. 이 필터는 HTTP 요청 헤더에 포함된 JWT를 해석하고, 유효한 토큰인 경우 Security Context에 인증 정보를 설정합니다. 또한 이 필터는 Dispatcher Servlet 보다 앞단에 위치하여, Handler Interceptor는 뒷단에 존재하기 때문에, Filter에서 보낸 예외는 Exception Handler로 처리를 못합니다. 따라서, JWT 필터에서 예외가 발생할 경우 이를 적절히 처리..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cwZXqK/btseqtg9x5Q/J1kO7buifzJbS2hgP09Cy1/img.png)
1. build.gradle 추가 implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0' implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '3.0.0' 2. SwaggerConfig @Configuration @RequiredArgsConstructor public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .securityContexts(Arrays.asList(securityContext()..
- Total
- Today
- Yesterday
- CompositePattern
- 브리지 패턴
- 프록시패턴
- Iterator Pattern
- 메멘토 패턴
- 컴포지트패턴
- 복합체 패턴
- 책임연쇄패턴
- 퍼싸드패턴
- 책임체인패턴
- GithubActions
- 프로토타입 패턴
- UML 필요성
- restapi
- idtoken
- dfs
- Flutter
- 구글로그인
- ArrayDeque
- 반복자 패턴
- java문법
- 양방향연관관계
- n+1
- jpa
- 상태 패턴
- springsecurity
- 플라이웨이트패턴
- FacadePattern
- Chain of Responsibility
- 빌더 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |