제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁

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.SimpleFlowMap<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의 의미는 해시 기반 컬렉션에서 객체의 위치를 빠르게 찾기 위해 사용.

 

+ Recent posts