Post

TIL(20240730) [error:JAXB is unavailable]


챌린지 top10리스트 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Transactional(readOnly = true)
    public List<ChallengeSummaryResponseDto> getTop10Challenges() {
        List<Challenge> top10Challenges = challengeRepository.findTop10ByOrderByUserChallengesDesc();
        if (top10Challenges.isEmpty()) {
            throw new GlobalException(ErrorCode.NOT_FOUND_CHALLENGE);
        }
        List<ChallengeSummaryResponseDto> top10ChallengeList = new ArrayList<>();
        for (Challenge challenge : top10Challenges) {
            ChallengeSummaryResponseDto responseDto = new ChallengeSummaryResponseDto(challenge);
            top10ChallengeList.add(responseDto);
        }
        return top10ChallengeList;
    }

이상하게 두번째로 많은 데이터 부터 가져와지게 되었다.

image image

2번이 먼저 조회가 되어야 하는데.. 쿼리문에서 유저 테이블에서 가장 많은 challengeId를 조회해오는게 아닌 userchallenge에 등록된 순으로 조회해오는 쿼리를 만들엇기 때문..😅

JPA쿼리로 구현하려면 유저-테이블(중간테이블)에서 먼저 challengeId가 많은 순서대로 리스트형식의 id를 가져온 후에 그 아이디를 가지고 challenge테이블에서 해당 challenge를 찾아서 반환형식에 맞게 바꿔주고 내보내는 과정으로 이루어질 것이라 짐작했는데, 이는 훨씬 복잡해질 수 있다는 생각에 이 과정을 잘 풀어 가독성을 높이기 위해 QueryDSL을 사용하는 방법을 선택했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public List<ChallengeSummaryResponseDto> findTop10ChallengesByUserchallenges() {
	QChallenge challenge = QChallenge.challenge;
	QUserChallenge userChallenge = QUserChallenge.userChallenge;

	List<ChallengeSummaryResponseDto> top10ChallengeList = queryFactory
		.select((Projections.constructor(ChallengeSummaryResponseDto.class, challenge)))
		.from(userChallenge)
		.join(userChallenge.challenge, challenge)
		.groupBy(challenge)
		.orderBy(userChallenge.challenge.count().desc())
		.limit(10)
		.fetch();

	return top10ChallengeList;
  }

해당쿼리를 바꾸어주니 2,3,1순서대로 나왔다.

image

챌린지 이미지 등록 부분을 구현하다가 해당 오류가 나왔는데,

1
JAXB is unavailable. Will fallback to SDK implementation which may be less performant.If you are using Java 9+, you will need to include javax.xml.bind:jaxb-api as a dependency.

이전에 인증요청할때는 나오지 않았던것이 왜.. 갑자기..?

일단 찾아보니

1
implementation 'javax.xml.bind:jaxb-api:2.3.1' 

종속성 추가를 해야한다는 것

“JAXB를 사용할 수 없습니다. 성능이 떨어질 수 있는 SDK 구현으로 대체됩니다.”라는 경고 메시지는 일반적으로 Java 애플리케이션에서 JAXB(Java Architecture for XML Binding)를 사용하려고 할 때 발생하지만 Java 버전 9에는 기본적으로 포함되어 있지 않습니다. 이상. JAXB는 Java 8까지 Java SE 표준 라이브러리의 일부였지만 Java 9부터는 더 이상 포함되지 않습니다.

이 문제를 해결하려면 JAXB API를 프로젝트에 별도의 종속성으로 포함해야 합니다. 방법은 다음과 같습니다.

JAXB API를 포함하는 이유는 무엇입니까? JAXB는 마샬링(Java 객체를 XML로 변환) 및 언마샬링(XML을 다시 Java 객체로 변환)에 사용됩니다. 애플리케이션이 XML 데이터를 다루고 JAXB 주석(@XmlRootElement, @XmlElement 등)을 사용하여 Java 객체를 XML에 매핑하거나 그 반대로 매핑하는 경우 JAXB API를 포함하면 호환성과 적절한 기능이 보장됩니다.

Java 9 이상에 대한 참고 사항 Java 9부터 모듈화 변경으로 인해 JAXB는 더 이상 Java SE 표준 라이브러리에 포함되지 않습니다. 따라서 Java 9 이상을 사용하는 경우 JAXB API를 프로젝트의 종속성으로 명시적으로 포함해야 합니다.

예시 시나리오 애플리케이션이 JAXB 주석을 사용하고 경고 메시지가 표시되는 경우 JAXB API 종속성을 추가하면 성능이 떨어지는 SDK 구현으로 대체하지 않고도 JAXB 기능이 올바르게 작동할 수 있습니다.

다음 단계를 수행하고 프로젝트 구성(Maven 또는 Gradle)에 JAXB API 종속성을 포함하면 경고를 해결하고 Java 애플리케이션에서 적절한 JAXB 기능을 보장해야 합니다.

This post is licensed under CC BY 4.0 by the author.