전체 글

·WEB
IT-CAST 프로젝트에서 선택된 데이터를 정해진 시간에 메일로 보내는 로직이 있습니다.@Service@RequiredArgsConstructorpublic class MailService { private final AmazonSimpleEmailService amazonSimpleEmailService; private final EmailSender emailSender; public void send(final SendMailRequest sendMailRequest) { try { final SendEmailRequest emailRequest = emailSender.from(sendMailRequest); amazonSimpl..
·WEB
Users 테이블에 100만 개의 데이터를 넣고 조회 속도 개선을 위해 2가지를 시도해 보았습니다. 이를 위해 간단한 닉네임을 조회하는 메서드를 만들었습니다.public UserSearchResponse searchNickname(final UserSearchRequest userSearchRequest) { final User user = userRepository.findByNickname(userSearchRequest.nickname()) .orElseThrow(() -> new InvalidRequestException("닉네임이 유효하지 않습니다.")); return UserSearchResponse.from(user.getNickname());}실행시간은 다음과..
·WEB
기존에 Filter와 Argument Resolver로 처리하던 인증/인가 로직을 Spring Security로 변경하면서 구현 과정에 대해 정리했습니다. Spring Security의 기본적인 동작 흐름과 이를 기반으로 한 인증 및 인가 로직을 설명해 보겠습니다. Spring Security 동작 과정Spring Security는 Filter 기반으로 동작하며, Dispatcher Servlet으로 요청이 도달하기 전에 필터 체인에서 처리가 이루어집니다. 아래는 Spring Security의 동작 구조입니다.저는 SecurityConfig, 인증(Authentication) 인가(Authorization) 흐름으로 나누어 개발했습니다. Config(SecurityConfig 구현)1. Authentic..
·WEB
문제 상황: N+1 문제와 성능 저하개발 중에 다음과 같은 문제가 발생했습니다. 하나의 게시물 목록을 조회하는 코드에서, N+1 문제가 발생하면서 다수의 추가적인 쿼리가 나가고 있었습니다.@Transactional(readOnly = true)public PostsReadPageRespDto readPosts(final int page, final int limit) { final Page posts = postRepository.findAll( PageRequest.of(page, limit, Sort.by(Sort.Direction.DESC, "lastModifiedAt"))); final Page postsResponse = posts.map( post -> { ..
·WEB
날씨 API 구현처음, 날씨 API를 통해 오늘의 날씨 정보를 가져오는 기능을 구현하기 위해 코드를 작성했습니다. 메서드는 두 가지 주요 기능을 가지고 있었습니다. public WeatherResponse getWeather(final String date) { final WeatherResponse[] responses = webClient.get() .uri("/f-api/weather.json") .retrieve() .bodyToMono(WeatherResponse[].class) .block(); // 날씨 정보 가져오기 return ..
·WEB
문제 설명JPA를 사용하여 스케줄을 업데이트하는 메서드에서 다음과 같은 코드가 있었습니다.public ScheduleUpdateResponse update(final ScheduleUpdateRequest request, final Long scheduleId) { final Schedule schedule = scheduleRepository.findById(scheduleId) .orElseThrow(() -> new ScheduleApplicationException(SCHEDULE_NOT_FOUND)); schedule.update(request.title(), request.title()); return ScheduleUpdateR..
·WEB
소프트 딜리트(Soft Delete)란?소프트 딜리트는 데이터베이스에서 레코드를 물리적으로 삭제하지 않고, 삭제된 것처럼 처리하는 방법입니다. 데이터를 실제로는 삭제하지 않고, 상태를 비활성화하여 다른 사용자들이 보지 못하게 하지만, 데이터는 여전히 데이터베이스에 남아 있습니다. 보통 삭제 플래그나 상태 값을 변경하는 방식으로 구현합니다. 소프트 딜리트 구현 방법제가 구현한 소프트 딜리트는 데이터베이스 테이블에 Status 필드를 추가하여 처리했습니다. 상태 값으로 데이터의 활성, 비활성, 비공개 여부를 관리할 수 있습니다. 소프트 딜리트 코드소프트 딜리트는 상태 값 INACTIVE를 사용해 게시글이 삭제된 것처럼 보이도록 설정할 수 있습니다.public enum ArticleStatus { ACT..
·WEB
JPA 코드에서 JDBC 코드로 변경하기이 글에서는 JPA로 작성된 코드를 JDBC로 변경하는 과정을 살펴보겠습니다. JPA는 객체와 데이터베이스 간의 매핑을 자동으로 처리해 주지만, JDBC는 우리가 직접 SQL을 작성해야 하고 데이터베이스와의 연결을 수동으로 처리해야 합니다. 아래에서 JPA 코드를 JDBC로 변경하는 방법을 단계별로 진행해 보겠습니다. JPA로 작성된 Product 클래스먼저, JPA를 사용해 작성된 Product 클래스입니다. JPA는 어노테이션을 통해 데이터베이스 테이블과의 매핑을 쉽게 처리할 수 있습니다.@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Product extends BaseE..
·WEB
로깅을 왜 해야 할까?운영 서버에서 항상 문제가 발생하지 않기를 바라지만, 이는 매우 어려운 일입니다. 시스템이 복잡해질수록 문제는 더 자주 발생할 수 있고, 이를 해결하기 위해서는 로그가 필수적입니다. 로그는 단순한 기록이 아니라, 시스템의 행동을 이해하고 문제를 추적하는 데 있어 개발자와 운영팀의 비밀 무기입니다. 예를 들어, 한 사용자가 웹 애플리케이션에서 특정 기능을 사용하다가 오류를 경험했다고 가정해 봅시다. 문제를 해결하기 위해 개발자는 로그를 확인하려고 합니다. 하지만 로그가 명확한 정보 없이 단순히 "오류 발생"이라고만 적혀 있다면, 어떤 상황에서 문제가 발생했는지, 어떤 사용자가 영향을 받았는지를 파악하기가 매우 어렵습니다. 이런 상황에서 개발자는 로그를 해석하는 데 많은 시간을 소모하고..
·JAVA
Java의 탄생 배경자바가 등장할 당시, C/C++과 같은 언어들이 주로 사용되었지만, 이 언어들은 특정 플랫폼(OS)이나 하드웨어에 맞춰 컴파일되도록 설계된 언어였다. 각 플랫폼마다 사용하는 CPU에 따라 해당 환경에 맞게 컴파일해야 했다. 이런 한계를 극복하기 위해 Sun Microsystems는 OS나 하드웨어에 상관없이 다양한 환경에서 실행될 수 있는 언어를 만들기로 결심했고, 이것이 자바의 탄생으로 이어졌다. 자바는 “Write Once, Run Anywhere”라는 철학을 기반으로 다양한 플랫폼에서 동일한 코드를 실행할 수 있도록 설계된 언어이다. JAVA의 동작 원리JVM을 설명하기 전에, 자바 프로그램이 어떻게 동작하는지 기본적인 원리를 먼저 살펴보겠다.자바로 작성된 소스 파일은 보통 이름..
유선준
개발 일기 블로그