현재 프로젝트 구조는 다음과 같다. 과제 공통 조건 중 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
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
어노테이션 이용@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
의 영역@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);
}
SimpleJdbcInsert
: Spring JDBC의 유틸리티. SQL을 직접 작성하지 않고 테이블에 데이터 삽입 가능withTableName()
: 삽입할 테이블 이름을 지정usingGeneratedKeyColumns()
: 삽입 후 생성된 키(Primary Key) 값을 반환executeAndReturnKey
: 데이터를 삽입하고, 자동 생성된 Primary Key 값을 반환new MapSqlParameterSource(parameters)
: 앞에서 만든 parameters 맵을 MapSqlParameterSource
로 감싸서 전달강의 실습 부분을 차근차근 따라하니 저번주보다는 이해가 잘되었던 날이었다. 연휴 동안 트러블 슈팅 정리하고, 도전과제 Lv.4까지는 해보는 것이 목표다!