Troubleshooting: 무엇이 문제였는가? 40

2주 차: 알림 기능 찾아 삼만리 Day 5 - 이메일 하나 보내는 데 7초씩이나 걸리면, 2,000명일 때는 얼마나 걸린단 소리지?

[인용 및 참고 자료]1. 구글 검색: 티스토리, "java.lang.Object org.hibernate.ScrollableResults.get(int)", 오류 해결하기, (2025.02.19)2. 구글 검색: 티스토리, "java.lang.Object org.hibernate.ScrollableResults.get(int)", 오류 해결하기, (2025.02.19)3. 구글 검색: QueryDSL GitHub, "java.lang.Object org.hibernate.ScrollableResults.get(int)", 오류 해결하기, (2025.02.19)4. 구글 검색: 정책 브리핑, "한국 실업자 수", 2024년 12월 및 연간 고용동향, (2025.02.19) [알림 기능 찾아 삼만리 Day..

2주 차: 알림 기능 찾아 삼만리 Day 4 - 팀장님, 우리 그냥 ZonedDateTime 말고 LocalDateTime 쓰면 안 돼요?

[인용 및 참고 출처]1. 구글 검색: MySQL 8.4 Reference Manua, "MySQL timestamp with time zone", 13.2.2 The DATE, DATETIME, and TIMESTAMP Types, (2025.02.18) [알림 기능 찾아 삼만리 Day 1 링크][알림 기능 찾아 삼만리 Day 2 링크][알림 기능 찾아 삼만리 Day 3 링크][깃허브(GitHub) 링크] '취하여(취업을 위하여)' 프로젝트는 현재 국내 채용 공고만 조회할 수 있지만, 언젠가 다른 나라의 채용 공고도 조회할 수 있도록 서비스를 개선할 생각을 염두에 두고 ZonedDateTime을 사용 중이었다. 어제에 이어 오늘은 한 번 조회한 채용 공고를 다시 조회하지 않도록 스프링 스케줄러(Spri..

2주 차: 알림 기능 찾아 삼만리 Day 3 - Spring Scheduler와 Spring Email로 이메일 보내기에 성공은 했는데

[인용 및 참고 출처]1. 구글 검색: Baeldung, "Spring Email", Guide to Spring Email, (2025.02.17)2. 구글 검색: 티스토리, "구글 SMTP 설정", Gmail SMTP로 메일 발송 설정하기, (2025.02.17)3. 구글 검색: velog, "구글 SMTP 설정", Gmail SMTP 설정으로 이메일 보내기, (2025.02.17) [알림 기능 찾아 삼만리 Day 1 링크][알림 기능 찾아 삼만리 Day 2 링크]더보기package com.project.cheerha.domain.notice.dto;import com.querydsl.core.annotations.QueryProjection;public record UserKeywordDto( ..

1주 차: 알림 기능 찾아 삼만리 Day 2 - Spring Scheduler를 어떻게 고칠지 다시 정리하다

[알림 기능 찾아 삼만리 Day 1 링크]더보기package com.project.cheerha.domain.notice;import com.project.cheerha.domain.notice.dto.JobOpeningDto;import com.project.cheerha.domain.notice.dto.JobOpeningKeywordDto;import com.project.cheerha.domain.notice.dto.UserDto;import com.project.cheerha.domain.notice.dto.UserKeywordDto;import com.project.cheerha.domain.notice.service.NoticeCreationService;import java.util.Arra..

1주 차: 알림 기능 찾아 삼만리 Day 1 - Spring Scheduler를 사용하다

'어떻게 채용 공고 목록을 가져오지?' 이메일 전송 기능을 구현하기 전에 우선 사용자가 등록한 기술 키워드가 포함된 채용 공고 목록부터 조회하기로 했다. ERD(Entity Relationship Diagram)을 바탕으로 조회 순서를 고려한 뒤, 저번 프로젝트에서 사용한 스프링 스케줄러(Spring Scheduler)를 활용하기로 했다. 이 기술에 익숙했에 빠르게 기능을 구현하고 성능 개선에 집중할 수 있을 듯했다. (1) UserKeyword 테이블에서 사용자가 등록한 키워드 식별자 목록 조회하기(2) JobOpeningKeyword 테이블에서 해당 키워드를 포함한 채용 공고 식별자 목록 조회하기(3) JobOpening 테이블에서 조회된 채용 공고 정보 조회하기 전체 흐름을 머릿속으로 정리한 뒤에는..

1주 차: SQL Error 1062: Duplicate entry '1-3' for key 'user_keyword

[문제]채용 공고에 있는 기술 스택(Tech Stack)을 키워드(Keyword)로 몇 개 넣은 다음, 사용자가 알림 받고자 하는 채용 키워드를 등록하는 API를 구현해서 Postman을 실행했더니 오류가 발생했다. 'Duplicate entry '1-3' for key 'user_keyword'// (a) 'user_keyword'라는 고유 키에 '1-3' 값이 중복되어 삽입됨// (b) 1: user_id 값 // (c) 3: keyword_id 값 [원인 및 해결 과정]더보기package com.project.cheerha.domain.keyword.entity;import com.project.cheerha.domain.user.entity.User;import jakarta.persistence..

10단계: "NoSuchBeanDefinitionException - No qualifying bean of type 'JwtUtil' available"

[인용 및 참고 출처]1. 구글 검색: 티스토리, "@Slf4j "테스트 코드", 테스트 코드에서 @Slf4j 사용하기, (2025.01.28) 2. 구글 검색: SLF4J Manual, "Spring Slf4j docs", SLF4J user manual, (2025.01.28) [문제]더보기package org.example.expert;import java.time.LocalDateTime;import org.example.expert.common.dto.AuthUserDto;import org.example.expert.common.entity.Todo;import org.example.expert.domain.user.dto.response.UserResponseDto;import org.exa..

10단계: "세상에, 'HttpMessageNotWritableException'이라니! 순환 참조에 걸린 사람? 저요!" (수정 중)

[문제]가게(Store), 카테고리(Category), 중간 테이블(Store Category)이 연관관계를 잘 맺었고 가게가 잘 생성되는지 확인했는데, 이상하게 입력된 카테고리가 데이터베이스(database)에만 저장되고 반환되지 않았다. 카테고리 목록을 제외한 여는 시간이나 주문 최소 금액 같은 다른 값은 모두 제대로 반환되었기 때문에, 혹시 응답 시 쓰는 DTO(Data Transfer Object)에 카테고리 목록이 들어가지 않았을지 모른다고 추측했다. [원인 및 문제 해결 과정]더보기package com.example.outsourcingproject.store.service;import com.example.outsourcingproject.auth.repository.OwnerAuthRepo..

10단계: Cannot invoke "Object.getClass()" because "constant" is null

[문제]QueryDSL을 사용해서 조회할 때 특정 검색어가 없으면 일정 목록이 전부 조회되어야 하는데 이상하게 '403 Forbidden' 오류 메시지가 떴다. 메시지야 직접 설정하지 않았으니 그렇다 쳐도, 어디선가 문제가 생겼다는 뜻이라 눈을 동그랗게 뜨고 원인을 찾았다. [원인]private long countByTitle(String search) { return Optional.ofNullable( jpaQueryFactory.select(Wildcard.count) .from(todo) .where(todo.title.contains(search)) .fetchOne() ) ..

10단계: Null이 아니라 널 보고 싶어요, 이메일 씨

[문제]스프링 시큐리티(Spring Security)를 적용한 뒤 일정을 생성할 때마다 email 값이 null로 나왔다. 데이터베이스(database)에는 잘 저장되어 이후에 일정을 조회할 때는 email 값이 잘 나왔기 때문에 이메일 값이 들어가는 AuthUserDto를 확인했다. 그 결과 email 값이 null이 되었다는 점을 확인했고, 'AuthUserDto를 생성하는 부분에서 이메일 값을 빠뜨렸나?' 추측했다. [원인]우선 'new AuthUserDto'로 새로운 AuthUserDto를 생성하는 AuthUserArgumentResolver에서 로그를 찍었다. 그 결과 SpringContext에 인증 정보를 설정할 때, 또는 그 전에 인증 객체를 생성할 때부터 email 값이 빠졌다고 추측할 수..