[내배캠/24일차] TIL - createSchedule, findSchedules 구현

euphony·2025년 1월 27일
0

내일배움캠프

목록 보기
39/66

✅오늘의 한 일

  • 기초 Spring 강의 6주차 실습
  • Spring 입문 과제 Lv.1 완료

💻오늘의 학습

Spring 입문 과제 - 일정 관리 앱

프로젝트 구조

현재 프로젝트 구조는 다음과 같다. 과제 공통 조건 중 3 Layer Architecture에 따라 각 Layer의 목적에 맞게 개발해야하는 조건이 있다. 따라서 각 역할에 맞게 Controller, Service, Repository 패키지로 나누어 진행 중이다.

schedule-manager-api/
├── controller/
│   └── ScheduleController.java
├── dto/
│   └── schedule/
│       ├── ScheduleRequestDto.java
│       └── ScheduleResponseDto.java
├── entity/
│   └── Schedule.java
├── repository/
│   ├── JdbcTemplateScheduleRepository.java
│   └── ScheduleRepository.java
├── service/
│   ├── ScheduleService.java
│   └── ScheduleServiceImpl.java
├── ScheduleManagerApiApplication.java

일정 작성하기

Controller

Presentation Layer인 Controller 클래스에서는 요청을 전달 받고, Service Layer를 호출/응답하는 역할을 한다.

private final ScheduleService scheduleService;

public ScheduleController(ScheduleService scheduleService) {
    this.scheduleService = scheduleService;
}

@PostMapping
public ResponseEntity<ScheduleResponseDto> createSchedule(
       @RequestBody ScheduleRequestDto dto
) {
    return new ResponseEntity<>(scheduleService.saveSchedule(dto), HttpStatus.CREATED);
  }
  • Service 객체 생성 및 호출
  • ResponseEntity를 사용해 상태 코드 따로 반환 가능
  • 최초로 주입된 Service가 애플리케이션이 종료될 때까지 유지
  • @PostMapping 어노테이션 이용

Service

@Override
public ScheduleResponseDto saveSchedule(ScheduleRequestDto dto) {
    Schedule schedule = new Schedule(dto.getTask(), dto.getWriter(), dto.getPassword());
    return scheduleRepository.saveSchedule(schedule);
}
  • Service Layer에서 비즈니스 로직 구현
  • 일정 생성 시 필요한 필드를 받는 Schedule 생성자 만들기
  • Schedule 인스턴스 생성, schedule_id 없음 → why? 식별자(schedule_id )는 Repository의 영역

Repository

@Override
public ScheduleResponseDto saveSchedule(Schedule schedule) {
    SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
    jdbcInsert.withTableName("schedules").usingGeneratedKeyColumns("scheduleId");

    LocalDateTime now = LocalDateTime.now();
    Map<String, Object> parameters = new HashMap<>();
    parameters.put("task", schedule.getTask());
    parameters.put("writer", schedule.getWriter());
    parameters.put("password", schedule.getPassword());
    parameters.put("createdAt", now);
    parameters.put("updatedAt", now);

    Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));

    return new ScheduleResponseDto(key.longValue(), schedule.getTask(), schedule.getWriter(), now, now);
}
  • 실제로 SQL Database와 상호작용
  • SimpleJdbcInsert : Spring JDBC의 유틸리티. SQL을 직접 작성하지 않고 테이블에 데이터 삽입 가능
  • withTableName() : 삽입할 테이블 이름을 지정
  • usingGeneratedKeyColumns() : 삽입 후 생성된 키(Primary Key) 값을 반환
  • executeAndReturnKey : 데이터를 삽입하고, 자동 생성된 Primary Key 값을 반환
  • new MapSqlParameterSource(parameters) : 앞에서 만든 parameters 맵을 MapSqlParameterSource로 감싸서 전달

주의할 점

  • 요청 URL을 정확히 넣었는지 확인하기
  • 경로 오타 주의

📝오늘의 회고

강의 실습 부분을 차근차근 따라하니 저번주보다는 이해가 잘되었던 날이었다. 연휴 동안 트러블 슈팅 정리하고, 도전과제 Lv.4까지는 해보는 것이 목표다!

📌내일의 할 일

  • Spring 입문 과제 Lv.2 완료
  • 트러블 슈팅 작성
  • 자바 중급 2편 섹션10 Map 구현체까지 듣기

0개의 댓글

관련 채용 정보