- 정해진 값으로 DB에 넣어줘야 조회할 때도 정해진 값으로 조회가 될텐데 값이 달라지면 조회가 안되게 된다.
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private JobStatus jobStatus;
}
public enum JobStatus {
STUDENT,
EMPLOYED,
NOTEMPLOYED
}
@RequiredArgsConstructor
public enum JobStatus {
STUDENT("학생", "student"),
EMPLOYED("취업성공", "employed"),
NOTEMPLOYED("취업준비", "notemployed");
private final String koreanName;
private final String lowerCase;
//JobStatus(String koreanName, String lowerCase){
// this.koreanName=koreanName;
// this.lowerCase=lowerCase;
//} 생략가능!
}
@JsonFormat
@RequiredArgsConstructor
public enum JobStatus {
STUDENT("학생"),
EMPLOYED("취업성공"),
NOTEMPLOYED("취업준비");
@JsonValue
private final String koreanName;
}
shape = JsonFormat.Shape.OBJECT
shape = JsonFormat.Shape.STRING
shape = JsonFormat.Shape.NUMBER
@Getter
@JsonFormat
@RequiredArgsConstructor
public enum JobStatus {
STUDENT("학생"),
EMPLOYED("취업성공"),
NOTEMPLOYED("취업준비");
EMPTY("빈값");
@JsonValue
private final String koreanName;
public static JobStatus findByJobStatus(String input){
return
Arrays.stream(JobStatus.values())
.filter(jobStatus -> jobStatus.getKoreanName().equals(input))
.findAny()
.orElse(EMPTY);
}
}
@Getter
@RequiredArgsConstructor
public enum JobStatus {
STUDENT("학생", Arrays.asList("HIGH_SCHOOL", "UNIVERSITY")),
EMPLOYED("취업성공", Arrays.asList("SALARY_MAN", "SELF_EMPLOYED", "ETC")),
NOTEMPLOYED("취업준비", Arrays.asList("CHALLENGING", "STUDYING", "GIVING_UP")),
EMPTY("빈값", Collections.EMPTY_LIST);
private final String koreanName;
private final List<String> detailList;
//String으로 들어온 값을 확인하고 해당 상수를 리턴한다.
public static JobStatus findByDetail(String input){
return Arrays.stream(JobStatus.values())
.filter(detail -> detail.hasDetailList(input))
.findAny()
.orElse(EMPTY);
}
public boolean hasDetailList(String input){
return detailList.stream()
.anyMatch(detail -> detail.equals(input));
}
}
public class JobStatusTest {
private String selectedDetail(){
return "HIGH_SCHOOL";
}
@Test
public void jobStatusTest(){
//given
String detail = selectedDetail();
//when
JobStatus jobStatus = JobStatus.findByDetail(detail);
//then
assertEquals(jobStatus.name(), "STUDENT");
assertEquals(jobStatus.getKoreanName(), "학생");
}
}
@Getter
@RequiredArgsConstructor
public enum Detail {
HIGH_SCHOOL("고등학생"),
UNIVERSITY("대학생"),
SALARY_MAN("직장인"),
SELF_EMPLOYED("자영업자"),
ETC("기타"),
CHALLENGING("취업도전중"),
STUDYING("취업공부중"),
GIVING_UP("포기상태");
private final String koreanName;
}
@Getter
@RequiredArgsConstructor
public enum JobStatus {
STUDENT("학생", Arrays.asList(Detail.HIGH_SCHOOL, Detail.UNIVERSITY)),
EMPLOYED("취업성공", Arrays.asList(Detail.SALARY_MAN, Detail.SELF_EMPLOYED, Detail.ETC)),
NOTEMPLOYED("취업준비", Arrays.asList(Detail.CHALLENGING, Detail.STUDYING, Detail.GIVING_UP)),
EMPTY("빈값", Collections.EMPTY_LIST);
private final String koreanName;
private final List<Detail> detailList;
//타입을 변경해 타입 안정성을 확보한다.
public static JobStatus findByDetail(Detail inputDetail){
return Arrays.stream(JobStatus.values())
.filter(detail -> detail.hasDetailList(inputDetail))
.findAny()
.orElse(EMPTY);
}
public boolean hasDetailList(Detail inputDetail){
return detailList.stream()
.anyMatch(detail -> detail.equals(inputDetail));
}
}
public class JobStatusTest {
private Detail selectedDetail2(){
return Detail.STUDYING;
}
@Test
public void jobStatusTest2(){
//given
Detail detail = selectedDetail2();
//when
JobStatus jobStatus = JobStatus.findByDetail(detail);
//then
assertEquals(jobStatus.name(), "NOTEMPLOYED");
assertEquals(jobStatus.getKoreanName(), "취업준비");
}
아래 Reference에 자세한 코드와 설명을 참고해주세요.
- 일관된 타입을 받기 위해 Interface를 생성하고 해당 Interface를 VO객체를 생성자 인자로 받아 인스턴스를 만든다.
- Enum 역시 해당 Interface를 구현한다.
- 그리고 Enum을 Value 클래스로 변환하여 Enum의 상수값과 상수의 필드값을 JSON 리스트 형태로 리턴한다.
- LinkedHashMap 기반의 Enum을 담을 팩토리 클래스를 만든다.
- 팩토리 클래스를 Bean 등록하고 Enum을 저장한다.
- View Layer 같이 필요한 곳에서 꺼내어 사용한다.
Reference: