제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
ISSUE
final FlowJobBuilder flowJobBuilder = this.parentJobConfig.customJobBuilders()
.get(jobName)
.start(step1)
.on(ExitStatus.FAILED.getExitCode())
.fail()
.on(ExitStatus.STOPPED.getExitCode())
.stop()
.next(step2)
.on(ExitStatus.COMPLETED.getExitCode())
.end()
.on(ExitStatus.FAILED.getExitCode())
.fail()
.on(ExitStatus.STOPPED.getExitCode())
.stop()
.build();
- o.s.b.core.job.flow.support.SimpleFlow은 Map<String, Set<StateTransition>>으로
매개변수화된 변수 전환 Map에서 상태 전환을 가리킴. - o.s.b.core.job.builder.FlowJobBuilder를 사용하여 Set에 중복된 항목을 얻는 에러가 발생.
StateTransition 역할
StateTransition 클래스는 상태 전이(State Transition)를 표현하는 역할
- 상태 저장: 특정 전이에 관련된 상태 정보를 저장.
- 패턴 관리: 전이 조건을 정의하는 패턴을 관리.
- 다음 상태 정의: 전이가 완료된 후 다음 상태를 정의.
- 상태 전이 비교: 다른 상태 전이 객체와의 비교를 통해 전이의 동등성을 판단.
- 해시 코드 제공: 상태 전이를 해시 기반 컬렉션에 저장할 수 있도록 해시 코드를 제공.
- 불변 객체: 상태 전이 객체가 불변임을 보장하여 스레드 안전성을 높임.
해결
코드
// StateTransition.java
public final class StateTransition {
// ... other
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
StateTransition that = (StateTransition) o;
return Objects.equals(state, that.state) &&
Objects.equals(pattern, that.pattern) &&
Objects.equals(next, that.next);
}
@Override
public int hashCode() {
return Objects.hash(state, pattern, next);
}
}
// StateTransitionTests.java
@Test
public void testEquals() {
StateTransition A = StateTransition.createStateTransition(state, "pattern1", "next1");
StateTransition B = StateTransition.createStateTransition(state, "pattern1", "next1");
StateTransition C = StateTransition.createStateTransition(state, "pattern2", "next2");
assertTrue(A.equals(B));
assertFalse(A.equals(C));
assertTrue(A.equals(A));
assertFalse(A.equals(null));
}
equals 메서드
- 두 객체가 동일한 객체인지(this == o) 확인.
- 비교 대상이 null이 아니고 동일한 클래스인지 확인.
- StateTransition의 필드인 state, pattern, next가 모두 같은지 비교.
hashCode 메서드
- Objects.hash 메서드를 사용하여 상태, 패턴, 다음 상태의 해시 값을 결합하여 해시 코드를 생성.
Test code
- equals 메서드가 다양한 조건에서 올바르게 동작하는지 확인
- StateTransition 객체 생성
- A, B는 동일한 필드. C는 다른 필드를 가지는 객체 생성
- 동일한 필드 확인(assertTrue(A.equals(B))
- A와 B는 동일한 필드를 가지므로 equals 메서드는 true를 반환.
- 다른 필드 확인(assertFalse(A.equals(C))
- A와 C는 패턴과 다른 필드를 가지므로 equals 메서드는 false를 반환.
- 자기 자신 비교(assertTrue(A.equals(A))
- A는 자기 자신이므로 equals 메서드는 true를 반환.
- A와 null과의 비교(assertFalse(A.equals(null))
- A는 null과 비교할 수 없으므로 equals 메서드는 false를 반환.
느낀점
- 중복되는 객체를 확인을 어떻게 하는지 고민이였는데, 필드가 많지 않아 필드로 확인하는 로직으로 구현.
- hashcode의 의미는 해시 기반 컬렉션에서 객체의 위치를 빠르게 찾기 위해 사용.
'기타 > OpenSource 기여' 카테고리의 다른 글
[OpenSource] 초보자 오픈소스 컨트리뷰션 기여 방법! (0) | 2024.05.23 |
---|---|
[spring-security] CasAuthenticationProvider 구조 개선 (0) | 2024.05.21 |