java 15

[Redis 캐싱 처리] Could not write JSON: Java 8 date/time type `java.time.LocalDateTime` not supported by default

문제점 Redis를 이용하여 캐싱 처리를 하려고 하니 Could not write JSON: Java 8 date/time type `java.time.LocalDateTime` not supported by default와 같은 에러가 발생하였다. @Bean public CacheManager cacheManager() { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory()); RedisCacheConfiguration configuration = RedisCacheConfiguration.defaul..

기타/개발일기 2024.03.24

[Spring Boot] Redis로 캐싱 처리 적용하기

Redis 정의 이전에 Spring Boot에서 Redis를 사용하는 방법에 대해서 간단하게 포스팅했다. Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)이다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소이다. Redis 장점 높은 성능 Redis는 인메모리 데이터 저장소로 작동하므로 빠른 속도로 데이터를 처리할 수 있다. 비동기 방식으로 데이터를 처리하므로 성능이 향상된다. 데이터 구조 다양성 Redis는 다양한 데이터 구조를 지원하므로, String, List, Hash, Set 등을 통해 데이터를 쉽게 처리할 수 있다. 데이터 복제 및 분산 Redis는 데이터 복제를 지원한다. 클..

기타/개발일기 2024.03.24

[Spring Security] JWT 특성을 이용한 인증 처리 리팩토링

JWT의 특성 JWT의 특성은 stateless, 즉 무상태성이다. JWT는 HTTP 통신을 통해 주고받기 때문에 기본적으로 HTTP의 특성을 가지게 된다. 무상태성은 서버가 클라이언트의 상태를 가지고 있지 않는 것을 말한다. 인증 처리 리팩토링 리팩토링을 하게 된 계기는, 로그인한 유저가 로그인 인증 처리를 할 때, Database를 걸쳐 나오는 것 때문에, 이를 수정하고자 했다. // 인증 처리 public void setAuthentication(String username) { SecurityContext context = SecurityContextHolder.createEmptyContext(); Authentication authentication = createAuthentication(u..

기타/개발일기 2024.03.21

Spring Boot에서 Redis 사용하기

Redis를 공부하게 된 계기는 프로젝트를 진행하면서 Refresh Token을 처리를 해줘야 하는데 이를 보통 Redis로 사용을 많이 한다고 한다. 하지만 Redis를 따로 사용해 본 적이 없어서 Database를 사용하여 Refresh Token을 관리해줬다. Redis를 공부해놔야 할 것 같아 리팩토링을 통해 Redis를 사용하게 되었다. Redis 레디스는 Mysql와 같은 RDS도 아니고, MongoDB와 같은 NoSQL도 아니다. 인메모리 형식의 키-값 구조를 가진 데이터 저장소이다. 주요 Redis 사용 사례로는 캐싱, 세션 관리, pub/sub 및 순위표라고 한다. Spring Boot Redis 스프링 부트에서 공식적으로 레디스 기능을 제공해준다. Spring Boot Redis에는 J..

기타/개발일기 2024.03.15

queryDSL 사용방법

Config 설정 queryDSL을 사용하기 위해서 Dependency를 추가해줘야 한다. implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" build.gradle에 해당 스크립트를 추가해준다. 그리고 queryDSL은 JPAQueryFactory를 통해서 사용해야 하기 때문에 빈 등록을 해줘야 한다. Config ..

Language/Java 2024.03.14

Spring Boot S3에 이미지 업로드

Spring Boot 이미지 업로드 처음에 이미지 업로드는 서버에 임의로 지정해놓은 디렉터리에 저장되도록 구현했다. private PostImage getPostImage(MultipartFile file, Post post) throws IOException { if (file != null) { String originalFilename = file.getOriginalFilename(); String saveFileName = createSaveFileName(originalFilename); file.transferTo(new File(getFullPath(saveFileName))); // 여기서 임의의 위치로 이미지 저장 String filePath = uploadPath + saveFileN..

기타/개발일기 2024.03.13

JPA에 대해 깊이 알아보자

JPA에 대해 깊이 알아보기 위해 체크리스트 JDBC 와 Persistence Framework 의 차이점에 대해 설명할 수 있다. JDBC Template 과 MyBatis 의 차이점에 대해 설명할 수 있다. SQL Mapper 와 ORM 의 차이점에 대해 설명할 수 있다. MyBatis 가 쿼리를 생성하는 2가지 방법에 대해 설명할 수 있다. 영속성 컨텍스트와 쓰기지연의 연관성에 대해서 설명할 수 있다. 다대다 관계를 현업에서 주로 어떻게 구현하여 사용하는지 설명할 수 있다. 부모가 자식의 영속성을 완전히 관리하기 위해서 사용하는 cascade 옵션을 설명할 수 있다. 현업에서 주로 사용하는 Fetch 전략에 대해서 설명할 수 있다. QueryDSL 의 버전별 연동방법을 설명할 수 있다. QueryD..

Language/Java 2024.03.07

Service 인터페이스와 구현체 분리

왜 분리해서 사용할까? 인터페이스와 구현체를 분리함으로써 구현체를 독립적으로 확장할 수 있으며, 구현체 클래스를 변경하거나 확장해도 이를 사용하는 클라이언트의 코드에 영향을 주지 않도록 하기 위함이기 때문이다. 이러한 구조로 프로젝트를 설계했을 때, interface에서 정의한 기능을 새로운 방식으로 구현해야 한다면 사용해야 하는 곳에서 구현체만 손쉽게 바꿀 수 있기 때문에 Service를 인터페이스로 만들고, 해당 기능을 ServiceImpl라는 클래스 로 구현하는 것이다. 사용 장점 확장 가능성과 유지보수성 현재는 인터페이스와 구현체 클래스가 일대일 관계를 맺고 있을지라도 언제 서비스가 커져서 구현체 클래스가 확장될지를 모른다. 그래서 이러한 구조로 확장 가능성을 열어둔다면 유지보수하기 편리하다. 협..

Language/Java 2024.03.06

@Component, @Bean, @Autowired가 뭘까?

일단 결과적으로 이 세 어노테이션들은 모두 빈을 등록하는 어노테이션이다. 근데 왜 구분하여 사용하는 걸까? 용도가 다르니 구분했겠지. @Component @Component는 개발자가 직접 작성한 클래스 파일에 대해 Bean을 등록하기 위한 어노테이션이다. 예를 들면 Controller, Service 어노테이션을 보면 @Component가 붙어있는 것을 볼 수 있다. @Bean @Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean 등록하기 위한 어노테이션이다. @Autowired @Autowired는 @Component를 통해 등록된 Bean을 다른 곳에서 의존성 주입(DI)을 위해 사용하는 어노테이션이다. @Autowired를 통해 의존성을 주입하는 방법은 세 가지가 있다. 생성자..

Language/Java 2024.03.05

[TIL] 모던 자바(Java 8)

모던 자바 : 자바 8 변경점 자바는 진화하는 언어이며, 가장 큰 진화는 Java 8에서 이루어졌다고 한다. 함수형 프로그래밍 함수를 일급 값으로 프로그래밍에서 지원하는 모든 연산을 지원하고 있고, 이러한 연산을 모두 지원하는 “값”들을 일급 시민, 또는 일급 객체라고 한다. 하지만 특정한 연산을 지원하지 않는 값이기 때문에 메서드는 이급 시민으로 볼 수 있다. 결론 : Java 8에 메서드 참조 기능이 도입되었다. 람다 : 익명 함수 람다는 익명함수를 지칭하는 말 익명함수란 말 그대로 이름이 없는 함수를 뜻하며, 일급 객체로 취급 함수를 값으로 사용 할 수도 있으며 파라미터에 전달 변수에 대입 하기와 같은 연산들이 가능 Javascript ES6의 Arrow function과 같다. 스트림 스트림은 데..

기타/개발일기 2024.01.05