기타/개발일기 16

Spring Boot 3.x.x Swagger API 명세서

Dependency 추가Spring Boot 2.x대 에서는 SpringFox를 사용했다고 하는데 업데이트가 되지 않는게 오래 되어서 이제는 SpringDoc를 사용한다고 한다.SpringDoc는 스프링부트 2점대와 3점대가 의존성을 추가하는 방법이 다르다고 하니 버전에 맞게 잘 사용하면 될 것 같다.이번 프로젝트에서 사용한 버전은 3.3.3이므로 아래와 같이 의존성을 추가해줬다.implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'사용법다른 블로그를 보면 환경변수를 설정하거나 Config 설정을 하는것으로 나와 있는데나는 따로 설정을 하지 않고 기본적으로 설정되어 있는데로 사용하였다.대신에 Spring Security를 사용하기..

기타/개발일기 2024.09.18

좋은 코드란 무엇일까?

좋은 코드란 무엇일까?좋은 코드라는 것이 뭘까? 어려운 문제를 엄청 간단하고 짧은 한줄의 코드로 해결하는 것이 좋은 코드인가?UpZen 대표 한기용님이 말씀하시는 좋은 코드는 가독성이 높은 코드이다.그래서 내가 나중에 코드를 봤을 때 쉽게 다시 기억을 되살릴 수가 있을 것이고, 다른 사람들이 쉽게 이해할 수 있기 때문에 내가 그만두거나 다른 일로 넘어갔을 때 유지보수가 쉬워진다. 단 코드를 작성할 때 본인이 맡은 업무를 명확히 이해하는 것이 중요하다 ("문제 정의"). 그래야 맡은 일에서 정말 중요한 것들 중심으로 구현할 수 있기 때문이다. 문제의 복잡도와 이를 해결하기 위해 들어가는 시간에는 보통 2080법칙(아마 팔레토법칙을 말씀하시는 것 같음)이 적용된다. 마지막 20%를 해결하는데 보통 80%의 ..

기타/개발일기 2024.08.31

대용량 트래픽을 처리하는 방법

대용량 트래픽을 처리하는 방법이전에 진행했던 티켓 예매 프로젝트를 통해 대용량 트래픽을 처리하는 방법을 알아봤다.티켓 예매 서비스 특성상, 콘서트를 예매할 시기에 트래픽이 과도하게 몰릴 것이고 원활한 서비스를 제공하기 위해서 대용량 트래픽을 감당할 수 있어야 했다.대용량 트래픽 처리를 위해 할 수 있는 방법은 크게 애플리케이션 관점과 하드웨어 관점으로 나눌 수 있을 것 같다.애플리케이션 관점시간 복잡도 최적화애플리케이션 관점에서 가장 먼저 고민해야 할 부분인 것 같다. 애플리케이션의 비즈니스 로직이 원활하게 동작할 수 있도록 시간 복잡도를 최적화를 시켜줘야 한다.만약 100만개의 데이터가 들어오는데 시간 복잡도가 O($n^{2}$)라면 10조가 나오게 되지만, O($n$)라면 100만이 나오기 때문에 훨..

기타/개발일기 2024.06.09

[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

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

[TIL] Jackson, Controller, DTO, JDBC

Jackson Jackson은 `JSON` 데이터 구조를 처리해주는 라이브러리이다. Object를 JSON 타입의 String으로 변환해줄 수 있다. 반대로 JSON 타입의 String을 Object로 변환해줄 수 있다. Spring은 3.0버전 이후로 `Jackson`과 관련된 API를 제공함으로써, 직접 코드를 작성하여 JSON 데이터를 처리하지 않아도 자동으로 처리해주고 있다. 직접 처리해야 할 때는 Jackson 라이브러리의 `ObjectMapper`를 사용하면 된다. Object To JSON @Test @DisplayName("Object To JSON : get Method 필요") void test1() throws JsonProcessingException { Star star = new..

기타/개발일기 2024.01.18