Java 16

[Redis] 캐싱 구현(콜론 두 개 :: 등장 이유)

아래 글은 Spring Cache를 Redis와 함께 사용할 때, **::(콜론 두 개)**가 등장하는 이유와, 이를 어떻게 다뤄야 하는지에 집중해 정리했습니다. 캐싱 구현에서 흔히 겪는 혼동을 줄이는 데 도움이 되었으면 합니다. ■ @Cacheable(value = "cacheName")와 실제 Redis 키Spring Cache 추상화(예: @Cacheable)를 통해 Redis를 사용하면, 실제 Redis 키는 자동으로 아래와 같은 형태로 생성됩니다."캐시이름::캐시 키"예: @Cacheable(value = "routeCache", key = "#routeNo")라면캐시 이름: "routeCache"캐시 키: routeNo실제 Redis 키: "routeCache::{routeNo}"이는 Spri..

Java 2025.01.30

[WebSocket] Java로 WebSocket 구현하기(feat. JWT)

이 전 포스팅에서 웹소켓이 무엇이고 웹소켓에 jwt를 추가하는 글을 작성했었는데, 이 번 글에서는 Spring Boot를 사용해 WebSocket 기반의 실시간 통신을 구현하는 과정을 공유합니다. 이 글에서는 WebSocket 설정, 클라이언트와의 메시징 경로, 그리고 JWT 기반의 인증 처리까지 함께 다룰 예정입니다. ■ Gradle 설정Spring Boot에서 WebSocket을 사용하려면 의존성을 추가해야 합니다. Gradle의 build.gradle 파일에 아래 내용을 추가하세요:implementation 'org.springframework.boot:spring-boot-starter-websocket' ■ 메시지 전송 코드아래는 WebSocket을 통해 메시지를 전송하는 서비스 클래스입니다.S..

Java 2025.01.23

[S3] Spring에서 AWS S3 설정을 활용한 파일 업로드

이 글에서는 Spring Boot 애플리케이션이 AWS S3와 연결하여 파일을 업로드하는 방법을 소개합니다. AWS 자격 증명과 설정을 env.properties에 저장하고, 이 설정을 이용해 S3에 안전하게 접근할 수 있도록 S3Util과 S3Service 클래스를 구현했습니다. ■ env.properties 설정 파일env.properties 파일은 AWS S3와 연결할 때 필요한 다양한 설정 값을 포함하고 있습니다. 다음과 같은 설정이 필요합니다.env.aws.accessKey=sample env.aws.secretKey=sample env.aws.region=sample env.aws.bucket=sample env.aws.endpoint=http://sample or https://sample...

Java 2024.11.08

[Gradle] 의존성 설정과 컴파일/런타임 시점의 이해(feat.Lombok)

의존성 설정을 올바르게 사용하기 위해 꼭 알아야 할 두 가지 개념인 컴파일 시점과 런타임 시점의 차이를 자세히 살펴보겠습니다. 이러한 차이를 이해하는 것이 compileOnly, runtimeOnly, annotationProcessor와 같은 설정을 올바르게 사용하는 데 매우 중요합니다. 컴파일 시점과 런타임 시점이 무엇인지, 그리고 이 시점들이 Gradle의 의존성 설정과 어떻게 연관되어 있는지 알아본 후, 컴파일 시점에 주로 사용하는 compileOnly와 annotationProcessor의 차이점에 대해서도 다루어보겠습니다. 이를 통해 여러분의 프로젝트에서 최적화된 의존성 관리를 구현하는 방법을 배울 수 있을 것입니다. ■ 컴파일 시점과 런타임 시점이란?  1. 컴파일 시점 (Compile-Ti..

Java 2024.09.30

[Gradle] 의존성 설정 알아보기

Gradle은 Java 프로젝트에서 라이브러리 의존성을 관리하는 데 사용되는 빌드 도구입니다. 프로젝트의 크기와 복잡도에 따라 다양한 라이브러리를 사용하게 되는데, 이러한 라이브러리가 어떻게 프로젝트에 포함되는지 관리하는 것이 매우 중요합니다. 이때 사용되는 것이 바로 Gradle의 다양한 의존성 설정입니다. 이번 글에서는 implementation, compileOnly, developmentOnly, runtimeOnly, annotationProcessor, testImplementation과 같은 의존성 설정의 차이점을 예시와 함께 설명하고, 각 설정을 왜 구분해서 사용해야 하는지도 살펴보겠습니다. ■ 의존성 설정 차이점 정리 설정 적용 범위 예시 용도implementation컴파일 & 런타임..

Java 2024.09.27

[JUnit]Spring Boot에서 JUnit으로 테스트하는 방법

이 글에서는 Spring Boot에서 JUnit을 사용하여 컨트롤러 테스트를 수행하는 방법을 설명하겠습니다. 특히, 사용자 인증 및 CSRF 보호와 같은 보안 관련 사항을 고려하여 테스트 코드를 작성하는 방법에 대해 다룰 것입니다. 아래 코드는 Spring Security가 적용된 환경에서 컨트롤러를 테스트하는 예시입니다. 이 코드에서는 카카오 지도 api를 사용하고 사용자 인증, CSRF 토큰 검증을 고려한 테스트 환경을 구성합니다. 아래의 **testGetRoute()**는 MapController의 /api/map/route 경로에 대한 단위 테스트를 수행하는 코드입니다. 각각의 메소드를 이렇게 단위별로 테스트할 수 있으며, 이 예시에서는 /api/map/route로의 POST 요청을 처리하는 컨트..

Java 2024.09.09

[JWT] Spring Boot에서 JWT(Json Web Token) 적용하기

Spring Boot 프로젝트에서 JWT를 사용하여 인증과 권한 부여를 구현하는 방법에 대해 설명합니다. 이 글에서는 JWT의 생성, 검증, 쿠키를 통한 JWT 저장 및 처리 방법을 설명하며, io.jsonwebtoken:jjwt 라이브러리를 활용합니다. Gradle을 사용하는 환경을 기준으로 설명합니다. 1. Gradle 의존성 추가dependencies {     implementation 'io.jsonwebtoken:jjwt:0.9.1' } 2. JWT 유틸리티 클래스 작성이제 JWT를 생성하고 검증하는 유틸리티 클래스를 작성해보겠습니다. JwtUtil 클래스는 JWT 생성, 검증, 쿠키 저장, 쿠키에서 토큰 추출, 토큰 무효화 기능을 제공합니다.// JwtUtil.javapackage taxi...

Java 2024.09.04

[Spring] 왜 자주 사용하는 객체들을 자동으로 빈으로 등록하지 않을까?

Spring 프레임워크는 유연하고 강력한 애플리케이션 개발을 위해 다양한 기능을 제공합니다. 그 중에서 가장 핵심적인 기능 중 하나는 빈(Bean) 관리입니다. Spring은 애플리케이션에서 사용되는 객체를 자동으로 관리하고 주입하여 개발자의 생산성을 크게 향상시킵니다. 하지만 RestTemplate, ObjectMapper와 같은 자주 사용하는 객체들은 Spring이 자동으로 빈으로 등록하지 않아 그냥 사용하게 되면 에러가 발생하게 됩니다. 왜 그럴까요? 이번 포스트에서는 이 질문에 대해 알아보겠습니다. ■ 빈 등록 없이 객체를 사용하면 발생하는 문제 먼저, 빈 등록 없이 RestTemplate과 같은 객체를 사용하려고 할 때 어떤 문제가 발생하는지 살펴보겠습니다. 아래 코드를 예시로 들어보죠.@Slf..

Java 2024.08.30

[Redis] 직렬화

# Redis에서의 기본 직렬화 설정Spring에서 RedisTemplate을 사용할 때, 직렬화 설정을 명시적으로 하지 않으면, 기본적으로 Redis는 JdkSerializationRedisSerializer를 사용합니다. 이 직렬화기는 Java의 직렬화 메커니즘을 활용하여 객체를 바이트 스트림으로 변환합니다.@Configuration public class RedisConfig {     @Bean     public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {         RedisTemplate template = new RedisTemplate();         template.setConnectionFact..

Java 2024.08.26

[Spring] 생성자 주입이 필요한 이유

# 의존성 주입의 기본 개념먼저, 의존성 주입이란 클래스가 필요로 하는 외부 객체를 Spring 컨테이너가 대신 주입해주는 개념입니다. 이렇게 하면 클래스는 직접 의존성을 생성할 필요 없이, Spring이 적절한 시점에 해당 객체를 주입해주므로 유연한 애플리케이션 구조를 만들 수 있습니다.Spring에서 의존성 주입을 할 수 있는 방법에는 크게 두 가지가 있습니다:필드 주입: @Autowired로 필드에 주입.@Component public class MyService {     // 필드 주입     @Autowired     private MyRepository myRepository; } 생성자 주입: 생성자를 통해 주입.@Component public class MyService {    // 생..

Java 2024.08.23