WEB

·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
로깅을 왜 해야 할까?운영 서버에서 항상 문제가 발생하지 않기를 바라지만, 이는 매우 어려운 일입니다. 시스템이 복잡해질수록 문제는 더 자주 발생할 수 있고, 이를 해결하기 위해서는 로그가 필수적입니다. 로그는 단순한 기록이 아니라, 시스템의 행동을 이해하고 문제를 추적하는 데 있어 개발자와 운영팀의 비밀 무기입니다. 예를 들어, 한 사용자가 웹 애플리케이션에서 특정 기능을 사용하다가 오류를 경험했다고 가정해 봅시다. 문제를 해결하기 위해 개발자는 로그를 확인하려고 합니다. 하지만 로그가 명확한 정보 없이 단순히 "오류 발생"이라고만 적혀 있다면, 어떤 상황에서 문제가 발생했는지, 어떤 사용자가 영향을 받았는지를 파악하기가 매우 어렵습니다. 이런 상황에서 개발자는 로그를 해석하는 데 많은 시간을 소모하고..
·WEB
스프링 부트를 사용한 애플리케이션 개발에서 테스트는 매우 중요한 역할을 한다. 적절한 테스트는 코드의 안정성과 품질을 보장하고, 예기치 못한 오류를 사전에 방지할 수 있게 해 준다. 스프링에서는 다양한 테스트 방법을 제공하는데, 그중에서도 Mock을 활용한 단위 테스트와 SpringBootTest를 사용한 통합 테스트는 자주 사용되는 두 가지 방식이다. 이번에는 이 두 가지 테스트 방법의 차이점과 각각의 사용 목적에 대해 설명해보려고 한다.     @Mock먼저 Mock을 사용한 테스트이다.@ExtendWith(MockitoExtension.class)class ProductServiceTest { @Mock private ProductRepository productRepository; ..
유선준
'WEB' 카테고리의 글 목록