처음에는 이 내용을 보고 뇌정지가 온 것 같다.
(어떻게 시작해야 하나 계속 생각 중)
6단계 기능: 연관 관계 설정 ------------------------------------------------------- 🔻 설명 - 담당자는 일정과 분리해서 관리합니다. - 동명이인의 담당자가 있어 각 담당자가 할 일을 구별할 수 없습니다! 담당자를 식별하기 위해 이름으로만 관리하던 담당자에게 고유 식별자를 부여합니다. ------------------------------------------------------- 🔻 조건 - 담당자는 이름 외에 이메일, 등록일, 수정일 정보를 가지고 있습니다. - 담당자의 정보는 추가로 받을 수 있습니다. - 고유 식별자를 통해 담당자를 조회할 수 있도록 기존 코드를 변경합니다. -------------------------------------------------------

일단 담당자과 일정과 분리해서 관리한다고 하니 manager라는 table을 생성하였다.
CREATE TABLE IF NOT EXISTS manager (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE,
created_day TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_day TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
또한 manager를 연결하면서 그 안에있는 데이터를 가져오려면 기존에 있던 java 코드를 수정해야했다.
public MyScheduleResponseDto createSchedule(MyScheduleRequestDto myScheduleRequestDto) {
MySchedule mySchedule = new MySchedule(myScheduleRequestDto);
MyScheduleRepository myScheduleRepository = new MyScheduleRepository(jdbcTemplate);
MySchedule saveMySchedule = myScheduleRepository.save(mySchedule);
ManagerRepository managerRepository = new ManagerRepository(jdbcTemplate);
String managerName = managerRepository.findManagerNameById(saveMySchedule.getManagerId());
return new MyScheduleResponseDto(saveMySchedule, managerName);
}
public MySchedule save(MySchedule mySchedule) {
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "INSERT INTO schedule (task, manager_id, password, created_day, updated_day) VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(con -> {
PreparedStatement preparedStatement = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, mySchedule.getTask());
preparedStatement.setLong(2, mySchedule.getManagerId()); // 올바른 manager_id 설정
preparedStatement.setString(3, mySchedule.getPassword());
preparedStatement.setTimestamp(4, mySchedule.getCreatedDay());
preparedStatement.setTimestamp(5, mySchedule.getUpdatedDay());
return preparedStatement;
}, keyHolder);
Long id = keyHolder.getKey().longValue();
mySchedule.setId(id);
return mySchedule;
}
@Getter
@NoArgsConstructor
public class MyScheduleResponseDto {
private Long id;
private String task;
private Long managerId;
private String managerName;
private Timestamp createdDay;
private Timestamp updatedDay;
public MyScheduleResponseDto(Long id, String task, Long managerId, String managerName, Timestamp createdDay, Timestamp updatedDay) {
this.id = id;
this.task = task;
this.managerId = managerId;
this.managerName = managerName;
this.createdDay = createdDay;
this.updatedDay = updatedDay;
}
public MyScheduleResponseDto(MySchedule mySchedule, String managerName) {
this.id = mySchedule.getId();
this.task = mySchedule.getTask();
this.managerId = mySchedule.getManagerId();
this.managerName = managerName;
this.createdDay = mySchedule.getCreatedDay();
this.updatedDay = mySchedule.getUpdatedDay();
}
}
@Getter
@Setter
@NoArgsConstructor
public class MyScheduleRequestDto {
private String task;
private Long managerId;
private String password;
public MyScheduleRequestDto(String task, Long managerId, String password) {
this.task = task;
this.managerId = managerId;
this.password = password;
}
}
근데도 실행했는데 안됬다....
왜? 라고 생각했는데 manager에 데이터를 추가한 다음에 schedule에 데이터를 추가해야 해결할 수 있었다.
이유 : schedule에 있는 manager_id가 manager에 있는 id를 참조하기 때문
그래서 manager를 CRUD할 ManagerController, ManagerRepository를 생성
@RestController
@RequestMapping("/api/managers")
public class ManagerController {
private final ManagerRepository managerRepository;
public ManagerController(ManagerRepository managerRepository) {
this.managerRepository = managerRepository;
}
@PostMapping
public void createManager(@RequestBody Manager manager) {
manager.setCreatedDay(new Timestamp(System.currentTimeMillis()));
manager.setUpdatedDay(new Timestamp(System.currentTimeMillis()));
managerRepository.save(manager);
}
}
@Repository
public class ManagerRepository {
private final JdbcTemplate jdbcTemplate;
public ManagerRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void save(Manager manager) {
String sql = "INSERT INTO manager (name, email, created_day, updated_day) VALUES (?, ?, ?, ?)";
jdbcTemplate.update(sql, manager.getName(), manager.getEmail(), manager.getCreatedDay(), manager.getUpdatedDay());
}
// 관리자 이름을 ID로 조회
public String findManagerNameById(Long managerId) {
String sql = "SELECT name FROM manager WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{managerId}, String.class);
}
위의 예시코드들을 해서 하니 성공했다!