문제토스페이먼츠 API를 이용하던 중, 응답으로 주던 날짜 형식 "2024-10-02T21:16:13+09:00" 이 LocalDateTime으로 파싱이 되지 않았다. 해결 OffsetDateTime을 이용해서 파싱 할 수 있었다. 1. LocalDateTime 파싱 에러 발생 @Test@DisplayName("LocalDateTime 파싱 - 에러남")public void testLocalDateTimeParseException() { // given String rawTime = "2024-10-02T21:16:13+09:00"; // when & then assertThatThrownBy(() -> LocalDateTime.parse(rawTime)) .isIns..
Spring
문제간편결제를 구현하기 위해 6자리 숫자 비밀번호를 도입했다. 근데 평문으로 저장할 순 없으니 암호화를 해야 하는데, 스프링 시큐리티까지는 필요 없이 비밀번호 암호화만 하면 되었다. 해결 dependencies { // ... // spring security crypto implementation 'org.springframework.security:spring-security-crypto' // 여기 !!! // ...}spring-security-crypto 라이브러리를 의존한다. import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configur..
문제결제 엔티티에서 결제 승인 메서드를 실행하면 결제 승인 시간에 자동으로 현재 시간으로 넣어준다. 자동으로 넣어준 LocalDateTIme을 어떻게 테스트할지 궁금했는데, 특정 시간과 가까운지 테스트하는 코드가 있었다.상황 /** * 결제 승인 */public void approve() { this.status = PaymentStatus.APPROVED; this.approvedAt = LocalDateTime.now(); // 여기 !!!}결제 승인 메서드 실행 시 approvedAt에 현재 시간을 넣어준다.해결 전체 테스트 코드import static org.assertj.core.api.Assertions.assertThat;// ... @Test@DisplayName("결제 성공")..
문제우리는 JPA 엔티티를 Ksuid라고 하는 고유 식별자를 사용하기로 했다. UUID 같은거다. 생성시간 기반의 20byte 고유 식별자로, 시간순으로 정렬이 가능해서 인덱싱의 이점을 누리면서도 랜덤값도 포함되어 중복 가능성이 거의 없으며, 길이도 짧다. 따라서 엔티티를 저장할 때 id를 넣어서 생성하도록 했다. @Transactionalpublic S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (this.entityInformation.isNew(entity)) { this.entityManager.persist(entity); return entity; } else {..
문제멀티 모듈 구조에서 JpaRepository 빈을 읽어오지 못하는 문제가 있었다. 상황우리는 멀티 모듈을 채택했고, 스프링 앱, 도메인 코어, 데이터베이스 모듈로 3개를 분리했다. 스프링 앱에서 실행 시, 데이터베이스 모듈의 JpaConfig 설정을 읽어오지 못해서 도메인 코어의 repository에 JpaRepository를 빈이 없다고 주입을 못해주고 있었다. 간단하게 현제 문제인 것들만 정리하자면모듈payment-core : 결제 도메인의 핵심 부분 (서비스, 도메인, 리포지토리 포함)모듈 위치 : service:payment:core 패키지 시작점 : radiata.service.payment.corepayment-api : 결제 도메인의 외부 요청 부분 (스프링 애플리케이션, 컨트롤러, ..
문제 Review 엔티티에 기본형 boolean 타입의 isReported 필드가 있었는데, 이를 DTO로 변환하는 mapStruct 매퍼를 사용 중, 컴파일 시 아래와 같은 경고가 떴다. // ReviewMapper.class// ...import org.mapstruct.Mapper;import org.mapstruct.Mapping;import static org.mapstruct.MappingConstants.ComponentModel.SPRING;@Mapper(componentModel = SPRING)public interface ReviewMapper { ReviewResponseDto toReviewResponseDto(Review review);}// ReviewResponseDto..
상황MSA 1차 과제의 답안이 공개되어 보던 중 기존의 강의와 해설 영상에서도 다루지 않았던 코드를 발견했다.// ServletInitializer.classimport org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder..
// application.ymlspring: application: name: ymlserver: port: 8088fruit: list: - name: banana color: yellow - name: apple color: reddeveloper: name: yunjaeapplication.yml // application-dev.ymlserver: port: 8055application-dev.yml // DeveloperName.class import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframewor..
의존성 목록 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'}의존성이 web, lombok 밖에 없다. 전역 설정 import org.springframework.context.annotat..