TIL

TIL - 2025/02/03

호롤로 2025. 2. 3. 23:53

▶ 진행사항

- 현재 진행중인 '일정 관리 앱' 만들기 과제의 제출이 내일까지라, 오늘은 온종일 과제에 집중했다. 원래 목표로는 도전 단계까지 모두 진행해보는것을 노렸으나, 아직 배움이 많이 부족하여 필수 단계를 간신히 진행하고있는 상황이 슬프다.

 

▶ '일정관리 앱' 필수 단계 (완료)

- 작성 코드

▷ CalendarController

@RestController
@RequestMapping("/api")
public class CalendarController {

    @Autowired
    private CalendarService calendarService;

    @PostMapping("/calendars")
    public void createCalendar(@RequestBody CalendarModel calendarModel) {
        calendarService.createCalendar(calendarModel);
    }

    @GetMapping("/lists")
    public List<CalendarModel> getAllCalendars(@RequestParam(required = false) String author,
                                               @RequestParam(required = false) String updateDate) {
        return calendarService.getAllCalendars(author, updateDate);
    }

    @GetMapping("/lists/{id}")
    public CalendarModel getCalendarById(@PathVariable Long id) {
        return calendarService.getCalendarById(id);
    }

    @PutMapping("/{id}")
    public String updateCalendar(@PathVariable Long id, @RequestBody CalendarDto calendarDto) {
        try {
            calendarService.updateCalendar(id, calendarDto);
            return "수정완료";
        } catch (IllegalArgumentException e) {
            return e.getMessage();
        }
    }
}

 

▷ CalendarDto

@Getter
@Setter
public class CalendarDto {

    private String todolist;
    private String author;
    private String password;

 

▷ CalendarModel

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CalendarModel {

    private Long id;
    private String author;
    private String todolist;
    private String password;
    private LocalDateTime createDate;
    private LocalDateTime updateDate;
}

 

▷ CalendarRepository

@Repository
public class CalendarRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public int createCalendar(CalendarModel calendarModel) {
        String sql = "insert into calendar (author, todolist, password, createDate, updateDate) values(?,?,?,?,?)";
        return jdbcTemplate.update(sql, calendarModel.getAuthor(), calendarModel.getTodolist(), calendarModel.getPassword(), calendarModel.getCreateDate(), calendarModel.getUpdateDate());
    }

    public List<CalendarModel> getAllCalendars(String author, String updateDate) {
        StringBuilder sql = new StringBuilder("select * from calendar where 1=1");
        List<Object> params = new ArrayList<>();

        if (author != null && !author.isEmpty()) {
            sql.append(" and author = ?");
            params.add(author);
        }

        if (updateDate != null && !updateDate.isEmpty()) {
            sql.append(" and date(updateDate) = ?");
            params.add(Date.valueOf(updateDate));
        }

        sql.append(" order by updateDate desc");

        return jdbcTemplate.query(sql.toString(), params.toArray(), new BeanPropertyRowMapper<>(CalendarModel.class));
    }

    public CalendarModel getCalendarById(Long id) {
        String sql = "select * from calendar where id = ?";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(CalendarModel.class), id);
    }

    public void updateCalendar(CalendarModel calendarModel) {
        String sql = "update calendar set todolist = ?, author = ?, updateDate = ?, where id = ?";
        jdbcTemplate.update(sql, calendarModel.getTodolist(), calendarModel.getAuthor(), calendarModel.getUpdateDate(), calendarModel.getId());
    }

    public void deleteCalendar(Long id) {
        String sql = "delete from calendar where id = ?";
        jdbcTemplate.update(sql, id);
    }
}

 

▷ CalendarService

@Service
public class CalendarService {

    @Autowired
    private CalendarRepository calendarRepository;

    // 일정 생성
    public void createCalendar(CalendarModel calendarModel) {

        LocalDateTime now = LocalDateTime.now();

        calendarModel.setCreateDate(now);
        calendarModel.setUpdateDate(now);

        calendarRepository.createCalendar(calendarModel);
    }

    // 전체 일정 조회
    public List<CalendarModel> getAllCalendars(String author, String updateDate) {
        return calendarRepository.getAllCalendars(author, updateDate);
    }

    // 단건 조회
    public CalendarModel getCalendarById(Long id) {
        return calendarRepository.getCalendarById(id);
    }

    // 수정
    public void updateCalendar(Long id, CalendarDto calendarDto) {

        LocalDateTime now = LocalDateTime.now();
        CalendarModel existingCalendar;

        try {
            existingCalendar = calendarRepository.getCalendarById(id);
        } catch (Exception e) {
            throw new IllegalArgumentException("해당 일정을 찾을 수 없습니다.", e);
        }

        if (!existingCalendar.getPassword().equals(calendarDto.getPassword())) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        existingCalendar.setTodolist(calendarDto.getTodolist());
        existingCalendar.setAuthor(calendarDto.getAuthor());
        existingCalendar.setUpdateDate(now);

        calendarRepository.updateCalendar(existingCalendar);
    }

    // 삭제
    public void deleteCalendar(Long id, String password) {
        CalendarModel existingCalendar;

        try {
            existingCalendar = calendarRepository.getCalendarById(id);
        } catch (Exception e) {
            throw new IllegalArgumentException("해당 일정을 찾을 수 없습니다.", e);
        }

        if (!existingCalendar.getPassword().equals(password)) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        calendarRepository.deleteCalendar(id);
    }
}

 

▶ 트러블슈팅

1. Lombok 패키지 추가 안함 (해결 完)

 └ 처음 프로젝트 생성時, 롬복 패키지를 추가 안했는지, 프로그램이 인식을 하지 못하는 문제가 발생하여, 해당 문제 해결방법을 인터넷등에서 찾아본 결과, 직접 build.gradle 파일 內 에서 추가하여 해결 가능했다.

 

2. 데이터베이스 연결 오류 (해결 完)

└ 현재 과제를 완료하고 마지막 확인도중, 프로그램 실행 時, 데이터베이스 연결이 안되는 오류가 발생하고 있다. 여러 방면으로 해결방법을 물색해봤고, 결국 처음으로 돌아가 처음부터 다시 세팅을 해보는 식으로 문제를 해결해보고자 접근해봤다. 결과적으로 새로 시작한 프로젝트에선 데이터베이스 연동이 정상적으로 작동했으나, 그럴듯한 해결방법이 뭐였는지는 정확하진 않으나, schema 설정이 제대로 되지 않았던게 아닌가 하는 생각이 든다.

 

▶ 마치며

- 처음으로 스프링 과제를 진행하며 여러가지 문제에 막히는 경험들을 해봤다. 이 경험을 기반으로 다음번엔 좀더 수월히 스프링을 운용할수 있을 밑거름이 될거라 긍정적인 마인드로 앞으로도 화이팅해보자.

'TIL' 카테고리의 다른 글

TIL 2025/02/26  (0) 2025.02.27
TIL 2025/02/12  (0) 2025.02.13
TIL - 2025/01/17  (1) 2025.01.17
TIL 2024/01/09  (0) 2025.01.10
TIL 2025/01/08  (0) 2025.01.08