Java/Spring

파라미터에 따라 특정 변수에 값 Set 하기

체리필터 2018. 10. 24. 15:01
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
반응형