728x90
반응형
Java로 Entity를 만들고 멤버 변수로 1 ~ 31일을 만들어 둔 다음 넘오는 날짜에 따라 특정 날짜 변수에 값을 담는 작업을 하다 알게 된 내용이다.
역시 새롭게 알게 된 내용이라 정리 차원으로 올린다.
MontTimeTable Entity는 아래와 같다.
@Entity
@EntityListeners(value = {AuditingEntityListener.class})
@Data
@Table(name = "month_timetable")
public class MonthTimetable {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private Integer policy_instance_id;
@Column
private Integer year;
@Column
private Integer month;
@Column
private Integer d1;
@Column
private Integer d2;
@Column
private Integer d3;
@Column
private Integer d4;
@Column
private Integer d5;
@Column
private Integer d6;
@Column
private Integer d7;
@Column
private Integer d8;
@Column
private Integer d9;
@Column
private Integer d10;
@Column
private Integer d11;
@Column
private Integer d12;
@Column
private Integer d13;
@Column
private Integer d14;
@Column
private Integer d15;
@Column
private Integer d16;
@Column
private Integer d17;
@Column
private Integer d18;
@Column
private Integer d19;
@Column
private Integer d20;
@Column
private Integer d21;
@Column
private Integer d22;
@Column
private Integer d23;
@Column
private Integer d24;
@Column
private Integer d25;
@Column
private Integer d26;
@Column
private Integer d27;
@Column
private Integer d28;
@Column
private Integer d29;
@Column
private Integer d30;
@Column
private Integer d31;
@CreatedDate
@Column(updatable = false, name = "created_at")
private Date createdAt;
@LastModifiedDate
@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;
}
그리고 넘어온 날짜 기반으로 각 필요한 날짜 변수에 값을 셋팅을 해야 하는데 아래와 같은 방법으로 Set 하게 된다.
@Service
@Slf4j
public class MonthTimetableService {
public void createTimeTable(Long id, List<Date> timetableList) {
Map<String, MonthTimetable> monthTimetableMap = new HashMap<>();
for (Date date:timetableList) {
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int day = localDate.getDayOfMonth();
MonthTimetable monthTimetable = monthTimetableMap.get(year+""+month);
if(monthTimetable == null) {
monthTimetable = new MonthTimetable();
monthTimetable.setYear(year);
monthTimetable.setMonth(month);
monthTimetableMap.put(year+""+month, monthTimetable);
}
this.setDay(monthTimetable, day);
}
}
private void setDay(MonthTimetable monthTimetable, int day) {
try {
String setterMethodName = "d" + day;
Field field = MonthTimetable.class.getDeclaredField(setterMethodName);
field.setAccessible(true);
field.set(monthTimetable, 1);
} catch (IllegalAccessException | NoSuchFieldException e) {
throw new PolicyException(ErrorMessage.FAIL_POLICY_ADD);
}
}
}
이렇게 하게 될 경우 동적으로 필요한 변수를 찾아 값을 Set 할 수 있게 된다.
참고 : https://stackoverflow.com/questions/11652598/how-to-instantiate-and-call-methods-dynamically-of-a-class-member-in-java
728x90
반응형
'Java > Spring' 카테고리의 다른 글
Spring Batch, Migration, 튜닝 및 OOM 해결 후기 (0) | 2019.08.12 |
---|---|
QueryDSL 사용하기 (0) | 2019.08.08 |
JPA QueryDsl 에서 Group By Count 값 가져오기 (0) | 2018.09.28 |
RestTemplate에서 PUT으로 파라미터 전송하기 (0) | 2018.09.13 |
Jackson ObjectMapper에서 json data를 Map이 아니라 Object로 받기 (0) | 2018.09.12 |