
지난 3일간 TODO리스트를 관리할 수 있는 간단한 스프링부트 프로그램을 만들었다.
🔗 깃허브에서 보기
처음 다루는 Spring으로 우여곡절이 많았고, 어질어질 빙글빙글했지만,,,, 그래도 과제 필수까지 완료했다!!
여기까지 진행한 나 칭찬해. 아니 반성해. 아니 칭찬해.
(도전 과제를 못해서 울고있는 건 안비밀...ㅜㅜ)
👎 어려웠던 점
JDBC를 처음 사용할 때 어떻게 SQL을 매핑하고 관리할지 가닥을 잡지 못해 시간을 많이 썼던 것 같다.
JdbcTemplate을 적용하면서 SQL과 Java 코드가 분리되어 가독성이 향상되었지만 RowMapper라는 개념을 활용한 매핑 과정이 헷갈렸다.
👍 개선 방법
1. JdbcTemplate의 queryForObject, query 메서드를 활용하여 간결한 코드로 작성할 수 있었ㄸ ㅏ
String Pw = jdbcTemplate.queryForObject(findPW, new Object[]{dto.getId()}, String.class);
return jdbcTemplate.queryForObject(sql, (rs, rowNum) ->
new ResponseDto(
rs.getLong("id"),
rs.getString("userName"),
rs.getString("todo"),
rs.getDate("doDate"),
rs.getTimestamp("createDate").toLocalDateTime(),
rs.getTimestamp("updateDate").toLocalDateTime()
), id
);
👎 문제점
예외가 발생했을때, 에러가 났다고 단순히 spring 프로그램 내에서만 보여주는게 아니라, 나중에 프론트에게 전달할때도 정리된 형태(어떤 에러인지)로 보여주고 싶었다.
ResponseEntity를 활용한 반환값 설정 시, 적절한 HttpStatus코드를 매핑하는 것이 어려웠다.
👍 개선 방법
try-catch 문을 활용하여 예외를 처리하고, 예외 발생 시 적절한 응답을 반환!
ResponseEntity를 사용할 때, 성공/실패에 따른 HTTP 상태 코드(200 OK)를 명확하게 사용하기
@PutMapping("/update")
public ResponseEntity<String> updateTodoById(@RequestBody RequestDto dto){
boolean isUpdated = todoService.updateTodoById(dto);
if (isUpdated){
return ResponseEntity.ok("업뎃 됨!"); //문구 표시
}
else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("잘못된 업뎃입니다");
}
}
클래스와 레이어 분리가 부족
DAO, Service, Controller 간의 역할의 개념을 아직 명확히 이해하지 못해 시간을 많이 사용함
예외 처리의 부족
→ 특정 데이터가 없을 경우 발생하는 예외를 고려하지 않고 단순 쿼리 실행
→ 클라이언트 요청에 대한 유효성 검증이 미흡했다ㅠㅠ (아이디가 10자 이상이어야 한다던가..)
반환값 설계 미흡
→ ResponseEntity를 사용할 때, 단순히 200 OK만 반환하여 상세한 응답을 제공하지 못함.
JDBC와 JdbcTemplate의 활용 ( 추후에는 JPA 사용하기!)
SQL을 직접 사용하여 데이터베이스 연동함! (데이터가 날아가지 않고 계속 보관됨)
JdbcTemplate을 적용하면서 코드가 간결해지고 유지보수성이 향상됨.
개념 공부 중 얻은 인사이트들을 블로그에 기록해서 생각 안날때 찾아보면서 할 수 있었음
좀 더 발전된 레이어드 아키텍처 구성해보기
예외 처리 고도화하기
→ @ExceptionHandler를 활용하기
→ 예외 발생 시, 클라이언트에게 의미 있는 메시지를 제공해주기
→ 성공시의 경우만 반환하는게 아니라 실패도 좀 더 다양하게 구성해주기
이번 프로젝트를 통해 Spring, JDBC, 예외 처리, HTTP 응답 코드 등에 대한 많은 경험을 쌓을 수 있었다!!!
처음 배우는 Spring이라서 생소한 용어도 너무 많고 수업에서 배웠던 memo 프로젝트를 많이 참고하면서 개발했기에 온전히 내가 내 머리속에 있는 걸 사용해서 개발했어요!!! 라고 말할수는 없다ㅠㅠ..
하지만 이제 Spring에서 어떻게 데이터를 주고받고, 어떤 구성이 좋은 설계이고 이런 것들을 이해했으니 이번 프로젝트를 좀 더 리팩토링(예외처리)할 예정이다.
앞으로는 JPA 사용을 통해 더 발전된 프로젝트를 만들고 싶고, 주어진 과제를 넘어 개인적으로 프로젝트도 진행해보고자 한다🔥