추석 연휴 간 TIL

남예준·2025년 10월 5일

Lombok 에러

이게 Lombok 관련해서 annotation을 달면 심볼을 알 수 없다고 에러가 계속 났다.

컴파일 자체에서 나는 건 아니었고 gradle에도 추가된 것을 봤었다.

annotation processing도 활성화 된 상태였고.

gradle에 아래 내용을 추가해주니 해결됐다.

annotationProcessor 'org.projectlombok:lombok'

RestTemplate

deprecated 된다고 한다.

WebClient를 사용하는 것이 권장 사항이라는데 Reactive web 의존성을 추가하면 되는 것 같다.

WebClient를 코드에 급하게 적용하려다가 오류가 많이 발생해 RestTemplate을 일단 기용했다.

RestTemplate은 무한 대기로 이어질 수 있어서 TimeOut으로 끊어주는 것이 좋다고 한다.

보니까 build 메소드는 Timeout에 대한 설정이 존재하지 않는 것으로 확인했다.

public <T extends RestTemplate> T configure(T restTemplate) {
		ClientHttpRequestFactory requestFactory = buildRequestFactory();
		if (requestFactory != null) {
			restTemplate.setRequestFactory(requestFactory);
		}
		addClientHttpRequestInitializer(restTemplate);
		if (!CollectionUtils.isEmpty(this.messageConverters)) {
			restTemplate.setMessageConverters(new ArrayList<>(this.messageConverters));
		}
		if (this.uriTemplateHandler != null) {
			restTemplate.setUriTemplateHandler(this.uriTemplateHandler);
		}
		if (this.errorHandler != null) {
			restTemplate.setErrorHandler(this.errorHandler);
		}
		if (this.rootUri != null) {
			RootUriBuilderFactory.applyTo(restTemplate, this.rootUri);
		}
		restTemplate.getInterceptors().addAll(this.interceptors);
		if (!CollectionUtils.isEmpty(this.customizers)) {
			for (RestTemplateCustomizer customizer : this.customizers) {
				customizer.customize(restTemplate);
			}
		}
		return restTemplate;
	}
public record ClientHttpRequestFactorySettings(Redirects redirects, Duration connectTimeout, Duration readTimeout,
		SslBundle sslBundle) {

	private static final ClientHttpRequestFactorySettings defaults = new ClientHttpRequestFactorySettings(null, null,
			null, null);

이런 식으로 따라 올라가면 null이 기본 값인 듯하다.

그래서 .connectTimeout(Duration.*ofSeconds*(30))로 따로 지정을 해줘야 무한 대기를 멈춘다고 한다.

Soft Delete

그 뭐냐 팀원이 쓴 코드 중에 Soft Delete를 구현하기 위해 따로 JpaRepository를 상속해 만든 repository가 있었다.

@Override
default void delete(T entity) {
    throw new UnsupportedOperationException("Use service.softDelete(...) instead.");
}

이런 느낌으로 delete 관련 메소드들을 전부 override해서 막아두는 형식이었다. 이런 방법으로도 제어하는 방법이 있다는 걸 한 수 배웠다.

Docker PostgreSql

팀원들이 짜놓은 ERD와 테이블 명세에 맞추지 않기도 하고 테이블 생성 쿼리를 활용하지 않는다는 사실을 알게 됐다.

merge된 코드를 사용하려고 하니 컬럼명, 데이터 타입 등이 전부 불일치하는 상황에서 알게 됐다.

그래서 간단하게나마 내가 돌리고 있는 ec2 서버에 docker container로 개발 DB를 띄워주기로 했다.

docker pull postgres:15.1 
docker images
docker run -p

docker run -p 5432:5432 --name postgres \
-e POSTGRES_PASSWORD=~ \
-e TZ=Asia/Seoul \
-v /home/testuser/pgdata:/var/lib/postgresql/data \
-d postgres:15.1

docker exec -it postgres bash
psql --version
psql -U postgres
select current_database();

CREATE DATABASE "~";
\l // 데이터베이스 확인
\c ~ // 데이터베이스 변경

CREATE TABLE ~~~~~

SELECT * FROM PG_TABLES;

Created By

JPA Auditing을 이용해서 생성자와 수정자 등을 받아주는 기능을 구현하려고 했다.

이 부분에 대해서 팀원이 개발했지만 merge하고 테스트해보니 제대로 동작하지 않는다는 것을 알 수 있었다.

찾아보니 AuditorAware의 구현체를 생성하지 않아서라고 한다.

그래서 이렇게 만들어서 다시 수행해보니

@Component
@RequiredArgsConstructor
public class AuditorAwareImpl implements AuditorAware<Long> {
    @Override
    public Optional<Long> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
            return Optional.empty();
        }
        Object principal = authentication.getPrincipal();
        if (principal instanceof UserDetailsImpl userDetails) {
            return Optional.of(userDetails.getUserId());
        }
        return Optional.empty();
    }
}

다음과 같이 잘 들어가는 것을 확인할 수 있었다.

0개의 댓글