Skip to content

Conversation

@geniusYoo
Copy link
Contributor

Related issue 🛠

Work Description ✏️

솝트로그가 일부 유저에게 안 열리는 이슈를 해결합니다.

ArrayIndexOutOfBoundsException 이슈

  • 솝트로그 조회 시, 플그에서 받아온 정보를 바탕으로 기수와 파트를 split()으로 꺼내옵니다.
    해당 과정에서, 데이터가 어떻게 오는지는 확인하지 못했지만, 아래의 로그를 확인했습니다.
2025-03-30T17:58:58.229+09:00 ERROR 2500635 --- [app-server] [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1] with root cause

java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.sopt.app.application.playground.dto.PlaygroundProfileInfo$ActivityCardinalInfo.getPlaygroundPart(PlaygroundProfileInfo.java:124) ~[!/:0.0.1-SNAPSHOT]
	at org.sopt.app.presentation.user.UserResponse$SoptLog.lambda$of$0(UserResponse.java:176) ~[!/:0.0.1-SNAPSHOT]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
	at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na]
	at org.sopt.app.presentation.user.UserResponse$SoptLog.of(UserResponse.java:177) ~[!/:0.0.1-SNAPSHOT]
	at org.sopt.app.presentation.user.UserController.getUserSoptLog(UserController.java:131) ~[!/:0.0.1-SNAPSHOT]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.11.jar!/:6.1.11]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.11.jar!/:6.1.11]
  • 이를 해결하기 위해, cardinalInfo의 length를 확인하고 로그를 남기는 로직을 추가했습니다.
    public PlaygroundPart getPlaygroundPart() {
    try {
    String[] parts = cardinalInfo.split(",");
    if (parts.length < 2) {
    log.warn("Invalid cardinalInfo format: {}", cardinalInfo);
    return PlaygroundPart.NONE;
    }
    return findPlaygroundPartByPartName(parts[1]);
    } catch (Exception e) {
    log.warn("Error parsing PlaygroundPart from cardinalInfo: {}", cardinalInfo, e);
    return PlaygroundPart.NONE;
    }
    }
    }

솝트로그 솝탬프 제외 후 duration 리턴으로 변경

  • 솝탬프가 닫혀있으므로, 활동기수의 경우에도 솝트와 N개월로 리턴되도록 이전 로직을 주석처리했습니다.
    // if (isActive) {
    // // soptampRank = rankFacade.findUserRank(user.getId());
    // } else {
    //
    // }
    List<Long> generations = playgroundProfile.getAllActivities().stream()
    .map(PlaygroundProfileInfo.ActivityCardinalInfo::getGeneration)
    .toList();
    if (!generations.isEmpty()) {
    soptDuring = (long) ActivityDurationCalculator.calculate(generations);
    }

Trouble Shooting ⚽️

Related ScreenShot 📷

Uncompleted Tasks 😅

To Reviewers 📢

@geniusYoo geniusYoo added the 🛠️ BugFix 버그 해결 label Mar 31, 2025
@geniusYoo geniusYoo self-assigned this Mar 31, 2025
@height
Copy link

height bot commented Mar 31, 2025

Link Height tasks by mentioning a task ID in the pull request title or commit messages, or description and comments with the keyword link (e.g. "Link T-123").

💡Tip: You can also use "Close T-X" to automatically close a task when the pull request is merged.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR addresses an issue where some users experienced failures when opening the Sopt Log due to an ArrayIndexOutOfBoundsException.

  • In UserController.java, the legacy soptampRank retrieval is now commented out to reflect the updated Sopt Stamp closures.
  • In PlaygroundProfileInfo.java, error handling is added in getPlaygroundPart() to check the cardinalInfo format and log a warning, returning a safe default.

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
src/main/java/org/sopt/app/presentation/user/UserController.java Commented out soptampRank logic in response to new requirements for duration calculation.
src/main/java/org/sopt/app/application/playground/dto/PlaygroundProfileInfo.java Added try-catch and validation to prevent ArrayIndexOutOfBoundsException when parsing cardinalInfo.
Comments suppressed due to low confidence (1)

src/main/java/org/sopt/app/application/playground/dto/PlaygroundProfileInfo.java:127

  • Consider adding unit tests to cover cases where 'cardinalInfo' does not contain a comma, ensuring that the method returns PlaygroundPart.NONE as expected.
String[] parts = cardinalInfo.split(",");

@geniusYoo geniusYoo merged commit e3619c4 into dev Mar 31, 2025
1 check passed
Copy link
Collaborator

@hyerinhwang-sailin hyerinhwang-sailin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! 다만 솝탬프 아직 노출 시키지 않아서 주석처리하셨다고 하셨는데 추후 다시 솝탬프 열때를 대비해 주석 처리와 함께 설명 주석 같이 달아주시면 더 좋을 것 같습니다~ 고생하셨습니다 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FIX] 일부 유저 솝트로그가 열리지 않는 이슈 해결

2 participants